From 4600af055566854e6e59f54d1c45914d36ca19d5 Mon Sep 17 00:00:00 2001 From: NozomuIkuta Date: Mon, 27 Nov 2023 02:56:39 +0000 Subject: [PATCH] deploy: d325ce16c9bf90b9c6493a416bb791d67ea0d2df --- 404.html | 10 +- assets/app.a465d4fe.js | 1 + assets/app.ae722434.js | 1 - ...-02-10-js-tooling-research.md.62856b03.js} | 2 +- ...0-js-tooling-research.md.62856b03.lean.js} | 2 +- ...2022-08-08-linter-research.md.2f4287c0.js} | 2 +- ...08-08-linter-research.md.2f4287c0.lean.js} | 2 +- ..._2023-11-07-announcing-oxc.md.899bda23.js} | 2 +- ...-11-07-announcing-oxc.md.899bda23.lean.js} | 2 +- ...23-11-08-announcing-oxlint.md.9976ed49.js} | 2 +- ...-08-announcing-oxlint.md.9976ed49.lean.js} | 2 +- ....a20bd3b9.js => blog_index.md.e44a5676.js} | 2 +- ...lean.js => blog_index.md.e44a5676.lean.js} | 2 +- assets/chunks/@localSearchIndexja.fe90f88e.js | 1 + ...f5f162.js => VPLocalSearchBox.7afa7cdc.js} | 6 +- .../{theme.996dd6ef.js => theme.be7b3ccb.js} | 2 +- ...=> docs_contribute_codegen.md.5da044b1.js} | 2 +- ...cs_contribute_codegen.md.5da044b1.lean.js} | 2 +- ...ocs_contribute_development.md.5b7d3e4f.js} | 2 +- ...ontribute_development.md.5b7d3e4f.lean.js} | 2 +- ... docs_contribute_formatter.md.d7a59564.js} | 2 +- ..._contribute_formatter.md.d7a59564.lean.js} | 2 +- ...cs_contribute_introduction.md.5c1fbb9f.js} | 2 +- ...ntribute_introduction.md.5c1fbb9f.lean.js} | 2 +- ... => docs_contribute_linter.md.15e43eac.js} | 2 +- ...ocs_contribute_linter.md.15e43eac.lean.js} | 2 +- ...> docs_contribute_minifier.md.15260fdc.js} | 2 +- ...s_contribute_minifier.md.15260fdc.lean.js} | 2 +- ... => docs_contribute_parser.md.bb1bc2fa.js} | 2 +- ...ocs_contribute_parser.md.bb1bc2fa.lean.js} | 2 +- ...ocs_contribute_performance.md.4ff20e3f.js} | 2 +- ...ontribute_performance.md.4ff20e3f.lean.js} | 2 +- ...> docs_contribute_prettier.md.d0e1731d.js} | 2 +- ...s_contribute_prettier.md.d0e1731d.lean.js} | 2 +- ...> docs_contribute_resolver.md.841f60b8.js} | 2 +- ...s_contribute_resolver.md.841f60b8.lean.js} | 2 +- ...> docs_contribute_showcase.md.030540b5.js} | 2 +- ...s_contribute_showcase.md.030540b5.lean.js} | 2 +- ...ocs_contribute_transformer.md.16592f8f.js} | 2 +- ...ontribute_transformer.md.16592f8f.lean.js} | 2 +- ... => docs_contribute_vscode.md.4c08a98c.js} | 2 +- ...ocs_contribute_vscode.md.4c08a98c.lean.js} | 2 +- ...s => docs_guide_benchmarks.md.f62b4c74.js} | 2 +- ...docs_guide_benchmarks.md.f62b4c74.lean.js} | 2 +- ...=> docs_guide_introduction.md.62db88d2.js} | 2 +- ...cs_guide_introduction.md.62db88d2.lean.js} | 2 +- ...s => docs_guide_philosophy.md.2be5f5f9.js} | 2 +- ...docs_guide_philosophy.md.2be5f5f9.lean.js} | 2 +- ...ocs_guide_usage_benchmarks.md.64291503.js} | 2 +- ...uide_usage_benchmarks.md.64291503.lean.js} | 2 +- ...=> docs_guide_usage_linter.md.45344b17.js} | 4 +- ...cs_guide_usage_linter.md.45344b17.lean.js} | 2 +- ...=> docs_guide_usage_parser.md.879fa23a.js} | 2 +- ...cs_guide_usage_parser.md.879fa23a.lean.js} | 2 +- ...ocs_guide_usage_philosophy.md.57f130a7.js} | 2 +- ...uide_usage_philosophy.md.57f130a7.lean.js} | 2 +- ... docs_guide_usage_resolver.md.c3f62e0b.js} | 4 +- ..._guide_usage_resolver.md.c3f62e0b.lean.js} | 2 +- ...arn_architecture_formatter.md.b8f08359.js} | 2 +- ...rchitecture_formatter.md.b8f08359.lean.js} | 2 +- ..._architecture_introduction.md.5fdf9f2b.js} | 2 +- ...itecture_introduction.md.5fdf9f2b.lean.js} | 2 +- ..._learn_architecture_linter.md.2f9c0c5d.js} | 2 +- ...n_architecture_linter.md.2f9c0c5d.lean.js} | 2 +- ...earn_architecture_minifier.md.661eaafc.js} | 2 +- ...architecture_minifier.md.661eaafc.lean.js} | 2 +- ..._learn_architecture_parser.md.4234e563.js} | 2 +- ...n_architecture_parser.md.4234e563.lean.js} | 2 +- ...earn_architecture_resolver.md.cfbd489f.js} | 2 +- ...architecture_resolver.md.cfbd489f.lean.js} | 2 +- ...n_architecture_transformer.md.48cf4290.js} | 2 +- ...hitecture_transformer.md.48cf4290.lean.js} | 2 +- ...s_learn_ecmascript_grammar.md.4dc3d487.js} | 2 +- ...rn_ecmascript_grammar.md.4dc3d487.lean.js} | 2 +- ...docs_learn_ecmascript_spec.md.c10ef8af.js} | 2 +- ...learn_ecmascript_spec.md.c10ef8af.lean.js} | 2 +- ...js => docs_learn_ecosystem.md.81955525.js} | 2 +- ... docs_learn_ecosystem.md.81955525.lean.js} | 2 +- ... => docs_learn_performance.md.33aec0bd.js} | 2 +- ...ocs_learn_performance.md.33aec0bd.lean.js} | 2 +- ...s => docs_learn_references.md.62c70fb2.js} | 2 +- ...docs_learn_references.md.62c70fb2.lean.js} | 2 +- assets/index.md.b39570fc.js | 1 - assets/index.md.b39570fc.lean.js | 1 - assets/index.md.dc0fe200.js | 1 + assets/index.md.dc0fe200.lean.js | 1 + ...2-02-10-js-tooling-research.md.cbcccc07.js | 1 + ...10-js-tooling-research.md.cbcccc07.lean.js | 1 + ..._2022-08-08-linter-research.md.50a5b9a3.js | 1 + ...-08-08-linter-research.md.50a5b9a3.lean.js | 1 + ...g_2023-11-07-announcing-oxc.md.d6db77d4.js | 1 + ...3-11-07-announcing-oxc.md.d6db77d4.lean.js | 1 + ...023-11-08-announcing-oxlint.md.e3b3e413.js | 1 + ...1-08-announcing-oxlint.md.e3b3e413.lean.js | 1 + assets/ja_blog_index.md.3de8b9cb.js | 7 + assets/ja_blog_index.md.3de8b9cb.lean.js | 1 + .../ja_docs_contribute_codegen.md.837767d8.js | 1 + ...ocs_contribute_codegen.md.837767d8.lean.js | 1 + ...docs_contribute_development.md.599cc7ae.js | 1 + ...contribute_development.md.599cc7ae.lean.js | 1 + ...a_docs_contribute_formatter.md.9f37d059.js | 1 + ...s_contribute_formatter.md.9f37d059.lean.js | 1 + ...ocs_contribute_introduction.md.cb17b786.js | 1 + ...ontribute_introduction.md.cb17b786.lean.js | 1 + .../ja_docs_contribute_linter.md.170c9f93.js | 9 + ...docs_contribute_linter.md.170c9f93.lean.js | 1 + ...ja_docs_contribute_minifier.md.24e36ab1.js | 1 + ...cs_contribute_minifier.md.24e36ab1.lean.js | 1 + .../ja_docs_contribute_parser.md.242f07ac.js | 1 + ...docs_contribute_parser.md.242f07ac.lean.js | 1 + ...docs_contribute_performance.md.b4a85950.js | 13 + ...contribute_performance.md.b4a85950.lean.js | 1 + ...ja_docs_contribute_prettier.md.0fcbc08e.js | 1 + ...cs_contribute_prettier.md.0fcbc08e.lean.js | 1 + ...ja_docs_contribute_resolver.md.a7d71247.js | 1 + ...cs_contribute_resolver.md.a7d71247.lean.js | 1 + ...ja_docs_contribute_showcase.md.2c987012.js | 1 + ...cs_contribute_showcase.md.2c987012.lean.js | 1 + ...docs_contribute_transformer.md.f632fd4e.js | 1 + ...contribute_transformer.md.f632fd4e.lean.js | 1 + .../ja_docs_contribute_vscode.md.f0821a79.js | 1 + ...docs_contribute_vscode.md.f0821a79.lean.js | 1 + .../ja_docs_guide_benchmarks.md.eef70013.js | 1 + ..._docs_guide_benchmarks.md.eef70013.lean.js | 1 + .../ja_docs_guide_introduction.md.e93c04aa.js | 1 + ...ocs_guide_introduction.md.e93c04aa.lean.js | 1 + .../ja_docs_guide_philosophy.md.53319563.js | 1 + ..._docs_guide_philosophy.md.53319563.lean.js | 1 + ...docs_guide_usage_benchmarks.md.333e4a26.js | 1 + ...guide_usage_benchmarks.md.333e4a26.lean.js | 1 + .../ja_docs_guide_usage_linter.md.6d7c833c.js | 77 +++ ...ocs_guide_usage_linter.md.6d7c833c.lean.js | 1 + .../ja_docs_guide_usage_parser.md.0185a423.js | 1 + ...ocs_guide_usage_parser.md.0185a423.lean.js | 1 + ...docs_guide_usage_philosophy.md.cc97835a.js | 1 + ...guide_usage_philosophy.md.cc97835a.lean.js | 1 + ...a_docs_guide_usage_resolver.md.8d81200e.js | 33 ++ ...s_guide_usage_resolver.md.8d81200e.lean.js | 1 + ...earn_architecture_formatter.md.e9e4c97a.js | 1 + ...architecture_formatter.md.e9e4c97a.lean.js | 1 + ...n_architecture_introduction.md.45104dba.js | 1 + ...hitecture_introduction.md.45104dba.lean.js | 1 + ...s_learn_architecture_linter.md.a9524693.js | 1 + ...rn_architecture_linter.md.a9524693.lean.js | 1 + ...learn_architecture_minifier.md.6c9d6ee0.js | 1 + ..._architecture_minifier.md.6c9d6ee0.lean.js | 1 + ...s_learn_architecture_parser.md.f8c02391.js | 1 + ...rn_architecture_parser.md.f8c02391.lean.js | 1 + ...learn_architecture_resolver.md.751b4d95.js | 1 + ..._architecture_resolver.md.751b4d95.lean.js | 1 + ...rn_architecture_transformer.md.ea5219ab.js | 1 + ...chitecture_transformer.md.ea5219ab.lean.js | 1 + ...cs_learn_ecmascript_grammar.md.53196869.js | 401 ++++++++++++++ ...arn_ecmascript_grammar.md.53196869.lean.js | 1 + ..._docs_learn_ecmascript_spec.md.550d6650.js | 57 ++ ..._learn_ecmascript_spec.md.550d6650.lean.js | 1 + assets/ja_docs_learn_ecosystem.md.c9d3c686.js | 1 + ...a_docs_learn_ecosystem.md.c9d3c686.lean.js | 1 + .../ja_docs_learn_performance.md.239666b7.js | 469 ++++++++++++++++ ...docs_learn_performance.md.239666b7.lean.js | 1 + .../ja_docs_learn_references.md.fa521212.js | 1 + ..._docs_learn_references.md.fa521212.lean.js | 1 + assets/ja_index.md.2f58577e.js | 1 + assets/ja_index.md.2f58577e.lean.js | 1 + ...{style.82c265ef.css => style.dd858c05.css} | 2 +- blog/2022-02-10-js-tooling-research.html | 14 +- blog/2022-08-08-linter-research.html | 14 +- blog/2023-11-07-announcing-oxc.html | 14 +- blog/2023-11-08-announcing-oxlint.html | 14 +- blog/index.html | 16 +- docs/contribute/codegen.html | 14 +- docs/contribute/development.html | 14 +- docs/contribute/formatter.html | 14 +- docs/contribute/introduction.html | 14 +- docs/contribute/linter.html | 16 +- docs/contribute/minifier.html | 14 +- docs/contribute/parser.html | 14 +- docs/contribute/performance.html | 16 +- docs/contribute/prettier.html | 14 +- docs/contribute/resolver.html | 14 +- docs/contribute/showcase.html | 14 +- docs/contribute/transformer.html | 14 +- docs/contribute/vscode.html | 14 +- docs/guide/benchmarks.html | 14 +- docs/guide/introduction.html | 14 +- docs/guide/philosophy.html | 14 +- docs/guide/usage/benchmarks.html | 14 +- docs/guide/usage/linter.html | 16 +- docs/guide/usage/parser.html | 14 +- docs/guide/usage/philosophy.html | 14 +- docs/guide/usage/resolver.html | 16 +- docs/learn/architecture/formatter.html | 14 +- docs/learn/architecture/introduction.html | 14 +- docs/learn/architecture/linter.html | 14 +- docs/learn/architecture/minifier.html | 14 +- docs/learn/architecture/parser.html | 14 +- docs/learn/architecture/resolver.html | 14 +- docs/learn/architecture/transformer.html | 14 +- docs/learn/ecmascript/grammar.html | 16 +- docs/learn/ecmascript/spec.html | 16 +- docs/learn/ecosystem.html | 14 +- docs/learn/performance.html | 16 +- docs/learn/references.html | 14 +- hashmap.json | 2 +- index.html | 14 +- ja/blog/2022-02-10-js-tooling-research.html | 37 ++ ja/blog/2022-08-08-linter-research.html | 37 ++ ja/blog/2023-11-07-announcing-oxc.html | 37 ++ ja/blog/2023-11-08-announcing-oxlint.html | 37 ++ ja/blog/index.html | 43 ++ ja/docs/contribute/codegen.html | 37 ++ ja/docs/contribute/development.html | 37 ++ ja/docs/contribute/formatter.html | 37 ++ ja/docs/contribute/introduction.html | 37 ++ ja/docs/contribute/linter.html | 45 ++ ja/docs/contribute/minifier.html | 37 ++ ja/docs/contribute/parser.html | 37 ++ ja/docs/contribute/performance.html | 49 ++ ja/docs/contribute/prettier.html | 37 ++ ja/docs/contribute/resolver.html | 37 ++ ja/docs/contribute/showcase.html | 37 ++ ja/docs/contribute/transformer.html | 37 ++ ja/docs/contribute/vscode.html | 37 ++ ja/docs/guide/benchmarks.html | 37 ++ ja/docs/guide/introduction.html | 37 ++ ja/docs/guide/philosophy.html | 37 ++ ja/docs/guide/usage/benchmarks.html | 37 ++ ja/docs/guide/usage/linter.html | 113 ++++ ja/docs/guide/usage/parser.html | 37 ++ ja/docs/guide/usage/philosophy.html | 37 ++ ja/docs/guide/usage/resolver.html | 69 +++ ja/docs/learn/architecture/formatter.html | 37 ++ ja/docs/learn/architecture/introduction.html | 37 ++ ja/docs/learn/architecture/linter.html | 37 ++ ja/docs/learn/architecture/minifier.html | 37 ++ ja/docs/learn/architecture/parser.html | 37 ++ ja/docs/learn/architecture/resolver.html | 37 ++ ja/docs/learn/architecture/transformer.html | 37 ++ ja/docs/learn/ecmascript/grammar.html | 437 +++++++++++++++ ja/docs/learn/ecmascript/spec.html | 93 ++++ ja/docs/learn/ecosystem.html | 37 ++ ja/docs/learn/performance.html | 505 ++++++++++++++++++ ja/docs/learn/references.html | 37 ++ ja/index.html | 37 ++ 244 files changed, 4011 insertions(+), 373 deletions(-) create mode 100644 assets/app.a465d4fe.js delete mode 100644 assets/app.ae722434.js rename assets/{blog_2022-02-10-js-tooling-research.md.e5bf29cc.js => blog_2022-02-10-js-tooling-research.md.62856b03.js} (89%) rename assets/{blog_2022-02-10-js-tooling-research.md.e5bf29cc.lean.js => blog_2022-02-10-js-tooling-research.md.62856b03.lean.js} (89%) rename assets/{blog_2022-08-08-linter-research.md.7364aab2.lean.js => blog_2022-08-08-linter-research.md.2f4287c0.js} (89%) rename assets/{blog_2022-08-08-linter-research.md.7364aab2.js => blog_2022-08-08-linter-research.md.2f4287c0.lean.js} (89%) rename assets/{blog_2023-11-07-announcing-oxc.md.3a2f4a1d.js => blog_2023-11-07-announcing-oxc.md.899bda23.js} (88%) rename assets/{blog_2023-11-07-announcing-oxc.md.3a2f4a1d.lean.js => blog_2023-11-07-announcing-oxc.md.899bda23.lean.js} (88%) rename assets/{blog_2023-11-08-announcing-oxlint.md.706d95fb.js => blog_2023-11-08-announcing-oxlint.md.9976ed49.js} (89%) rename assets/{blog_2023-11-08-announcing-oxlint.md.706d95fb.lean.js => blog_2023-11-08-announcing-oxlint.md.9976ed49.lean.js} (89%) rename assets/{blog_index.md.a20bd3b9.js => blog_index.md.e44a5676.js} (99%) rename assets/{blog_index.md.a20bd3b9.lean.js => blog_index.md.e44a5676.lean.js} (84%) create mode 100644 assets/chunks/@localSearchIndexja.fe90f88e.js rename assets/chunks/{VPLocalSearchBox.11f5f162.js => VPLocalSearchBox.7afa7cdc.js} (93%) rename assets/chunks/{theme.996dd6ef.js => theme.be7b3ccb.js} (99%) rename assets/{docs_contribute_codegen.md.038d4799.js => docs_contribute_codegen.md.5da044b1.js} (89%) rename assets/{docs_contribute_codegen.md.038d4799.lean.js => docs_contribute_codegen.md.5da044b1.lean.js} (89%) rename assets/{docs_contribute_development.md.260bd01b.js => docs_contribute_development.md.5b7d3e4f.js} (99%) rename assets/{docs_contribute_development.md.260bd01b.lean.js => docs_contribute_development.md.5b7d3e4f.lean.js} (87%) rename assets/{docs_contribute_formatter.md.c3e52bdc.js => docs_contribute_formatter.md.d7a59564.js} (94%) rename assets/{docs_contribute_formatter.md.c3e52bdc.lean.js => docs_contribute_formatter.md.d7a59564.lean.js} (94%) rename assets/{docs_contribute_introduction.md.b8b3797b.js => docs_contribute_introduction.md.5c1fbb9f.js} (98%) rename assets/{docs_contribute_introduction.md.b8b3797b.lean.js => docs_contribute_introduction.md.5c1fbb9f.lean.js} (87%) rename assets/{docs_contribute_linter.md.b1685e29.js => docs_contribute_linter.md.15e43eac.js} (98%) rename assets/{docs_contribute_linter.md.b1685e29.lean.js => docs_contribute_linter.md.15e43eac.lean.js} (86%) rename assets/{docs_contribute_minifier.md.8673c15a.js => docs_contribute_minifier.md.15260fdc.js} (96%) rename assets/{docs_contribute_minifier.md.8673c15a.lean.js => docs_contribute_minifier.md.15260fdc.lean.js} (96%) rename assets/{docs_contribute_parser.md.dea12757.js => docs_contribute_parser.md.bb1bc2fa.js} (97%) rename assets/{docs_contribute_parser.md.dea12757.lean.js => docs_contribute_parser.md.bb1bc2fa.lean.js} (86%) rename assets/{docs_contribute_performance.md.32708dc6.js => docs_contribute_performance.md.4ff20e3f.js} (99%) rename assets/{docs_contribute_performance.md.32708dc6.lean.js => docs_contribute_performance.md.4ff20e3f.lean.js} (87%) rename assets/{docs_contribute_prettier.md.ed67e286.js => docs_contribute_prettier.md.d0e1731d.js} (89%) rename assets/{docs_contribute_prettier.md.ed67e286.lean.js => docs_contribute_prettier.md.d0e1731d.lean.js} (89%) rename assets/{docs_contribute_resolver.md.668d9bbb.js => docs_contribute_resolver.md.841f60b8.js} (94%) rename assets/{docs_contribute_resolver.md.668d9bbb.lean.js => docs_contribute_resolver.md.841f60b8.lean.js} (94%) rename assets/{docs_contribute_showcase.md.04c27e6a.js => docs_contribute_showcase.md.030540b5.js} (93%) rename assets/{docs_contribute_showcase.md.04c27e6a.lean.js => docs_contribute_showcase.md.030540b5.lean.js} (93%) rename assets/{docs_contribute_transformer.md.d026b587.js => docs_contribute_transformer.md.16592f8f.js} (93%) rename assets/{docs_contribute_transformer.md.d026b587.lean.js => docs_contribute_transformer.md.16592f8f.lean.js} (93%) rename assets/{docs_contribute_vscode.md.dfac2403.js => docs_contribute_vscode.md.4c08a98c.js} (95%) rename assets/{docs_contribute_vscode.md.dfac2403.lean.js => docs_contribute_vscode.md.4c08a98c.lean.js} (86%) rename assets/{docs_guide_benchmarks.md.426cf9b1.js => docs_guide_benchmarks.md.f62b4c74.js} (90%) rename assets/{docs_guide_benchmarks.md.426cf9b1.lean.js => docs_guide_benchmarks.md.f62b4c74.lean.js} (90%) rename assets/{docs_guide_introduction.md.138c6418.js => docs_guide_introduction.md.62db88d2.js} (93%) rename assets/{docs_guide_introduction.md.138c6418.lean.js => docs_guide_introduction.md.62db88d2.lean.js} (79%) rename assets/{docs_guide_philosophy.md.d9540af9.js => docs_guide_philosophy.md.2be5f5f9.js} (90%) rename assets/{docs_guide_philosophy.md.d9540af9.lean.js => docs_guide_philosophy.md.2be5f5f9.lean.js} (90%) rename assets/{docs_guide_usage_benchmarks.md.cf30d29b.js => docs_guide_usage_benchmarks.md.64291503.js} (80%) rename assets/{docs_guide_usage_benchmarks.md.cf30d29b.lean.js => docs_guide_usage_benchmarks.md.64291503.lean.js} (80%) rename assets/{docs_guide_usage_linter.md.be302645.js => docs_guide_usage_linter.md.45344b17.js} (95%) rename assets/{docs_guide_usage_linter.md.be302645.lean.js => docs_guide_usage_linter.md.45344b17.lean.js} (75%) rename assets/{docs_guide_usage_parser.md.a90d6882.js => docs_guide_usage_parser.md.879fa23a.js} (93%) rename assets/{docs_guide_usage_parser.md.a90d6882.lean.js => docs_guide_usage_parser.md.879fa23a.lean.js} (56%) rename assets/{docs_guide_usage_philosophy.md.7fb423b5.js => docs_guide_usage_philosophy.md.57f130a7.js} (80%) rename assets/{docs_guide_usage_philosophy.md.7fb423b5.lean.js => docs_guide_usage_philosophy.md.57f130a7.lean.js} (80%) rename assets/{docs_guide_usage_resolver.md.60e2e81f.js => docs_guide_usage_resolver.md.c3f62e0b.js} (96%) rename assets/{docs_guide_usage_resolver.md.60e2e81f.lean.js => docs_guide_usage_resolver.md.c3f62e0b.lean.js} (63%) rename assets/{docs_learn_architecture_formatter.md.80783d23.js => docs_learn_architecture_formatter.md.b8f08359.js} (90%) rename assets/{docs_learn_architecture_formatter.md.80783d23.lean.js => docs_learn_architecture_formatter.md.b8f08359.lean.js} (90%) rename assets/{docs_learn_architecture_introduction.md.da9ddefa.js => docs_learn_architecture_introduction.md.5fdf9f2b.js} (90%) rename assets/{docs_learn_architecture_introduction.md.da9ddefa.lean.js => docs_learn_architecture_introduction.md.5fdf9f2b.lean.js} (90%) rename assets/{docs_learn_architecture_linter.md.12e3a00b.js => docs_learn_architecture_linter.md.2f9c0c5d.js} (91%) rename assets/{docs_learn_architecture_linter.md.12e3a00b.lean.js => docs_learn_architecture_linter.md.2f9c0c5d.lean.js} (91%) rename assets/{docs_learn_architecture_minifier.md.bc5e2ca4.js => docs_learn_architecture_minifier.md.661eaafc.js} (80%) rename assets/{docs_learn_architecture_minifier.md.bc5e2ca4.lean.js => docs_learn_architecture_minifier.md.661eaafc.lean.js} (80%) rename assets/{docs_learn_architecture_parser.md.4ee292fb.js => docs_learn_architecture_parser.md.4234e563.js} (97%) rename assets/{docs_learn_architecture_parser.md.4ee292fb.lean.js => docs_learn_architecture_parser.md.4234e563.lean.js} (87%) rename assets/{docs_learn_architecture_resolver.md.06afd529.js => docs_learn_architecture_resolver.md.cfbd489f.js} (90%) rename assets/{docs_learn_architecture_resolver.md.06afd529.lean.js => docs_learn_architecture_resolver.md.cfbd489f.lean.js} (90%) rename assets/{docs_learn_architecture_transformer.md.8a48936b.js => docs_learn_architecture_transformer.md.48cf4290.js} (90%) rename assets/{docs_learn_architecture_transformer.md.8a48936b.lean.js => docs_learn_architecture_transformer.md.48cf4290.lean.js} (90%) rename assets/{docs_learn_ecmascript_grammar.md.e9677e24.js => docs_learn_ecmascript_grammar.md.4dc3d487.js} (99%) rename assets/{docs_learn_ecmascript_grammar.md.e9677e24.lean.js => docs_learn_ecmascript_grammar.md.4dc3d487.lean.js} (87%) rename assets/{docs_learn_ecmascript_spec.md.03200411.js => docs_learn_ecmascript_spec.md.c10ef8af.js} (99%) rename assets/{docs_learn_ecmascript_spec.md.03200411.lean.js => docs_learn_ecmascript_spec.md.c10ef8af.lean.js} (87%) rename assets/{docs_learn_ecosystem.md.8c414ce3.js => docs_learn_ecosystem.md.81955525.js} (96%) rename assets/{docs_learn_ecosystem.md.8c414ce3.lean.js => docs_learn_ecosystem.md.81955525.lean.js} (86%) rename assets/{docs_learn_performance.md.5eb36f6e.js => docs_learn_performance.md.33aec0bd.js} (99%) rename assets/{docs_learn_performance.md.5eb36f6e.lean.js => docs_learn_performance.md.33aec0bd.lean.js} (86%) rename assets/{docs_learn_references.md.ff70791a.js => docs_learn_references.md.62c70fb2.js} (98%) rename assets/{docs_learn_references.md.ff70791a.lean.js => docs_learn_references.md.62c70fb2.lean.js} (86%) delete mode 100644 assets/index.md.b39570fc.js delete mode 100644 assets/index.md.b39570fc.lean.js create mode 100644 assets/index.md.dc0fe200.js create mode 100644 assets/index.md.dc0fe200.lean.js create mode 100644 assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.js create mode 100644 assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.lean.js create mode 100644 assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.js create mode 100644 assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.lean.js create mode 100644 assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.js create mode 100644 assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.lean.js create mode 100644 assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.js create mode 100644 assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.lean.js create mode 100644 assets/ja_blog_index.md.3de8b9cb.js create mode 100644 assets/ja_blog_index.md.3de8b9cb.lean.js create mode 100644 assets/ja_docs_contribute_codegen.md.837767d8.js create mode 100644 assets/ja_docs_contribute_codegen.md.837767d8.lean.js create mode 100644 assets/ja_docs_contribute_development.md.599cc7ae.js create mode 100644 assets/ja_docs_contribute_development.md.599cc7ae.lean.js create mode 100644 assets/ja_docs_contribute_formatter.md.9f37d059.js create mode 100644 assets/ja_docs_contribute_formatter.md.9f37d059.lean.js create mode 100644 assets/ja_docs_contribute_introduction.md.cb17b786.js create mode 100644 assets/ja_docs_contribute_introduction.md.cb17b786.lean.js create mode 100644 assets/ja_docs_contribute_linter.md.170c9f93.js create mode 100644 assets/ja_docs_contribute_linter.md.170c9f93.lean.js create mode 100644 assets/ja_docs_contribute_minifier.md.24e36ab1.js create mode 100644 assets/ja_docs_contribute_minifier.md.24e36ab1.lean.js create mode 100644 assets/ja_docs_contribute_parser.md.242f07ac.js create mode 100644 assets/ja_docs_contribute_parser.md.242f07ac.lean.js create mode 100644 assets/ja_docs_contribute_performance.md.b4a85950.js create mode 100644 assets/ja_docs_contribute_performance.md.b4a85950.lean.js create mode 100644 assets/ja_docs_contribute_prettier.md.0fcbc08e.js create mode 100644 assets/ja_docs_contribute_prettier.md.0fcbc08e.lean.js create mode 100644 assets/ja_docs_contribute_resolver.md.a7d71247.js create mode 100644 assets/ja_docs_contribute_resolver.md.a7d71247.lean.js create mode 100644 assets/ja_docs_contribute_showcase.md.2c987012.js create mode 100644 assets/ja_docs_contribute_showcase.md.2c987012.lean.js create mode 100644 assets/ja_docs_contribute_transformer.md.f632fd4e.js create mode 100644 assets/ja_docs_contribute_transformer.md.f632fd4e.lean.js create mode 100644 assets/ja_docs_contribute_vscode.md.f0821a79.js create mode 100644 assets/ja_docs_contribute_vscode.md.f0821a79.lean.js create mode 100644 assets/ja_docs_guide_benchmarks.md.eef70013.js create mode 100644 assets/ja_docs_guide_benchmarks.md.eef70013.lean.js create mode 100644 assets/ja_docs_guide_introduction.md.e93c04aa.js create mode 100644 assets/ja_docs_guide_introduction.md.e93c04aa.lean.js create mode 100644 assets/ja_docs_guide_philosophy.md.53319563.js create mode 100644 assets/ja_docs_guide_philosophy.md.53319563.lean.js create mode 100644 assets/ja_docs_guide_usage_benchmarks.md.333e4a26.js create mode 100644 assets/ja_docs_guide_usage_benchmarks.md.333e4a26.lean.js create mode 100644 assets/ja_docs_guide_usage_linter.md.6d7c833c.js create mode 100644 assets/ja_docs_guide_usage_linter.md.6d7c833c.lean.js create mode 100644 assets/ja_docs_guide_usage_parser.md.0185a423.js create mode 100644 assets/ja_docs_guide_usage_parser.md.0185a423.lean.js create mode 100644 assets/ja_docs_guide_usage_philosophy.md.cc97835a.js create mode 100644 assets/ja_docs_guide_usage_philosophy.md.cc97835a.lean.js create mode 100644 assets/ja_docs_guide_usage_resolver.md.8d81200e.js create mode 100644 assets/ja_docs_guide_usage_resolver.md.8d81200e.lean.js create mode 100644 assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.js create mode 100644 assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.lean.js create mode 100644 assets/ja_docs_learn_architecture_introduction.md.45104dba.js create mode 100644 assets/ja_docs_learn_architecture_introduction.md.45104dba.lean.js create mode 100644 assets/ja_docs_learn_architecture_linter.md.a9524693.js create mode 100644 assets/ja_docs_learn_architecture_linter.md.a9524693.lean.js create mode 100644 assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.js create mode 100644 assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.lean.js create mode 100644 assets/ja_docs_learn_architecture_parser.md.f8c02391.js create mode 100644 assets/ja_docs_learn_architecture_parser.md.f8c02391.lean.js create mode 100644 assets/ja_docs_learn_architecture_resolver.md.751b4d95.js create mode 100644 assets/ja_docs_learn_architecture_resolver.md.751b4d95.lean.js create mode 100644 assets/ja_docs_learn_architecture_transformer.md.ea5219ab.js create mode 100644 assets/ja_docs_learn_architecture_transformer.md.ea5219ab.lean.js create mode 100644 assets/ja_docs_learn_ecmascript_grammar.md.53196869.js create mode 100644 assets/ja_docs_learn_ecmascript_grammar.md.53196869.lean.js create mode 100644 assets/ja_docs_learn_ecmascript_spec.md.550d6650.js create mode 100644 assets/ja_docs_learn_ecmascript_spec.md.550d6650.lean.js create mode 100644 assets/ja_docs_learn_ecosystem.md.c9d3c686.js create mode 100644 assets/ja_docs_learn_ecosystem.md.c9d3c686.lean.js create mode 100644 assets/ja_docs_learn_performance.md.239666b7.js create mode 100644 assets/ja_docs_learn_performance.md.239666b7.lean.js create mode 100644 assets/ja_docs_learn_references.md.fa521212.js create mode 100644 assets/ja_docs_learn_references.md.fa521212.lean.js create mode 100644 assets/ja_index.md.2f58577e.js create mode 100644 assets/ja_index.md.2f58577e.lean.js rename assets/{style.82c265ef.css => style.dd858c05.css} (99%) create mode 100644 ja/blog/2022-02-10-js-tooling-research.html create mode 100644 ja/blog/2022-08-08-linter-research.html create mode 100644 ja/blog/2023-11-07-announcing-oxc.html create mode 100644 ja/blog/2023-11-08-announcing-oxlint.html create mode 100644 ja/blog/index.html create mode 100644 ja/docs/contribute/codegen.html create mode 100644 ja/docs/contribute/development.html create mode 100644 ja/docs/contribute/formatter.html create mode 100644 ja/docs/contribute/introduction.html create mode 100644 ja/docs/contribute/linter.html create mode 100644 ja/docs/contribute/minifier.html create mode 100644 ja/docs/contribute/parser.html create mode 100644 ja/docs/contribute/performance.html create mode 100644 ja/docs/contribute/prettier.html create mode 100644 ja/docs/contribute/resolver.html create mode 100644 ja/docs/contribute/showcase.html create mode 100644 ja/docs/contribute/transformer.html create mode 100644 ja/docs/contribute/vscode.html create mode 100644 ja/docs/guide/benchmarks.html create mode 100644 ja/docs/guide/introduction.html create mode 100644 ja/docs/guide/philosophy.html create mode 100644 ja/docs/guide/usage/benchmarks.html create mode 100644 ja/docs/guide/usage/linter.html create mode 100644 ja/docs/guide/usage/parser.html create mode 100644 ja/docs/guide/usage/philosophy.html create mode 100644 ja/docs/guide/usage/resolver.html create mode 100644 ja/docs/learn/architecture/formatter.html create mode 100644 ja/docs/learn/architecture/introduction.html create mode 100644 ja/docs/learn/architecture/linter.html create mode 100644 ja/docs/learn/architecture/minifier.html create mode 100644 ja/docs/learn/architecture/parser.html create mode 100644 ja/docs/learn/architecture/resolver.html create mode 100644 ja/docs/learn/architecture/transformer.html create mode 100644 ja/docs/learn/ecmascript/grammar.html create mode 100644 ja/docs/learn/ecmascript/spec.html create mode 100644 ja/docs/learn/ecosystem.html create mode 100644 ja/docs/learn/performance.html create mode 100644 ja/docs/learn/references.html create mode 100644 ja/index.html diff --git a/404.html b/404.html index 14bf1b162e..8d97e66bb0 100644 --- a/404.html +++ b/404.html @@ -1,13 +1,13 @@ - + 404 | The JavaScript Oxidation Compiler - + - + @@ -26,8 +26,8 @@ -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
+ \ No newline at end of file diff --git a/assets/app.a465d4fe.js b/assets/app.a465d4fe.js new file mode 100644 index 0000000000..81b4915dc8 --- /dev/null +++ b/assets/app.a465d4fe.js @@ -0,0 +1 @@ +import{d as A,u as y,g as _,o as n,c as o,F as b,D,k as c,_ as w,h as S,j as x,y as E,t as f,e as R,s as v,a3 as T,a4 as M,a5 as $,a6 as F,a7 as H,a8 as I,a9 as O,aa as V,ab as j,ac as N,X as G,ad as U,ae as W,af as X,ag as q}from"./chunks/framework.725e5b03.js";import{t as z}from"./chunks/theme.be7b3ccb.js";import{T as J}from"./chunks/team.fcc5c8bb.js";const K={class:"AppBadgeList"},Q=["src","alt"],Y=A({__name:"AppBadgeList",setup(e){const t=y(),a=_(()=>t.frontmatter.value.badges);return(s,h)=>(n(),o("ul",K,[(n(!0),o(b,null,D(a.value,r=>(n(),o("li",{key:r.src,class:"badge"},[c("img",{src:r.src,alt:r.alt},null,8,Q)]))),128))]))}});const Z=w(Y,[["__scopeId","data-v-095e1027"]]),ee={class:"AppBlogPostHeader"},te={key:0},ae=["datetime"],se={class:"authors"},ne=["src","alt"],oe={class:"author-text"},re=["href"],le={key:1,class:"author-name"},ce={class:"author-title"},ie=A({__name:"AppBlogPostHeader",setup(e){const t=y(),a=_(()=>t.frontmatter.value.title),s=_(()=>t.lang.value),h=_(()=>t.frontmatter.value.authors.flatMap(i=>{const l=J[i];if(l){const{avatar:p,links:u,name:d,title:g}=l,{link:C=""}=(u==null?void 0:u.find(L=>L.link.startsWith("https://github.com/")))??{};return[{avatar:p,link:C,name:d,title:g}]}return[]})),r=_(()=>{const l=t.page.value.filePath.match(/blog\/(?\d{4}-\d{2}-\d{2})-.*$/),{date:p}=(l==null?void 0:l.groups)??{};return p?new Date(p):null}),P=_(()=>{var i;return((i=r.value)==null?void 0:i.toISOString())??null}),B=S("");return x(()=>{E(()=>{r.value&&(B.value=new Intl.DateTimeFormat(s.value,{dateStyle:"long"}).format(r.value))})}),(i,l)=>(n(),o("header",ee,[c("h1",null,f(a.value),1),P.value?(n(),o("p",te,[c("time",{datetime:P.value},f(B.value),9,ae)])):R("",!0),c("ul",se,[(n(!0),o(b,null,D(h.value,({avatar:p,link:u,name:d,title:g})=>(n(),o("li",{key:d,class:"author"},[c("img",{src:p,alt:d,class:"author-avatar"},null,8,ne),c("p",oe,[u?(n(),o("a",{key:0,href:u,target:"_blank",class:"author-name"},f(d),9,re)):(n(),o("span",le,f(d),1)),c("span",ce,f(g),1)])]))),128))])]))}});const pe=w(ie,[["__scopeId","data-v-f35b0a27"]]),ue={extends:z,async enhanceApp({app:e}){e.component("AppBadgeList",Z),e.component("AppBlogPostHeader",pe)}};function k(e){if(e.extends){const t=k(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const m=k(ue),de=A({name:"VitePressApp",setup(){const{site:e}=y();return x(()=>{E(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),U(),W(),X(),m.setup&&m.setup(),()=>q(m.Layout)}});async function _e(){const e=he(),t=me();t.provide(M,e);const a=$(e.route);return t.provide(F,a),t.component("Content",H),t.component("ClientOnly",I),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),m.enhanceApp&&await m.enhanceApp({app:t,router:e,siteData:O}),{app:t,router:e,data:a}}function me(){return V(de)}function he(){let e=v,t;return j(a=>{let s=N(a),h=null;return s&&(e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),h=G(()=>import(s),[])),v&&(e=!1),h},m.NotFound)}v&&_e().then(({app:e,router:t,data:a})=>{t.go().then(()=>{T(t.route,a.site),e.mount("#app")})});export{_e as createApp}; diff --git a/assets/app.ae722434.js b/assets/app.ae722434.js deleted file mode 100644 index e101cfb80b..0000000000 --- a/assets/app.ae722434.js +++ /dev/null @@ -1 +0,0 @@ -import{d as A,u as y,g as f,o as n,c as o,F as B,D,k as l,_ as b,h as L,j as w,y as x,t as h,e as S,s as v,a3 as R,a4 as T,a5 as M,a6 as $,a7 as F,a8 as H,a9 as I,aa as O,ab as V,ac as j,X as N,ad as G,ae as U,af as W,ag as X}from"./chunks/framework.725e5b03.js";import{t as q}from"./chunks/theme.996dd6ef.js";import{T as z}from"./chunks/team.fcc5c8bb.js";const J={class:"AppBadgeList"},K=["src","alt"],Q=A({__name:"AppBadgeList",setup(e){const t=y(),a=f(()=>t.frontmatter.value.badges);return(s,r)=>(n(),o("ul",J,[(n(!0),o(B,null,D(a.value,i=>(n(),o("li",{key:i.src,class:"badge"},[l("img",{src:i.src,alt:i.alt},null,8,K)]))),128))]))}});const Y=b(Q,[["__scopeId","data-v-095e1027"]]),Z={class:"AppBlogPostHeader"},ee={key:0},te=["datetime"],ae={class:"authors"},se=["src","alt"],ne={class:"author-text"},oe=["href"],re={key:1,class:"author-name"},ce={class:"author-title"},le=A({__name:"AppBlogPostHeader",setup(e){const t=y(),a=f(()=>t.frontmatter.value.title),s=f(()=>t.frontmatter.value.authors.flatMap(p=>{const c=z[p];if(c){const{avatar:u,links:d,name:_,title:g}=c,{link:k=""}=(d==null?void 0:d.find(C=>C.link.startsWith("https://github.com/")))??{};return[{avatar:u,link:k,name:_,title:g}]}return[]})),r=f(()=>{const c=t.page.value.filePath.match(/^blog\/(?\d{4}-\d{2}-\d{2})-.*$/),{date:u}=(c==null?void 0:c.groups)??{};return u?new Date(u):null}),i=f(()=>{var p;return((p=r.value)==null?void 0:p.toISOString())??null}),P=L("");return w(()=>{x(()=>{r.value&&(P.value=new Intl.DateTimeFormat(t.lang.value,{dateStyle:"long"}).format(r.value))})}),(p,c)=>(n(),o("header",Z,[l("h1",null,h(a.value),1),i.value?(n(),o("p",ee,[l("time",{datetime:i.value},h(P.value),9,te)])):S("",!0),l("ul",ae,[(n(!0),o(B,null,D(s.value,({avatar:u,link:d,name:_,title:g})=>(n(),o("li",{key:_,class:"author"},[l("img",{src:u,alt:_,class:"author-avatar"},null,8,se),l("p",ne,[d?(n(),o("a",{key:0,href:d,target:"_blank",class:"author-name"},h(_),9,oe)):(n(),o("span",re,h(_),1)),l("span",ce,h(g),1)])]))),128))])]))}});const ie=b(le,[["__scopeId","data-v-1f4911dd"]]),pe={extends:q,async enhanceApp({app:e}){e.component("AppBadgeList",Y),e.component("AppBlogPostHeader",ie)}};function E(e){if(e.extends){const t=E(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const m=E(pe),ue=A({name:"VitePressApp",setup(){const{site:e}=y();return w(()=>{x(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),G(),U(),W(),m.setup&&m.setup(),()=>X(m.Layout)}});async function de(){const e=me(),t=_e();t.provide(T,e);const a=M(e.route);return t.provide($,a),t.component("Content",F),t.component("ClientOnly",H),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),m.enhanceApp&&await m.enhanceApp({app:t,router:e,siteData:I}),{app:t,router:e,data:a}}function _e(){return O(ue)}function me(){let e=v,t;return V(a=>{let s=j(a),r=null;return s&&(e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),r=N(()=>import(s),[])),v&&(e=!1),r},m.NotFound)}v&&de().then(({app:e,router:t,data:a})=>{t.go().then(()=>{R(t.route,a.site),e.mount("#app")})});export{de as createApp}; diff --git a/assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.js b/assets/blog_2022-02-10-js-tooling-research.md.62856b03.js similarity index 89% rename from assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.js rename to assets/blog_2022-02-10-js-tooling-research.md.62856b03.js index 9b9530d931..9c0fab3f84 100644 --- a/assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.js +++ b/assets/blog_2022-02-10-js-tooling-research.md.62856b03.js @@ -1 +1 @@ -import{_ as o,C as t,o as a,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-02-10-js-tooling-research.md","filePath":"blog/2022-02-10-js-tooling-research.md","lastUpdated":1701052174000}'),n={name:"blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=t("AppBlogPostHeader");return a(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; +import{_ as o,C as t,o as a,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-02-10-js-tooling-research.md","filePath":"blog/2022-02-10-js-tooling-research.md","lastUpdated":1701053760000}'),n={name:"blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=t("AppBlogPostHeader");return a(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; diff --git a/assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.lean.js b/assets/blog_2022-02-10-js-tooling-research.md.62856b03.lean.js similarity index 89% rename from assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.lean.js rename to assets/blog_2022-02-10-js-tooling-research.md.62856b03.lean.js index 9b9530d931..9c0fab3f84 100644 --- a/assets/blog_2022-02-10-js-tooling-research.md.e5bf29cc.lean.js +++ b/assets/blog_2022-02-10-js-tooling-research.md.62856b03.lean.js @@ -1 +1 @@ -import{_ as o,C as t,o as a,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-02-10-js-tooling-research.md","filePath":"blog/2022-02-10-js-tooling-research.md","lastUpdated":1701052174000}'),n={name:"blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=t("AppBlogPostHeader");return a(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; +import{_ as o,C as t,o as a,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-02-10-js-tooling-research.md","filePath":"blog/2022-02-10-js-tooling-research.md","lastUpdated":1701053760000}'),n={name:"blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=t("AppBlogPostHeader");return a(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; diff --git a/assets/blog_2022-08-08-linter-research.md.7364aab2.lean.js b/assets/blog_2022-08-08-linter-research.md.2f4287c0.js similarity index 89% rename from assets/blog_2022-08-08-linter-research.md.7364aab2.lean.js rename to assets/blog_2022-08-08-linter-research.md.2f4287c0.js index 20338bcd71..737549e0ed 100644 --- a/assets/blog_2022-08-08-linter-research.md.7364aab2.lean.js +++ b/assets/blog_2022-08-08-linter-research.md.2f4287c0.js @@ -1 +1 @@ -import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-08-08-linter-research.md","filePath":"blog/2022-08-08-linter-research.md","lastUpdated":1701052174000}'),n={name:"blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; +import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-08-08-linter-research.md","filePath":"blog/2022-08-08-linter-research.md","lastUpdated":1701053760000}'),n={name:"blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/blog_2022-08-08-linter-research.md.7364aab2.js b/assets/blog_2022-08-08-linter-research.md.2f4287c0.lean.js similarity index 89% rename from assets/blog_2022-08-08-linter-research.md.7364aab2.js rename to assets/blog_2022-08-08-linter-research.md.2f4287c0.lean.js index 20338bcd71..737549e0ed 100644 --- a/assets/blog_2022-08-08-linter-research.md.7364aab2.js +++ b/assets/blog_2022-08-08-linter-research.md.2f4287c0.lean.js @@ -1 +1 @@ -import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-08-08-linter-research.md","filePath":"blog/2022-08-08-linter-research.md","lastUpdated":1701052174000}'),n={name:"blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; +import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2022-08-08-linter-research.md","filePath":"blog/2022-08-08-linter-research.md","lastUpdated":1701053760000}'),n={name:"blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.js b/assets/blog_2023-11-07-announcing-oxc.md.899bda23.js similarity index 88% rename from assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.js rename to assets/blog_2023-11-07-announcing-oxc.md.899bda23.js index bf1ecc281c..a56b0c187f 100644 --- a/assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.js +++ b/assets/blog_2023-11-07-announcing-oxc.md.899bda23.js @@ -1 +1 @@ -import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-07-announcing-oxc.md","filePath":"blog/2023-11-07-announcing-oxc.md","lastUpdated":1701052174000}'),s={name:"blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; +import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-07-announcing-oxc.md","filePath":"blog/2023-11-07-announcing-oxc.md","lastUpdated":1701053760000}'),s={name:"blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; diff --git a/assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.lean.js b/assets/blog_2023-11-07-announcing-oxc.md.899bda23.lean.js similarity index 88% rename from assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.lean.js rename to assets/blog_2023-11-07-announcing-oxc.md.899bda23.lean.js index bf1ecc281c..a56b0c187f 100644 --- a/assets/blog_2023-11-07-announcing-oxc.md.3a2f4a1d.lean.js +++ b/assets/blog_2023-11-07-announcing-oxc.md.899bda23.lean.js @@ -1 +1 @@ -import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-07-announcing-oxc.md","filePath":"blog/2023-11-07-announcing-oxc.md","lastUpdated":1701052174000}'),s={name:"blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; +import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-07-announcing-oxc.md","filePath":"blog/2023-11-07-announcing-oxc.md","lastUpdated":1701053760000}'),s={name:"blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; diff --git a/assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.js b/assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.js similarity index 89% rename from assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.js rename to assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.js index cdab496c42..d5dcd9e226 100644 --- a/assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.js +++ b/assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.js @@ -1 +1 @@ -import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-08-announcing-oxlint.md","filePath":"blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701052174000}'),i={name:"blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; +import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-08-announcing-oxlint.md","filePath":"blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701053760000}'),i={name:"blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.lean.js b/assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.lean.js similarity index 89% rename from assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.lean.js rename to assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.lean.js index cdab496c42..d5dcd9e226 100644 --- a/assets/blog_2023-11-08-announcing-oxlint.md.706d95fb.lean.js +++ b/assets/blog_2023-11-08-announcing-oxlint.md.9976ed49.lean.js @@ -1 +1 @@ -import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-08-announcing-oxlint.md","filePath":"blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701052174000}'),i={name:"blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; +import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"blog/2023-11-08-announcing-oxlint.md","filePath":"blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701053760000}'),i={name:"blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/blog_index.md.a20bd3b9.js b/assets/blog_index.md.e44a5676.js similarity index 99% rename from assets/blog_index.md.a20bd3b9.js rename to assets/blog_index.md.e44a5676.js index 445dea1311..7edac1e0ab 100644 --- a/assets/blog_index.md.a20bd3b9.js +++ b/assets/blog_index.md.e44a5676.js @@ -1,4 +1,4 @@ -import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":1701052174000}'),t={name:"blog/index.md"},o=s(`

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
+import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":1701053760000}'),t={name:"blog/index.md"},o=s(`

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
 
 touch test.js
 cargo run -p rome_cli -- check ./test.js
cargo run -p rome_cli
diff --git a/assets/blog_index.md.a20bd3b9.lean.js b/assets/blog_index.md.e44a5676.lean.js
similarity index 84%
rename from assets/blog_index.md.a20bd3b9.lean.js
rename to assets/blog_index.md.e44a5676.lean.js
index 5b253e3923..8a512c3f9e 100644
--- a/assets/blog_index.md.a20bd3b9.lean.js
+++ b/assets/blog_index.md.e44a5676.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":1701052174000}'),t={name:"blog/index.md"},o=s("",18),n=[o];function l(i,p,c,h,d,b){return a(),r("div",null,n)}const u=e(t,[["render",l]]);export{m as __pageData,u as default};
+import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"blog/index.md","filePath":"blog/index.md","lastUpdated":1701053760000}'),t={name:"blog/index.md"},o=s("",18),n=[o];function l(i,p,c,h,d,b){return a(),r("div",null,n)}const u=e(t,[["render",l]]);export{m as __pageData,u as default};
diff --git a/assets/chunks/@localSearchIndexja.fe90f88e.js b/assets/chunks/@localSearchIndexja.fe90f88e.js
new file mode 100644
index 0000000000..dca819f9c4
--- /dev/null
+++ b/assets/chunks/@localSearchIndexja.fe90f88e.js
@@ -0,0 +1 @@
+const e='{"documentCount":132,"nextId":132,"documentIds":{"0":"/ja/blog/#history","1":"/ja/blog/#concrete-syntax-tree","2":"/ja/blog/#grammar","3":"/ja/blog/#entry-point","4":"/ja/blog/#contributing","5":"/ja/docs/contribute/codegen.html#codegen","6":"/ja/docs/contribute/development.html#development","7":"/ja/docs/contribute/development.html#clone-repository","8":"/ja/docs/contribute/development.html#set-up-project","9":"/ja/docs/contribute/development.html#install-rust","10":"/ja/docs/contribute/development.html#install-project-tools","11":"/ja/docs/contribute/development.html#cargo-binstall","12":"/ja/docs/contribute/development.html#just","13":"/ja/docs/contribute/development.html#dependencies","14":"/ja/docs/contribute/formatter.html#formatter","15":"/ja/docs/contribute/introduction.html#introduction","16":"/ja/docs/contribute/introduction.html#general-rules","17":"/ja/docs/contribute/introduction.html#pr-rules","18":"/ja/docs/contribute/introduction.html#action-policy","19":"/ja/docs/contribute/introduction.html#development-policy","20":"/ja/docs/contribute/introduction.html#maintenance-policy","21":"/ja/docs/contribute/linter.html#linter","22":"/ja/docs/contribute/linter.html#development","23":"/ja/docs/contribute/linter.html#rule-generation","24":"/ja/docs/contribute/minifier.html#minifier","25":"/ja/docs/contribute/parser.html#parser","26":"/ja/docs/contribute/parser.html#conformance-tests","27":"/ja/docs/contribute/parser.html#test262","28":"/ja/docs/contribute/parser.html#babel","29":"/ja/docs/contribute/parser.html#typescript","30":"/ja/docs/contribute/parser.html#test-runner","31":"/ja/docs/contribute/performance.html#performance-tuning","32":"/ja/docs/contribute/performance.html#compile-time","33":"/ja/docs/contribute/performance.html#profile","34":"/ja/docs/contribute/performance.html#mac-xcode-instruments","35":"/ja/docs/contribute/prettier.html#prettier","36":"/ja/docs/contribute/resolver.html#resolver","37":"/ja/docs/contribute/showcase.html#showcase","38":"/ja/docs/contribute/transformer.html#transformer","39":"/ja/docs/contribute/vscode.html#vscode-extension","40":"/ja/docs/contribute/vscode.html#development","41":"/ja/docs/guide/benchmarks.html#benchmarks","42":"/ja/docs/guide/introduction.html#what-is-oxc","43":"/ja/docs/guide/introduction.html#philosophy","44":"/ja/docs/guide/introduction.html#core-team","45":"/ja/docs/guide/philosophy.html#philosophy","46":"/ja/docs/guide/usage/benchmarks.html#benchmarks","47":"/ja/docs/guide/usage/linter.html#oxlint","48":"/ja/docs/guide/usage/linter.html#features","49":"/ja/docs/guide/usage/linter.html#adoptions","50":"/ja/docs/guide/usage/linter.html#installation","51":"/ja/docs/guide/usage/linter.html#integration","52":"/ja/docs/guide/usage/linter.html#ides","53":"/ja/docs/guide/usage/linter.html#vscode-extension","54":"/ja/docs/guide/usage/linter.html#vim-nvim-coc","55":"/ja/docs/guide/usage/linter.html#continuous-integration","56":"/ja/docs/guide/usage/linter.html#github-actions","57":"/ja/docs/guide/usage/linter.html#nix","58":"/ja/docs/guide/usage/linter.html#commands","59":"/ja/docs/guide/usage/linter.html#system-requirements","60":"/ja/docs/guide/usage/parser.html#parser","61":"/ja/docs/guide/usage/parser.html#features","62":"/ja/docs/guide/usage/parser.html#installation","63":"/ja/docs/guide/usage/parser.html#rust","64":"/ja/docs/guide/usage/parser.html#node-js","65":"/ja/docs/guide/usage/philosophy.html#philosophy","66":"/ja/docs/guide/usage/resolver.html#resolver","67":"/ja/docs/guide/usage/resolver.html#installation","68":"/ja/docs/guide/usage/resolver.html#rust","69":"/ja/docs/guide/usage/resolver.html#node-js","70":"/ja/docs/guide/usage/resolver.html#example","71":"/ja/docs/learn/architecture/formatter.html#formatter","72":"/ja/docs/learn/architecture/introduction.html#introduction","73":"/ja/docs/learn/architecture/linter.html#example","74":"/ja/docs/learn/architecture/minifier.html#minifier","75":"/ja/docs/learn/architecture/parser.html#parser","76":"/ja/docs/learn/architecture/parser.html#how-is-it-so-fast","77":"/ja/docs/learn/architecture/resolver.html#resolver","78":"/ja/docs/learn/architecture/transformer.html#transformer","79":"/ja/docs/learn/ecmascript/grammar.html#ll-1-grammar","80":"/ja/docs/learn/ecmascript/grammar.html#identifiers","81":"/ja/docs/learn/ecmascript/grammar.html#class-and-strict-mode","82":"/ja/docs/learn/ecmascript/grammar.html#legacy-octal-and-use-strict","83":"/ja/docs/learn/ecmascript/grammar.html#non-simple-parameter-and-strict-mode","84":"/ja/docs/learn/ecmascript/grammar.html#parenthesized-expression","85":"/ja/docs/learn/ecmascript/grammar.html#function-declaration-in-if-statement","86":"/ja/docs/learn/ecmascript/grammar.html#label-statement-is-legit","87":"/ja/docs/learn/ecmascript/grammar.html#let-is-not-a-keyword","88":"/ja/docs/learn/ecmascript/grammar.html#for-in-for-of-and-the-in-context","89":"/ja/docs/learn/ecmascript/grammar.html#block-level-function-declarations","90":"/ja/docs/learn/ecmascript/grammar.html#grammar-context","91":"/ja/docs/learn/ecmascript/grammar.html#assignmentpattern-vs-bindingpattern","92":"/ja/docs/learn/ecmascript/grammar.html#ambiguous-grammar","93":"/ja/docs/learn/ecmascript/grammar.html#cover-grammar","94":"/ja/docs/learn/ecmascript/grammar.html#coverparenthesizedexpressionandarrowparameterlist","95":"/ja/docs/learn/ecmascript/grammar.html#covercallexpressionandasyncarrowhead","96":"/ja/docs/learn/ecmascript/grammar.html#coverinitializedname","97":"/ja/docs/learn/ecmascript/spec.html#notational-conventions","98":"/ja/docs/learn/ecmascript/spec.html#recursion","99":"/ja/docs/learn/ecmascript/spec.html#optional","100":"/ja/docs/learn/ecmascript/spec.html#parameters","101":"/ja/docs/learn/ecmascript/spec.html#source-text","102":"/ja/docs/learn/ecmascript/spec.html#ecmascript-language-lexical-grammar","103":"/ja/docs/learn/ecmascript/spec.html#expressions-statements-functions-classes-scripts-and-modules","104":"/ja/docs/learn/ecosystem.html#rolldown","105":"/ja/docs/learn/performance.html#pursuit-of-performance-on-building-a-javascript-compiler","106":"/ja/docs/learn/performance.html#on-performance","107":"/ja/docs/learn/performance.html#parsing","108":"/ja/docs/learn/performance.html#abstract-syntax-tree-ast","109":"/ja/docs/learn/performance.html#memory-allocation","110":"/ja/docs/learn/performance.html#enum-sizes","111":"/ja/docs/learn/performance.html#span","112":"/ja/docs/learn/performance.html#strings-and-identifiers","113":"/ja/docs/learn/performance.html#string-interning","114":"/ja/docs/learn/performance.html#string-cache","115":"/ja/docs/learn/performance.html#string-inlining","116":"/ja/docs/learn/performance.html#lexer","117":"/ja/docs/learn/performance.html#token","118":"/ja/docs/learn/performance.html#cow","119":"/ja/docs/learn/performance.html#simd","120":"/ja/docs/learn/performance.html#keyword-match","121":"/ja/docs/learn/performance.html#linter","122":"/ja/docs/learn/performance.html#parent-pointing-tree","123":"/ja/docs/learn/performance.html#processing-files-in-parallel","124":"/ja/docs/learn/performance.html#printing-is-slow","125":"/ja/docs/learn/references.html#references","126":"/ja/docs/learn/references.html#projects-using-oxc","127":"/ja/docs/learn/references.html#📚-learning-resources","128":"/ja/docs/learn/references.html#parsers-in-active-development","129":"/ja/docs/learn/references.html#ast","130":"/ja/docs/learn/references.html#rust","131":"/ja/docs/learn/references.html#blog-posts"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,54],"1":[3,1,74],"2":[1,1,33],"3":[2,1,60],"4":[1,1,54],"5":[1,1,1],"6":[1,1,12],"7":[2,1,23],"8":[3,1,1],"9":[2,4,36],"10":[3,4,1],"11":[2,6,48],"12":[1,6,20],"13":[1,6,52],"14":[1,1,51],"15":[1,1,22],"16":[2,1,22],"17":[2,1,21],"18":[2,1,63],"19":[2,1,59],"20":[2,1,31],"21":[1,1,1],"22":[1,1,17],"23":[2,1,44],"24":[1,1,110],"25":[1,1,13],"26":[2,1,20],"27":[1,3,31],"28":[1,3,25],"29":[1,3,9],"30":[2,1,15],"31":[2,1,1],"32":[2,2,56],"33":[1,2,1],"34":[3,3,146],"35":[1,1,1],"36":[1,1,56],"37":[1,1,7],"38":[1,1,36],"39":[2,1,1],"40":[1,2,42],"41":[1,1,2],"42":[4,1,41],"43":[1,4,37],"44":[2,4,1],"45":[1,1,2],"46":[1,1,1],"47":[1,1,1],"48":[1,1,31],"49":[1,1,31],"50":[1,1,31],"51":[1,1,1],"52":[1,2,1],"53":[2,3,8],"54":[4,3,19],"55":[2,2,19],"56":[2,3,19],"57":[1,2,7],"58":[1,1,80],"59":[2,1,13],"60":[1,1,1],"61":[1,1,28],"62":[1,1,1],"63":[1,2,26],"64":[2,2,13],"65":[1,1,1],"66":[1,1,15],"67":[1,1,1],"68":[1,2,14],"69":[2,2,14],"70":[1,1,43],"71":[1,1,1],"72":[1,1,1],"73":[1,1,12],"74":[1,1,1],"75":[1,1,103],"76":[5,1,42],"77":[1,1,1],"78":[1,1,1],"79":[3,1,165],"80":[1,1,75],"81":[4,1,72],"82":[5,1,92],"83":[6,1,119],"84":[2,1,61],"85":[5,1,54],"86":[4,1,43],"87":[5,1,45],"88":[7,1,92],"89":[4,1,79],"90":[2,1,56],"91":[3,1,215],"92":[2,1,175],"93":[2,1,18],"94":[1,3,173],"95":[1,3,53],"96":[1,3,122],"97":[2,1,18],"98":[1,3,22],"99":[1,3,20],"100":[1,3,35],"101":[2,1,59],"102":[4,1,14],"103":[7,1,15],"104":[1,1,4],"105":[8,1,11],"106":[2,8,68],"107":[1,1,18],"108":[5,1,93],"109":[2,6,179],"110":[2,6,212],"111":[1,6,82],"112":[3,6,61],"113":[2,6,108],"114":[2,7,270],"115":[2,6,153],"116":[1,1,1],"117":[1,2,217],"118":[1,2,147],"119":[1,2,91],"120":[2,2,222],"121":[1,1,49],"122":[3,2,216],"123":[4,2,95],"124":[3,2,116],"125":[1,1,1],"126":[3,1,1],"127":[3,1,25],"128":[5,1,16],"129":[1,1,7],"130":[1,1,5],"131":[2,1,21]},"averageFieldLength":[1.9621212121212122,1.8560606060606057,48.598484848484865],"storedFields":{"0":{"title":"History","titles":[null]},"1":{"title":"Concrete Syntax Tree","titles":[null]},"2":{"title":"Grammar","titles":[null]},"3":{"title":"Entry Point","titles":[null]},"4":{"title":"Contributing","titles":[null]},"5":{"title":"Codegen","titles":[]},"6":{"title":"Development","titles":[]},"7":{"title":"Clone Repository","titles":["Development"]},"8":{"title":"Set Up Project","titles":["Development"]},"9":{"title":"Install Rust","titles":["Development","Set Up Project"]},"10":{"title":"Install Project Tools","titles":["Development","Set Up Project"]},"11":{"title":"cargo-binstall","titles":["Development","Set Up Project","Install Project Tools"]},"12":{"title":"just","titles":["Development","Set Up Project","Install Project Tools"]},"13":{"title":"Dependencies","titles":["Development","Set Up Project","Install Project Tools"]},"14":{"title":"Formatter","titles":[]},"15":{"title":"Introduction","titles":[]},"16":{"title":"General Rules","titles":["Introduction"]},"17":{"title":"PR Rules","titles":["Introduction"]},"18":{"title":"Action Policy","titles":["Introduction"]},"19":{"title":"Development Policy","titles":["Introduction"]},"20":{"title":"Maintenance Policy","titles":["Introduction"]},"21":{"title":"Linter","titles":[]},"22":{"title":"Development","titles":["Linter"]},"23":{"title":"Rule generation","titles":["Linter"]},"24":{"title":"Minifier","titles":[]},"25":{"title":"Parser","titles":[]},"26":{"title":"Conformance Tests","titles":["Parser"]},"27":{"title":"Test262","titles":["Parser","Conformance Tests"]},"28":{"title":"Babel","titles":["Parser","Conformance Tests"]},"29":{"title":"TypeScript","titles":["Parser","Conformance Tests"]},"30":{"title":"Test Runner","titles":["Parser"]},"31":{"title":"Performance Tuning","titles":[]},"32":{"title":"Compile Time","titles":["Performance Tuning"]},"33":{"title":"Profile","titles":["Performance Tuning"]},"34":{"title":"Mac Xcode Instruments","titles":["Performance Tuning","Profile"]},"35":{"title":"Prettier","titles":[]},"36":{"title":"Resolver","titles":[]},"37":{"title":"Showcase","titles":[]},"38":{"title":"Transformer","titles":[]},"39":{"title":"VSCode Extension","titles":[]},"40":{"title":"Development","titles":["VSCode Extension"]},"41":{"title":"Benchmarks","titles":[]},"42":{"title":"What is OXC?","titles":[]},"43":{"title":"Philosophy","titles":["What is OXC?"]},"44":{"title":"Core Team","titles":["What is OXC?"]},"45":{"title":"Philosophy","titles":[]},"46":{"title":"Benchmarks","titles":[]},"47":{"title":"oxlint","titles":[]},"48":{"title":"Features","titles":["oxlint"]},"49":{"title":"Adoptions","titles":["oxlint"]},"50":{"title":"Installation","titles":["oxlint"]},"51":{"title":"Integration","titles":["oxlint"]},"52":{"title":"IDEs","titles":["oxlint","Integration"]},"53":{"title":"VSCode Extension","titles":["oxlint","Integration","IDEs"]},"54":{"title":"Vim / Nvim (coc)","titles":["oxlint","Integration","IDEs"]},"55":{"title":"Continuous Integration","titles":["oxlint","Integration"]},"56":{"title":"GitHub Actions","titles":["oxlint","Integration","Continuous Integration"]},"57":{"title":"Nix","titles":["oxlint","Integration"]},"58":{"title":"Commands","titles":["oxlint"]},"59":{"title":"System Requirements","titles":["oxlint"]},"60":{"title":"Parser","titles":[]},"61":{"title":"Features","titles":["Parser"]},"62":{"title":"Installation","titles":["Parser"]},"63":{"title":"Rust","titles":["Parser","Installation"]},"64":{"title":"Node.js","titles":["Parser","Installation"]},"65":{"title":"Philosophy","titles":[]},"66":{"title":"Resolver","titles":[]},"67":{"title":"Installation","titles":["Resolver"]},"68":{"title":"Rust","titles":["Resolver","Installation"]},"69":{"title":"Node.js","titles":["Resolver","Installation"]},"70":{"title":"Example","titles":["Resolver"]},"71":{"title":"Formatter","titles":[]},"72":{"title":"Introduction","titles":[]},"73":{"title":"Example","titles":[]},"74":{"title":"Minifier","titles":[]},"75":{"title":"Parser","titles":[]},"76":{"title":"How is it so fast","titles":["Parser"]},"77":{"title":"Resolver","titles":[]},"78":{"title":"Transformer","titles":[]},"79":{"title":"LL(1) Grammar","titles":[null]},"80":{"title":"Identifiers","titles":[null]},"81":{"title":"Class and Strict Mode","titles":[null]},"82":{"title":"Legacy Octal and Use Strict","titles":[null]},"83":{"title":"Non-simple Parameter and Strict Mode","titles":[null]},"84":{"title":"Parenthesized Expression","titles":[null]},"85":{"title":"Function Declaration in If Statement","titles":[null]},"86":{"title":"Label statement is legit","titles":[null]},"87":{"title":"let is not a keyword","titles":[null]},"88":{"title":"For-in / For-of and the [In] context","titles":[null]},"89":{"title":"Block-Level Function Declarations","titles":[null]},"90":{"title":"Grammar Context","titles":[null]},"91":{"title":"AssignmentPattern vs BindingPattern","titles":[null]},"92":{"title":"Ambiguous Grammar","titles":[null]},"93":{"title":"Cover Grammar","titles":[null]},"94":{"title":"CoverParenthesizedExpressionAndArrowParameterList","titles":[null,"Cover Grammar",null]},"95":{"title":"CoverCallExpressionAndAsyncArrowHead","titles":[null,"Cover Grammar",null]},"96":{"title":"CoverInitializedName","titles":[null,"Cover Grammar",null]},"97":{"title":"Notational Conventions","titles":[null]},"98":{"title":"Recursion","titles":[null,"Notational Conventions"]},"99":{"title":"Optional","titles":[null,"Notational Conventions"]},"100":{"title":"Parameters","titles":[null,"Notational Conventions"]},"101":{"title":"Source Text","titles":[null]},"102":{"title":"ECMAScript Language: Lexical Grammar","titles":[null]},"103":{"title":"Expressions, Statements, Functions, Classes, Scripts and Modules","titles":[null]},"104":{"title":"Rolldown","titles":[null]},"105":{"title":"Pursuit of Performance on Building a JavaScript Compiler","titles":[]},"106":{"title":"On Performance","titles":["Pursuit of Performance on Building a JavaScript Compiler"]},"107":{"title":"Parsing","titles":[]},"108":{"title":"Abstract Syntax Tree (AST)","titles":["Parsing"]},"109":{"title":"Memory Allocation","titles":["Parsing","Abstract Syntax Tree (AST)"]},"110":{"title":"Enum Sizes","titles":["Parsing","Abstract Syntax Tree (AST)"]},"111":{"title":"Span","titles":["Parsing","Abstract Syntax Tree (AST)"]},"112":{"title":"Strings and Identifiers","titles":["Parsing","Abstract Syntax Tree (AST)"]},"113":{"title":"String interning","titles":["Parsing","Abstract Syntax Tree (AST)"]},"114":{"title":"string-cache","titles":["Parsing","Abstract Syntax Tree (AST)","String interning"]},"115":{"title":"String Inlining","titles":["Parsing","Abstract Syntax Tree (AST)"]},"116":{"title":"Lexer","titles":["Parsing"]},"117":{"title":"Token","titles":["Parsing","Lexer"]},"118":{"title":"Cow","titles":["Parsing","Lexer"]},"119":{"title":"SIMD","titles":["Parsing","Lexer"]},"120":{"title":"Keyword match","titles":["Parsing","Lexer"]},"121":{"title":"Linter","titles":["Parsing"]},"122":{"title":"Parent Pointing Tree","titles":["Parsing","Linter"]},"123":{"title":"Processing files in parallel","titles":["Parsing","Linter"]},"124":{"title":"Printing is slow","titles":["Parsing","Linter"]},"125":{"title":"References","titles":[]},"126":{"title":"Projects Using Oxc","titles":["References"]},"127":{"title":"📚 Learning Resources","titles":["References"]},"128":{"title":"Parsers (in active development)","titles":["References"]},"129":{"title":"AST","titles":["References"]},"130":{"title":"Rust","titles":["References"]},"131":{"title":"Blog Posts","titles":["References"]}},"dirtCount":0,"index":[["6",{"2":{"120":2}}],["64",{"2":{"110":4,"115":5}}],["$lt$impl$u20$core",{"2":{"120":20}}],["zn4core5slice3cmp81",{"2":{"120":20}}],["📚",{"0":{"127":1}}],["😃",{"2":{"114":1,"120":1}}],["💡",{"2":{"109":1,"114":2}}],["©",{"2":{"112":1}}],["^",{"2":{"92":4,"98":12}}],["^^^^^^^^^",{"2":{"94":2,"110":2}}],["^^^^^^^^^^^^^^",{"2":{"110":2}}],["^^^^^^^^^^^^^^^",{"2":{"95":2}}],["^^^^^^^^^^^",{"2":{"86":2}}],["^^^^^^^^",{"2":{"92":2}}],["^^^",{"2":{"91":8}}],["🤯",{"2":{"91":1}}],["∉",{"2":{"88":1}}],["≠",{"2":{"88":1}}],["+await",{"2":{"95":2,"100":2}}],["+in",{"2":{"88":8,"94":2}}],["+",{"2":{"87":2}}],["7",{"2":{"120":2}}],["747bed2e8aaafe8fdf2c65e8a10dd7ae64f66c47",{"2":{"82":2}}],["75",{"2":{"49":1}}],["kind",{"2":{"115":1,"117":16,"122":21}}],["know",{"2":{"113":1,"114":1}}],["knowledge",{"2":{"106":1}}],["known",{"2":{"1":1,"18":1,"24":1,"117":1}}],["kelley",{"2":{"127":1}}],["keep",{"2":{"81":1,"90":1,"110":1,"117":3}}],["keywords",{"2":{"117":2,"120":1}}],["keyword",{"0":{"87":1,"120":1},"2":{"87":1,"88":1,"95":1,"120":9}}],["key",{"2":{"75":1}}],["23",{"2":{"115":1}}],["22",{"2":{"115":1}}],["268",{"2":{"114":1}}],["268https",{"2":{"114":1}}],["251",{"2":{"112":1}}],["24",{"2":{"110":2,"115":1,"117":1}}],["2015",{"2":{"114":1}}],["2017",{"2":{"110":1}}],["200",{"2":{"110":2}}],["20",{"2":{"109":1,"110":1}}],["2023",{"2":{"34":3}}],["2",{"2":{"70":2,"88":2,"89":1,"91":2,"96":4,"98":2,"101":1,"110":4,"120":4,"131":1}}],["2x",{"2":{"61":1}}],["`nodes`",{"2":{"122":2}}],["`rc`",{"2":{"110":2}}],["`regexp`",{"2":{"92":2}}],["`box`",{"2":{"110":2}}],["`bindingidentifier`",{"2":{"91":2}}],["`variant`",{"2":{"110":2}}],["`enum`",{"2":{"110":2}}],["`identifierreference`",{"2":{"91":2}}],["`labelledstatement`",{"2":{"86":2}}],["`",{"2":{"58":4,"92":6,"110":4,"124":8}}],["|path|",{"2":{"123":2}}],["||",{"2":{"114":2,"123":6}}],["|",{"2":{"58":2,"91":4,"110":28}}],["84",{"2":{"120":2,"122":1}}],["8",{"2":{"49":1,"110":1,"117":1,"120":2}}],["visiting",{"2":{"122":1}}],["visit",{"2":{"121":6,"122":9}}],["visitors",{"2":{"122":2}}],["visitor",{"2":{"121":1,"122":1}}],["visits",{"2":{"121":1}}],["visitation",{"2":{"109":1}}],["video",{"2":{"120":2}}],["via",{"2":{"109":1,"118":1}}],["vim",{"0":{"54":1}}],["very",{"2":{"110":1,"120":1}}],["version",{"2":{"38":1,"108":1,"109":1,"114":1,"117":1}}],["versions",{"2":{"38":1}}],["vec",{"2":{"94":1,"108":4,"109":1,"117":10,"122":3}}],["v8",{"2":{"93":1,"102":1,"120":2}}],["void",{"2":{"83":2}}],["vaguely",{"2":{"118":1}}],["variety",{"2":{"115":1}}],["variants",{"2":{"110":7,"117":1}}],["variant",{"2":{"110":15,"117":1}}],["variable",{"2":{"91":2,"115":1}}],["variabledeclarator",{"2":{"91":7,"108":2}}],["variabledeclarationstatement",{"2":{"108":2}}],["variabledeclaration",{"2":{"80":2,"91":3,"99":1,"108":4}}],["var",{"2":{"80":1,"89":6,"91":4,"99":2}}],["value=",{"2":{"83":2}}],["value",{"2":{"18":1,"24":1,"83":2,"96":4,"112":2,"113":1,"114":1,"117":3,"118":2}}],["values",{"2":{"18":1,"112":1,"117":1}}],["v3",{"2":{"56":2}}],["vs",{"0":{"91":1}}],["vsix",{"2":{"40":2}}],["vscode",{"0":{"39":1,"53":1},"1":{"40":1},"2":{"40":4,"53":1,"54":2}}],["42",{"2":{"124":4}}],["4gb",{"2":{"111":1}}],["48",{"2":{"49":1,"110":3}}],["45",{"2":{"34":3,"110":1}}],["41",{"2":{"34":3}}],["4",{"2":{"34":3,"110":4,"120":2}}],["0",{"2":{"83":2,"87":2,"110":2,"114":2}}],["01",{"2":{"82":1,"83":5}}],["03",{"2":{"34":3}}],["09",{"2":{"34":3}}],["191362",{"2":{"120":2}}],["10",{"2":{"110":1,"120":2}}],["100x",{"2":{"48":1}}],["16",{"2":{"110":6}}],["11",{"2":{"101":1,"120":2}}],["11735729c4ebe590e406f952059813f250a4cbd1",{"2":{"89":2}}],["14",{"2":{"91":2}}],["15",{"2":{"91":5,"96":2}}],["13",{"2":{"91":5,"96":6}}],["12m",{"2":{"49":1}}],["1",{"0":{"79":1},"2":{"34":2,"70":2,"79":3,"87":2,"96":10,"97":1,"98":2,"110":7,"114":6,"115":1,"120":6,"131":1}}],["==",{"2":{"114":4}}],["===",{"2":{"83":2}}],["=`",{"2":{"92":2}}],["=",{"2":{"34":4,"70":10,"80":3,"83":3,"84":4,"86":2,"87":4,"88":3,"91":12,"92":8,"94":9,"95":6,"96":20,"98":4,"99":2,"110":4,"114":22,"115":4,"118":4,"120":10,"122":6,"123":12,"124":8}}],["xa9",{"2":{"112":1}}],["x86",{"2":{"110":2,"115":2}}],["x64",{"2":{"59":3}}],["x",{"2":{"34":1,"40":3,"84":1,"85":2,"87":2,"96":6}}],["xctrace",{"2":{"34":2}}],["xcrun",{"2":{"34":1}}],["xcode",{"0":{"34":1},"2":{"34":2}}],["xtask",{"2":{"2":2}}],["56",{"2":{"110":1}}],["5th",{"2":{"91":1}}],["5a059c0413baf1d54436ac0c149a829f0dfd1f4d",{"2":{"90":2}}],["5m",{"2":{"49":1}}],["50",{"2":{"48":1,"113":1}}],["5",{"2":{"32":1,"90":1,"91":2,"96":4,"97":2,"110":4,"111":1,"120":2}}],["question",{"2":{"110":1}}],["quaz",{"2":{"86":2}}],["quality",{"2":{"24":2}}],["quick",{"2":{"120":1,"128":1}}],["quickly",{"2":{"119":1}}],["quite",{"2":{"117":1}}],["quirks",{"2":{"79":2,"131":1}}],["quiet",{"2":{"34":1}}],["quietxcrun",{"2":{"34":1}}],["quot",{"2":{"22":4,"34":4,"40":2,"54":36,"58":12,"70":24,"82":2,"83":22,"84":4,"86":4,"91":22,"92":4,"101":6,"110":10,"111":2,"114":2,"115":8,"117":2,"118":2,"120":56,"123":2,"124":8}}],["32",{"2":{"117":3}}],["30",{"2":{"113":1}}],["39",{"2":{"34":4,"84":4,"109":4,"112":8,"115":2,"117":6,"118":4,"121":4,"122":38}}],["3",{"2":{"20":1,"89":1,"91":2,"96":2,"105":1,"110":4,"120":2}}],["~return",{"2":{"100":4}}],["~await",{"2":{"100":2}}],["~yield",{"2":{"95":2,"100":4}}],["~",{"2":{"11":1,"110":4}}],["yield",{"2":{"80":20,"85":4,"88":8,"90":1,"91":22,"94":22,"95":16,"96":6,"100":1}}],["year",{"2":{"114":1}}],["years",{"2":{"79":2,"91":1,"106":1,"114":1}}],["yes",{"2":{"56":2,"120":1}}],["yet",{"2":{"9":1,"82":1,"115":1}}],["yamljobs",{"2":{"56":1}}],["yarn",{"2":{"50":4,"64":2,"69":2}}],["y",{"2":{"12":1}}],["ycargo",{"2":{"12":1}}],["youtube",{"2":{"120":1}}],["you",{"2":{"9":1,"11":1,"13":4,"15":1,"16":1,"17":1,"24":2,"50":2,"53":1,"61":1,"68":1,"79":2,"82":1,"106":1,"118":1,"119":1,"124":4}}],["your",{"2":{"4":1,"32":2,"79":1}}],["9",{"2":{"118":1,"120":2}}],["99",{"2":{"4":1,"20":1,"118":1}}],["9815467c66688773bc1bb6ef9a5b2d86ca7b3682",{"2":{"3":4}}],["my",{"2":{"106":2,"108":1,"119":1,"127":2}}],["mysterious",{"2":{"83":1}}],["mjs",{"2":{"101":1}}],["mutation",{"2":{"118":1,"122":1}}],["mutate",{"2":{"117":1}}],["mut",{"2":{"114":16,"118":2,"121":2,"122":10,"124":4}}],["mutex",{"2":{"113":1,"114":6}}],["must",{"2":{"81":1,"91":1,"96":2,"112":1}}],["much",{"2":{"79":1,"113":1}}],["multiplicativeoperator",{"2":{"92":3}}],["multiplicativeexpression",{"2":{"92":7}}],["multiples",{"2":{"113":1}}],["multiple",{"2":{"58":2}}],["multi",{"2":{"36":1,"113":1,"114":1,"119":1}}],["missing",{"2":{"122":1}}],["mistakes",{"2":{"79":1}}],["mitigate",{"2":{"109":1}}],["middle",{"2":{"94":1}}],["mixed",{"2":{"82":1}}],["millions",{"2":{"24":1,"117":1}}],["minor",{"2":{"75":1}}],["mins",{"2":{"49":1}}],["minimum",{"2":{"73":1}}],["minimize",{"2":{"32":1,"115":1}}],["minimal",{"2":{"19":1}}],["minify",{"2":{"24":1}}],["minification",{"2":{"24":2}}],["minifiers",{"2":{"24":2}}],["minifier",{"0":{"24":1,"74":1},"2":{"24":2,"42":1,"108":1}}],["minutes",{"2":{"20":1,"32":1}}],["mentioning",{"2":{"114":1}}],["method",{"2":{"106":1,"113":1}}],["methods",{"2":{"19":1}}],["me",{"2":{"106":1,"109":1,"111":1,"114":1,"115":1,"118":2}}],["mem",{"2":{"110":2,"114":2,"115":2}}],["memberexpression",{"2":{"92":1,"95":4}}],["memory",{"0":{"109":1},"2":{"76":2,"106":1,"109":7,"110":2,"111":2,"113":1,"115":3,"117":3,"122":2}}],["mean",{"2":{"110":1}}],["meanwhile",{"2":{"89":1}}],["meanings",{"2":{"84":2}}],["means",{"2":{"28":1,"79":3,"92":2,"98":1,"99":1,"100":1}}],["messages",{"2":{"124":1}}],["message",{"2":{"79":1,"83":1}}],["merging",{"2":{"20":1}}],["mechanism",{"2":{"11":1}}],["move",{"2":{"117":1,"123":6}}],["monorepos",{"2":{"124":1}}],["month",{"2":{"114":1}}],["months",{"2":{"109":1,"117":1}}],["monitored",{"2":{"20":1}}],["monitor",{"2":{"20":1}}],["mozilla",{"2":{"79":1}}],["modify",{"2":{"94":1}}],["modern",{"2":{"86":1}}],["mode",{"0":{"81":1,"83":1},"2":{"81":4,"82":3,"83":3,"85":1,"86":1,"101":1}}],["modules",{"0":{"103":1}}],["moduleitem",{"2":{"100":2}}],["module",{"2":{"36":1,"66":1,"101":3}}],["mod",{"2":{"23":1}}],["mostly",{"2":{"94":1}}],["most",{"2":{"19":1,"42":1,"61":1,"75":1,"79":2,"108":1,"115":1,"120":1}}],["more",{"2":{"4":1,"43":1,"57":1,"61":1,"75":1,"83":2,"96":2,"102":1,"110":1,"122":1}}],["md",{"2":{"4":1,"79":1}}],["managed",{"2":{"119":1}}],["manage",{"2":{"117":1,"119":1}}],["many",{"2":{"75":1,"115":1}}],["mask",{"2":{"114":2}}],["mara",{"2":{"114":1}}],["may",{"2":{"96":2,"111":1,"112":1,"114":1,"117":1,"119":1,"122":1}}],["major",{"2":{"88":1}}],["matklad",{"2":{"110":1}}],["matches",{"2":{"110":1,"120":1}}],["matched",{"2":{"82":2,"92":1,"96":2}}],["matching",{"2":{"92":2,"120":1}}],["match",{"0":{"120":1},"2":{"70":2,"92":1,"118":2,"120":7,"122":2}}],["material",{"2":{"27":1}}],["mainly",{"2":{"109":1}}],["maintains",{"2":{"75":1}}],["maintenance",{"0":{"20":1}}],["main",{"2":{"70":2,"91":2,"101":1}}],["mac",{"0":{"34":1},"2":{"34":1}}],["macros",{"2":{"19":1,"23":1}}],["making",{"2":{"18":1,"117":1,"122":1}}],["make",{"2":{"13":1,"15":1,"16":1,"79":1,"101":1,"110":1,"117":1,"124":1}}],["makes",{"2":{"1":1,"101":1,"117":1}}],["made",{"2":{"0":1,"118":1}}],["eternity",{"2":{"124":1}}],["etc",{"2":{"1":1}}],["educational",{"2":{"120":1}}],["editors",{"2":{"117":1}}],["editor",{"2":{"40":1}}],["evident",{"2":{"114":1}}],["everything",{"2":{"81":1}}],["every",{"2":{"24":1,"27":1,"110":1,"114":1,"117":1,"122":1,"124":2}}],["even",{"2":{"18":2}}],["eventually",{"2":{"3":1,"84":1,"119":1,"124":1}}],["eight",{"2":{"114":1}}],["either",{"2":{"92":1,"110":1,"118":1}}],["eq",{"2":{"110":6,"115":2}}],["equivalent",{"2":{"34":1}}],["equate",{"2":{"24":1}}],["e0072",{"2":{"110":2}}],["elements",{"2":{"91":2,"92":2}}],["else",{"2":{"79":1,"85":2}}],["easier",{"2":{"117":1}}],["easy",{"2":{"81":1,"122":1}}],["each",{"2":{"94":1,"113":1,"115":1,"117":1,"120":1,"121":1,"122":2,"123":2}}],["early",{"2":{"82":1,"83":1,"96":10}}],["err",{"2":{"70":2}}],["error",{"2":{"58":2,"70":6,"82":3,"83":5,"89":4,"92":1,"96":10,"106":1,"110":3,"121":2,"122":2,"123":8}}],["errors",{"2":{"48":1,"76":1,"82":2,"83":1,"89":1,"96":4,"108":1,"124":4}}],["emit=llvm",{"2":{"120":1}}],["emit",{"2":{"58":2}}],["empower",{"2":{"42":1}}],["embrace",{"2":{"19":1}}],["eb179b85",{"2":{"34":3}}],["effect",{"2":{"75":1,"109":1}}],["efficiencies",{"2":{"43":1}}],["efficient",{"2":{"32":1,"109":1,"110":1,"122":2}}],["effort",{"2":{"32":1,"120":1}}],["ecma",{"2":{"81":2,"129":1}}],["ecmascript",{"0":{"102":1},"2":{"27":1,"38":1,"75":1,"81":1,"85":1,"92":1,"102":1,"131":1}}],["economic",{"2":{"24":1}}],["execution",{"2":{"113":1,"120":1}}],["exercise",{"2":{"92":1,"96":1}}],["examining",{"2":{"111":1}}],["examples",{"2":{"73":1}}],["example",{"0":{"70":1,"73":1},"2":{"37":1,"58":2,"75":1,"80":1,"83":1,"90":1,"91":1,"92":2,"99":1,"100":1,"108":1,"110":1,"114":1,"115":1,"117":1,"122":1}}],["extend",{"2":{"91":2}}],["extensions",{"2":{"40":1}}],["extension",{"0":{"39":1,"53":1},"1":{"40":1},"2":{"40":1,"53":1}}],["extra",{"2":{"81":1,"91":1,"111":1}}],["except",{"2":{"76":1,"94":1}}],["exit665",{"2":{"120":2}}],["exit655",{"2":{"120":2}}],["exit625",{"2":{"120":2}}],["exit590",{"2":{"120":2}}],["exit540",{"2":{"120":2}}],["exit450",{"2":{"120":2}}],["exit380",{"2":{"120":2}}],["exit325",{"2":{"120":2}}],["exit280",{"2":{"120":2}}],["exit",{"2":{"120":2}}],["exited",{"2":{"34":2}}],["existing",{"2":{"24":1,"75":1}}],["expr",{"2":{"110":1}}],["expressionnode",{"2":{"109":2}}],["expressionstatement",{"2":{"92":2}}],["expressions",{"0":{"103":1},"2":{"84":1,"88":1}}],["expression",{"0":{"84":1},"2":{"88":3,"91":4,"92":2,"94":7,"109":2,"110":5}}],["export",{"2":{"108":1}}],["exportdeclaration",{"2":{"100":2}}],["exports",{"2":{"63":1}}],["exponentiationexpression",{"2":{"92":5}}],["explicitly",{"2":{"87":1,"88":1}}],["explanation",{"2":{"83":1,"102":1}}],["explain",{"2":{"80":1,"89":1,"114":1}}],["explains",{"2":{"6":1}}],["explore",{"2":{"75":1}}],["experimental",{"2":{"58":2}}],["experience",{"2":{"32":1,"75":1}}],["expectations",{"2":{"114":1}}],["expected",{"2":{"92":1,"96":2}}],["expect",{"2":{"24":1,"70":4}}],["e",{"2":{"24":1,"87":1,"94":2,"108":3,"110":2,"112":1}}],["essence",{"2":{"115":1}}],["es5",{"2":{"83":1}}],["es6",{"2":{"83":1}}],["escape",{"2":{"82":2,"112":1}}],["escapesequence",{"2":{"82":2}}],["escaped",{"2":{"82":2,"112":1,"118":2}}],["estree",{"2":{"75":4,"80":1,"84":1,"91":3,"108":2,"129":1}}],["established",{"2":{"14":1}}],["esm",{"2":{"58":2}}],["es2015",{"2":{"38":1}}],["esnext",{"2":{"38":1}}],["esbuild",{"2":{"24":1,"94":1,"128":1}}],["eslintignore",{"2":{"48":1,"123":1}}],["eslint",{"2":{"23":1,"36":1,"40":1,"48":2,"49":1,"55":1,"83":1,"108":1,"122":1}}],["especially",{"2":{"18":2,"36":1,"80":1}}],["enough",{"2":{"120":1,"122":1}}],["enclose",{"2":{"118":1}}],["encounters",{"2":{"118":1,"124":1}}],["encountered",{"2":{"118":1}}],["enlightenment",{"2":{"91":1}}],["enums",{"2":{"108":1,"117":1}}],["enum",{"0":{"110":1},"2":{"91":4,"108":2,"109":2,"110":25,"115":3,"117":10,"122":3}}],["entity",{"2":{"124":4}}],["entire",{"2":{"88":1,"89":1,"114":1}}],["enter",{"2":{"122":6}}],["entry",{"0":{"3":1},"2":{"3":2,"114":32}}],["end",{"2":{"79":1,"111":2,"120":1}}],["ending",{"2":{"34":2}}],["enhances",{"2":{"75":1}}],["enhanced",{"2":{"36":1,"66":1,"114":1}}],["env",{"2":{"70":6}}],["enable",{"2":{"58":8,"113":1}}],["ensuring",{"2":{"32":1}}],["enrionment",{"2":{"6":1}}],["dbg",{"2":{"120":2}}],["dynamic",{"2":{"114":4}}],["due",{"2":{"110":1}}],["during",{"2":{"75":1,"90":1,"94":1,"109":1,"114":1}}],["dropped",{"2":{"109":2,"122":1}}],["dropping",{"2":{"94":1,"109":1}}],["drop",{"2":{"109":1,"117":1,"123":2}}],["drives",{"2":{"92":1}}],["dragons",{"2":{"91":1}}],["drawback",{"2":{"75":1}}],["daniel",{"2":{"119":1}}],["days",{"2":{"120":1}}],["day",{"2":{"91":1,"109":1}}],["darwin",{"2":{"59":2}}],["data",{"2":{"19":1,"24":1,"109":1,"111":2,"114":2,"115":1,"117":4,"118":5,"122":1}}],["d=name",{"2":{"58":2}}],["dlx",{"2":{"50":4}}],["d",{"2":{"50":8,"58":8,"64":8,"69":8}}],["dod",{"2":{"127":1}}],["domain",{"2":{"106":1}}],["doesn",{"2":{"118":2}}],["does",{"2":{"80":1,"81":1,"83":1,"89":1,"92":2,"96":1,"109":1,"110":1,"114":2,"117":1,"120":1,"123":1}}],["don",{"2":{"79":2,"118":1}}],["done",{"2":{"76":2,"119":1}}],["downside",{"2":{"117":1}}],["downstream",{"2":{"75":1,"80":1}}],["down",{"2":{"34":1,"89":1,"91":1,"92":2,"106":1,"122":1}}],["download",{"2":{"11":1,"50":1,"53":1}}],["dollars",{"2":{"24":1}}],["doing",{"2":{"18":1,"94":1,"118":1}}],["do",{"2":{"14":1,"34":2,"79":3,"80":1,"83":1,"91":2,"94":3,"110":2,"120":4}}],["document",{"2":{"94":1}}],["documentation",{"2":{"68":1}}],["documented",{"2":{"19":1,"124":2}}],["doc",{"2":{"4":1}}],["diagnostic",{"2":{"124":1}}],["diagnostics",{"2":{"123":5,"124":1}}],["did",{"2":{"109":1,"113":1,"119":1}}],["dive",{"2":{"115":1}}],["divpunctuator",{"2":{"92":4}}],["division",{"2":{"92":1}}],["different",{"2":{"108":1,"122":1}}],["differently",{"2":{"80":1}}],["differs",{"2":{"75":1}}],["difficult",{"2":{"3":1,"79":1,"91":1,"106":1,"117":1}}],["directive",{"2":{"83":1}}],["directives",{"2":{"82":2}}],["directly",{"2":{"50":1,"91":1}}],["directory",{"2":{"40":1,"123":1}}],["disallowing",{"2":{"90":1,"101":1}}],["disallow",{"2":{"88":2}}],["disallows",{"2":{"82":1}}],["disabling",{"2":{"48":1}}],["distinguishes",{"2":{"91":1}}],["distinguish",{"2":{"80":1,"91":2}}],["distinction",{"2":{"75":1,"101":1}}],["distinct",{"2":{"75":1,"113":1}}],["disparate",{"2":{"43":1}}],["discipline",{"2":{"106":1}}],["discover",{"2":{"94":1}}],["discord",{"2":{"4":1,"13":1}}],["discussion",{"2":{"16":1}}],["dsl",{"2":{"2":1}}],["deep",{"2":{"115":1}}],["dealing",{"2":{"115":1}}],["deallocate",{"2":{"109":1}}],["deallocation",{"2":{"76":1}}],["deduplication",{"2":{"114":1}}],["dedicated",{"2":{"32":1,"89":1}}],["deviate",{"2":{"91":1}}],["developing",{"2":{"32":1,"75":1}}],["developer",{"2":{"14":1}}],["develop",{"2":{"11":1,"13":1,"24":1}}],["development",{"0":{"6":1,"19":1,"22":1,"40":1,"128":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1},"2":{"6":1,"14":1,"17":1,"32":1,"75":2}}],["dependents",{"2":{"110":1}}],["dependent",{"2":{"110":1}}],["dependencies",{"0":{"13":1},"2":{"13":1,"19":1}}],["depth",{"2":{"83":1,"102":1}}],["derivation",{"2":{"79":1}}],["delegated",{"2":{"76":1}}],["determine",{"2":{"91":1}}],["detect",{"2":{"58":6,"82":1}}],["detail",{"2":{"57":1,"61":1,"120":1}}],["details",{"2":{"1":1,"4":1,"38":1}}],["deny",{"2":{"58":2}}],["deny=name",{"2":{"58":2}}],["denying",{"2":{"58":2}}],["deno",{"2":{"50":2}}],["defining",{"2":{"91":2}}],["definition",{"2":{"81":1,"117":1}}],["definitions",{"2":{"81":1,"83":1,"94":1,"95":1,"96":1}}],["defines",{"2":{"94":1}}],["defined",{"2":{"80":1,"91":3,"117":1}}],["define",{"2":{"1":1,"2":1,"85":1,"91":2,"95":1,"96":1,"110":1}}],["default",{"2":{"48":1,"58":2,"70":2,"90":1}}],["debuggerstatement",{"2":{"121":2,"122":2}}],["debugger`",{"2":{"58":4}}],["debugger",{"2":{"40":3,"121":2}}],["debug",{"2":{"34":5,"114":2}}],["debating",{"2":{"18":1}}],["demonstrated",{"2":{"32":1}}],["demand",{"2":{"14":1}}],["decide",{"2":{"87":1,"91":1}}],["decided",{"2":{"81":1,"109":1,"113":1,"114":1}}],["decisiveness",{"2":{"18":1}}],["decisions",{"2":{"18":1}}],["decision",{"2":{"0":1,"18":2}}],["declaration",{"0":{"85":1},"2":{"81":1,"85":4,"89":4,"94":2,"110":2}}],["declarationsstatement",{"2":{"85":1}}],["declarations",{"0":{"89":1},"2":{"80":1,"85":2,"89":1,"108":2}}],["declaring",{"2":{"80":1,"108":1,"117":1}}],["declared",{"2":{"82":1,"94":1}}],["declare",{"2":{"23":1,"81":1,"94":1,"109":1}}],["destructuring",{"2":{"91":2}}],["description",{"2":{"118":1}}],["describing",{"2":{"96":2}}],["describes",{"2":{"1":1,"110":1,"120":1}}],["described",{"2":{"1":1,"83":1}}],["descent",{"2":{"79":1,"107":1}}],["designed",{"2":{"118":1}}],["design",{"2":{"19":1,"108":1}}],["de",{"2":{"14":1}}],["u8s",{"2":{"117":1}}],["u8",{"2":{"117":4}}],["utilize",{"2":{"114":1}}],["utilizes",{"2":{"12":1}}],["utilization",{"2":{"113":2}}],["u32",{"2":{"111":3,"114":2}}],["ubuntu",{"2":{"56":2}}],["umbrella",{"2":{"38":1,"63":1}}],["urgency",{"2":{"18":1}}],["unlocks",{"2":{"123":1}}],["unless",{"2":{"82":1,"87":1}}],["untyped",{"2":{"122":1}}],["until",{"2":{"91":1,"94":1,"109":1,"111":1}}],["unique",{"2":{"115":1,"117":2}}],["unicorn",{"2":{"23":2}}],["unaware",{"2":{"114":1}}],["unnecessary",{"2":{"91":1}}],["uncaught",{"2":{"83":1}}],["uncertainty",{"2":{"18":1}}],["unwrap",{"2":{"70":2,"123":4}}],["understood",{"2":{"118":1}}],["understanding",{"2":{"102":1,"131":1}}],["understand",{"2":{"88":2,"91":1,"92":1,"103":1,"109":1,"118":1}}],["under",{"2":{"34":1}}],["undertake",{"2":{"14":1}}],["unused",{"2":{"20":1}}],["unknowns",{"2":{"18":1}}],["unfortunately",{"2":{"14":1,"79":1,"109":1,"112":1}}],["ungram",{"2":{"2":1}}],["ungrammar",{"2":{"2":2}}],["ustr",{"2":{"114":2}}],["usize",{"2":{"111":5,"114":2,"117":4,"122":2}}],["usizes",{"2":{"111":1}}],["using",{"0":{"126":1},"2":{"2":1,"19":1,"26":1,"75":1,"91":3,"94":2,"95":4,"108":1,"117":3,"120":1,"122":2}}],["usage",{"2":{"58":2,"109":1,"115":1,"117":2}}],["us",{"2":{"13":1,"88":1,"101":1,"110":1,"117":1,"120":5,"123":1}}],["useful",{"2":{"123":1}}],["useless",{"2":{"48":1}}],["user",{"2":{"42":1,"108":1}}],["users",{"2":{"24":1,"79":1}}],["used",{"2":{"34":2,"38":1,"79":1,"92":4,"96":4,"108":1,"111":1,"113":3,"121":1,"123":1}}],["uses",{"2":{"27":1,"56":2,"82":1,"117":1,"119":1,"120":1,"123":1}}],["use",{"0":{"82":1},"2":{"11":1,"58":4,"70":3,"82":1,"83":7,"96":2,"101":2,"106":1,"109":1,"110":4,"112":1,"115":3,"117":1,"118":1,"119":1,"122":2,"124":1}}],["upon",{"2":{"113":1}}],["upfront",{"2":{"109":1}}],["updated",{"2":{"79":1}}],["up",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1},"2":{"6":1,"20":1,"91":1,"94":1,"110":3,"111":1,"113":1,"117":2,"122":1}}],["gperf",{"2":{"120":1}}],["game",{"2":{"117":1}}],["gained",{"2":{"32":1}}],["guesses",{"2":{"114":1}}],["guarded",{"2":{"88":1}}],["glance",{"2":{"122":1}}],["global",{"2":{"113":1,"124":4}}],["glue",{"2":{"34":1}}],["g",{"2":{"87":1,"108":3,"110":2,"114":2}}],["gt",{"2":{"70":4,"84":10,"86":4,"92":8,"94":6,"95":6,"101":4,"108":4,"109":4,"110":12,"112":4,"114":23,"115":4,"117":15,"118":8,"120":12,"121":2,"122":45}}],["got",{"2":{"119":1,"120":1}}],["go",{"2":{"92":1,"117":3,"122":2,"128":1}}],["going",{"2":{"91":1,"114":1,"117":1,"119":1}}],["google",{"2":{"24":1}}],["good",{"2":{"13":1}}],["goal",{"2":{"24":1,"27":1,"42":1,"92":4}}],["gives",{"2":{"120":1}}],["given",{"2":{"17":1,"92":1}}],["gitignore",{"2":{"123":1}}],["gitgit",{"2":{"7":1}}],["git",{"2":{"7":4,"54":2}}],["github",{"0":{"56":1},"2":{"3":4,"4":1,"7":2,"20":1,"50":1,"81":2,"82":2,"89":2,"90":2,"114":2,"124":1}}],["get",{"2":{"80":1,"122":3,"124":4}}],["getting",{"2":{"3":1,"15":1,"92":1}}],["generic",{"2":{"75":1,"122":2}}],["generator",{"2":{"79":1}}],["generate",{"2":{"79":1}}],["generated",{"2":{"2":3}}],["generation",{"0":{"23":1}}],["general",{"0":{"16":1},"2":{"118":1}}],["group",{"2":{"119":1}}],["greatly",{"2":{"75":1,"80":1}}],["green",{"2":{"1":3}}],["grab",{"2":{"79":1}}],["grasp",{"2":{"79":1,"91":1}}],["graphite",{"2":{"17":1}}],["grammars",{"2":{"79":1,"83":1,"93":1,"96":2}}],["grammar",{"0":{"2":1,"79":1,"90":1,"92":1,"93":1,"102":1},"1":{"94":1,"95":1,"96":1},"2":{"2":3,"79":5,"80":1,"84":1,"85":1,"87":1,"88":4,"90":2,"91":7,"92":11,"94":2,"95":4,"96":6,"97":1,"98":1,"100":1,"101":1,"103":1}}],["num",{"2":{"117":6}}],["number",{"2":{"48":1}}],["null",{"2":{"91":4}}],["navigating",{"2":{"91":1}}],["nature",{"2":{"79":1,"110":1}}],["namely",{"2":{"90":1}}],["names",{"2":{"58":2,"112":1,"115":1}}],["namejust",{"2":{"23":2}}],["name",{"2":{"23":11,"56":2,"80":4,"84":4,"89":1,"91":2,"95":1,"112":2,"118":1}}],["named",{"2":{"1":1}}],["nice",{"2":{"79":1,"109":1,"122":2}}],["nixpkgs",{"2":{"57":1}}],["nix",{"0":{"57":1}}],["nth",{"2":{"70":4}}],["nvim",{"0":{"54":1}}],["npx",{"2":{"50":2,"56":2,"58":2}}],["npm",{"2":{"50":2,"64":2,"69":2}}],["npmpnpmyarnbundeno",{"2":{"50":1}}],["npmpnpmyarnbun",{"2":{"50":1,"64":1,"69":1}}],["negative",{"2":{"117":1}}],["negatively",{"2":{"114":1}}],["neglected",{"2":{"109":1}}],["nearby",{"2":{"109":1}}],["necessary",{"2":{"96":2}}],["never",{"2":{"86":1,"117":1,"118":1,"119":1}}],["next",{"2":{"79":1,"92":1,"114":4}}],["newline",{"2":{"124":1}}],["new",{"2":{"14":1,"23":13,"28":1,"70":2,"112":1,"114":8,"118":3,"123":3,"124":2}}],["needs",{"2":{"82":1,"87":1,"88":2,"89":1,"92":1,"122":1}}],["needed",{"2":{"7":2,"88":2}}],["need",{"2":{"2":1,"14":1,"79":1,"81":1,"87":1,"88":1,"91":2,"92":2,"94":1,"96":1,"97":1,"101":1,"109":1,"110":1,"114":2,"117":1,"120":1,"122":1,"123":1,"124":1}}],["none",{"2":{"117":4,"118":2}}],["nonnull",{"2":{"114":8}}],["non",{"0":{"83":1},"2":{"83":2,"85":1}}],["nonoctaldecimalescapesequence",{"2":{"82":2}}],["nodes",{"2":{"75":2,"91":2,"109":1,"111":1,"122":9}}],["node",{"0":{"64":1,"69":1},"2":{"66":1,"80":8,"81":1,"85":1,"91":5,"94":1,"108":8,"111":2,"121":1,"122":38}}],["no",{"2":{"40":1,"48":1,"58":4,"76":1,"82":1,"94":2,"95":4,"110":2,"120":1,"123":1}}],["normal",{"2":{"34":1,"96":2}}],["now",{"2":{"13":1,"49":1,"83":1,"91":1,"92":1,"114":1}}],["notation",{"2":{"97":1}}],["notational",{"0":{"97":1},"1":{"98":1,"99":1,"100":1}}],["notable",{"2":{"75":1}}],["noted",{"2":{"94":1}}],["note",{"2":{"88":3,"96":2,"97":1,"114":1}}],["nothing",{"2":{"79":1}}],["not",{"0":{"87":1},"2":{"9":1,"18":1,"34":2,"40":1,"43":1,"76":1,"79":2,"80":2,"81":1,"83":1,"84":2,"85":1,"86":2,"87":2,"88":1,"89":1,"91":3,"92":3,"94":5,"95":1,"96":5,"100":1,"101":1,"108":1,"109":1,"110":2,"111":1,"113":1,"114":2,"118":1,"119":1,"120":2,"122":2,"123":1,"124":1}}],["job",{"2":{"117":2}}],["journey",{"2":{"106":1}}],["join",{"2":{"4":1}}],["jest",{"2":{"23":2,"58":4}}],["jsparagus",{"2":{"79":1,"109":1,"118":1,"128":1,"129":1}}],["json",{"2":{"54":1,"119":1}}],["jsx",{"2":{"23":2,"58":4,"61":1,"75":1}}],["jscargo",{"2":{"3":1}}],["js",{"0":{"64":1,"69":1},"2":{"2":2,"3":8,"4":1,"40":1,"56":2,"66":1,"79":2,"82":2,"89":2,"90":2,"101":1,"128":1,"131":1}}],["justfile",{"2":{"13":1}}],["just",{"0":{"12":1},"2":{"2":1,"12":3,"13":3,"22":1,"23":8,"26":1,"79":1,"81":2,"83":1,"84":1,"91":1,"94":1,"113":1,"114":2,"117":1,"118":2}}],["javascriptvar",{"2":{"99":1}}],["javascriptasync",{"2":{"95":1}}],["javascripta",{"2":{"92":1,"98":1}}],["javascriptlet",{"2":{"87":1,"94":1,"96":1}}],["javascriptif",{"2":{"85":1}}],["javascriptfunction",{"2":{"83":2,"89":2}}],["javascripthttps",{"2":{"82":1,"89":1}}],["javascript",{"0":{"105":1},"1":{"106":1},"2":{"0":1,"4":1,"14":2,"24":1,"27":1,"28":1,"36":1,"42":2,"43":1,"54":3,"61":1,"75":3,"79":3,"84":2,"86":2,"91":2,"94":1,"96":1,"101":2,"105":1,"108":3,"109":1,"110":1,"112":1,"115":1,"118":1,"120":1,"127":2,"128":1}}],["f64",{"2":{"117":6}}],["f9c4eff94a133fa497778328fa0734aa22d5697c",{"2":{"81":2}}],["further",{"2":{"91":1}}],["fun",{"2":{"83":1}}],["functionality",{"2":{"118":1}}],["functions",{"0":{"103":1},"2":{"109":1,"121":2}}],["functionbody",{"2":{"83":2}}],["functionbodycontainsusestrict",{"2":{"83":2}}],["functionexpression",{"2":{"83":2}}],["functiondeclarations",{"2":{"85":1}}],["functiondeclaration",{"2":{"83":2,"89":2}}],["function",{"0":{"85":1,"89":1},"2":{"81":1,"83":11,"84":4,"85":4,"89":10,"94":3,"95":1,"120":2}}],["full",{"2":{"70":2,"113":1,"122":1}}],["fully",{"2":{"1":1,"91":1,"96":2}}],["fn",{"2":{"70":2,"81":2,"84":10,"110":2,"114":2,"115":2,"118":1,"120":1,"121":2,"122":10}}],["felt",{"2":{"124":1}}],["fetch",{"2":{"114":4}}],["feature",{"2":{"66":1,"123":1}}],["features",{"0":{"48":1,"61":1},"2":{"28":1}}],["fewer",{"2":{"106":1}}],["few",{"2":{"55":1,"79":1,"94":1,"119":1,"120":1}}],["feedback",{"2":{"55":1}}],["frequently",{"2":{"114":1,"117":1}}],["free",{"2":{"79":2}}],["friendly",{"2":{"42":1,"108":1,"110":1,"114":1}}],["from",{"2":{"0":2,"2":1,"11":1,"18":1,"24":1,"40":2,"50":1,"63":1,"70":2,"75":1,"79":2,"82":1,"83":1,"91":2,"108":1,"111":1,"113":1,"114":5,"119":1,"120":3}}],["flexstr",{"2":{"115":3}}],["flexibility",{"2":{"14":1}}],["flags",{"2":{"7":1,"90":1}}],["fast",{"0":{"76":1},"2":{"76":1,"109":1,"113":1,"120":1,"122":1,"124":1,"131":2}}],["fastest",{"2":{"24":1,"25":1,"42":1,"61":1,"75":1}}],["fasterthanli",{"2":{"115":1}}],["faster",{"2":{"17":1,"24":3,"48":1,"55":1,"61":1,"109":1,"120":2,"122":1,"124":1}}],["far",{"2":{"61":1,"75":1,"114":1}}],["false",{"2":{"34":2,"83":2}}],["favor",{"2":{"18":2}}],["fact",{"2":{"83":1}}],["facto",{"2":{"14":1}}],["face",{"2":{"18":1}}],["fater",{"2":{"11":1}}],["focus",{"2":{"122":1}}],["focusing",{"2":{"38":1}}],["foo",{"2":{"80":2,"83":7,"85":2,"86":2,"87":2,"88":3,"89":4,"91":8,"94":2,"124":4}}],["footprint",{"2":{"111":1}}],["foot",{"2":{"79":1}}],["found",{"2":{"26":1,"29":1,"30":1,"84":1,"110":1,"119":1,"120":1,"124":1}}],["follows",{"2":{"109":1}}],["following",{"2":{"9":1,"13":1,"15":1,"26":1,"34":1,"54":1,"59":1,"83":1,"86":1,"89":1,"90":1,"91":4,"92":1,"93":1,"94":2,"95":4,"96":5,"106":2,"110":1,"115":1}}],["follow",{"2":{"9":1,"80":1,"85":1,"92":2}}],["forget",{"2":{"122":1}}],["forgiveness",{"2":{"18":1}}],["forum",{"2":{"110":1}}],["forward",{"2":{"94":1}}],["forinofstatement",{"2":{"88":1}}],["forbids",{"2":{"88":1}}],["forbid",{"2":{"83":1}}],["fortunately",{"2":{"82":1,"115":1}}],["formalparameters",{"2":{"83":2}}],["formatter",{"0":{"14":1,"71":1},"2":{"14":2,"42":1,"108":1}}],["form",{"2":{"16":1}}],["for",{"0":{"88":2},"2":{"3":2,"4":3,"6":1,"9":1,"14":2,"15":1,"17":1,"18":1,"20":2,"23":1,"24":3,"25":1,"30":1,"32":1,"34":3,"36":3,"38":2,"42":2,"55":1,"57":1,"58":6,"59":1,"61":1,"73":1,"75":1,"76":1,"79":1,"80":2,"81":2,"82":1,"83":1,"84":4,"85":1,"88":13,"90":2,"91":7,"92":4,"94":3,"96":5,"99":2,"100":2,"102":1,"106":1,"108":4,"109":3,"110":6,"111":1,"112":2,"113":1,"114":5,"115":1,"117":8,"120":3,"121":2,"122":7,"123":4,"124":2}}],["figure",{"2":{"114":1}}],["field",{"2":{"110":5,"117":2}}],["five",{"2":{"109":1}}],["fix",{"2":{"58":2}}],["final",{"2":{"122":1,"123":1}}],["finally",{"2":{"3":1,"91":1,"117":1}}],["finish",{"2":{"94":1,"118":2}}],["fine",{"2":{"32":1,"120":1}}],["find",{"2":{"3":1,"40":1,"91":1,"110":1,"117":1,"120":2}}],["first",{"2":{"3":1,"13":1,"34":1,"36":1,"79":1,"92":3,"93":1,"94":2,"95":1,"108":2,"110":2,"118":1,"120":1,"122":1}}],["filetypes",{"2":{"54":2}}],["files",{"0":{"123":1},"2":{"50":1,"108":1,"111":1,"114":1,"123":1}}],["file",{"2":{"2":1,"9":1,"23":1,"34":6,"36":1,"40":2,"58":2,"101":1,"109":1,"111":1}}],["https",{"2":{"105":1,"114":1,"115":1}}],["html",{"2":{"101":2}}],["huge",{"2":{"101":1,"124":1}}],["human",{"2":{"79":1}}],["h",{"2":{"58":2}}],["high",{"2":{"42":1}}],["higher",{"2":{"38":1}}],["history",{"0":{"0":1}}],["hey",{"2":{"79":1}}],["heap",{"2":{"76":1,"109":1,"113":1,"114":1,"115":2}}],["herelet",{"2":{"124":1}}],["hereuse",{"2":{"124":1}}],["here",{"2":{"29":1,"91":1,"94":2,"95":4,"97":1,"114":1,"122":1,"124":3}}],["help",{"2":{"4":1,"58":9,"110":2,"118":1,"119":1}}],["hot",{"2":{"120":1}}],["hold",{"2":{"117":1}}],["holds",{"2":{"24":1,"110":2}}],["hour",{"2":{"114":1}}],["horrors",{"2":{"79":1}}],["hood",{"2":{"34":1}}],["however",{"2":{"24":1,"36":1,"96":2,"106":1,"114":1,"122":1}}],["how",{"0":{"76":1},"2":{"4":1,"6":1,"88":1,"89":1,"91":1,"94":1,"98":1,"110":1,"119":1,"127":1}}],["happy",{"2":{"114":1}}],["happens",{"2":{"83":1,"94":1}}],["half",{"2":{"114":1}}],["handle",{"2":{"124":10}}],["hand",{"2":{"79":2,"88":1,"91":2,"92":1}}],["handy",{"2":{"12":1}}],["haven",{"2":{"79":1}}],["have",{"2":{"9":1,"24":1,"28":1,"32":1,"75":2,"79":2,"81":1,"84":3,"86":1,"88":1,"91":3,"92":1,"109":1,"110":3,"112":1,"115":2,"117":1,"120":1,"122":2,"123":1,"124":1}}],["having",{"2":{"1":1,"115":1,"122":3}}],["hashing",{"2":{"114":1}}],["hashmap",{"2":{"114":7,"120":1}}],["hash",{"2":{"114":13,"120":4}}],["has",{"2":{"4":2,"14":1,"27":1,"28":1,"30":1,"32":1,"79":1,"90":1,"94":1,"106":1,"115":1,"117":2,"118":1,"119":1,"122":1}}],["l425",{"2":{"90":1}}],["l425https",{"2":{"90":1}}],["l404",{"2":{"90":2}}],["l35",{"2":{"89":1}}],["l35https",{"2":{"89":1}}],["l30",{"2":{"89":2}}],["lt",{"2":{"84":4,"86":2,"91":8,"92":4,"94":1,"101":4,"108":4,"109":4,"110":10,"112":4,"114":17,"115":4,"117":13,"118":2,"121":2,"122":41}}],["l85",{"2":{"81":1}}],["l85https",{"2":{"81":1}}],["l",{"2":{"79":2}}],["llvm",{"2":{"120":2}}],["ll",{"0":{"79":1},"2":{"79":5,"92":2,"117":1}}],["lemire",{"2":{"119":1}}],["length",{"2":{"117":1,"120":5}}],["len",{"2":{"117":2,"118":4}}],["lexical",{"0":{"102":1},"2":{"92":5}}],["lexer",{"0":{"116":1},"1":{"117":1,"118":1,"119":1,"120":1},"2":{"82":1,"92":2,"107":1,"117":2,"118":6}}],["level",{"0":{"89":1},"2":{"89":1,"100":2,"108":1}}],["legit",{"0":{"86":1},"2":{"86":1}}],["legacyoctalescapesequence",{"2":{"82":2}}],["legacy",{"0":{"82":1},"2":{"82":5,"89":1}}],["leave",{"2":{"122":6}}],["leaf",{"2":{"111":1}}],["leading",{"2":{"115":1}}],["lead",{"2":{"91":1,"117":1}}],["leads",{"2":{"75":1,"123":1}}],["learning",{"0":{"127":1},"2":{"106":1}}],["learn",{"2":{"79":1}}],["learned",{"2":{"79":1}}],["let",{"0":{"87":1},"2":{"70":6,"79":1,"87":14,"88":7,"92":3,"94":2,"96":1,"114":15,"117":1,"122":3,"123":11,"124":6}}],["lefthandsideexpression",{"2":{"91":6,"96":6}}],["leftmost",{"2":{"79":1}}],["left",{"2":{"18":1,"34":1,"79":2,"91":4}}],["less",{"2":{"14":1,"24":1,"106":1}}],["long",{"2":{"124":1}}],["lost",{"2":{"117":1}}],["lossy",{"2":{"70":2}}],["lossless",{"2":{"1":1}}],["logical",{"2":{"114":1}}],["loop",{"2":{"122":1}}],["loops",{"2":{"55":1}}],["looking",{"2":{"114":1,"120":1}}],["looks",{"2":{"95":1,"114":1}}],["lookahead",{"2":{"88":2}}],["look",{"2":{"4":1,"88":1,"114":2,"115":1,"117":1}}],["locks",{"2":{"113":1,"114":2}}],["lock",{"2":{"113":2,"114":3,"124":6}}],["loc",{"2":{"49":1}}],["located",{"2":{"34":1}}],["lots",{"2":{"85":2,"113":1,"115":1,"121":2}}],["lot",{"2":{"36":1,"109":1,"113":1}}],["loads",{"2":{"24":1}}],["lower",{"2":{"38":1}}],["low",{"2":{"11":1}}],["l19",{"2":{"82":1}}],["l19https",{"2":{"82":1}}],["l16",{"2":{"82":2}}],["l17",{"2":{"3":1}}],["l17https",{"2":{"3":1}}],["l178",{"2":{"3":2}}],["l14",{"2":{"3":2}}],["l187",{"2":{"3":1}}],["l187https",{"2":{"3":1}}],["lazily",{"2":{"118":1}}],["lazy",{"2":{"79":1,"114":4,"131":1}}],["lasso",{"2":{"114":1}}],["last",{"2":{"110":2,"122":1}}],["layout",{"2":{"110":1}}],["labelled",{"2":{"86":2}}],["label",{"0":{"86":1},"2":{"120":22}}],["labelidentifier",{"2":{"80":2}}],["later",{"2":{"83":1,"94":1,"114":1,"120":1}}],["latestjobs",{"2":{"56":1}}],["latest",{"2":{"50":6,"56":3,"58":2}}],["latest$",{"2":{"50":5}}],["lalrpop",{"2":{"114":1}}],["lalr",{"2":{"79":1}}],["launching",{"2":{"34":2}}],["launch",{"2":{"34":5}}],["lacking",{"2":{"14":1}}],["larger",{"2":{"111":1}}],["largest",{"2":{"110":1}}],["large",{"2":{"3":1,"110":1,"111":1,"115":1}}],["languages",{"2":{"79":1}}],["languageserver",{"2":{"54":2}}],["language",{"0":{"102":1},"2":{"1":1,"28":1,"42":1,"43":1,"79":1,"82":2,"85":1,"92":1}}],["lib",{"2":{"110":2}}],["library",{"2":{"1":1,"113":3,"114":2,"122":1}}],["libraries",{"2":{"0":1,"114":1}}],["lifetime",{"2":{"109":2,"117":2}}],["literal",{"2":{"86":1}}],["literals",{"2":{"82":3,"112":1,"117":2}}],["linux",{"2":{"59":2}}],["linear",{"2":{"109":1,"114":2,"122":1}}],["lineterminator",{"2":{"92":4,"94":2,"95":4}}],["line",{"2":{"34":3,"86":1,"119":1,"124":1}}],["lints",{"2":{"58":2}}],["lint",{"2":{"23":2,"56":2,"58":2,"123":2,"128":1}}],["linter",{"0":{"21":1,"121":1},"1":{"22":1,"23":1,"122":1,"123":1,"124":1},"2":{"23":1,"42":1,"73":3,"108":1,"110":2,"113":1,"121":2,"122":1,"123":11,"124":1}}],["linting",{"2":{"1":1}}],["lingering",{"2":{"18":1}}],["lists",{"2":{"98":1}}],["list",{"2":{"13":1,"58":3,"79":1,"83":1,"120":1}}],["like",{"2":{"2":1,"36":1,"91":2,"92":1,"114":1,"118":1,"124":1}}],["o",{"2":{"115":1}}],["occasionally",{"2":{"111":1}}],["octals",{"2":{"82":1}}],["octal",{"0":{"82":1},"2":{"82":4}}],["old",{"2":{"101":1,"119":1}}],["older",{"2":{"38":1}}],["ok",{"2":{"70":2,"123":2}}],["obvious",{"2":{"94":1}}],["obviously",{"2":{"85":1}}],["obstacles",{"2":{"88":1}}],["observable",{"2":{"27":1}}],["objectliteral",{"2":{"96":15}}],["objectbindingpattern",{"2":{"91":2}}],["objectassignmentpattern",{"2":{"91":4,"96":7}}],["objectpattern",{"2":{"91":7}}],["object",{"2":{"86":1,"96":4}}],["objectives",{"2":{"24":1}}],["other",{"2":{"23":1,"76":1,"83":1,"92":4,"109":1}}],["oxidation",{"2":{"42":1}}],["oxlint$",{"2":{"50":4}}],["oxlintcargo",{"2":{"34":1}}],["oxlint",{"0":{"47":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1},"2":{"22":2,"34":9,"37":1,"50":16,"55":2,"56":4,"58":4,"59":1}}],["oxc$",{"2":{"63":1}}],["oxc",{"0":{"42":1,"126":1},"1":{"43":1,"44":1},"2":{"6":1,"7":4,"11":1,"12":1,"13":1,"15":1,"22":2,"23":2,"24":1,"32":1,"34":4,"40":2,"54":4,"63":8,"64":9,"68":3,"69":9,"70":2,"73":1,"75":3,"107":1,"110":2}}],["operation",{"2":{"109":1}}],["operators",{"2":{"91":3}}],["operator",{"2":{"88":4,"92":1}}],["open",{"2":{"34":2,"40":2}}],["optvar",{"2":{"99":1}}],["optvariabledeclaration",{"2":{"99":1}}],["opt",{"2":{"80":2,"91":2,"99":3,"124":1}}],["optimized",{"2":{"120":1}}],["optimize",{"2":{"115":1}}],["optimization",{"2":{"106":1,"115":1,"117":1}}],["optimizing",{"2":{"24":1,"120":1,"131":1}}],["optimal",{"2":{"106":1}}],["optional",{"0":{"99":1},"2":{"99":1,"124":2}}],["option",{"2":{"84":1,"114":3,"122":4}}],["options",{"2":{"14":1,"58":2,"66":1,"123":2}}],["opportunity",{"2":{"75":1}}],["opinionated",{"2":{"14":1}}],["ourselves",{"2":{"79":1}}],["our",{"2":{"14":1,"24":1,"32":2,"36":1,"42":1,"75":2,"85":1,"91":1,"94":1,"115":1,"117":4,"120":1,"122":2}}],["outcome",{"2":{"114":1}}],["out",{"2":{"13":1,"91":1,"94":1,"110":1,"111":1,"114":1,"118":1,"119":1,"120":1}}],["output",{"2":{"2":1,"34":7}}],["order",{"2":{"109":3}}],["organized",{"2":{"106":1}}],["org",{"2":{"105":1}}],["oriented",{"2":{"19":1}}],["original",{"2":{"118":1}}],["originally",{"2":{"105":1}}],["origin",{"2":{"1":1}}],["or",{"2":{"4":1,"13":2,"16":1,"18":1,"19":1,"24":1,"36":1,"58":8,"88":2,"91":4,"92":3,"94":2,"96":4,"106":1,"109":2,"110":3,"117":1,"118":4,"124":1}}],["ones",{"2":{"115":1,"124":1}}],["one",{"2":{"91":1,"94":1,"96":1,"109":1,"112":1,"113":1,"115":1,"120":1}}],["once",{"2":{"34":1,"88":1}}],["only",{"2":{"34":2,"55":1,"79":1,"88":1,"92":1,"94":1,"113":1,"119":1,"120":2}}],["on",{"0":{"105":1,"106":1},"1":{"106":1},"2":{"4":3,"13":1,"18":1,"20":1,"24":3,"32":1,"34":3,"36":1,"38":1,"49":1,"56":2,"75":2,"83":1,"93":1,"102":1,"105":1,"106":1,"108":1,"109":4,"110":3,"111":1,"113":1,"114":1,"115":3,"117":2,"118":3,"120":5,"122":1,"124":5,"127":2}}],["over",{"2":{"1":1,"18":2,"48":1,"122":1}}],["overview",{"2":{"1":1}}],["ownership",{"2":{"118":1}}],["owned",{"2":{"114":2,"117":1,"118":1}}],["own",{"2":{"0":1,"4":1,"32":1,"75":1}}],["often",{"2":{"36":1,"75":2,"117":1}}],["offs",{"2":{"115":1}}],["offset",{"2":{"111":1}}],["off",{"2":{"24":1,"34":1}}],["offers",{"2":{"14":1}}],["official",{"2":{"9":1,"53":1}}],["of",{"0":{"88":1,"105":1},"1":{"106":1},"2":{"0":1,"1":7,"2":1,"13":1,"16":1,"18":1,"19":1,"20":1,"23":1,"24":2,"27":1,"28":1,"36":1,"38":1,"42":2,"43":1,"48":1,"58":3,"75":2,"79":5,"80":1,"83":5,"85":3,"86":1,"88":4,"89":1,"91":12,"92":3,"94":7,"95":8,"96":5,"100":1,"101":2,"106":6,"109":7,"110":11,"111":1,"113":6,"114":6,"115":14,"117":12,"118":2,"119":1,"120":6,"121":2,"122":5,"123":1,"124":1,"127":1}}],["piece",{"2":{"122":1}}],["pieces",{"2":{"120":1}}],["pipeline",{"2":{"91":1}}],["ptr",{"2":{"114":14,"117":2}}],["python",{"2":{"79":1}}],["pushing",{"2":{"122":1}}],["push",{"2":{"122":2}}],["pushed",{"2":{"94":1}}],["pull",{"2":{"114":3}}],["purposes",{"2":{"122":1}}],["pursuit",{"0":{"105":1},"1":{"106":1},"2":{"127":1}}],["pure",{"2":{"1":1}}],["published",{"2":{"113":1}}],["public",{"2":{"63":1}}],["pub",{"2":{"80":11,"108":13,"109":1,"111":5,"112":7,"114":2,"117":17,"121":1,"122":1}}],["philosophies",{"2":{"43":1}}],["philosophy",{"0":{"43":1,"45":1,"65":1}}],["phase",{"2":{"27":1}}],["pnpm",{"2":{"40":3,"50":4,"64":2,"69":2}}],["pm",{"2":{"34":3}}],["plus",{"2":{"120":1}}],["plugin",{"2":{"36":1,"58":12}}],["plugins",{"2":{"23":1,"58":2}}],["play",{"2":{"119":1}}],["plays",{"2":{"24":1,"36":1}}],["places",{"2":{"94":1}}],["place",{"2":{"82":1,"91":1,"114":2}}],["plain",{"2":{"80":1}}],["please",{"2":{"15":1,"16":1,"79":1,"114":1}}],["peak",{"2":{"111":1}}],["people",{"2":{"91":1}}],["peek",{"2":{"87":1}}],["peeking",{"2":{"79":1,"88":1}}],["penalize",{"2":{"19":1}}],["percent",{"2":{"119":1}}],["perfect",{"2":{"120":3}}],["perf",{"2":{"110":1}}],["performant",{"2":{"19":1,"43":1,"122":1}}],["performance",{"0":{"31":1,"105":1,"106":1},"1":{"32":1,"33":1,"34":1,"106":1},"2":{"19":1,"24":1,"36":2,"42":1,"75":2,"106":3,"109":1,"110":1,"111":2,"113":2,"114":4,"117":2,"119":1,"120":3,"124":1,"127":1,"130":1}}],["permitted",{"2":{"92":2}}],["permission",{"2":{"0":1,"17":1,"18":1}}],["perspective",{"2":{"83":1,"91":1}}],["primitives",{"2":{"123":1}}],["primaryexpression",{"2":{"80":3,"92":6,"94":4}}],["privateidentifier",{"2":{"88":2}}],["printing",{"0":{"124":1},"2":{"124":1}}],["print",{"2":{"123":1,"124":2}}],["println",{"2":{"70":8,"124":1}}],["prints",{"2":{"58":2,"108":1}}],["pratt",{"2":{"131":1}}],["practical",{"2":{"79":1,"127":1}}],["pragmatic",{"2":{"18":1}}],["prs",{"2":{"17":2,"20":1,"37":1}}],["pr",{"0":{"17":1}}],["prepared",{"2":{"114":1}}],["presented",{"2":{"98":1}}],["preserveparens",{"2":{"84":1}}],["pretty",{"2":{"94":1}}],["prettier",{"0":{"35":1},"2":{"14":1,"108":1}}],["precisely",{"2":{"85":1}}],["previously",{"2":{"49":1}}],["preliminary",{"2":{"24":1,"114":1}}],["preferred",{"2":{"106":1}}],["prefer",{"2":{"17":1}}],["pre",{"2":{"11":1}}],["propagate",{"2":{"117":1}}],["prop",{"2":{"96":4}}],["property",{"2":{"122":1}}],["propertydefinition",{"2":{"96":4}}],["properties",{"2":{"91":2}}],["prod",{"2":{"88":2}}],["produces",{"2":{"34":1}}],["produce",{"2":{"34":1}}],["productions",{"2":{"96":2}}],["production",{"2":{"25":1,"63":1,"82":2,"91":2,"94":2,"95":4,"96":6}}],["probing",{"2":{"114":2}}],["problem",{"2":{"92":1,"94":2,"106":1,"115":2,"122":1,"123":1}}],["problems",{"2":{"58":6,"120":1,"121":1}}],["probably",{"2":{"86":1}}],["prologue",{"2":{"82":2}}],["prolonged",{"2":{"18":1}}],["processing",{"0":{"123":1},"2":{"91":2,"94":2,"95":4}}],["process",{"2":{"34":2,"109":1,"122":1}}],["profiling",{"2":{"34":1,"113":1,"114":1}}],["profiler",{"2":{"34":3,"109":1}}],["profile",{"0":{"33":1},"1":{"34":1},"2":{"34":6,"109":1,"120":1}}],["prototype",{"2":{"24":1}}],["projects",{"0":{"126":1},"2":{"36":1}}],["project",{"0":{"8":1,"10":1},"1":{"9":1,"10":1,"11":2,"12":2,"13":2},"2":{"7":2,"9":2,"12":1,"13":2,"15":1,"19":1,"34":2,"43":1,"79":1,"81":2,"114":1,"119":1,"124":1}}],["programs",{"2":{"79":1}}],["program",{"2":{"3":2,"108":2,"109":1,"121":1}}],["programming",{"2":{"1":1,"79":2,"113":1}}],["provided",{"2":{"122":1}}],["provide",{"2":{"27":1,"118":1}}],["provides",{"2":{"1":2,"11":1,"75":1}}],["providing",{"2":{"23":1,"118":1}}],["proved",{"2":{"0":2}}],["payload",{"2":{"110":7}}],["painful",{"2":{"108":1}}],["patterns",{"2":{"91":1,"122":1}}],["pattern",{"2":{"91":19,"109":1,"121":1,"122":2}}],["pathbuf",{"2":{"70":4}}],["paths",{"2":{"58":2}}],["path",{"2":{"34":2,"58":6,"70":18,"120":1,"123":12}}],["passes",{"2":{"94":2}}],["passed",{"2":{"88":1,"110":1}}],["pass",{"2":{"82":1}}],["past",{"2":{"79":1}}],["palette",{"2":{"40":1}}],["package",{"2":{"40":1}}],["panel",{"2":{"34":2}}],["pages",{"2":{"109":2}}],["page",{"2":{"6":1,"24":1,"89":1}}],["par",{"2":{"114":1,"123":1}}],["parking",{"2":{"113":1}}],["parallel",{"0":{"123":1},"2":{"113":2,"114":2,"123":1}}],["parallelized",{"2":{"49":1}}],["parameterized",{"2":{"109":1}}],["parameters",{"0":{"100":1},"2":{"83":3,"90":1,"100":1}}],["parameter",{"0":{"83":1},"2":{"83":1,"88":2}}],["partialeq$lt$$u5b$b$u5d$$gt$$u20$for$u20$$u5b$a$u5d$$gt$2eq17h46d405acb5da4997e",{"2":{"120":20}}],["partial",{"2":{"115":1}}],["particular",{"2":{"79":1}}],["particularly",{"2":{"24":1,"122":1}}],["part",{"2":{"88":2,"96":2,"120":1,"131":2}}],["party",{"2":{"19":1}}],["parsing",{"0":{"107":1},"1":{"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1},"2":{"3":1,"81":1,"90":1,"94":3,"96":2,"113":1,"114":2,"117":1,"120":1,"131":4}}],["parses",{"2":{"79":1}}],["parsed",{"2":{"79":1,"87":1,"88":1}}],["parse",{"2":{"3":3,"27":1,"79":1,"88":1,"94":1,"96":1}}],["parsers",{"0":{"128":1},"2":{"79":2,"87":1,"96":1,"109":2}}],["parser$",{"2":{"63":1,"64":4,"69":4}}],["parser",{"0":{"25":1,"60":1,"75":1},"1":{"26":1,"27":1,"28":1,"29":1,"30":1,"61":1,"62":1,"63":1,"64":1,"76":1},"2":{"0":1,"1":1,"3":6,"4":4,"25":1,"27":1,"28":1,"42":1,"61":2,"63":3,"64":5,"69":4,"75":4,"76":1,"79":4,"81":4,"82":1,"83":1,"90":2,"91":2,"92":2,"94":2,"103":1,"107":1,"109":2,"113":2,"114":1,"119":2,"127":1}}],["parents",{"2":{"91":1}}],["parenthesizedexpression",{"2":{"84":2,"94":2}}],["parenthesized",{"0":{"84":1},"2":{"84":1,"94":1}}],["parent",{"0":{"122":1},"2":{"1":1,"122":9}}],["p",{"2":{"3":4,"22":2,"34":2}}],["powerful",{"2":{"131":1}}],["potential",{"2":{"106":1}}],["pop",{"2":{"122":2}}],["popular",{"2":{"113":1,"115":1}}],["popscope",{"2":{"94":1}}],["popandflattenscope",{"2":{"94":1}}],["popanddiscardscope",{"2":{"94":1}}],["portable",{"2":{"119":2}}],["porting",{"2":{"24":1,"36":1}}],["ported",{"2":{"0":1}}],["policy",{"0":{"18":1,"19":1,"20":1},"2":{"15":1}}],["pointing",{"0":{"122":1},"2":{"122":1}}],["pointed",{"2":{"111":1,"118":1}}],["pointers",{"2":{"122":1}}],["pointer",{"2":{"110":2,"115":2,"118":2,"122":4}}],["point",{"0":{"3":1},"2":{"1":1,"3":2,"122":1}}],["positions",{"2":{"87":1}}],["position",{"2":{"85":1}}],["positional",{"2":{"58":2}}],["posts",{"0":{"131":1}}],["posted",{"2":{"105":1,"120":1}}],["post",{"2":{"1":1,"83":1,"93":1,"114":1}}],["possible",{"2":{"0":2,"19":1,"111":1,"122":1}}],["switch",{"2":{"120":2}}],["swc",{"2":{"61":1,"81":6,"128":1,"129":1}}],["skip",{"2":{"119":2}}],["spawn",{"2":{"123":6}}],["spaces",{"2":{"119":1}}],["span",{"0":{"111":1},"2":{"111":1}}],["spend",{"2":{"111":1}}],["spending",{"2":{"109":1,"120":1}}],["spec",{"2":{"102":1}}],["specified",{"2":{"27":1}}],["specifically",{"2":{"83":1}}],["specification",{"2":{"27":1,"75":2,"80":1,"88":1,"91":4,"92":2,"93":1,"108":1}}],["specific",{"2":{"12":1,"75":1,"109":1}}],["speed",{"2":{"19":2,"20":1,"24":1,"32":2,"110":1}}],["snippet",{"2":{"89":1}}],["script",{"2":{"101":7}}],["scripts",{"0":{"103":1},"2":{"100":1}}],["scriptbody",{"2":{"100":2}}],["scanner",{"2":{"120":1,"131":1}}],["scanning",{"2":{"79":1}}],["scales",{"2":{"48":1}}],["scopes",{"2":{"81":1,"94":1}}],["scope",{"2":{"76":1,"81":1,"89":4,"91":2,"94":5}}],["synchronization",{"2":{"114":1}}],["syntactic",{"2":{"79":1,"90":1,"92":4,"103":1,"131":1}}],["syntaxerror",{"2":{"83":1,"96":2}}],["syntax",{"0":{"1":1,"108":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"0":1,"1":1,"2":1,"3":2,"76":1,"82":3,"83":3,"86":1,"91":1,"92":1,"96":6,"99":1,"107":1,"110":1}}],["symbol",{"2":{"76":1,"92":4,"112":1}}],["symbols",{"2":{"34":3,"94":1}}],["systematic",{"2":{"120":1}}],["systems",{"2":{"59":1,"115":1}}],["system",{"0":{"59":1}}],["smarter",{"2":{"120":1}}],["smart",{"2":{"118":2}}],["smartstring",{"2":{"115":2}}],["small",{"2":{"110":2,"111":1,"117":2,"123":1,"127":2}}],["smaller",{"2":{"17":1,"111":1}}],["smol",{"2":{"115":3}}],["smooth",{"2":{"32":1}}],["stmt",{"2":{"121":2,"122":8}}],["still",{"2":{"114":1,"117":1,"118":1}}],["studying",{"2":{"118":1}}],["study",{"2":{"114":1}}],["studied",{"2":{"109":1}}],["storage",{"2":{"122":1}}],["store",{"2":{"114":1,"115":5}}],["storing",{"2":{"111":1,"113":1}}],["stopped",{"2":{"92":1}}],["stop",{"2":{"34":2}}],["strena",{"2":{"114":1}}],["str",{"2":{"112":4,"114":4,"115":10,"117":4,"118":6,"120":2}}],["strager",{"2":{"120":1}}],["strange",{"2":{"95":1,"113":1}}],["straightforward",{"2":{"94":1,"108":1,"114":2}}],["structured",{"2":{"117":1}}],["structure",{"2":{"111":1,"114":2,"118":1,"122":1}}],["structures",{"2":{"109":1,"111":1,"117":1}}],["structs",{"2":{"108":1}}],["struct",{"2":{"80":4,"108":4,"110":5,"111":2,"112":4,"117":10,"122":5}}],["strong",{"2":{"79":1}}],["strict",{"0":{"81":1,"82":1,"83":1},"2":{"81":4,"82":6,"83":10,"85":1,"86":1,"101":5}}],["strip",{"2":{"34":4}}],["stringliteral",{"2":{"112":2}}],["strings",{"0":{"112":1},"2":{"76":1,"82":1,"112":1,"113":2,"115":2,"118":1,"120":1}}],["string",{"0":{"113":1,"114":1,"115":1},"1":{"114":1},"2":{"19":1,"70":2,"82":3,"91":2,"110":6,"112":3,"113":6,"114":29,"115":9,"117":20,"118":8,"119":1,"120":4}}],["stdin",{"2":{"124":1}}],["stdout",{"2":{"124":20}}],["std",{"2":{"70":2,"110":2,"114":2,"115":2,"124":2}}],["steps",{"2":{"56":2}}],["stack",{"2":{"115":1,"117":1}}],["stacked",{"2":{"17":1}}],["standard",{"2":{"107":1}}],["stating",{"2":{"83":1}}],["static",{"2":{"83":1,"96":4,"114":2,"115":4,"120":1}}],["states",{"2":{"87":1,"92":1,"93":1}}],["state",{"2":{"81":1,"82":1,"90":2,"91":1}}],["stated",{"2":{"81":1,"92":1,"94":1}}],["statementlistitem",{"2":{"100":2}}],["statementlist",{"2":{"100":2}}],["statements",{"0":{"103":1},"2":{"85":4,"89":1,"108":1,"122":2}}],["statement",{"0":{"85":1,"86":1},"2":{"40":1,"85":4,"86":2,"88":2,"91":2,"92":3,"108":4,"109":2,"110":3,"121":2,"122":2}}],["start",{"2":{"92":2,"111":2,"113":1,"118":4}}],["starts",{"2":{"79":1,"91":1}}],["started",{"2":{"79":1,"109":1,"113":1,"120":1,"124":1}}],["starting",{"2":{"15":1,"34":1,"94":1}}],["slice",{"2":{"117":2,"118":1}}],["slightly",{"2":{"3":1,"75":1}}],["slash",{"2":{"92":3}}],["slower",{"2":{"32":1}}],["slowest",{"2":{"24":1}}],["slow",{"0":{"124":1},"2":{"19":1,"113":1,"122":1}}],["simd",{"0":{"119":1},"2":{"119":4}}],["simplicity",{"2":{"81":1}}],["simply",{"2":{"80":1}}],["simplest",{"2":{"121":1}}],["simple",{"0":{"83":1},"2":{"19":1,"79":1,"83":1,"94":1,"120":1,"122":1,"131":1}}],["sized",{"2":{"121":2}}],["size",{"2":{"110":11,"115":10}}],["sizes",{"0":{"110":1},"2":{"110":4}}],["situations",{"2":{"91":1,"92":1}}],["situation",{"2":{"91":1}}],["side",{"2":{"88":1,"91":2,"92":1,"109":1}}],["single",{"2":{"49":1,"58":4,"84":1,"86":1,"91":1,"113":1,"114":1,"117":1,"120":1,"122":1,"123":1}}],["since",{"2":{"36":1,"55":1,"89":1,"92":1,"109":1,"114":1,"117":2,"120":2}}],["significant",{"2":{"14":1,"32":1}}],["siblings",{"2":{"1":1}}],["safe",{"2":{"117":1}}],["safely",{"2":{"111":1}}],["saying",{"2":{"114":1}}],["says",{"2":{"92":1}}],["saner",{"2":{"101":1}}],["saving",{"2":{"34":2}}],["saved",{"2":{"34":2}}],["save",{"2":{"11":1,"12":1,"40":1}}],["sacrificing",{"2":{"24":1}}],["same",{"2":{"0":1,"18":1,"43":1,"89":1,"109":1,"110":1,"112":1,"115":1,"122":1}}],["shiftexpression",{"2":{"88":4}}],["shipping",{"2":{"79":1}}],["sh$",{"2":{"50":9,"63":3,"64":4,"68":1,"69":4}}],["shares",{"2":{"43":1}}],["shallow",{"2":{"7":3}}],["shoot",{"2":{"79":1}}],["should",{"2":{"19":2,"20":1,"68":1,"83":1,"91":1,"94":1,"96":1,"115":1,"118":1,"120":1,"124":1}}],["short",{"2":{"13":1,"76":1,"115":2}}],["shown",{"2":{"114":1}}],["showed",{"2":{"109":1,"113":1}}],["shows",{"2":{"58":2,"84":1}}],["showcase",{"0":{"37":1}}],["showing",{"2":{"34":1}}],["show",{"2":{"9":2}}],["showrustup",{"2":{"9":1}}],["summary",{"2":{"109":1,"117":1,"124":1}}],["summarize",{"2":{"93":1}}],["suffix",{"2":{"99":1}}],["submitted",{"2":{"114":1}}],["submodules",{"2":{"7":7}}],["sub",{"2":{"114":3}}],["subtitle",{"2":{"91":1}}],["subsection",{"2":{"91":1}}],["super",{"2":{"91":1}}],["supplemental",{"2":{"91":1}}],["supposed",{"2":{"84":1,"89":1}}],["supports",{"2":{"48":2,"123":1}}],["suppress",{"2":{"58":2}}],["suite",{"2":{"27":1}}],["suites",{"2":{"26":1,"30":1}}],["such",{"2":{"24":1,"75":1,"81":1,"87":1,"106":1,"114":2,"123":1}}],["sucks",{"2":{"1":1}}],["sure",{"2":{"13":1,"15":1}}],["solving",{"2":{"94":1}}],["solved",{"2":{"94":2}}],["solve",{"2":{"92":1,"122":1}}],["solutions",{"2":{"106":1}}],["solution",{"2":{"91":1,"109":1,"114":2,"115":1,"122":1}}],["sorts",{"2":{"91":1}}],["so",{"0":{"76":1},"2":{"14":1,"79":3,"81":1,"83":1,"84":1,"87":1,"91":2,"92":1,"94":2,"106":1,"109":4,"110":1,"113":1,"114":1,"115":1,"119":2,"120":3,"122":1,"124":2}}],["sometimes",{"2":{"117":1}}],["somewhat",{"2":{"117":1}}],["some",{"2":{"4":1,"11":1,"76":1,"79":1,"80":1,"109":1,"110":2,"111":1,"114":5,"115":1,"118":2,"119":1,"120":1,"122":1,"123":2}}],["source",{"0":{"101":1},"2":{"1":1,"2":1,"11":1,"49":1,"79":1,"82":2,"96":2,"101":1,"111":1,"112":1,"117":1,"121":1}}],["src=",{"2":{"101":2}}],["src",{"2":{"2":1,"3":4,"23":1,"81":2,"89":2,"90":2,"110":2}}],["searching",{"2":{"124":1}}],["serious",{"2":{"120":1}}],["servo",{"2":{"113":1,"114":2}}],["serviceable",{"2":{"79":1}}],["server",{"2":{"4":1}}],["seqcst",{"2":{"114":4}}],["sequential",{"2":{"109":1}}],["sequences",{"2":{"112":1}}],["sequenceexpression",{"2":{"94":2}}],["sequence",{"2":{"82":2,"94":1,"118":1}}],["self",{"2":{"114":8,"118":8,"120":2,"121":2,"122":20,"123":6,"124":2}}],["select",{"2":{"34":3}}],["send",{"2":{"123":4}}],["sense",{"2":{"117":1,"118":1}}],["sensitive",{"2":{"92":1}}],["sent",{"2":{"24":1,"79":1}}],["several",{"2":{"92":1}}],["sections",{"2":{"106":2}}],["section",{"2":{"91":3,"97":1}}],["sec",{"2":{"80":1,"81":1,"82":1,"83":1,"85":2,"89":1,"92":1}}],["secondary",{"2":{"96":4}}],["seconds",{"2":{"49":1,"55":1}}],["second",{"2":{"24":1,"79":1,"92":2,"122":1}}],["semantics",{"2":{"83":1,"89":1,"91":1,"96":4}}],["semantic",{"2":{"76":1,"80":1,"84":1,"91":1}}],["separately",{"2":{"91":1}}],["separate",{"2":{"34":1,"91":1}}],["setting",{"2":{"91":1}}],["settings",{"2":{"54":1}}],["set",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1},"2":{"1":1,"6":1,"28":1,"43":1,"94":1,"114":9}}],["seem",{"2":{"114":1,"122":1}}],["see",{"2":{"0":1,"1":1,"4":2,"13":1,"34":1,"38":1,"40":1,"73":1,"114":1,"117":1}}],["s",{"2":{"0":1,"18":2,"79":2,"92":3,"94":2,"114":1,"117":1,"118":1,"119":1,"120":8,"122":1}}],["bb6",{"2":{"120":2}}],["blazingly",{"2":{"120":1,"131":2}}],["bloat",{"2":{"110":2}}],["blockstatement",{"2":{"122":8}}],["blocking",{"2":{"114":1}}],["block",{"0":{"89":1},"2":{"89":3,"122":2,"124":2}}],["blocker",{"2":{"36":1}}],["blob",{"2":{"3":4,"81":2,"82":2,"89":2,"90":2}}],["blogs",{"2":{"119":1}}],["blog",{"0":{"131":1},"2":{"1":1,"83":1,"93":1,"102":1,"114":1,"120":1}}],["branching",{"2":{"120":1}}],["break",{"2":{"92":1,"110":2,"114":2,"117":1}}],["browsers",{"2":{"38":1}}],["b",{"2":{"83":7,"85":1,"89":1,"92":4,"94":4,"95":4,"98":2,"110":2}}],["boa",{"2":{"128":1}}],["borrowed",{"2":{"118":2}}],["borrow",{"2":{"117":2,"118":1}}],["born",{"2":{"81":1}}],["bos",{"2":{"114":1}}],["book",{"2":{"110":1,"114":1,"130":1}}],["both",{"2":{"109":1,"114":1,"119":1}}],["bottleneck",{"2":{"36":1,"75":1}}],["bottom",{"2":{"23":1,"34":1}}],["body",{"2":{"94":1,"108":2,"122":2}}],["boils",{"2":{"89":1,"106":1}}],["boxing",{"2":{"110":1}}],["boxed",{"2":{"110":1,"114":2}}],["box",{"2":{"34":1,"109":1,"110":8,"114":4,"117":2}}],["battlefield",{"2":{"114":1,"115":1}}],["backing",{"2":{"122":1}}],["back",{"2":{"108":1,"110":1,"115":1,"122":1}}],["baz",{"2":{"86":2}}],["banned",{"2":{"86":1}}],["bans",{"2":{"83":1}}],["bar=",{"2":{"86":2}}],["bar",{"2":{"80":2,"85":2,"88":1,"89":10,"91":8,"94":2}}],["bare",{"2":{"73":1}}],["babel",{"0":{"28":1},"2":{"28":2,"84":1,"128":1,"129":1}}],["bashxcrun",{"2":{"34":1}}],["bashxcode",{"2":{"34":1}}],["bashjust",{"2":{"13":1,"22":1,"23":2,"26":1}}],["bashrustup",{"2":{"9":1}}],["bashgit",{"2":{"7":1}}],["bashcargo",{"2":{"3":1,"11":1,"12":1,"34":1}}],["based",{"2":{"1":1,"25":1,"32":1}}],["base",{"2":{"0":1,"1":1}}],["bump",{"2":{"118":2}}],["bumpalo",{"2":{"109":2}}],["buffer",{"2":{"124":2}}],["buffering",{"2":{"124":3}}],["bufwriter",{"2":{"124":2}}],["buf",{"2":{"117":2}}],["buckets",{"2":{"114":7}}],["bucket",{"2":{"114":16}}],["bundler",{"2":{"108":1}}],["bundling",{"2":{"36":1}}],["bunx",{"2":{"50":2}}],["bun",{"2":{"50":2,"64":2,"69":2}}],["but",{"2":{"24":1,"79":1,"81":1,"82":1,"84":1,"85":1,"86":1,"91":1,"94":3,"100":1,"110":1,"112":1,"113":2,"117":1,"118":1,"119":1,"120":1,"122":1,"124":1,"131":1}}],["bugs",{"2":{"19":1}}],["builds",{"2":{"13":1,"34":1,"122":1}}],["building",{"0":{"105":1},"1":{"106":1},"2":{"11":1,"42":1,"94":1,"127":1}}],["build",{"2":{"1":1,"34":3,"40":2,"108":1,"120":1,"122":2}}],["built",{"2":{"0":1,"34":1,"59":1}}],["bit",{"2":{"115":1}}],["biome",{"2":{"43":1,"128":1}}],["bias",{"2":{"18":3}}],["bind",{"2":{"91":1}}],["bindingpattern",{"0":{"91":1},"2":{"91":6,"94":1}}],["binding",{"2":{"76":1,"80":1,"99":4}}],["bindingidentifiers",{"2":{"80":1}}],["bindingidentifier",{"2":{"75":1,"80":7,"91":9,"94":2,"99":2}}],["bin",{"2":{"11":1,"22":2,"34":2}}],["binaries",{"2":{"11":1}}],["binary",{"2":{"3":1,"11":1,"34":1,"50":1}}],["binstallcargo",{"2":{"11":1}}],["binstall",{"0":{"11":1},"2":{"11":2,"12":2}}],["bytes",{"2":{"110":5,"115":4,"117":4}}],["byte",{"2":{"110":8,"111":1,"117":1}}],["by",{"2":{"1":1,"2":1,"11":1,"13":1,"19":1,"23":1,"24":1,"26":1,"28":1,"32":1,"34":1,"48":1,"61":1,"75":4,"76":1,"79":6,"81":1,"82":2,"83":3,"86":1,"90":1,"91":1,"92":1,"94":2,"96":2,"101":1,"109":1,"110":1,"113":3,"114":2,"115":1,"117":2,"119":2,"120":1,"122":3}}],["benefit",{"2":{"122":1}}],["benchmark",{"2":{"48":1,"61":1,"122":1}}],["benchmarks",{"0":{"41":1,"46":1}}],["being",{"2":{"114":1,"118":1}}],["beings",{"2":{"79":1}}],["beginners",{"2":{"109":1}}],["been",{"2":{"91":1,"119":1,"124":1}}],["better",{"2":{"91":1,"110":1,"118":1}}],["between",{"2":{"24":2,"101":1,"108":1}}],["behave",{"2":{"89":1}}],["behaviors",{"2":{"101":1}}],["behavior",{"2":{"27":1}}],["below",{"2":{"79":1,"114":2}}],["became",{"2":{"114":2}}],["because",{"2":{"79":2,"89":1,"91":3,"92":2,"95":1,"109":1,"111":1,"114":2,"117":1,"118":3,"122":2}}],["becomes",{"2":{"82":1,"117":1,"122":3}}],["become",{"2":{"36":1,"79":1,"91":1,"106":1}}],["before",{"2":{"15":1,"55":1,"79":1,"94":1,"119":1}}],["best",{"2":{"4":1,"24":1,"82":1,"90":1,"110":1}}],["berries",{"2":{"1":1}}],["be",{"2":{"0":1,"19":3,"20":1,"25":1,"29":1,"30":1,"34":2,"36":1,"38":1,"43":1,"79":2,"81":1,"82":1,"84":1,"87":1,"88":2,"89":1,"91":5,"92":3,"94":4,"96":2,"101":1,"104":1,"106":2,"108":1,"109":4,"110":1,"113":1,"117":1,"118":1,"120":1,"121":1,"122":3,"123":1}}],["c++",{"2":{"120":1,"128":1}}],["cmp",{"2":{"120":20}}],["cfg",{"2":{"110":2,"115":2}}],["cycle",{"2":{"110":2}}],["cycles",{"2":{"106":1}}],["certainly",{"2":{"122":1}}],["certain",{"2":{"90":1,"91":2,"96":2}}],["centric",{"2":{"0":1}}],["ctrl",{"2":{"34":2}}],["cpus",{"2":{"34":1}}],["cpu",{"2":{"34":1,"48":1,"106":1,"109":1,"113":2}}],["cjust",{"2":{"26":1}}],["circumstances",{"2":{"79":1,"91":2}}],["ci",{"2":{"20":2,"32":1,"49":1}}],["cumbersome",{"2":{"94":1}}],["current",{"2":{"20":1,"122":1}}],["currently",{"2":{"14":1,"36":1,"38":1,"117":1}}],["cut",{"2":{"18":1}}],["customization",{"2":{"14":1}}],["crafting",{"2":{"127":1}}],["crates",{"2":{"3":4,"23":1,"63":3,"73":1,"81":2,"90":2,"110":2,"115":2}}],["crate",{"2":{"3":1,"4":1,"19":1,"63":1,"68":1,"110":2,"114":4,"123":2}}],["critical",{"2":{"114":1}}],["creating",{"2":{"34":1,"94":1}}],["create",{"2":{"14":1,"16":1,"22":1,"23":1,"42":1,"94":2}}],["crucial",{"2":{"24":1,"36":1}}],["clever",{"2":{"117":1,"118":1}}],["cleanly",{"2":{"91":1}}],["clear",{"2":{"18":1,"75":1,"114":1}}],["clauses",{"2":{"85":1}}],["classes",{"0":{"103":1},"2":{"81":1}}],["class",{"0":{"81":1},"2":{"81":7,"122":4}}],["closely",{"2":{"75":1}}],["closure",{"2":{"24":1}}],["clones",{"2":{"115":1}}],["clone",{"0":{"7":1},"2":{"7":2,"118":4,"123":6}}],["click",{"2":{"34":3}}],["cli",{"2":{"3":6,"22":2,"34":2}}],["choosing",{"2":{"115":1}}],["choose",{"2":{"24":1}}],["chunks",{"2":{"109":1}}],["chance",{"2":{"119":1}}],["changing",{"2":{"109":1,"111":1,"115":1}}],["changes",{"2":{"119":1}}],["change",{"2":{"16":1,"34":1,"111":1,"114":1}}],["characters",{"2":{"120":1}}],["characteristics",{"2":{"115":1}}],["chars",{"2":{"118":2}}],["challenging",{"2":{"109":1,"122":1}}],["chapter",{"2":{"97":1,"101":1}}],["chrome",{"2":{"83":1}}],["checking",{"2":{"117":1}}],["checker",{"2":{"117":1}}],["checks",{"2":{"108":1,"121":1}}],["checkout",{"2":{"56":2}}],["check",{"2":{"3":2,"13":1,"57":1,"61":1,"68":1,"88":1,"90":1,"110":1}}],["children",{"2":{"1":1}}],["care",{"2":{"124":4}}],["cargo",{"0":{"11":1},"2":{"3":2,"4":2,"11":6,"34":2,"63":6,"68":2}}],["caught",{"2":{"119":1}}],["caution",{"2":{"91":1}}],["capacity",{"2":{"117":1}}],["cap",{"2":{"117":3}}],["cache",{"0":{"114":1},"2":{"109":1,"110":1,"113":4,"114":6}}],["case",{"2":{"82":1,"84":1,"118":1,"119":1}}],["cases",{"2":{"24":1,"91":1,"92":1}}],["cascading",{"2":{"75":1}}],["categories",{"2":{"58":2}}],["category",{"2":{"58":6}}],["candidate",{"2":{"120":2}}],["cannot",{"2":{"91":3}}],["canonicalize",{"2":{"70":2}}],["can",{"2":{"11":1,"13":3,"19":1,"24":2,"29":1,"30":1,"34":2,"36":1,"38":1,"43":1,"50":2,"53":1,"61":1,"75":1,"79":2,"82":1,"83":1,"84":2,"91":1,"106":1,"109":1,"111":1,"112":1,"113":1,"115":3,"117":4,"118":1,"119":1,"120":1,"121":1,"122":3,"123":1}}],["callbacks",{"2":{"122":1}}],["calling",{"2":{"109":1}}],["callmemberexpression",{"2":{"95":2}}],["callexpression",{"2":{"95":6}}],["called",{"2":{"1":1,"27":1,"109":1,"111":1,"113":2,"114":1,"115":1,"117":1,"118":2,"119":1,"122":1,"124":1}}],["call",{"2":{"3":1,"34":2,"94":1,"122":1,"124":1}}],["cst",{"2":{"1":3}}],["c",{"2":{"1":1,"26":1,"34":2,"83":1,"94":4,"95":4,"98":2,"110":2}}],["collect",{"2":{"122":1}}],["collection",{"2":{"42":1}}],["cow",{"0":{"118":1},"2":{"114":2,"118":3}}],["copy",{"2":{"113":1}}],["copyright",{"2":{"112":1}}],["copied",{"2":{"110":1}}],["count",{"2":{"114":6}}],["couple",{"2":{"109":1}}],["could",{"2":{"24":1,"43":1}}],["coffee",{"2":{"79":1}}],["coc",{"0":{"54":1},"2":{"54":1}}],["corresponding",{"2":{"117":2}}],["correctness",{"2":{"58":4}}],["correctly",{"2":{"13":1}}],["correct",{"2":{"9":1,"86":1,"88":1,"91":1,"92":1}}],["cores",{"2":{"48":1,"113":1}}],["core",{"0":{"44":1},"2":{"113":1}}],["coverinitializedname",{"0":{"96":1},"2":{"96":7}}],["covercallexpressionandasyncarrowheadasync",{"2":{"95":1}}],["covercallexpressionandasyncarrowhead",{"0":{"95":1},"2":{"95":15,"96":2}}],["coverparenthesizedexpressionandarrowparameterlistlet",{"2":{"94":1}}],["coverparenthesizedexpressionandarrowparameterlist",{"0":{"94":1},"2":{"94":9,"96":4}}],["cover",{"0":{"93":1},"1":{"94":1,"95":1,"96":1},"2":{"93":1,"96":8}}],["covers",{"2":{"27":1}}],["coverage",{"2":{"4":1,"20":2,"26":2}}],["come",{"2":{"117":2}}],["comes",{"2":{"109":1}}],["combination",{"2":{"106":1}}],["commontoken",{"2":{"92":4}}],["comments",{"2":{"119":1}}],["comment",{"2":{"48":1,"92":4}}],["commerce",{"2":{"24":1}}],["community",{"2":{"14":1,"114":1,"115":2}}],["commands",{"0":{"58":1},"2":{"12":1,"13":1}}],["command",{"2":{"9":1,"13":1,"34":3,"40":1,"54":2}}],["computes",{"2":{"120":1}}],["compute",{"2":{"112":1,"120":2}}],["compactstr",{"2":{"115":1}}],["compactstring",{"2":{"76":1}}],["compact",{"2":{"115":3}}],["comparisons",{"2":{"120":1}}],["comparison",{"2":{"120":1}}],["compare",{"2":{"120":1}}],["compared",{"2":{"114":1}}],["comparatively",{"2":{"32":1}}],["compatibility",{"2":{"84":1,"89":1}}],["comprises",{"2":{"111":1}}],["compromising",{"2":{"24":1}}],["compression",{"2":{"24":5}}],["compile",{"0":{"32":1}}],["compiler",{"0":{"105":1},"1":{"106":1},"2":{"24":1,"42":1,"105":1,"107":1,"108":1,"120":1,"127":1}}],["compiled",{"2":{"11":1}}],["compilation",{"2":{"19":2,"32":2}}],["complexity",{"2":{"11":1,"36":1}}],["completed",{"2":{"34":2}}],["complete",{"2":{"4":1,"32":1,"66":1}}],["components",{"2":{"9":1}}],["com",{"2":{"3":4,"7":2,"81":2,"82":2,"89":2,"90":2,"114":2}}],["connects",{"2":{"108":1}}],["convenient",{"2":{"122":1}}],["conventions",{"0":{"97":1},"1":{"98":1,"99":1,"100":1}}],["convention",{"2":{"48":1}}],["converted",{"2":{"94":1}}],["converter",{"2":{"94":1}}],["convert",{"2":{"94":1}}],["concluded",{"2":{"120":1}}],["concurrent",{"2":{"114":2}}],["concisebody",{"2":{"94":2}}],["concrete",{"0":{"1":1},"2":{"0":1,"1":1}}],["considerations",{"2":{"115":1,"124":1}}],["considered",{"2":{"19":1}}],["consuming",{"2":{"92":1}}],["constructor",{"2":{"120":4}}],["construct",{"2":{"117":1}}],["constructs",{"2":{"90":1,"117":1}}],["constructed",{"2":{"79":1,"109":1}}],["construction",{"2":{"79":1}}],["control",{"2":{"117":1}}],["contributions",{"2":{"16":1}}],["contributing",{"0":{"4":1},"2":{"4":1,"15":1}}],["contribute",{"2":{"4":1}}],["contributors",{"2":{"3":1}}],["contains",{"2":{"111":1,"118":1}}],["contain",{"2":{"85":1}}],["contexts",{"2":{"92":4,"96":4}}],["context",{"0":{"88":1,"90":1},"2":{"79":2,"88":2,"90":2,"92":1,"96":2}}],["continuous",{"0":{"55":1},"1":{"56":1}}],["confusing",{"2":{"88":3,"91":2}}],["confusion",{"2":{"75":1}}],["conformant",{"2":{"61":1,"75":1}}],["conformance",{"0":{"26":1},"1":{"27":1,"28":1,"29":1},"2":{"4":1,"7":1,"26":2,"27":1,"29":1}}],["config",{"2":{"54":1}}],["configuration",{"2":{"48":2,"66":1}}],["codegen",{"0":{"5":1},"2":{"2":3,"4":1}}],["code",{"2":{"1":1,"3":2,"14":1,"20":3,"48":1,"81":1,"82":3,"89":1,"91":1,"101":6,"114":2,"117":3,"118":2,"119":1,"120":5,"121":1}}],["codebases",{"2":{"4":1}}],["codebase",{"2":{"0":2,"3":1,"49":1,"117":1}}],["io",{"2":{"124":9}}],["ignore",{"2":{"123":3}}],["i64",{"2":{"120":22}}],["ir",{"2":{"120":2}}],["i",{"2":{"91":3,"94":2,"96":2,"106":1,"109":6,"110":2,"111":1,"112":1,"113":4,"114":5,"117":2,"118":5,"119":5,"120":21,"124":3}}],["id",{"2":{"91":2}}],["ident",{"2":{"120":2}}],["identification",{"2":{"92":1}}],["identifiers",{"0":{"80":1,"112":1},"2":{"80":5,"91":1,"112":1,"113":1}}],["identifiername",{"2":{"75":1}}],["identifierreferences",{"2":{"80":1}}],["identifierreference",{"2":{"75":1,"80":7,"84":2,"91":7,"92":4}}],["identifier",{"2":{"75":1,"88":1,"91":9,"99":4,"112":3,"120":4}}],["identical",{"2":{"83":1}}],["ides",{"0":{"52":1},"1":{"53":1,"54":1}}],["ide",{"2":{"0":1}}],["immutable",{"2":{"117":1,"118":1}}],["immediately",{"2":{"88":1}}],["impl",{"2":{"122":2}}],["implies",{"2":{"112":1}}],["implementing",{"2":{"113":1,"114":1}}],["implement",{"2":{"75":1,"122":1}}],["implementation",{"2":{"73":1}}],["implemented",{"2":{"28":1,"30":1}}],["improve",{"2":{"117":1}}],["improved",{"2":{"111":1,"113":1,"119":1}}],["improvement",{"2":{"109":1,"117":1}}],["improvements",{"2":{"75":1}}],["impossible",{"2":{"82":1,"92":1}}],["importdeclaration",{"2":{"100":2}}],["import",{"2":{"36":1,"58":4,"108":1}}],["impacted",{"2":{"114":1}}],["impact",{"2":{"32":1,"117":1}}],["illegal",{"2":{"83":1}}],["ifstatement",{"2":{"85":1}}],["if",{"0":{"85":1},"2":{"9":1,"16":1,"17":1,"18":1,"24":1,"82":2,"83":7,"85":3,"88":2,"89":3,"92":1,"94":3,"96":5,"108":1,"110":1,"114":7,"115":1,"118":2,"120":5,"122":2,"123":2,"124":4}}],["issimpleparameterlist",{"2":{"83":2}}],["issue",{"2":{"16":1,"38":1,"84":1,"105":1,"114":1}}],["issues",{"2":{"4":1,"13":1,"19":1,"117":1,"124":1}}],["isn",{"2":{"18":1,"92":1}}],["is",{"0":{"42":1,"76":1,"86":1,"87":1,"124":1},"1":{"43":1,"44":1},"2":{"0":1,"1":4,"2":4,"3":2,"4":2,"11":2,"12":1,"14":2,"18":2,"20":1,"27":1,"28":1,"32":2,"34":2,"36":1,"38":1,"40":1,"42":2,"49":1,"55":1,"58":2,"59":1,"75":2,"76":1,"79":2,"80":2,"81":4,"82":6,"83":10,"84":1,"86":2,"87":3,"88":6,"89":5,"90":1,"91":12,"92":17,"94":10,"95":6,"96":14,"97":1,"98":1,"101":4,"106":1,"107":1,"108":4,"109":6,"110":4,"111":3,"113":1,"114":17,"115":3,"117":7,"118":8,"120":8,"121":1,"122":12,"123":2,"124":2}}],["iter",{"2":{"123":3}}],["iterator",{"2":{"19":1}}],["items",{"2":{"58":2}}],["its",{"2":{"32":1,"75":2,"79":1,"89":1,"94":1,"108":1,"110":2,"114":1,"117":1,"120":2,"122":2}}],["itself",{"2":{"14":1}}],["it",{"0":{"76":1},"2":{"0":1,"11":2,"18":1,"24":1,"28":1,"36":2,"40":1,"49":1,"55":1,"79":3,"81":3,"82":3,"83":4,"84":2,"85":1,"86":2,"87":2,"88":2,"89":2,"90":1,"91":3,"92":5,"94":8,"96":1,"103":1,"106":1,"108":2,"109":4,"110":2,"111":1,"114":12,"117":9,"118":10,"119":1,"120":7,"122":6,"123":2,"124":4}}],["inefficient",{"2":{"122":1}}],["inlinerepresentation",{"2":{"115":1}}],["inlinereprensation",{"2":{"115":4}}],["inline",{"2":{"115":2}}],["inlined",{"2":{"76":1}}],["inlining",{"0":{"115":1},"2":{"115":1}}],["infrastructure",{"2":{"118":1}}],["infinite",{"2":{"110":2}}],["information",{"2":{"58":1,"122":1}}],["informationusage",{"2":{"58":1}}],["info",{"2":{"4":1,"34":2,"79":1,"83":1,"92":1,"110":1}}],["ingrained",{"2":{"106":1}}],["indextree",{"2":{"122":6}}],["indexes",{"2":{"122":1}}],["index",{"2":{"114":8,"122":2}}],["indirection",{"2":{"110":7,"114":1}}],["individually",{"2":{"109":1}}],["individual",{"2":{"94":1}}],["indicates",{"2":{"92":1,"122":1}}],["indicate",{"2":{"24":1}}],["industrial",{"2":{"79":1}}],["includes",{"2":{"107":1}}],["including",{"2":{"61":1,"75":1}}],["incorrect",{"2":{"94":1}}],["increased",{"2":{"14":1}}],["inserts",{"2":{"114":1}}],["insert",{"2":{"110":2,"114":4}}],["inserted",{"2":{"101":1,"114":1}}],["inspect",{"2":{"91":1}}],["inside",{"2":{"40":1,"81":1,"82":2,"83":1,"85":1,"89":3,"91":2,"109":1,"112":1,"122":2}}],["instanceof",{"2":{"87":2}}],["instance",{"2":{"84":1,"91":2,"94":2,"95":4,"111":1}}],["installation",{"0":{"50":1,"62":1,"67":1},"1":{"63":1,"64":1,"68":1,"69":1}}],["installxcode",{"2":{"34":1}}],["installs",{"2":{"9":1}}],["installing",{"2":{"9":1}}],["installed",{"2":{"9":1}}],["install",{"0":{"9":1,"10":1},"1":{"11":1,"12":1,"13":1},"2":{"9":1,"11":4,"13":1,"34":3,"40":2,"50":1,"63":7,"64":1,"68":3,"69":1}}],["instead",{"2":{"75":1,"91":1,"94":3,"114":1,"117":3,"123":1}}],["instruments",{"0":{"34":1},"2":{"34":4}}],["instruction",{"2":{"9":1}}],["instructions",{"2":{"4":1,"58":1}}],["involves",{"2":{"108":1}}],["invokes",{"2":{"34":1}}],["invert",{"2":{"34":1}}],["intaglio",{"2":{"114":1}}],["introducing",{"2":{"75":1}}],["introduction",{"0":{"15":1,"72":1},"1":{"16":1,"17":1,"18":1,"19":1,"20":1}}],["into",{"2":{"43":1,"80":1,"87":1,"109":1,"114":4,"117":2,"118":2,"122":3}}],["integer",{"2":{"120":1}}],["integration",{"0":{"51":1,"55":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":2,"57":1}}],["integrated",{"2":{"43":1}}],["interpreters",{"2":{"127":1}}],["interpretation",{"2":{"91":2,"94":2,"95":4}}],["intern",{"2":{"114":1}}],["interners",{"2":{"114":1}}],["interner",{"2":{"114":2}}],["interning",{"0":{"113":1},"1":{"114":1},"2":{"113":1,"114":1}}],["interface",{"2":{"91":10,"123":1}}],["interest",{"2":{"79":1}}],["interested",{"2":{"15":1}}],["initial",{"2":{"115":1}}],["initially",{"2":{"96":2,"113":1}}],["initializer",{"2":{"80":4,"91":4,"96":4,"99":6}}],["initialize",{"2":{"7":1}}],["init",{"2":{"13":1,"91":2}}],["initjust",{"2":{"13":1}}],["inquiries",{"2":{"4":1}}],["inputelementdiv",{"2":{"92":4}}],["inputelementregexp",{"2":{"92":5}}],["input",{"2":{"2":1,"34":1,"79":1,"92":2,"120":1}}],["in",{"0":{"85":1,"88":2,"123":1,"128":1},"2":{"0":2,"1":1,"2":2,"4":1,"11":1,"13":2,"14":1,"15":1,"18":1,"19":2,"24":2,"26":1,"27":1,"32":1,"36":1,"38":1,"42":1,"43":1,"49":1,"61":1,"75":2,"76":2,"79":8,"80":13,"81":1,"83":7,"84":1,"85":4,"86":1,"87":1,"88":25,"89":2,"90":2,"91":17,"92":6,"94":9,"95":4,"96":12,"98":1,"100":2,"101":2,"102":1,"106":1,"108":1,"109":8,"110":5,"111":1,"112":1,"113":2,"114":10,"115":2,"117":5,"119":1,"120":2,"122":3,"123":1,"124":4,"127":1}}],["away",{"2":{"114":1}}],["awareness",{"2":{"106":1}}],["await",{"2":{"80":20,"85":4,"88":8,"90":1,"91":22,"94":22,"95":16,"96":6,"100":2}}],["again",{"2":{"114":1,"120":2}}],["against",{"2":{"88":1}}],["ago",{"2":{"79":1,"114":1,"117":1}}],["age",{"2":{"42":1}}],["a=name",{"2":{"58":2}}],["afraid",{"2":{"91":1}}],["affine",{"2":{"37":1}}],["afterwards",{"2":{"94":1}}],["after",{"2":{"0":1,"1":1,"9":1,"81":1,"82":1,"87":1,"91":2,"94":1,"106":1,"114":2,"119":1,"120":2}}],["about",{"2":{"109":1,"113":3,"118":1,"120":3,"122":1,"124":4}}],["above",{"2":{"30":1,"34":1,"76":1,"80":1,"82":1,"83":1,"92":1}}],["abstract",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"107":1,"110":1}}],["abundance",{"2":{"75":1}}],["ability",{"2":{"1":1}}],["am",{"2":{"114":2}}],["amp",{"2":{"70":2,"110":2,"112":4,"114":14,"115":2,"117":3,"118":8,"120":2,"121":4,"122":20,"123":10}}],["amount",{"2":{"24":1,"115":1}}],["ambiguous",{"0":{"92":1},"2":{"75":2,"94":1}}],["ambiguity",{"2":{"18":1,"75":1}}],["ambition",{"2":{"14":1}}],["a11y",{"2":{"23":2,"58":4}}],["advertised",{"2":{"117":1}}],["advantage",{"2":{"1":1}}],["adoptions",{"0":{"49":1}}],["adds",{"2":{"123":1}}],["additional",{"2":{"110":1,"123":1}}],["addition",{"2":{"96":4,"120":1}}],["adding",{"2":{"37":1,"83":1,"117":1}}],["address",{"2":{"36":1}}],["added",{"2":{"28":1,"83":1,"84":1}}],["add",{"2":{"23":3,"40":1,"50":8,"54":1,"64":8,"69":8,"114":4,"122":1,"124":4}}],["aims",{"2":{"24":1}}],["aim",{"2":{"20":1,"25":1,"32":1,"115":1}}],["avail",{"2":{"120":1}}],["available",{"2":{"13":1,"43":1,"58":4}}],["avoiding",{"2":{"79":1}}],["avoid",{"2":{"19":2,"88":2,"110":1}}],["acquire",{"2":{"124":3}}],["achieving",{"2":{"106":1,"115":1}}],["achieve",{"2":{"24":2}}],["acornjs",{"2":{"89":2}}],["acorn",{"2":{"84":1,"89":4,"128":1}}],["academia",{"2":{"79":1}}],["accompanying",{"2":{"109":1}}],["accordingly",{"2":{"82":1,"90":1}}],["according",{"2":{"79":1}}],["accessed",{"2":{"110":1}}],["accessibility",{"2":{"58":2}}],["access",{"2":{"17":1,"109":3,"110":1,"118":1,"122":1}}],["across",{"2":{"49":1}}],["active",{"0":{"128":1}}],["actively",{"2":{"20":1,"24":1,"36":1}}],["acting",{"2":{"18":1}}],["actions",{"0":{"56":1},"2":{"20":1,"56":2}}],["action",{"0":{"18":1},"2":{"18":2}}],["actual",{"2":{"3":1,"96":4}}],["apparent",{"2":{"114":1}}],["appropriate",{"2":{"124":1}}],["approaches",{"2":{"115":1}}],["approach",{"2":{"94":1,"114":1,"120":1,"122":1}}],["appreciate",{"2":{"16":1}}],["appears",{"2":{"96":2}}],["appear",{"2":{"87":1}}],["applying",{"2":{"114":1}}],["apply",{"2":{"83":1,"103":1,"119":1}}],["applied",{"2":{"96":6}}],["applies",{"2":{"79":1,"92":1}}],["application",{"2":{"36":1,"88":1}}],["app",{"2":{"34":2}}],["apis",{"2":{"1":1,"19":1}}],["attention",{"2":{"119":1}}],["attempt",{"2":{"112":1}}],["attempts",{"2":{"109":1}}],["atomicisize",{"2":{"114":2}}],["atomics",{"2":{"114":1}}],["atom",{"2":{"80":4}}],["at",{"2":{"4":1,"9":1,"13":1,"23":1,"34":2,"79":2,"87":1,"88":1,"92":2,"101":1,"113":1,"114":1,"115":1,"117":1,"120":3,"122":2}}],["autocow",{"2":{"118":1}}],["automatically",{"2":{"79":1,"101":1}}],["auto",{"2":{"2":1}}],["authors",{"2":{"1":1}}],["author",{"2":{"0":2,"83":1}}],["already",{"2":{"117":1,"120":1}}],["aleksey",{"2":{"110":1}}],["although",{"2":{"114":1}}],["altogether",{"2":{"109":1}}],["alternative",{"2":{"14":1}}],["almost",{"2":{"92":1}}],["always",{"2":{"81":1,"117":3,"119":1}}],["align",{"2":{"114":2}}],["alignment",{"2":{"110":1,"114":2}}],["aligning",{"2":{"75":1}}],["aligned",{"2":{"66":1}}],["aliased",{"2":{"26":1}}],["alloc",{"2":{"117":2,"118":4}}],["allocates",{"2":{"109":1,"118":1}}],["allocate",{"2":{"106":1,"109":1,"112":1,"115":1,"117":1,"118":1}}],["allocated",{"2":{"76":1,"109":3,"113":1,"117":1}}],["allocations",{"2":{"76":1,"115":1}}],["allocation",{"0":{"109":1},"2":{"76":1}}],["allows",{"2":{"85":1,"100":1}}],["allow",{"2":{"58":2,"88":1}}],["allow=name",{"2":{"58":2}}],["allowing",{"2":{"58":2,"90":1}}],["allowed",{"2":{"40":1,"83":1,"87":2,"100":1}}],["all",{"2":{"1":1,"19":1,"23":1,"24":1,"42":1,"58":2,"63":1,"66":1,"79":2,"91":2,"92":5,"94":1,"108":2,"109":2,"110":3,"111":1,"113":1,"114":1,"115":3,"117":1,"120":1,"122":1,"123":1}}],["also",{"2":{"1":1,"11":1,"23":1,"50":1,"68":1,"88":1,"96":2,"109":1,"110":2,"117":1,"119":1}}],["asyncarrowhead",{"2":{"95":2}}],["asyncarrowfunction",{"2":{"95":6}}],["asyncconcisebody",{"2":{"95":4}}],["async",{"2":{"88":2,"95":6}}],["assembly",{"2":{"120":1}}],["assert",{"2":{"110":6,"114":2,"115":2}}],["assumptions",{"2":{"94":1}}],["assignment",{"2":{"91":5}}],["assignmentproperty",{"2":{"91":2}}],["assignmentpattern",{"0":{"91":1},"2":{"91":7,"96":2}}],["assignmentexpressiona",{"2":{"98":1}}],["assignmentexpressionargumentlist",{"2":{"98":1}}],["assignmentexpression",{"2":{"80":3,"91":14,"92":1,"96":4,"98":6}}],["associating",{"2":{"81":1}}],["asking",{"2":{"18":1}}],["ask",{"2":{"13":1,"82":1}}],["astkind",{"2":{"122":17}}],["asts",{"2":{"80":1,"108":1,"110":1,"122":1}}],["ast$",{"2":{"63":1}}],["astral",{"2":{"18":1}}],["ast",{"0":{"108":1,"129":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"1":2,"2":1,"63":3,"75":5,"76":2,"80":1,"84":1,"85":1,"91":1,"107":1,"108":8,"109":12,"110":3,"111":1,"112":1,"113":2,"121":1,"122":11,"129":2}}],["as",{"2":{"0":1,"1":1,"14":1,"18":1,"19":1,"24":2,"34":3,"43":1,"75":3,"81":1,"89":2,"91":1,"92":7,"94":1,"96":7,"106":1,"108":1,"110":1,"114":8,"115":1,"117":3,"118":2,"119":1,"120":5,"122":1,"123":1}}],["a",{"0":{"87":1,"105":1},"1":{"106":1},"2":{"0":1,"1":4,"4":1,"11":1,"12":1,"14":3,"18":4,"19":1,"22":1,"23":1,"24":4,"30":1,"32":2,"34":2,"36":4,"38":2,"40":1,"42":2,"43":2,"49":2,"55":1,"58":6,"75":4,"76":1,"79":11,"80":2,"81":5,"82":2,"83":13,"84":1,"86":2,"87":5,"88":4,"89":7,"90":1,"91":20,"92":20,"94":17,"95":6,"96":15,"101":2,"103":2,"106":1,"107":3,"108":6,"109":7,"110":9,"111":3,"112":10,"113":5,"114":16,"115":6,"117":27,"118":8,"119":5,"120":10,"121":6,"122":55,"123":4,"124":6,"127":2}}],["article",{"2":{"123":1,"127":1}}],["arc",{"2":{"123":4}}],["arch",{"2":{"110":2,"115":2}}],["architecture",{"2":{"94":1}}],["architectural",{"2":{"16":1,"108":1}}],["argumentlist",{"2":{"98":7}}],["arguments",{"2":{"95":4}}],["args",{"2":{"70":4}}],["arrowformalparameters",{"2":{"95":2}}],["arrowfunction",{"2":{"94":2}}],["arrow",{"2":{"94":2}}],["arrowexpression",{"2":{"94":3}}],["arrowparameters",{"2":{"94":5}}],["arrayexpression",{"2":{"122":4}}],["arrayliteral",{"2":{"96":2}}],["arraybindingpattern",{"2":{"91":2}}],["arrayassignmentpattern",{"2":{"91":4}}],["arraypattern",{"2":{"91":7}}],["arm64",{"2":{"59":3}}],["arenas",{"2":{"109":2}}],["arena",{"2":{"76":1,"109":5,"118":4,"122":2}}],["are",{"2":{"0":1,"7":2,"11":1,"13":1,"14":1,"17":1,"19":2,"23":1,"24":2,"28":1,"36":1,"38":1,"42":1,"43":1,"63":1,"66":1,"76":4,"79":2,"80":3,"83":1,"84":1,"88":1,"91":3,"92":3,"94":1,"96":8,"97":1,"98":1,"100":2,"109":3,"110":1,"112":1,"113":2,"114":4,"115":4,"117":1,"118":2,"120":1,"122":1,"124":1}}],["around",{"2":{"0":1,"20":1,"109":1,"110":2,"114":1,"119":1}}],["announcing",{"2":{"119":1}}],["announced",{"2":{"104":1}}],["annotations",{"2":{"109":1}}],["annotation",{"2":{"109":1,"117":2}}],["annex",{"2":{"85":1,"89":1}}],["analyzes",{"2":{"121":1}}],["analyzer",{"2":{"0":3,"76":1}}],["analysis",{"2":{"36":1,"80":1,"91":1}}],["another",{"2":{"28":1,"109":1,"114":3,"115":1,"117":1}}],["anywhere",{"2":{"87":1}}],["any",{"2":{"16":1,"19":1,"32":1,"75":1,"84":1,"92":1,"96":2,"122":2}}],["an",{"2":{"1":1,"2":1,"16":2,"38":1,"43":1,"58":2,"79":2,"81":1,"88":1,"89":1,"91":5,"92":4,"94":4,"95":4,"96":13,"106":1,"107":1,"109":1,"110":1,"114":2,"117":2,"118":2,"120":1,"122":2,"124":1}}],["andrew",{"2":{"127":1}}],["and",{"0":{"81":1,"82":1,"83":1,"88":1,"103":1,"112":1},"2":{"0":1,"1":1,"3":2,"7":1,"9":3,"11":3,"12":1,"13":1,"14":2,"15":1,"16":1,"18":2,"19":3,"20":1,"22":1,"24":2,"32":1,"34":2,"36":1,"40":3,"42":3,"43":1,"48":2,"58":6,"61":3,"63":2,"75":7,"76":2,"79":9,"80":4,"81":2,"82":1,"83":3,"84":2,"85":1,"86":1,"87":1,"88":5,"90":4,"91":6,"92":9,"94":4,"96":3,"100":2,"101":2,"106":3,"107":1,"108":2,"109":7,"110":5,"111":1,"112":4,"113":3,"114":7,"115":6,"117":9,"118":2,"119":1,"120":5,"121":1,"122":5,"123":1,"124":2}}],["wrap",{"2":{"124":2}}],["wraps",{"2":{"122":1}}],["wrong",{"2":{"91":1}}],["wrote",{"2":{"79":1}}],["writing",{"2":{"103":1,"106":1,"109":1}}],["written",{"2":{"42":1,"61":1,"75":1,"86":1,"109":1,"114":1}}],["writeln",{"2":{"124":4}}],["write",{"2":{"0":1,"79":4,"83":1,"94":1,"101":2,"118":3,"124":2,"127":1}}],["won",{"2":{"117":1}}],["worth",{"2":{"114":1,"120":1}}],["world",{"2":{"79":1}}],["worked",{"2":{"109":1}}],["worker",{"2":{"49":1}}],["workers",{"2":{"49":1}}],["work",{"2":{"108":1,"117":1,"118":1,"122":1}}],["workflow",{"2":{"32":1}}],["working",{"2":{"4":2,"24":1,"36":1,"109":1,"114":1,"124":1}}],["would",{"2":{"19":1,"84":1,"85":1,"94":1,"117":2}}],["who",{"2":{"84":1}}],["whole",{"2":{"1":1,"13":1,"91":2}}],["what",{"0":{"42":1},"1":{"43":1,"44":1},"2":{"24":1,"79":1,"83":2,"87":1,"91":1,"109":1,"110":1,"114":3,"115":1,"117":1,"118":2,"122":1}}],["whether",{"2":{"91":2,"94":1}}],["where",{"2":{"24":1,"32":1,"83":1,"91":2,"92":3,"94":1,"96":4,"113":1,"115":1,"122":1,"123":1}}],["whenever",{"2":{"92":1}}],["when",{"2":{"18":2,"19":1,"28":1,"82":1,"91":3,"94":4,"95":4,"96":4,"109":1,"113":2,"114":2,"115":1,"117":2,"118":4,"119":1,"124":1}}],["whitespaces",{"2":{"119":2}}],["whitespace",{"2":{"92":4}}],["while",{"2":{"14":1,"32":1,"75":1,"87":2,"103":1,"109":2,"114":3,"117":5,"123":2}}],["which",{"2":{"11":1,"12":1,"75":1,"79":1,"92":1,"96":1,"110":1,"111":1,"114":1,"115":1,"119":1,"123":1,"124":1}}],["walk",{"2":{"92":1,"123":7}}],["wall",{"2":{"49":1}}],["warning",{"2":{"40":1}}],["warm",{"2":{"32":1}}],["watch",{"2":{"22":2}}],["wanted",{"2":{"119":1}}],["want",{"2":{"16":1,"79":1,"82":1,"115":1,"122":1}}],["ways",{"2":{"110":1}}],["way",{"2":{"4":1,"11":1,"12":1,"19":1,"79":1,"110":2,"117":1}}],["was",{"2":{"0":2,"91":1,"109":1,"111":1,"113":3,"114":6,"118":4,"119":1,"120":1,"124":1}}],["week",{"2":{"91":1}}],["web",{"2":{"89":1}}],["websites",{"2":{"24":1}}],["website",{"2":{"24":1}}],["were",{"2":{"83":1}}],["well",{"2":{"19":1,"24":1,"75":1,"119":1}}],["welcome",{"2":{"16":1}}],["we",{"2":{"2":1,"14":1,"16":1,"17":1,"18":5,"24":3,"25":1,"32":1,"36":1,"38":1,"42":1,"75":1,"79":5,"80":1,"81":1,"83":4,"85":2,"86":1,"88":3,"91":7,"92":5,"94":5,"97":1,"101":2,"110":2,"111":2,"112":1,"114":3,"115":5,"117":6,"120":8,"122":5,"123":1,"124":1}}],["width",{"2":{"110":2,"115":2}}],["widely",{"2":{"79":1,"113":1}}],["wikipedia",{"2":{"79":1}}],["win32",{"2":{"59":2}}],["within",{"2":{"94":1,"114":3,"115":1}}],["without",{"2":{"24":2,"91":1,"94":1,"106":1,"110":5,"114":1,"122":1}}],["with",{"2":{"0":2,"4":2,"17":1,"18":2,"24":1,"34":4,"48":1,"66":1,"75":2,"81":2,"82":2,"83":2,"88":3,"89":1,"91":2,"92":1,"96":3,"109":2,"113":2,"114":1,"115":1,"117":4,"118":1,"119":2,"120":3,"122":2,"123":1}}],["will",{"2":{"0":1,"3":1,"36":1,"79":1,"80":1,"91":1,"92":1,"106":2,"108":1,"109":2,"110":1,"117":2,"118":1,"124":1}}],["tx",{"2":{"123":10}}],["tc39",{"2":{"82":2}}],["two",{"2":{"76":1,"79":1,"88":2,"91":2,"94":2,"106":1,"110":1,"111":1,"120":1}}],["tbd",{"2":{"41":1,"45":1}}],["tutorial",{"2":{"127":1}}],["turns",{"2":{"110":1,"119":1,"120":1}}],["turning",{"2":{"38":1}}],["turn",{"2":{"34":2,"94":1,"117":1}}],["tune",{"2":{"32":1}}],["tuning",{"0":{"31":1},"1":{"32":1,"33":1,"34":1},"2":{"120":1}}],["tdewolff",{"2":{"24":1}}],["typical",{"2":{"110":1}}],["typically",{"2":{"24":1,"117":1}}],["typed",{"2":{"122":1}}],["type=",{"2":{"101":1}}],["type",{"2":{"91":8,"117":1,"118":3,"122":1}}],["types",{"2":{"75":2,"80":1,"101":1,"110":4}}],["typescript",{"0":{"29":1},"2":{"0":1,"4":1,"29":1,"42":1,"49":1,"54":2,"61":1,"75":1,"83":1,"94":1,"120":1}}],["tsx",{"2":{"61":1,"75":1}}],["ts",{"2":{"22":3,"23":2,"40":1}}],["tedious",{"2":{"122":1}}],["term",{"2":{"118":2}}],["terms",{"2":{"117":1}}],["terser",{"2":{"24":1,"108":1}}],["technique",{"2":{"113":1,"115":1}}],["techniques",{"2":{"19":1,"75":1}}],["tells",{"2":{"101":1}}],["telling",{"2":{"92":1}}],["temporary",{"2":{"94":1}}],["template",{"2":{"34":4}}],["text",{"0":{"101":1},"2":{"80":1,"82":2,"96":2,"108":1,"111":1,"112":1,"114":1,"117":1}}],["team",{"0":{"44":1},"2":{"113":1}}],["test262",{"0":{"27":1},"2":{"27":2,"82":3}}],["tests",{"0":{"26":1},"1":{"27":1,"28":1,"29":1},"2":{"4":2,"7":1,"27":1,"28":1,"29":1}}],["test",{"0":{"30":1},"2":{"3":4,"4":2,"22":3,"24":1,"26":1,"27":2,"30":2,"58":2,"82":2,"110":3,"115":4}}],["t",{"2":{"18":1,"79":3,"92":1,"96":2,"117":4,"118":3}}],["task",{"2":{"122":1}}],["tasks",{"2":{"26":1,"36":1}}],["taught",{"2":{"120":1}}],["table",{"2":{"120":1}}],["tables",{"2":{"34":2}}],["tag",{"2":{"110":1}}],["taking",{"2":{"49":1}}],["takes",{"2":{"55":1,"103":1,"120":1}}],["taken",{"2":{"18":1}}],["take",{"2":{"4":1,"79":2,"106":1,"110":2,"114":5,"117":1,"118":2}}],["tap",{"2":{"43":1}}],["targeting",{"2":{"83":1}}],["target",{"2":{"34":5,"110":4,"115":4}}],["talking",{"2":{"0":1,"118":1}}],["times",{"2":{"24":1,"109":1,"122":2}}],["time",{"0":{"32":1},"2":{"3":1,"20":2,"34":5,"49":1,"79":1,"84":1,"109":1,"110":1,"111":1,"113":1,"114":2,"117":1,"118":1,"120":1,"124":2}}],["tried",{"2":{"120":1}}],["tries",{"2":{"120":1}}],["tricks",{"2":{"117":1}}],["trial",{"2":{"106":1}}],["true",{"2":{"83":2,"87":2,"89":2}}],["treated",{"2":{"89":2}}],["tremendous",{"2":{"24":1}}],["treebuilder",{"2":{"122":2}}],["trees",{"2":{"1":2,"122":1}}],["tree",{"0":{"1":1,"108":1,"122":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"0":1,"1":2,"34":2,"79":2,"94":2,"107":1,"108":1,"109":1,"110":1,"122":7}}],["trait",{"2":{"118":1,"121":2,"122":2}}],["traits",{"2":{"19":1}}],["transforms",{"2":{"108":1}}],["transformer",{"0":{"38":1,"78":1},"2":{"38":1}}],["transpiles",{"2":{"83":1}}],["transpiler",{"2":{"38":1,"42":1}}],["tracestarting",{"2":{"34":1}}],["trace",{"2":{"34":5}}],["track",{"2":{"24":1}}],["trade",{"2":{"24":1,"115":1}}],["traversal",{"2":{"1":1,"109":1,"123":1}}],["trying",{"2":{"94":1}}],["try",{"2":{"17":1,"92":1}}],["thousands",{"2":{"124":1}}],["thought",{"2":{"84":1}}],["through",{"2":{"92":1,"106":1,"117":1,"119":1,"122":1,"124":1}}],["throws",{"2":{"83":1}}],["thrown",{"2":{"82":1}}],["throw",{"2":{"82":1,"92":1,"96":2}}],["three",{"2":{"80":1,"93":1,"94":1}}],["threaded",{"2":{"114":2}}],["threads",{"2":{"114":1}}],["thread",{"2":{"34":1,"113":1,"123":1}}],["things",{"2":{"97":1,"124":1}}],["thing",{"2":{"92":1}}],["think",{"2":{"92":1}}],["thinking",{"2":{"83":1}}],["third",{"2":{"19":1,"42":1}}],["this",{"2":{"1":1,"6":1,"9":1,"14":1,"19":1,"24":2,"28":1,"32":1,"36":1,"43":1,"63":1,"75":2,"79":1,"82":4,"83":4,"84":2,"88":1,"89":1,"91":9,"92":5,"93":1,"94":8,"95":1,"96":4,"98":1,"109":4,"110":2,"111":1,"112":1,"114":11,"115":3,"117":7,"118":3,"119":1,"120":4,"122":8,"123":3,"124":2}}],["thank",{"2":{"15":1}}],["than",{"2":{"11":1,"48":1,"110":1,"111":1,"120":3,"122":1}}],["that",{"2":{"0":2,"1":2,"7":1,"14":1,"19":1,"24":2,"27":1,"32":1,"38":1,"43":1,"79":2,"81":1,"84":1,"92":4,"94":2,"101":2,"107":1,"109":2,"111":2,"112":1,"114":4,"118":2,"119":1,"120":4,"121":1,"122":4,"123":1,"124":3}}],["these",{"2":{"80":1,"88":1,"90":1,"92":1,"94":1,"95":1,"96":3,"108":1,"109":1,"110":1,"115":1}}],["they",{"2":{"30":1,"76":1,"79":2,"81":1,"96":2,"109":3,"110":1}}],["then",{"2":{"22":1,"23":1,"34":2,"61":1,"94":2,"103":1,"114":2,"118":1}}],["there",{"2":{"14":1,"23":1,"80":1,"83":1,"88":1,"92":1,"101":2,"109":1,"110":2,"113":2,"114":1,"115":2,"120":2,"123":1}}],["them",{"2":{"11":1,"18":1,"19":1,"28":1,"80":1,"91":1,"103":1,"109":1}}],["their",{"2":{"0":1,"75":1,"109":2,"122":1}}],["the",{"0":{"88":1},"2":{"0":5,"1":10,"2":7,"3":6,"4":5,"7":1,"9":5,"11":1,"13":4,"14":3,"15":1,"17":1,"18":2,"19":1,"20":1,"23":4,"24":5,"25":1,"26":2,"27":4,"29":1,"30":1,"32":1,"34":19,"36":1,"38":1,"40":4,"42":4,"43":1,"48":1,"50":2,"53":1,"54":1,"58":15,"59":1,"61":1,"63":2,"73":1,"75":8,"76":3,"79":20,"80":4,"82":8,"83":5,"84":3,"85":3,"86":1,"87":3,"88":18,"89":3,"90":2,"91":29,"92":35,"93":3,"94":13,"95":13,"96":10,"97":2,"98":1,"99":1,"100":2,"101":3,"102":2,"103":1,"106":4,"108":7,"109":17,"110":24,"111":6,"112":5,"113":11,"114":26,"115":10,"117":21,"118":9,"119":6,"120":24,"121":3,"122":18,"123":3,"124":9,"130":1,"131":1}}],["total",{"2":{"110":1,"113":1,"120":1}}],["told",{"2":{"110":1}}],["toggle",{"2":{"90":1}}],["today",{"2":{"79":1}}],["took",{"2":{"109":1,"114":1}}],["too",{"2":{"79":1}}],["tool",{"2":{"79":1}}],["tooling",{"2":{"36":1,"43":1,"75":1}}],["toolchain",{"2":{"9":2,"43":1}}],["toolshed",{"2":{"109":1}}],["tools",{"0":{"10":1},"1":{"11":1,"12":1,"13":1},"2":{"0":1,"3":4,"11":1,"32":1,"34":1,"42":2,"43":1,"75":2,"80":1,"90":2,"108":2}}],["tokenvalue",{"2":{"117":9}}],["tokenizer",{"2":{"117":1}}],["tokenize",{"2":{"92":1}}],["tokenized",{"2":{"92":2,"118":1}}],["tokeninputelementdiv",{"2":{"92":1}}],["token",{"0":{"117":1},"2":{"79":1,"87":2,"88":1,"92":12,"94":1,"117":9}}],["topic",{"2":{"93":1,"115":1,"120":1,"123":1}}],["top",{"2":{"34":2,"100":2,"101":1,"113":1,"120":1}}],["towards",{"2":{"18":3}}],["toml",{"2":{"9":1,"34":1}}],["touch",{"2":{"3":2}}],["to",{"2":{"0":4,"1":2,"2":1,"3":1,"4":3,"6":1,"7":2,"11":3,"12":1,"13":3,"14":3,"15":2,"16":1,"17":1,"20":1,"23":3,"24":5,"25":1,"26":1,"27":1,"28":2,"32":2,"34":8,"36":1,"38":2,"42":1,"43":1,"54":1,"55":2,"70":2,"75":2,"76":1,"79":9,"80":1,"81":2,"82":3,"83":2,"84":1,"87":3,"88":13,"89":4,"90":1,"91":11,"92":6,"93":1,"94":12,"96":5,"97":2,"101":2,"103":2,"104":1,"106":1,"108":2,"109":6,"110":13,"111":5,"112":2,"113":4,"114":12,"115":10,"117":18,"118":5,"119":5,"120":8,"122":19,"123":2,"124":3,"127":1}}],["rx",{"2":{"123":2}}],["rc",{"2":{"122":3}}],["rapidjson",{"2":{"119":2}}],["rare",{"2":{"118":1}}],["rawvec",{"2":{"117":5}}],["rawmutex",{"2":{"113":1}}],["raw",{"2":{"113":1}}],["rayon",{"2":{"113":1,"123":6}}],["ratel",{"2":{"109":1,"128":1}}],["rather",{"2":{"18":1}}],["rightbracepunctuator",{"2":{"92":4}}],["right",{"2":{"79":4,"88":1,"92":1}}],["r",{"2":{"13":1}}],["rspack",{"2":{"37":1}}],["rs",{"2":{"3":4,"23":1,"73":1,"81":2,"90":2,"109":1,"110":2}}],["rslint",{"2":{"0":4}}],["ruff",{"2":{"43":1}}],["rule",{"0":{"23":1},"2":{"23":14,"58":8,"83":1}}],["rules",{"0":{"16":1,"17":1},"2":{"15":1,"23":2,"58":4,"96":4,"121":1}}],["runner",{"0":{"30":1},"2":{"26":1,"30":1}}],["running",{"2":{"3":1,"11":1,"13":1,"34":1,"49":1,"113":1}}],["runtime",{"2":{"19":1,"91":1}}],["runs",{"2":{"13":1,"26":1,"32":2,"48":1,"56":2}}],["run",{"2":{"3":4,"7":1,"9":1,"12":1,"13":2,"22":2,"40":4,"50":3,"55":2,"56":2,"84":1,"124":1}}],["rustlet",{"2":{"123":1,"124":1}}],["rustfor",{"2":{"122":1}}],["rustfn",{"2":{"118":1,"120":1}}],["ruststruct",{"2":{"122":3}}],["rustc",{"2":{"120":1}}],["rustmagazine",{"2":{"105":1}}],["rustenum",{"2":{"91":2,"110":1,"115":1}}],["rustpub",{"2":{"80":1,"108":1,"109":1,"111":1,"112":1,"114":2,"117":5,"121":1,"122":1}}],["rustuse",{"2":{"70":1,"124":1}}],["rustup",{"2":{"9":1}}],["rusthttps",{"2":{"3":2,"81":1,"90":1}}],["rust",{"0":{"9":1,"63":1,"68":1,"130":1},"2":{"0":6,"9":5,"11":1,"19":2,"25":1,"32":2,"34":1,"42":1,"61":1,"75":1,"106":1,"108":1,"109":2,"110":3,"114":2,"115":2,"117":1,"118":1,"119":1,"120":2,"122":1,"124":1,"127":1,"128":1,"130":1}}],["routine",{"2":{"114":1}}],["route",{"2":{"92":1}}],["rolldown",{"0":{"104":1}}],["role",{"2":{"24":1,"36":1}}],["rootpatterns",{"2":{"54":2}}],["root",{"2":{"9":1,"13":1}}],["rowan",{"2":{"1":5}}],["rome",{"2":{"0":3,"2":1,"3":16,"4":2,"30":1,"90":5}}],["reward",{"2":{"117":1}}],["rewritten",{"2":{"0":2,"19":1,"43":1}}],["revisited",{"2":{"117":1}}],["reversible",{"2":{"18":1}}],["regularexpressionflags",{"2":{"92":1}}],["regularexpressionflagsregularexpressionliteral",{"2":{"92":1}}],["regularexpressionbody",{"2":{"92":2}}],["regularexpressionliterala",{"2":{"92":1}}],["regularexpressionliteral",{"2":{"92":10}}],["regexp",{"2":{"92":4}}],["regexes",{"2":{"19":1}}],["regex",{"2":{"19":1,"92":9}}],["reforowned",{"2":{"118":1}}],["ref",{"2":{"114":6}}],["reference",{"2":{"112":1,"118":1,"122":1}}],["references",{"0":{"125":1},"1":{"126":1,"127":1,"128":1,"129":1,"130":1,"131":1},"2":{"80":1,"117":1}}],["refined",{"2":{"91":2,"94":2,"95":4}}],["returns",{"2":{"86":1,"118":1}}],["return",{"2":{"83":4,"85":2,"90":1,"92":2,"100":2,"114":2}}],["remove",{"2":{"113":1,"119":2}}],["removing",{"2":{"75":1,"113":1}}],["remains",{"2":{"32":1}}],["relevant",{"2":{"109":1,"114":1,"120":1,"124":1}}],["releases",{"2":{"50":1}}],["release",{"2":{"34":7}}],["relatively",{"2":{"108":1}}],["relational",{"2":{"88":2}}],["relationalexpression",{"2":{"88":5}}],["rely",{"2":{"75":1}}],["request",{"2":{"70":10,"114":1}}],["requirements",{"0":{"59":1}}],["require",{"2":{"24":1,"70":4}}],["required",{"2":{"11":1,"28":1,"48":1,"96":2,"118":1}}],["represent",{"2":{"110":1}}],["represents",{"2":{"75":1}}],["replicates",{"2":{"108":1}}],["reputation",{"2":{"32":1}}],["report",{"2":{"121":2,"122":2}}],["reports",{"2":{"48":1}}],["repository",{"0":{"7":1},"2":{"17":1,"57":1,"63":1}}],["repo",{"2":{"0":1}}],["re",{"2":{"18":1,"89":1,"94":1}}],["rest",{"2":{"117":1}}],["restricting",{"2":{"110":1}}],["restricted",{"2":{"96":2}}],["resurfaced",{"2":{"114":1}}],["result",{"2":{"120":1}}],["resulted",{"2":{"109":1,"110":1}}],["results",{"2":{"24":1,"96":2}}],["resulting",{"2":{"24":1,"109":2}}],["resolved",{"2":{"70":2}}],["resolveoptions",{"2":{"70":4}}],["resolve",{"2":{"36":1,"66":1,"70":2}}],["resolver$",{"2":{"68":1}}],["resolver",{"0":{"36":1,"66":1,"77":1},"1":{"67":1,"68":1,"69":1,"70":1},"2":{"36":1,"42":1,"68":2,"69":1,"70":6}}],["resolution",{"2":{"36":1,"66":1,"70":4,"76":1}}],["resources",{"0":{"127":1},"2":{"14":1}}],["responsible",{"2":{"18":1,"38":1,"92":1}}],["researched",{"2":{"75":1}}],["research",{"2":{"14":1,"106":1,"119":1,"120":1}}],["recv",{"2":{"123":2}}],["recursion",{"0":{"98":1}}],["recursive",{"2":{"79":1,"107":1,"110":8}}],["recurse",{"2":{"7":3}}],["recklessness",{"2":{"18":1}}],["recognized",{"2":{"96":2}}],["recognizing",{"2":{"14":1}}],["recording",{"2":{"34":8}}],["record",{"2":{"34":2}}],["recommended",{"2":{"11":1,"55":1}}],["recoverable",{"2":{"1":1}}],["reasoning",{"2":{"120":1}}],["reach",{"2":{"92":1,"94":1,"96":1}}],["reaches",{"2":{"92":1}}],["reached",{"2":{"88":1,"91":1}}],["react",{"2":{"23":2}}],["reading",{"2":{"109":1,"114":1}}],["ready",{"2":{"13":2,"25":1,"63":1}}],["reads",{"2":{"9":1}}],["read",{"2":{"1":1,"15":1,"93":1,"97":1,"102":1,"109":1,"114":1}}],["realize",{"2":{"111":1}}],["really",{"2":{"91":2}}],["real",{"2":{"1":1,"82":1}}],["redeclaration",{"2":{"89":2}}],["reduce",{"2":{"111":1,"113":1,"117":1}}],["reduces",{"2":{"24":1}}],["reduced",{"2":{"20":1,"115":1}}],["red",{"2":{"1":3}}]],"serializationVersion":2}';export{e as default};
diff --git a/assets/chunks/VPLocalSearchBox.11f5f162.js b/assets/chunks/VPLocalSearchBox.7afa7cdc.js
similarity index 93%
rename from assets/chunks/VPLocalSearchBox.11f5f162.js
rename to assets/chunks/VPLocalSearchBox.7afa7cdc.js
index c62d5ecf03..2bfd65fa8d 100644
--- a/assets/chunks/VPLocalSearchBox.11f5f162.js
+++ b/assets/chunks/VPLocalSearchBox.7afa7cdc.js
@@ -1,7 +1,7 @@
-import{X as pt,h as oe,x as Ve,ah as kt,ai as Nt,d as It,E as xe,aj as et,g as Fe,ak as Dt,al as _t,y as Ot,am as Rt,j as _e,O as he,V as Ee,an as Mt,S as Lt,U as Pt,ao as zt,Y as Bt,s as Vt,ap as $t,o as ee,b as Wt,k as E,a1 as jt,l as U,aq as Kt,ar as Jt,as as Ut,c as re,n as tt,e as Se,D as rt,F as at,a as ve,t as pe,at as Ht,p as Gt,m as Qt,au as nt,av as qt,a6 as Yt,ac as Zt,_ as Xt}from"./framework.725e5b03.js";import{u as er,c as tr,L as rr}from"./theme.996dd6ef.js";const ar={root:()=>pt(()=>import("./@localSearchIndexroot.694ff656.js"),[])};/*!
+import{X as Ve,h as oe,x as $e,ah as kt,ai as Nt,d as It,E as xe,aj as tt,g as Fe,ak as Dt,al as _t,y as Ot,am as Rt,j as _e,O as he,V as Ee,an as Mt,S as Lt,U as Pt,ao as zt,Y as Bt,s as Vt,ap as $t,o as ee,b as Wt,k as E,a1 as jt,l as U,aq as Kt,ar as Jt,as as Ut,c as re,n as rt,e as Se,D as at,F as nt,a as ve,t as pe,at as Ht,p as Gt,m as Qt,au as it,av as qt,a6 as Yt,ac as Zt,_ as Xt}from"./framework.725e5b03.js";import{u as er,c as tr,L as rr}from"./theme.be7b3ccb.js";const ar={root:()=>Ve(()=>import("./@localSearchIndexroot.694ff656.js"),[]),ja:()=>Ve(()=>import("./@localSearchIndexja.fe90f88e.js"),[])};/*!
 * tabbable 6.2.0
 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
-*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Te=mt.join(","),yt=typeof Element>"u",ue=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ne=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},nr=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Te));return t&&ue.call(e,Te)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var d=ue.call(i,Te);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ne(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var y=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||nr(e))&&!wt(e)?0:e.tabIndex},ir=function(e,t){var r=se(e);return r<0&&t&&!wt(e)?0:r},or=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},sr=function(e){return xt(e)&&e.type==="hidden"},ur=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},lr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=ke(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(hr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},pr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},yr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=ir(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(or).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},gr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:mr}):r=gt(e,t.includeContainer,$e.bind(null,t)),yr(r)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ie.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ie.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Te)===!1?!1:$e(t,e)},wr=mt.concat("iframe").join(","),Oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,wr)===!1?!1:Ie(t,e)};/*!
+*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Te=mt.join(","),yt=typeof Element>"u",ue=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ne=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},nr=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Te));return t&&ue.call(e,Te)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var d=ue.call(i,Te);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ne(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var y=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||nr(e))&&!wt(e)?0:e.tabIndex},ir=function(e,t){var r=se(e);return r<0&&t&&!wt(e)?0:r},or=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},sr=function(e){return xt(e)&&e.type==="hidden"},ur=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},lr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=ke(e);if(u&&!u.shadowRoot&&n(u)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(hr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return ot(e);return!1},pr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},yr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=ir(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(or).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},gr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:mr}):r=gt(e,t.includeContainer,We.bind(null,t)),yr(r)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ie.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ie.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Te)===!1?!1:We(t,e)},wr=mt.concat("iframe").join(","),Oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,wr)===!1?!1:Ie(t,e)};/*!
 * focus-trap 7.5.4
 * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
-*/function ot(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function st(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},Sr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ar=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Cr=function(e){return ge(e)&&!e.shiftKey},Tr=function(e){return ge(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},ct=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},me=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),I=1;I=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||d("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=gr(c,a.tabbableOptions),p=br(c,a.tabbableOptions),N=f.length>0?f[0]:void 0,I=f.length>0?f[f.length-1]:void 0,M=p.find(function(m){return le(m)}),P=p.slice().reverse().find(function(m){return le(m)}),z=!!f.find(function(m){return se(m)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:z,firstTabbableNode:N,lastTabbableNode:I,firstDomTabbableNode:M,lastDomTabbableNode:P,nextTabbableNode:function(x){var $=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,j=f.indexOf(x);return j<0?$?p.slice(p.indexOf(x)+1).find(function(G){return le(G)}):p.slice(0,p.indexOf(x)).reverse().find(function(G){return le(G)}):f[j+($?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function w(c){var f=c.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?w(f.shadowRoot):f},b=function w(c){if(c!==!1&&c!==y(document)){if(!c||!c.focus){w(h());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,Sr(c)&&c.select()}},S=function(c){var f=d("setReturnFocus",c);return f||(f===!1?!1:c)},g=function(c){var f=c.target,p=c.event,N=c.isBackward,I=N===void 0?!1:N;f=f||Ae(p),v();var M=null;if(i.tabbableGroups.length>0){var P=l(f,p),z=P>=0?i.containerGroups[P]:void 0;if(P<0)I?M=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:M=i.tabbableGroups[0].firstTabbableNode;else if(I){var m=ct(i.tabbableGroups,function(B){var J=B.firstTabbableNode;return f===J});if(m<0&&(z.container===f||Oe(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!z.nextTabbableNode(f,!1))&&(m=P),m>=0){var x=m===0?i.tabbableGroups.length-1:m-1,$=i.tabbableGroups[x];M=se(f)>=0?$.lastTabbableNode:$.lastDomTabbableNode}else ge(p)||(M=z.nextTabbableNode(f,!1))}else{var j=ct(i.tabbableGroups,function(B){var J=B.lastTabbableNode;return f===J});if(j<0&&(z.container===f||Oe(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!z.nextTabbableNode(f))&&(j=P),j>=0){var G=j===i.tabbableGroups.length-1?0:j+1,Q=i.tabbableGroups[G];M=se(f)>=0?Q.firstTabbableNode:Q.firstDomTabbableNode}else ge(p)||(M=z.nextTabbableNode(f))}}else M=d("fallbackFocus");return M},A=function(c){var f=Ae(c);if(!(l(f,c)>=0)){if(me(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}me(a.allowOutsideClick,c)||c.preventDefault()}},T=function(c){var f=Ae(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var N,I=!0;if(i.mostRecentlyFocusedNode)if(se(i.mostRecentlyFocusedNode)>0){var M=l(i.mostRecentlyFocusedNode),P=i.containerGroups[M].tabbableNodes;if(P.length>0){var z=P.findIndex(function(m){return m===i.mostRecentlyFocusedNode});z>=0&&(a.isKeyForward(i.recentNavEvent)?z+1=0&&(N=P[z-1],I=!1))}}else i.containerGroups.some(function(m){return m.tabbableNodes.some(function(x){return se(x)>0})})||(I=!1);else I=!1;I&&(N=g({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),b(N||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},F=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=g({event:c,isBackward:f});p&&(ge(c)&&c.preventDefault(),b(p))},L=function(c){if(Ar(c)&&me(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&F(c,a.isKeyBackward(c))},R=function(c){var f=Ae(c);l(f,c)>=0||me(a.clickOutsideDeactivates,c)||me(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},V=function(){if(i.active)return ut.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?lt(function(){b(h())}):b(h()),r.addEventListener("focusin",T,!0),r.addEventListener("mousedown",A,{capture:!0,passive:!1}),r.addEventListener("touchstart",A,{capture:!0,passive:!1}),r.addEventListener("click",R,{capture:!0,passive:!1}),r.addEventListener("keydown",L,{capture:!0,passive:!1}),s},k=function(){if(i.active)return r.removeEventListener("focusin",T,!0),r.removeEventListener("mousedown",A,!0),r.removeEventListener("touchstart",A,!0),r.removeEventListener("click",R,!0),r.removeEventListener("keydown",L,!0),s},O=function(c){var f=c.some(function(p){var N=Array.from(p.removedNodes);return N.some(function(I){return I===i.mostRecentlyFocusedNode})});f&&b(h())},C=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(O):void 0,_=function(){C&&(C.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){C.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),N=u(c,"checkCanFocusTrap");N||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var I=function(){N&&v(),V(),_(),p==null||p()};return N?(N(i.containers.concat()).then(I,I),this):(I(),this)},deactivate:function(c){if(!i.active)return this;var f=st({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,k(),i.active=!1,i.paused=!1,_(),ut.deactivateTrap(n,s);var p=u(f,"onDeactivate"),N=u(f,"onPostDeactivate"),I=u(f,"checkCanReturnFocus"),M=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){lt(function(){M&&b(S(i.nodeFocusedBeforeActivation)),N==null||N()})};return M&&I?(I(S(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),k(),_(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),V(),_(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),_(),this}},s.updateContainerElements(e),s};function Ir(o,e={}){let t;const{immediate:r,...n}=e,a=oe(!1),i=oe(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},d=()=>{t&&(t.unpause(),i.value=!1)};return Ve(()=>kt(o),h=>{h&&(t=Nr(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Nt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:d}}class fe{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{fe.matches(l,this.exclude)?u():this.onIframeReady(l,d=>{t(l)&&(s++,r(d)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new fe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,d,h=()=>({prevNode:d,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Dr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new fe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return fe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,d),e.value=h+v,e.nodes.forEach((y,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=d),e.nodes[b].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let d=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,d,v=>t(v,s,a.value.substring(l,d),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let d=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,y)=>this.opt.filter(y,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=fe.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function _r(o){const e=new Dr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var W=function(){return W=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Mr="ENTRIES",Ft="KEYS",Et="VALUES",H="",Re=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ce(this._path),t=e.node,r=e.keys;if(ce(r)===H)return{done:!1,value:this.result()};var n=t.get(ce(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ce(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ce(t)}).filter(function(e){return e!==H}).join("")},o.prototype.value=function(){return ce(this._path).node.get(H)},o.prototype.result=function(){switch(this._type){case Et:return this.value();case Ft:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ce=function(o){return o[o.length-1]},Lr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}St(o.get(y),e,t,r,n,S,i,s+y)}}}catch(f){u={error:f}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=K(De(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=K(Je(i),2),u=s[0],l=s[1];try{for(var d=D(u.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==H&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(b){t={error:b}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Pr(this._tree,e)},o.prototype.entries=function(){return new Re(this,Mr)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=K(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Lr(this._tree,e,t)},o.prototype.get=function(e){var t=We(this._tree,e);return t!==void 0?t.get(H):void 0},o.prototype.has=function(e){var t=We(this._tree,e);return t!==void 0&&t.has(H)},o.prototype.keys=function(){return new Re(this,Ft)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(H,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(H,t(r.get(H))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e),n=r.get(H);return n===void 0&&r.set(H,n=t()),n},o.prototype.values=function(){return new Re(this,Et)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=K(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),De=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==H&&e.startsWith(s))return t.push([o,s]),De(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),De(void 0,"",t)},We=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==H&&e.startsWith(i))return We(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Le=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Ke,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Or(this,void 0,void 0,function(){var r,n,a,i,s,u,l,d,h,v,y,b,S,g,A,T,F,L,R,V,k,O,C,_,w;return Rr(this,function(c){switch(c.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||je.batchSize,a=e.batchWait||je.batchWait,i=1,c.label=1;case 1:c.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),c.label=2;case 2:if(u.done)return[3,6];l=K(u.value,2),d=l[0],h=l[1];try{for(v=(O=void 0,D(h)),y=v.next();!y.done;y=v.next()){b=K(y.value,2),S=b[0],g=b[1];try{for(A=(_=void 0,D(g)),T=A.next();!T.done;T=A.next())F=K(T.value,1),L=F[0],!this._documentIds.has(L)&&(g.size<=1?h.delete(S):g.delete(L))}catch(f){_={error:f}}finally{try{T&&!T.done&&(w=A.return)&&w.call(A)}finally{if(_)throw _.error}}}}catch(f){O={error:f}}finally{try{y&&!y.done&&(C=v.return)&&C.call(v)}finally{if(O)throw O.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(f){return setTimeout(f,a)})];case 3:c.sent(),c.label=4;case 4:i+=1,c.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return R=c.sent(),V={error:R},[3,9];case 8:try{u&&!u.done&&(k=s.return)&&k.call(s)}finally{if(V)throw V.error}return[7];case 9:this._dirtCount-=r,c.label=10;case 10:return[4,null];case 11:return c.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Be.minDirtCount,r=r||Be.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=K(u.value,2),d=l[0],h=l[1],v=h.score,y=h.terms,b=h.match,S=y.length||1,g={id:this._documentIds.get(d),score:v*S,terms:Object.keys(b),match:b};Object.assign(g,this._storedFields.get(d)),(t.filter==null||t.filter(g))&&i.push(g)}}catch(A){r={error:A}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(ht),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=W(W({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var d=l.value,h=d.score,v=d.terms,y=v.join(" "),b=s.get(y);b!=null?(b.score+=h,b.count+=1):s.set(y,{score:h,terms:v,count:1})}}catch(R){r={error:R}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var S=[];try{for(var g=D(s),A=g.next();!A.done;A=g.next()){var T=K(A.value,2),b=T[0],F=T[1],h=F.score,v=F.terms,L=F.count;S.push({suggestion:b,terms:v,score:h/L})}}catch(R){a={error:R}}finally{try{A&&!A.done&&(i=g.return)&&i.call(g)}finally{if(a)throw a.error}}return S.sort(ht),S},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(ze.hasOwnProperty(e))return Pe(ze,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,y=e.fieldIds,b=e.fieldLength,S=e.averageFieldLength,g=e.storedFields,A=e.dirtCount,T=e.serializationVersion;if(T!==1&&T!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var F=new o(t);F._documentCount=d,F._nextId=h,F._documentIds=Ce(v),F._idToShortId=new Map,F._fieldIds=y,F._fieldLength=Ce(b),F._avgFieldLength=S,F._storedFields=Ce(g),F._dirtCount=A||0,F._index=new Me;try{for(var L=D(F._documentIds),R=L.next();!R.done;R=L.next()){var V=K(R.value,2),k=V[0],O=V[1];F._idToShortId.set(O,k)}}catch(z){r={error:z}}finally{try{R&&!R.done&&(n=L.return)&&n.call(L)}finally{if(r)throw r.error}}try{for(var C=D(l),_=C.next();!_.done;_=C.next()){var w=K(_.value,2),c=w[0],f=w[1],p=new Map;try{for(var N=(s=void 0,D(Object.keys(f))),I=N.next();!I.done;I=N.next()){var M=I.value,P=f[M];T===1&&(P=P.ds),p.set(parseInt(M,10),Ce(P))}}catch(z){s={error:z}}finally{try{I&&!I.done&&(u=N.return)&&u.call(N)}finally{if(s)throw s.error}}F._index.set(c,p)}}catch(z){a={error:z}}finally{try{_&&!_.done&&(i=C.return)&&i.call(C)}finally{if(a)throw a.error}}return F},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var n=W(W(W({},t),e),{queries:void 0}),a=e.queries.map(function(g){return r.executeQuery(g,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,d=W(W({tokenize:s,processTerm:u},l),t),h=d.tokenize,v=d.processTerm,y=h(e).flatMap(function(g){return v(g)}).filter(function(g){return!!g}),b=y.map(jr(d)),S=b.map(function(g){return r.executeQuerySpec(g,d)});return this.combineResults(S,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=W(W({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(M,P){var z;return W(W({},M),(z={},z[P]=Pe(s.boost,P)||1,z))},{}),l=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,y=W(W({},ft.weights),d),b=y.fuzzy,S=y.prefix,g=this._index.get(e.term),A=this.termResults(e.term,e.term,1,g,u,l,v),T,F;if(e.prefix&&(T=this._index.atPrefix(e.term)),e.fuzzy){var L=e.fuzzy===!0?.2:e.fuzzy,R=L<1?Math.min(h,Math.round(e.term.length*L)):L;R&&(F=this._index.fuzzyGet(e.term,R))}if(T)try{for(var V=D(T),k=V.next();!k.done;k=V.next()){var O=K(k.value,2),C=O[0],_=O[1],w=C.length-e.term.length;if(w){F==null||F.delete(C);var c=S*C.length/(C.length+.3*w);this.termResults(e.term,C,c,_,u,l,v,A)}}}catch(M){r={error:M}}finally{try{k&&!k.done&&(n=V.return)&&n.call(V)}finally{if(r)throw r.error}}if(F)try{for(var f=D(F.keys()),p=f.next();!p.done;p=f.next()){var C=p.value,N=K(F.get(C),2),I=N[0],w=N[1];if(w){var c=b*C.length/(C.length+w);this.termResults(e.term,C,c,I,u,l,v,A)}}}catch(M){a={error:M}}finally{try{p&&!p.done&&(i=f.return)&&i.call(f)}finally{if(a)throw a.error}}return A},o.prototype.executeWildcardQuery=function(e){var t,r,n=new Map,a=W(W({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=K(s.value,2),l=u[0],d=u[1],h=a.boostDocument?a.boostDocument(d,"",this._storedFields.get(l)):1;n.set(l,{score:h,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Ue),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Vr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=K(s.value,2),l=u[0],d=u[1],h={};try{for(var v=(r=void 0,D(d)),y=v.next();!y.done;y=v.next()){var b=K(y.value,2),S=b[0],g=b[1];h[S]=Object.fromEntries(g)}}catch(A){r={error:A}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(A){e={error:A}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,d,h,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var b=D(Object.keys(a)),S=b.next();!S.done;S=b.next()){var g=S.value,A=a[g],T=this._fieldIds[g],F=n.get(T);if(F!=null){var L=F.size,R=this._avgFieldLength[T];try{for(var V=(h=void 0,D(F.keys())),k=V.next();!k.done;k=V.next()){var O=k.value;if(!this._documentIds.has(O)){this.removeTerm(T,O,t),L-=1;continue}var C=i?i(this._documentIds.get(O),t,this._storedFields.get(O)):1;if(C){var _=F.get(O),w=this._fieldLength.get(O)[T],c=Wr(_,L,this._documentCount,w,R,s),f=r*A*C*c,p=u.get(O);if(p){p.score+=f,Jr(p.terms,e);var N=Pe(p.match,t);N?N.push(g):p.match[t]=[g]}else u.set(O,{score:f,terms:[e],match:(y={},y[t]=[g],y)})}}}catch(I){h={error:I}}finally{try{k&&!k.done&&(v=V.return)&&v.call(V)}finally{if(h)throw h.error}}}}}catch(I){l={error:I}}finally{try{S&&!S.done&&(d=b.return)&&d.call(b)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,vt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,vt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Gt("data-v-5e5b049d"),o=o(),Qt(),o),Hr=["aria-owns"],Gr={class:"shell"},Qr=["title"],qr=Y(()=>E("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("circle",{cx:"11",cy:"11",r:"8"}),E("path",{d:"m21 21l-4.35-4.35"})])],-1)),Yr=[qr],Zr={class:"search-actions before"},Xr=["title"],ea=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),ta=[ea],ra=["placeholder"],aa={class:"search-actions"},na=["title"],ia=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),oa=[ia],sa=["disabled","title"],ua=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),la=[ua],ca=["id","role","aria-labelledby"],fa=["aria-selected"],da=["href","aria-label","onMouseenter","onFocusin"],ha={class:"titles"},va=Y(()=>E("span",{class:"title-icon"},"#",-1)),pa=["innerHTML"],ma=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),ya={class:"title main"},ga=["innerHTML"],ba={key:0,class:"excerpt-wrapper"},wa={key:0,class:"excerpt",inert:""},xa=["innerHTML"],Fa=Y(()=>E("div",{class:"excerpt-gradient-bottom"},null,-1)),Ea=Y(()=>E("div",{class:"excerpt-gradient-top"},null,-1)),Sa={key:0,class:"no-results"},Aa={class:"search-keyboard-shortcuts"},Ca=["aria-label"],Ta=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),ka=[Ta],Na=["aria-label"],Ia=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),Da=[Ia],_a=["aria-label"],Oa=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("path",{d:"m9 10l-5 5l5 5"}),E("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Ra=[Oa],Ma=["aria-label"],La=It({__name:"VPLocalSearchBox",emits:["close"],setup(o,{emit:e}){var P,z;const t=e,r=xe(),n=xe(),a=xe(ar),i=er(),{activate:s}=Ir(r,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:u,theme:l}=i,d=et(async()=>{var m,x,$,j,G,Q,B,J,Z;return nt(Br.loadJSON(($=await((x=(m=a.value)[u.value])==null?void 0:x.call(m)))==null?void 0:$.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((j=l.value.search)==null?void 0:j.provider)==="local"&&((Q=(G=l.value.search.options)==null?void 0:G.miniSearch)==null?void 0:Q.searchOptions)},...((B=l.value.search)==null?void 0:B.provider)==="local"&&((Z=(J=l.value.search.options)==null?void 0:J.miniSearch)==null?void 0:Z.options)}))}),v=Fe(()=>{var m,x;return((m=l.value.search)==null?void 0:m.provider)==="local"&&((x=l.value.search.options)==null?void 0:x.disableQueryPersistence)===!0}).value?oe(""):Dt("vitepress:local-search-filter",""),y=_t("vitepress:local-search-detailed-list",((P=l.value.search)==null?void 0:P.provider)==="local"&&((z=l.value.search.options)==null?void 0:z.detailedView)===!0),b=Fe(()=>{var m,x,$;return((m=l.value.search)==null?void 0:m.provider)==="local"&&(((x=l.value.search.options)==null?void 0:x.disableDetailedView)===!0||(($=l.value.search.options)==null?void 0:$.detailedView)===!1)}),S=Fe(()=>{var x,$,j,G,Q,B,J;const m=((x=l.value.search)==null?void 0:x.options)??l.value.algolia;return((Q=(G=(j=($=m==null?void 0:m.locales)==null?void 0:$[u.value])==null?void 0:j.translations)==null?void 0:G.button)==null?void 0:Q.buttonText)||((J=(B=m==null?void 0:m.translations)==null?void 0:B.button)==null?void 0:J.buttonText)||"Search"});Ot(()=>{b.value&&(y.value=!1)});const g=xe([]),A=oe(!1);Ve(v,()=>{A.value=!1});const T=et(async()=>{if(n.value)return nt(new _r(n.value))},null),F=new rr(16);Rt(()=>[d.value,v.value,y.value],async([m,x,$],j,G)=>{var be,He,Ge,Qe;(j==null?void 0:j[0])!==m&&F.clear();let Q=!1;if(G(()=>{Q=!0}),!m)return;g.value=m.search(x).slice(0,16),A.value=!0;const B=$?await Promise.all(g.value.map(q=>L(q.id))):[];if(Q)return;for(const{id:q,mod:ae}of B){const ne=q.slice(0,q.indexOf("#"));let te=F.get(ne);if(te)continue;te=new Map,F.set(ne,te);const X=ae.default??ae;if(X!=null&&X.render||X!=null&&X.setup){const ie=qt(X);ie.config.warnHandler=()=>{},ie.provide(Yt,i),Object.defineProperties(ie.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const qe=document.createElement("div");ie.mount(qe),qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(de=>{var Xe;const we=(Xe=de.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(we==null?void 0:we.startsWith("#"))&&we.slice(1);if(!Ye)return;let Ze="";for(;(de=de.nextElementSibling)&&!/^h[1-6]$/i.test(de.tagName);)Ze+=de.outerHTML;te.set(Ye,Ze)}),ie.unmount()}if(Q)return}const J=new Set;if(g.value=g.value.map(q=>{const[ae,ne]=q.id.split("#"),te=F.get(ae),X=(te==null?void 0:te.get(ne))??"";for(const ie in q.match)J.add(ie);return{...q,text:X}}),await he(),Q)return;await new Promise(q=>{var ae;(ae=T.value)==null||ae.unmark({done:()=>{var ne;(ne=T.value)==null||ne.markRegExp(M(J),{done:q})}})});const Z=((be=r.value)==null?void 0:be.querySelectorAll(".result .excerpt"))??[];for(const q of Z)(He=q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(Qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function L(m){const x=Zt(m.slice(0,m.indexOf("#")));try{if(!x)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await pt(()=>import(x),[])}}catch($){return console.error($),{id:m,mod:{}}}}const R=oe(),V=Fe(()=>{var m;return((m=v.value)==null?void 0:m.length)<=0});function k(m=!0){var x,$;(x=R.value)==null||x.focus(),m&&(($=R.value)==null||$.select())}_e(()=>{k()});function O(m){m.pointerType==="mouse"&&k()}const C=oe(-1),_=oe(!1);Ve(g,m=>{C.value=m.length?0:-1,w()});function w(){he(()=>{const m=document.querySelector(".result.selected");m&&m.scrollIntoView({block:"nearest"})})}Ee("ArrowUp",m=>{m.preventDefault(),C.value--,C.value<0&&(C.value=g.value.length-1),_.value=!0,w()}),Ee("ArrowDown",m=>{m.preventDefault(),C.value++,C.value>=g.value.length&&(C.value=0),_.value=!0,w()});const c=Mt();Ee("Enter",m=>{if(m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const x=g.value[C.value];if(m.target instanceof HTMLInputElement&&!x){m.preventDefault();return}x&&(c.go(x.id),t("close"))}),Ee("Escape",()=>{t("close")});const f={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},p=Lt(tr)(Pt(()=>{var m;return(m=l.value.search)==null?void 0:m.options}),f);_e(()=>{window.history.pushState(null,"",null)}),zt("popstate",m=>{m.preventDefault(),t("close")});const N=Bt(Vt?document.body:null);_e(()=>{he(()=>{N.value=!0,he().then(()=>s())})}),$t(()=>{N.value=!1});function I(){v.value="",he().then(()=>k(!1))}function M(m){return new RegExp([...m].sort((x,$)=>$.length-x.length).map(x=>`(${x.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(m,x)=>{var $,j,G,Q;return ee(),Wt(Ht,{to:"body"},[E("div",{ref_key:"el",ref:r,role:"button","aria-owns":($=g.value)!=null&&$.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[E("div",{class:"backdrop",onClick:x[0]||(x[0]=B=>m.$emit("close"))}),E("div",Gr,[E("form",{class:"search-bar",onPointerup:x[4]||(x[4]=B=>O(B)),onSubmit:x[5]||(x[5]=jt(()=>{},["prevent"]))},[E("label",{title:S.value,id:"localsearch-label",for:"localsearch-input"},Yr,8,Qr),E("div",Zr,[E("button",{class:"back-button",title:U(p)("modal.backButtonTitle"),onClick:x[1]||(x[1]=B=>m.$emit("close"))},ta,8,Xr)]),Kt(E("input",{ref_key:"searchInput",ref:R,"onUpdate:modelValue":x[2]||(x[2]=B=>Ut(v)?v.value=B:null),placeholder:S.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,ra),[[Jt,U(v)]]),E("div",aa,[b.value?Se("",!0):(ee(),re("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":U(y)}]),type:"button",title:U(p)("modal.displayDetails"),onClick:x[3]||(x[3]=B=>C.value>-1&&(y.value=!U(y)))},oa,10,na)),E("button",{class:"clear-button",type:"reset",disabled:V.value,title:U(p)("modal.resetButtonTitle"),onClick:I},la,8,sa)])],32),E("ul",{ref_key:"resultsEl",ref:n,id:(j=g.value)!=null&&j.length?"localsearch-list":void 0,role:(G=g.value)!=null&&G.length?"listbox":void 0,"aria-labelledby":(Q=g.value)!=null&&Q.length?"localsearch-label":void 0,class:"results",onMousemove:x[7]||(x[7]=B=>_.value=!1)},[(ee(!0),re(at,null,rt(g.value,(B,J)=>(ee(),re("li",{key:B.id,role:"option","aria-selected":C.value===J?"true":"false"},[E("a",{href:B.id,class:tt(["result",{selected:C.value===J}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:Z=>!_.value&&(C.value=J),onFocusin:Z=>C.value=J,onClick:x[6]||(x[6]=Z=>m.$emit("close"))},[E("div",null,[E("div",ha,[va,(ee(!0),re(at,null,rt(B.titles,(Z,be)=>(ee(),re("span",{key:be,class:"title"},[E("span",{class:"text",innerHTML:Z},null,8,pa),ma]))),128)),E("span",ya,[E("span",{class:"text",innerHTML:B.title},null,8,ga)])]),U(y)?(ee(),re("div",ba,[B.text?(ee(),re("div",wa,[E("div",{class:"vp-doc",innerHTML:B.text},null,8,xa)])):Se("",!0),Fa,Ea])):Se("",!0)])],42,da)],8,fa))),128)),U(v)&&!g.value.length&&A.value?(ee(),re("li",Sa,[ve(pe(U(p)("modal.noResultsText"))+' "',1),E("strong",null,pe(U(v)),1),ve('" ')])):Se("",!0)],40,ca),E("div",Aa,[E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.navigateUpKeyAriaLabel")},ka,8,Ca),E("kbd",{"aria-label":U(p)("modal.footer.navigateDownKeyAriaLabel")},Da,8,Na),ve(" "+pe(U(p)("modal.footer.navigateText")),1)]),E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.selectKeyAriaLabel")},Ra,8,_a),ve(" "+pe(U(p)("modal.footer.selectText")),1)]),E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.closeKeyAriaLabel")},"esc",8,Ma),ve(" "+pe(U(p)("modal.footer.closeText")),1)])])])],8,Hr)])}}});const $a=Xt(La,[["__scopeId","data-v-5e5b049d"]]);export{$a as default};
+*/function st(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function ut(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},Sr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ar=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Cr=function(e){return ge(e)&&!e.shiftKey},Tr=function(e){return ge(e)&&e.shiftKey},ct=function(e){return setTimeout(e,0)},ft=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},me=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),I=1;I=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||d("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=gr(c,a.tabbableOptions),p=br(c,a.tabbableOptions),N=f.length>0?f[0]:void 0,I=f.length>0?f[f.length-1]:void 0,M=p.find(function(m){return le(m)}),P=p.slice().reverse().find(function(m){return le(m)}),z=!!f.find(function(m){return se(m)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:z,firstTabbableNode:N,lastTabbableNode:I,firstDomTabbableNode:M,lastDomTabbableNode:P,nextTabbableNode:function(x){var $=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,j=f.indexOf(x);return j<0?$?p.slice(p.indexOf(x)+1).find(function(G){return le(G)}):p.slice(0,p.indexOf(x)).reverse().find(function(G){return le(G)}):f[j+($?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function w(c){var f=c.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?w(f.shadowRoot):f},b=function w(c){if(c!==!1&&c!==y(document)){if(!c||!c.focus){w(h());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,Sr(c)&&c.select()}},S=function(c){var f=d("setReturnFocus",c);return f||(f===!1?!1:c)},g=function(c){var f=c.target,p=c.event,N=c.isBackward,I=N===void 0?!1:N;f=f||Ae(p),v();var M=null;if(i.tabbableGroups.length>0){var P=l(f,p),z=P>=0?i.containerGroups[P]:void 0;if(P<0)I?M=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:M=i.tabbableGroups[0].firstTabbableNode;else if(I){var m=ft(i.tabbableGroups,function(B){var J=B.firstTabbableNode;return f===J});if(m<0&&(z.container===f||Oe(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!z.nextTabbableNode(f,!1))&&(m=P),m>=0){var x=m===0?i.tabbableGroups.length-1:m-1,$=i.tabbableGroups[x];M=se(f)>=0?$.lastTabbableNode:$.lastDomTabbableNode}else ge(p)||(M=z.nextTabbableNode(f,!1))}else{var j=ft(i.tabbableGroups,function(B){var J=B.lastTabbableNode;return f===J});if(j<0&&(z.container===f||Oe(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!z.nextTabbableNode(f))&&(j=P),j>=0){var G=j===i.tabbableGroups.length-1?0:j+1,Q=i.tabbableGroups[G];M=se(f)>=0?Q.firstTabbableNode:Q.firstDomTabbableNode}else ge(p)||(M=z.nextTabbableNode(f))}}else M=d("fallbackFocus");return M},A=function(c){var f=Ae(c);if(!(l(f,c)>=0)){if(me(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}me(a.allowOutsideClick,c)||c.preventDefault()}},T=function(c){var f=Ae(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var N,I=!0;if(i.mostRecentlyFocusedNode)if(se(i.mostRecentlyFocusedNode)>0){var M=l(i.mostRecentlyFocusedNode),P=i.containerGroups[M].tabbableNodes;if(P.length>0){var z=P.findIndex(function(m){return m===i.mostRecentlyFocusedNode});z>=0&&(a.isKeyForward(i.recentNavEvent)?z+1=0&&(N=P[z-1],I=!1))}}else i.containerGroups.some(function(m){return m.tabbableNodes.some(function(x){return se(x)>0})})||(I=!1);else I=!1;I&&(N=g({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),b(N||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},F=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=g({event:c,isBackward:f});p&&(ge(c)&&c.preventDefault(),b(p))},L=function(c){if(Ar(c)&&me(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&F(c,a.isKeyBackward(c))},R=function(c){var f=Ae(c);l(f,c)>=0||me(a.clickOutsideDeactivates,c)||me(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},V=function(){if(i.active)return lt.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?ct(function(){b(h())}):b(h()),r.addEventListener("focusin",T,!0),r.addEventListener("mousedown",A,{capture:!0,passive:!1}),r.addEventListener("touchstart",A,{capture:!0,passive:!1}),r.addEventListener("click",R,{capture:!0,passive:!1}),r.addEventListener("keydown",L,{capture:!0,passive:!1}),s},k=function(){if(i.active)return r.removeEventListener("focusin",T,!0),r.removeEventListener("mousedown",A,!0),r.removeEventListener("touchstart",A,!0),r.removeEventListener("click",R,!0),r.removeEventListener("keydown",L,!0),s},O=function(c){var f=c.some(function(p){var N=Array.from(p.removedNodes);return N.some(function(I){return I===i.mostRecentlyFocusedNode})});f&&b(h())},C=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(O):void 0,_=function(){C&&(C.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){C.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),N=u(c,"checkCanFocusTrap");N||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var I=function(){N&&v(),V(),_(),p==null||p()};return N?(N(i.containers.concat()).then(I,I),this):(I(),this)},deactivate:function(c){if(!i.active)return this;var f=ut({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,k(),i.active=!1,i.paused=!1,_(),lt.deactivateTrap(n,s);var p=u(f,"onDeactivate"),N=u(f,"onPostDeactivate"),I=u(f,"checkCanReturnFocus"),M=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){ct(function(){M&&b(S(i.nodeFocusedBeforeActivation)),N==null||N()})};return M&&I?(I(S(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),k(),_(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),V(),_(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),_(),this}},s.updateContainerElements(e),s};function Ir(o,e={}){let t;const{immediate:r,...n}=e,a=oe(!1),i=oe(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},d=()=>{t&&(t.unpause(),i.value=!1)};return $e(()=>kt(o),h=>{h&&(t=Nr(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Nt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:d}}class fe{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{fe.matches(l,this.exclude)?u():this.onIframeReady(l,d=>{t(l)&&(s++,r(d)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new fe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,d,h=()=>({prevNode:d,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Dr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new fe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return fe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,d),e.value=h+v,e.nodes.forEach((y,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=d),e.nodes[b].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let d=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,d,v=>t(v,s,a.value.substring(l,d),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let d=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,y)=>this.opt.filter(y,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=fe.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function _r(o){const e=new Dr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var W=function(){return W=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Mr="ENTRIES",Ft="KEYS",Et="VALUES",H="",Re=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ce(this._path),t=e.node,r=e.keys;if(ce(r)===H)return{done:!1,value:this.result()};var n=t.get(ce(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ce(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ce(t)}).filter(function(e){return e!==H}).join("")},o.prototype.value=function(){return ce(this._path).node.get(H)},o.prototype.result=function(){switch(this._type){case Et:return this.value();case Ft:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ce=function(o){return o[o.length-1]},Lr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}St(o.get(y),e,t,r,n,S,i,s+y)}}}catch(f){u={error:f}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=K(De(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=K(Ue(i),2),u=s[0],l=s[1];try{for(var d=D(u.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==H&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(b){t={error:b}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Pr(this._tree,e)},o.prototype.entries=function(){return new Re(this,Mr)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=K(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Lr(this._tree,e,t)},o.prototype.get=function(e){var t=je(this._tree,e);return t!==void 0?t.get(H):void 0},o.prototype.has=function(e){var t=je(this._tree,e);return t!==void 0&&t.has(H)},o.prototype.keys=function(){return new Re(this,Ft)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(H,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(H,t(r.get(H))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e),n=r.get(H);return n===void 0&&r.set(H,n=t()),n},o.prototype.values=function(){return new Re(this,Et)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=K(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),De=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==H&&e.startsWith(s))return t.push([o,s]),De(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),De(void 0,"",t)},je=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==H&&e.startsWith(i))return je(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Le=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Je,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Or(this,void 0,void 0,function(){var r,n,a,i,s,u,l,d,h,v,y,b,S,g,A,T,F,L,R,V,k,O,C,_,w;return Rr(this,function(c){switch(c.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||Ke.batchSize,a=e.batchWait||Ke.batchWait,i=1,c.label=1;case 1:c.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),c.label=2;case 2:if(u.done)return[3,6];l=K(u.value,2),d=l[0],h=l[1];try{for(v=(O=void 0,D(h)),y=v.next();!y.done;y=v.next()){b=K(y.value,2),S=b[0],g=b[1];try{for(A=(_=void 0,D(g)),T=A.next();!T.done;T=A.next())F=K(T.value,1),L=F[0],!this._documentIds.has(L)&&(g.size<=1?h.delete(S):g.delete(L))}catch(f){_={error:f}}finally{try{T&&!T.done&&(w=A.return)&&w.call(A)}finally{if(_)throw _.error}}}}catch(f){O={error:f}}finally{try{y&&!y.done&&(C=v.return)&&C.call(v)}finally{if(O)throw O.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(f){return setTimeout(f,a)})];case 3:c.sent(),c.label=4;case 4:i+=1,c.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return R=c.sent(),V={error:R},[3,9];case 8:try{u&&!u.done&&(k=s.return)&&k.call(s)}finally{if(V)throw V.error}return[7];case 9:this._dirtCount-=r,c.label=10;case 10:return[4,null];case 11:return c.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Be.minDirtCount,r=r||Be.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=K(u.value,2),d=l[0],h=l[1],v=h.score,y=h.terms,b=h.match,S=y.length||1,g={id:this._documentIds.get(d),score:v*S,terms:Object.keys(b),match:b};Object.assign(g,this._storedFields.get(d)),(t.filter==null||t.filter(g))&&i.push(g)}}catch(A){r={error:A}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(vt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=W(W({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var d=l.value,h=d.score,v=d.terms,y=v.join(" "),b=s.get(y);b!=null?(b.score+=h,b.count+=1):s.set(y,{score:h,terms:v,count:1})}}catch(R){r={error:R}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var S=[];try{for(var g=D(s),A=g.next();!A.done;A=g.next()){var T=K(A.value,2),b=T[0],F=T[1],h=F.score,v=F.terms,L=F.count;S.push({suggestion:b,terms:v,score:h/L})}}catch(R){a={error:R}}finally{try{A&&!A.done&&(i=g.return)&&i.call(g)}finally{if(a)throw a.error}}return S.sort(vt),S},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(ze.hasOwnProperty(e))return Pe(ze,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,y=e.fieldIds,b=e.fieldLength,S=e.averageFieldLength,g=e.storedFields,A=e.dirtCount,T=e.serializationVersion;if(T!==1&&T!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var F=new o(t);F._documentCount=d,F._nextId=h,F._documentIds=Ce(v),F._idToShortId=new Map,F._fieldIds=y,F._fieldLength=Ce(b),F._avgFieldLength=S,F._storedFields=Ce(g),F._dirtCount=A||0,F._index=new Me;try{for(var L=D(F._documentIds),R=L.next();!R.done;R=L.next()){var V=K(R.value,2),k=V[0],O=V[1];F._idToShortId.set(O,k)}}catch(z){r={error:z}}finally{try{R&&!R.done&&(n=L.return)&&n.call(L)}finally{if(r)throw r.error}}try{for(var C=D(l),_=C.next();!_.done;_=C.next()){var w=K(_.value,2),c=w[0],f=w[1],p=new Map;try{for(var N=(s=void 0,D(Object.keys(f))),I=N.next();!I.done;I=N.next()){var M=I.value,P=f[M];T===1&&(P=P.ds),p.set(parseInt(M,10),Ce(P))}}catch(z){s={error:z}}finally{try{I&&!I.done&&(u=N.return)&&u.call(N)}finally{if(s)throw s.error}}F._index.set(c,p)}}catch(z){a={error:z}}finally{try{_&&!_.done&&(i=C.return)&&i.call(C)}finally{if(a)throw a.error}}return F},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var n=W(W(W({},t),e),{queries:void 0}),a=e.queries.map(function(g){return r.executeQuery(g,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,d=W(W({tokenize:s,processTerm:u},l),t),h=d.tokenize,v=d.processTerm,y=h(e).flatMap(function(g){return v(g)}).filter(function(g){return!!g}),b=y.map(jr(d)),S=b.map(function(g){return r.executeQuerySpec(g,d)});return this.combineResults(S,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=W(W({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(M,P){var z;return W(W({},M),(z={},z[P]=Pe(s.boost,P)||1,z))},{}),l=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,y=W(W({},dt.weights),d),b=y.fuzzy,S=y.prefix,g=this._index.get(e.term),A=this.termResults(e.term,e.term,1,g,u,l,v),T,F;if(e.prefix&&(T=this._index.atPrefix(e.term)),e.fuzzy){var L=e.fuzzy===!0?.2:e.fuzzy,R=L<1?Math.min(h,Math.round(e.term.length*L)):L;R&&(F=this._index.fuzzyGet(e.term,R))}if(T)try{for(var V=D(T),k=V.next();!k.done;k=V.next()){var O=K(k.value,2),C=O[0],_=O[1],w=C.length-e.term.length;if(w){F==null||F.delete(C);var c=S*C.length/(C.length+.3*w);this.termResults(e.term,C,c,_,u,l,v,A)}}}catch(M){r={error:M}}finally{try{k&&!k.done&&(n=V.return)&&n.call(V)}finally{if(r)throw r.error}}if(F)try{for(var f=D(F.keys()),p=f.next();!p.done;p=f.next()){var C=p.value,N=K(F.get(C),2),I=N[0],w=N[1];if(w){var c=b*C.length/(C.length+w);this.termResults(e.term,C,c,I,u,l,v,A)}}}catch(M){a={error:M}}finally{try{p&&!p.done&&(i=f.return)&&i.call(f)}finally{if(a)throw a.error}}return A},o.prototype.executeWildcardQuery=function(e){var t,r,n=new Map,a=W(W({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=K(s.value,2),l=u[0],d=u[1],h=a.boostDocument?a.boostDocument(d,"",this._storedFields.get(l)):1;n.set(l,{score:h,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=He),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Vr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=K(s.value,2),l=u[0],d=u[1],h={};try{for(var v=(r=void 0,D(d)),y=v.next();!y.done;y=v.next()){var b=K(y.value,2),S=b[0],g=b[1];h[S]=Object.fromEntries(g)}}catch(A){r={error:A}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(A){e={error:A}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,d,h,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var b=D(Object.keys(a)),S=b.next();!S.done;S=b.next()){var g=S.value,A=a[g],T=this._fieldIds[g],F=n.get(T);if(F!=null){var L=F.size,R=this._avgFieldLength[T];try{for(var V=(h=void 0,D(F.keys())),k=V.next();!k.done;k=V.next()){var O=k.value;if(!this._documentIds.has(O)){this.removeTerm(T,O,t),L-=1;continue}var C=i?i(this._documentIds.get(O),t,this._storedFields.get(O)):1;if(C){var _=F.get(O),w=this._fieldLength.get(O)[T],c=Wr(_,L,this._documentCount,w,R,s),f=r*A*C*c,p=u.get(O);if(p){p.score+=f,Jr(p.terms,e);var N=Pe(p.match,t);N?N.push(g):p.match[t]=[g]}else u.set(O,{score:f,terms:[e],match:(y={},y[t]=[g],y)})}}}catch(I){h={error:I}}finally{try{k&&!k.done&&(v=V.return)&&v.call(V)}finally{if(h)throw h.error}}}}}catch(I){l={error:I}}finally{try{S&&!S.done&&(d=b.return)&&d.call(b)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,pt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,pt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Gt("data-v-5e5b049d"),o=o(),Qt(),o),Hr=["aria-owns"],Gr={class:"shell"},Qr=["title"],qr=Y(()=>E("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("circle",{cx:"11",cy:"11",r:"8"}),E("path",{d:"m21 21l-4.35-4.35"})])],-1)),Yr=[qr],Zr={class:"search-actions before"},Xr=["title"],ea=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),ta=[ea],ra=["placeholder"],aa={class:"search-actions"},na=["title"],ia=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),oa=[ia],sa=["disabled","title"],ua=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),la=[ua],ca=["id","role","aria-labelledby"],fa=["aria-selected"],da=["href","aria-label","onMouseenter","onFocusin"],ha={class:"titles"},va=Y(()=>E("span",{class:"title-icon"},"#",-1)),pa=["innerHTML"],ma=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),ya={class:"title main"},ga=["innerHTML"],ba={key:0,class:"excerpt-wrapper"},wa={key:0,class:"excerpt",inert:""},xa=["innerHTML"],Fa=Y(()=>E("div",{class:"excerpt-gradient-bottom"},null,-1)),Ea=Y(()=>E("div",{class:"excerpt-gradient-top"},null,-1)),Sa={key:0,class:"no-results"},Aa={class:"search-keyboard-shortcuts"},Ca=["aria-label"],Ta=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),ka=[Ta],Na=["aria-label"],Ia=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),Da=[Ia],_a=["aria-label"],Oa=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("path",{d:"m9 10l-5 5l5 5"}),E("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Ra=[Oa],Ma=["aria-label"],La=It({__name:"VPLocalSearchBox",emits:["close"],setup(o,{emit:e}){var P,z;const t=e,r=xe(),n=xe(),a=xe(ar),i=er(),{activate:s}=Ir(r,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:u,theme:l}=i,d=tt(async()=>{var m,x,$,j,G,Q,B,J,Z;return it(Br.loadJSON(($=await((x=(m=a.value)[u.value])==null?void 0:x.call(m)))==null?void 0:$.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((j=l.value.search)==null?void 0:j.provider)==="local"&&((Q=(G=l.value.search.options)==null?void 0:G.miniSearch)==null?void 0:Q.searchOptions)},...((B=l.value.search)==null?void 0:B.provider)==="local"&&((Z=(J=l.value.search.options)==null?void 0:J.miniSearch)==null?void 0:Z.options)}))}),v=Fe(()=>{var m,x;return((m=l.value.search)==null?void 0:m.provider)==="local"&&((x=l.value.search.options)==null?void 0:x.disableQueryPersistence)===!0}).value?oe(""):Dt("vitepress:local-search-filter",""),y=_t("vitepress:local-search-detailed-list",((P=l.value.search)==null?void 0:P.provider)==="local"&&((z=l.value.search.options)==null?void 0:z.detailedView)===!0),b=Fe(()=>{var m,x,$;return((m=l.value.search)==null?void 0:m.provider)==="local"&&(((x=l.value.search.options)==null?void 0:x.disableDetailedView)===!0||(($=l.value.search.options)==null?void 0:$.detailedView)===!1)}),S=Fe(()=>{var x,$,j,G,Q,B,J;const m=((x=l.value.search)==null?void 0:x.options)??l.value.algolia;return((Q=(G=(j=($=m==null?void 0:m.locales)==null?void 0:$[u.value])==null?void 0:j.translations)==null?void 0:G.button)==null?void 0:Q.buttonText)||((J=(B=m==null?void 0:m.translations)==null?void 0:B.button)==null?void 0:J.buttonText)||"Search"});Ot(()=>{b.value&&(y.value=!1)});const g=xe([]),A=oe(!1);$e(v,()=>{A.value=!1});const T=tt(async()=>{if(n.value)return it(new _r(n.value))},null),F=new rr(16);Rt(()=>[d.value,v.value,y.value],async([m,x,$],j,G)=>{var be,Ge,Qe,qe;(j==null?void 0:j[0])!==m&&F.clear();let Q=!1;if(G(()=>{Q=!0}),!m)return;g.value=m.search(x).slice(0,16),A.value=!0;const B=$?await Promise.all(g.value.map(q=>L(q.id))):[];if(Q)return;for(const{id:q,mod:ae}of B){const ne=q.slice(0,q.indexOf("#"));let te=F.get(ne);if(te)continue;te=new Map,F.set(ne,te);const X=ae.default??ae;if(X!=null&&X.render||X!=null&&X.setup){const ie=qt(X);ie.config.warnHandler=()=>{},ie.provide(Yt,i),Object.defineProperties(ie.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ye=document.createElement("div");ie.mount(Ye),Ye.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(de=>{var et;const we=(et=de.querySelector("a"))==null?void 0:et.getAttribute("href"),Ze=(we==null?void 0:we.startsWith("#"))&&we.slice(1);if(!Ze)return;let Xe="";for(;(de=de.nextElementSibling)&&!/^h[1-6]$/i.test(de.tagName);)Xe+=de.outerHTML;te.set(Ze,Xe)}),ie.unmount()}if(Q)return}const J=new Set;if(g.value=g.value.map(q=>{const[ae,ne]=q.id.split("#"),te=F.get(ae),X=(te==null?void 0:te.get(ne))??"";for(const ie in q.match)J.add(ie);return{...q,text:X}}),await he(),Q)return;await new Promise(q=>{var ae;(ae=T.value)==null||ae.unmark({done:()=>{var ne;(ne=T.value)==null||ne.markRegExp(M(J),{done:q})}})});const Z=((be=r.value)==null?void 0:be.querySelectorAll(".result .excerpt"))??[];for(const q of Z)(Ge=q.querySelector('mark[data-markjs="true"]'))==null||Ge.scrollIntoView({block:"center"});(qe=(Qe=n.value)==null?void 0:Qe.firstElementChild)==null||qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function L(m){const x=Zt(m.slice(0,m.indexOf("#")));try{if(!x)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await Ve(()=>import(x),[])}}catch($){return console.error($),{id:m,mod:{}}}}const R=oe(),V=Fe(()=>{var m;return((m=v.value)==null?void 0:m.length)<=0});function k(m=!0){var x,$;(x=R.value)==null||x.focus(),m&&(($=R.value)==null||$.select())}_e(()=>{k()});function O(m){m.pointerType==="mouse"&&k()}const C=oe(-1),_=oe(!1);$e(g,m=>{C.value=m.length?0:-1,w()});function w(){he(()=>{const m=document.querySelector(".result.selected");m&&m.scrollIntoView({block:"nearest"})})}Ee("ArrowUp",m=>{m.preventDefault(),C.value--,C.value<0&&(C.value=g.value.length-1),_.value=!0,w()}),Ee("ArrowDown",m=>{m.preventDefault(),C.value++,C.value>=g.value.length&&(C.value=0),_.value=!0,w()});const c=Mt();Ee("Enter",m=>{if(m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const x=g.value[C.value];if(m.target instanceof HTMLInputElement&&!x){m.preventDefault();return}x&&(c.go(x.id),t("close"))}),Ee("Escape",()=>{t("close")});const f={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},p=Lt(tr)(Pt(()=>{var m;return(m=l.value.search)==null?void 0:m.options}),f);_e(()=>{window.history.pushState(null,"",null)}),zt("popstate",m=>{m.preventDefault(),t("close")});const N=Bt(Vt?document.body:null);_e(()=>{he(()=>{N.value=!0,he().then(()=>s())})}),$t(()=>{N.value=!1});function I(){v.value="",he().then(()=>k(!1))}function M(m){return new RegExp([...m].sort((x,$)=>$.length-x.length).map(x=>`(${x.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(m,x)=>{var $,j,G,Q;return ee(),Wt(Ht,{to:"body"},[E("div",{ref_key:"el",ref:r,role:"button","aria-owns":($=g.value)!=null&&$.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[E("div",{class:"backdrop",onClick:x[0]||(x[0]=B=>m.$emit("close"))}),E("div",Gr,[E("form",{class:"search-bar",onPointerup:x[4]||(x[4]=B=>O(B)),onSubmit:x[5]||(x[5]=jt(()=>{},["prevent"]))},[E("label",{title:S.value,id:"localsearch-label",for:"localsearch-input"},Yr,8,Qr),E("div",Zr,[E("button",{class:"back-button",title:U(p)("modal.backButtonTitle"),onClick:x[1]||(x[1]=B=>m.$emit("close"))},ta,8,Xr)]),Kt(E("input",{ref_key:"searchInput",ref:R,"onUpdate:modelValue":x[2]||(x[2]=B=>Ut(v)?v.value=B:null),placeholder:S.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,ra),[[Jt,U(v)]]),E("div",aa,[b.value?Se("",!0):(ee(),re("button",{key:0,class:rt(["toggle-layout-button",{"detailed-list":U(y)}]),type:"button",title:U(p)("modal.displayDetails"),onClick:x[3]||(x[3]=B=>C.value>-1&&(y.value=!U(y)))},oa,10,na)),E("button",{class:"clear-button",type:"reset",disabled:V.value,title:U(p)("modal.resetButtonTitle"),onClick:I},la,8,sa)])],32),E("ul",{ref_key:"resultsEl",ref:n,id:(j=g.value)!=null&&j.length?"localsearch-list":void 0,role:(G=g.value)!=null&&G.length?"listbox":void 0,"aria-labelledby":(Q=g.value)!=null&&Q.length?"localsearch-label":void 0,class:"results",onMousemove:x[7]||(x[7]=B=>_.value=!1)},[(ee(!0),re(nt,null,at(g.value,(B,J)=>(ee(),re("li",{key:B.id,role:"option","aria-selected":C.value===J?"true":"false"},[E("a",{href:B.id,class:rt(["result",{selected:C.value===J}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:Z=>!_.value&&(C.value=J),onFocusin:Z=>C.value=J,onClick:x[6]||(x[6]=Z=>m.$emit("close"))},[E("div",null,[E("div",ha,[va,(ee(!0),re(nt,null,at(B.titles,(Z,be)=>(ee(),re("span",{key:be,class:"title"},[E("span",{class:"text",innerHTML:Z},null,8,pa),ma]))),128)),E("span",ya,[E("span",{class:"text",innerHTML:B.title},null,8,ga)])]),U(y)?(ee(),re("div",ba,[B.text?(ee(),re("div",wa,[E("div",{class:"vp-doc",innerHTML:B.text},null,8,xa)])):Se("",!0),Fa,Ea])):Se("",!0)])],42,da)],8,fa))),128)),U(v)&&!g.value.length&&A.value?(ee(),re("li",Sa,[ve(pe(U(p)("modal.noResultsText"))+' "',1),E("strong",null,pe(U(v)),1),ve('" ')])):Se("",!0)],40,ca),E("div",Aa,[E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.navigateUpKeyAriaLabel")},ka,8,Ca),E("kbd",{"aria-label":U(p)("modal.footer.navigateDownKeyAriaLabel")},Da,8,Na),ve(" "+pe(U(p)("modal.footer.navigateText")),1)]),E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.selectKeyAriaLabel")},Ra,8,_a),ve(" "+pe(U(p)("modal.footer.selectText")),1)]),E("span",null,[E("kbd",{"aria-label":U(p)("modal.footer.closeKeyAriaLabel")},"esc",8,Ma),ve(" "+pe(U(p)("modal.footer.closeText")),1)])])])],8,Hr)])}}});const $a=Xt(La,[["__scopeId","data-v-5e5b049d"]]);export{$a as default};
diff --git a/assets/chunks/theme.996dd6ef.js b/assets/chunks/theme.be7b3ccb.js
similarity index 99%
rename from assets/chunks/theme.996dd6ef.js
rename to assets/chunks/theme.be7b3ccb.js
index 2982cea3b5..b75fddd7ba 100644
--- a/assets/chunks/theme.996dd6ef.js
+++ b/assets/chunks/theme.be7b3ccb.js
@@ -1 +1 @@
-var De=Object.defineProperty;var Ee=(s,e,t)=>e in s?De(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var re=(s,e,t)=>(Ee(s,typeof e!="symbol"?e+"":e,t),t);import{d as g,o as a,c as i,r as u,n as M,a as A,t as L,_ as m,b as $,w as v,T as de,e as f,u as Fe,i as Oe,f as _e,g as k,h as T,j as G,k as c,l,p as z,m as D,q as O,s as q,v as ie,x as U,y as te,z as ve,A as we,B as Ge,C as j,F as I,D as H,E as pe,G as Y,H as h,I as F,J as Le,K as se,L as Z,M as ne,N as Ue,O as je,P as Se,Q as Re,R as Ke,S as qe,U as We,V as ye,W as Ye,X as Je,Y as Me,Z as Te,$ as Xe,a0 as Ze,a1 as Qe,a2 as et}from"./framework.725e5b03.js";const tt=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:M(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const st=m(tt,[["__scopeId","data-v-99f7fa3b"]]),nt={key:0,class:"VPBackdrop"},ot=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(de,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",nt)):f("",!0)]),_:1}))}});const at=m(ot,[["__scopeId","data-v-2e35c42d"]]),P=Fe;function rt(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ce(s){return/^\//.test(s)?s:`/${s}`}function J(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(Oe(s)||s.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(s))return s;const{site:r}=P(),d=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return _e(d)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:r}=P(),d=k(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:lt(b.link||(_==="root"?"/":`/${_}/`),r.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function lt(s,e,t,n){return e?s.replace(/\/$/,"")+ce(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const it=s=>(z("data-v-ca21a7ba"),s=s(),D(),s),ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},_t=it(()=>c("div",{class:"divider"},null,-1)),vt={class:"quote"},pt={class:"action"},ht=["href","aria-label"],ft=g({__name:"NotFound",setup(s){const{site:e,theme:t}=P(),{localeLinks:n}=X({removeCurrent:!1}),o=T("/");return G(()=>{var d;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(r)))==null?void 0:d.link)||n.value[0].link)}),(r,d)=>{var p,_,b,V,y;return a(),i("div",ct,[c("p",ut,L(((p=l(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",dt,L(((_=l(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),_t,c("blockquote",vt,L(((b=l(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",pt,[c("a",{class:"link",href:l(_e)(o.value),"aria-label":((V=l(t).notFound)==null?void 0:V.linkLabel)??"go to home"},L(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,ht)])])}}});const mt=m(ft,[["__scopeId","data-v-ca21a7ba"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=ce(e);const t=Object.keys(s).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>e.startsWith(ce(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function gt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function bt(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ue(s,e){return Array.isArray(e)?e.some(t=>ue(s,t)):O(s,e.link)?!0:e.items?ue(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function E(){const{frontmatter:s,page:e,theme:t}=P(),n=ie("(min-width: 960px)"),o=T(!1),r=k(()=>{const B=t.value.sidebar,w=e.value.relativePath;return B?Ie(B,w):[]}),d=T(r.value);U(r,(B,w)=>{JSON.stringify(B)!==JSON.stringify(w)&&(d.value=r.value)});const p=k(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=k(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=k(()=>p.value&&n.value),y=k(()=>p.value?gt(d.value):[]);function C(){o.value=!0}function S(){o.value=!1}function N(){o.value?S():C()}return{isOpen:o,sidebar:d,sidebarGroups:y,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:V,open:C,close:S,toggle:N}}function $t(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),ve(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ce=T(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{Ce.value=location.hash});function kt(s){const{page:e}=P(),t=T(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),r=T(!1),d=()=>{r.value=O(e.value.relativePath,s.value.link)};U([e,s,Ce],d),G(d);const p=k(()=>r.value?!0:s.value.items?ue(e.value.relativePath,s.value.items):!1),_=k(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(r.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:p,hasChildren:_,toggle:b}}function yt(){const{hasSidebar:s}=E(),e=ie("(min-width: 960px)"),t=ie("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const Pt=71;function he(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function fe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:Vt(t),link:"#"+t.id,level:n}});return wt(e,s)}function Vt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function wt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const r=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ge(()=>{d(location.hash)}),ve(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>p.some(N=>N.hash===S.hash&&S.offsetParent!==null)),b=window.scrollY,V=window.innerHeight,y=document.body.offsetHeight,C=Math.abs(b+V-y)<1;if(_.length&&C){d(_[_.length-1].hash);return}for(let S=0;S<_.length;S++){const N=_[S],B=_[S+1],[w,R]=St(S,N,B);if(w){d(R);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-Pt}function St(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=j("VPDocOutlineItem",!0);return a(),i("ul",{class:M(t.root?"root":"nested")},[(a(!0),i(I,null,H(t.headers,({children:r,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Mt),r!=null&&r.length?(a(),$(o,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}});const me=m(Tt,[["__scopeId","data-v-266a89cb"]]),It=s=>(z("data-v-82d1df03"),s=s(),D(),s),Ct={class:"content"},Nt={class:"outline-title",role:"heading","aria-level":"2"},Bt={"aria-labelledby":"doc-outline-aria-label"},At=It(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ht=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),n=pe([]);Y(()=>{n.value=fe(e.value.outline??t.value.outline)});const o=T(),r=T();return Lt(o,r),(d,p)=>(a(),i("div",{class:M(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",Ct,[c("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),c("div",Nt,L(l(he)(l(t))),1),c("nav",Bt,[At,h(me,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const xt=m(Ht,[["__scopeId","data-v-82d1df03"]]),zt={class:"VPDocAsideCarbonAds"},Dt=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",zt,[h(l(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Et=s=>(z("data-v-4ccc7a73"),s=s(),D(),s),Ft={class:"VPDocAside"},Ot=Et(()=>c("div",{class:"spacer"},null,-1)),Gt=g({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,n)=>(a(),i("div",Ft,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(xt),u(t.$slots,"aside-outline-after",{},void 0,!0),Ot,u(t.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),$(Dt,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ut=m(Gt,[["__scopeId","data-v-4ccc7a73"]]);function jt(){const{theme:s,page:e}=P();return k(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Rt(){const{page:s,theme:e,frontmatter:t}=P();return k(()=>{var _,b,V,y,C,S,N,B;const n=Ie(e.value.sidebar,s.value.relativePath),o=bt(n),r=o.findIndex(w=>O(s.value.relativePath,w.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((V=o[r-1])==null?void 0:V.docFooterText)??((y=o[r-1])==null?void 0:y.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((C=o[r-1])==null?void 0:C.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((S=o[r+1])==null?void 0:S.docFooterText)??((N=o[r+1])==null?void 0:N.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[r+1])==null?void 0:B.link)}}})}const Kt={},qt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Wt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Yt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Jt=[Wt,Yt];function Xt(s,e){return a(),i("svg",qt,Jt)}const Zt=m(Kt,[["render",Xt]]),x=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&Le.test(e.href));return(o,r)=>(a(),$(F(t.value),{class:M(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Qt={class:"VPLastUpdated"},es=["datetime"],ts=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=P(),r=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=k(()=>r.value.toISOString()),p=T("");return G(()=>{te(()=>{var _,b,V;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((V=e.value.lastUpdated)==null?void 0:V.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(_,b)=>{var V;return a(),i("p",Qt,[A(L(((V=l(e).lastUpdated)==null?void 0:V.text)||l(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,es)])}}});const ss=m(ts,[["__scopeId","data-v-46d1cb64"]]),ns={key:0,class:"VPDocFooter"},os={key:0,class:"edit-info"},as={key:0,class:"edit-link"},rs={key:1,class:"last-updated"},ls={key:1,class:"prev-next"},is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s={class:"pager"},vs=["href"],ps=["innerHTML"],hs=["innerHTML"],fs=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=P(),o=jt(),r=Rt(),d=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=k(()=>d.value||p.value||r.value.prev||r.value.next);return(b,V)=>{var y,C,S,N,B,w;return _.value?(a(),i("footer",ns,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",os,[d.value?(a(),i("div",as,[h(x,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[h(Zt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(l(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",rs,[h(ss)])):f("",!0)])):f("",!0),(y=l(r).prev)!=null&&y.link||(C=l(r).next)!=null&&C.link?(a(),i("nav",ls,[c("div",is,[(S=l(r).prev)!=null&&S.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(J)(l(r).prev.link)},[c("span",{class:"desc",innerHTML:((N=l(e).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,us),c("span",{class:"title",innerHTML:l(r).prev.text},null,8,ds)],8,cs)):f("",!0)]),c("div",_s,[(B=l(r).next)!=null&&B.link?(a(),i("a",{key:0,class:"pager-link next",href:l(J)(l(r).next.link)},[c("span",{class:"desc",innerHTML:((w=l(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,ps),c("span",{class:"title",innerHTML:l(r).next.text},null,8,hs)],8,vs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ms=m(fs,[["__scopeId","data-v-c097fc16"]]),gs={},bs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},$s=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ks=[$s];function ys(s,e){return a(),i("svg",bs,ks)}const ge=m(gs,[["render",ys]]),Ps={key:0,class:"VPDocOutlineDropdown"},Vs={key:0,class:"items"},ws=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=P(),n=T(!1);Y(()=>{n.value=!1});const o=pe([]);return Y(()=>{o.value=fe(e.value.outline??t.value.outline)}),(r,d)=>o.value.length>0?(a(),i("div",Ps,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:M({open:n.value})},[A(L(l(he)(l(t)))+" ",1),h(ge,{class:"icon"})],2),n.value?(a(),i("div",Vs,[h(me,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const Ls=m(ws,[["__scopeId","data-v-260152ac"]]),Ss=s=>(z("data-v-30a5e70a"),s=s(),D(),s),Ms={class:"container"},Ts=Ss(()=>c("div",{class:"aside-curtain"},null,-1)),Is={class:"aside-container"},Cs={class:"aside-content"},Ns={class:"content"},Bs={class:"content-container"},As={class:"main"},Hs=g({__name:"VPDoc",setup(s){const{theme:e}=P(),t=se(),{hasSidebar:n,hasAside:o,leftAside:r}=E(),d=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=j("Content");return a(),i("div",{class:M(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Ms,[l(o)?(a(),i("div",{key:0,class:M(["aside",{"left-aside":l(r)}])},[Ts,c("div",Is,[c("div",Cs,[h(Ut,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ns,[c("div",Bs,[u(p.$slots,"doc-before",{},void 0,!0),h(Ls),c("main",As,[h(b,{class:M(["vp-doc",[d.value,l(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ms,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const xs=m(Hs,[["__scopeId","data-v-30a5e70a"]]),zs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=k(()=>e.href&&Le.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,r)=>(a(),$(F(n.value),{class:M(["VPButton",[o.size,o.theme]]),href:o.href?l(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const Ds=m(zs,[["__scopeId","data-v-b47f9daa"]]),Es=["src","alt"],Fs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),i(I,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(_e)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Es)):(a(),i(I,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Fs,[["__scopeId","data-v-b7111cdf"]]),Os=s=>(z("data-v-fd5a7aed"),s=s(),D(),s),Gs={class:"container"},Us={class:"main"},js={key:0,class:"name"},Rs=["innerHTML"],Ks=["innerHTML"],qs=["innerHTML"],Ws={key:0,class:"actions"},Ys={key:0,class:"image"},Js={class:"image-container"},Xs=Os(()=>c("div",{class:"image-bg"},null,-1)),Zs=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:M(["VPHero",{"has-image":t.image||l(e)}])},[c("div",Gs,[c("div",Us,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",js,[c("span",{innerHTML:t.name,class:"clip"},null,8,Rs)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ks)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,qs)):f("",!0)],!0),t.actions?(a(),i("div",Ws,[(a(!0),i(I,null,H(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(Ds,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||l(e)?(a(),i("div",Ys,[c("div",Js,[Xs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Qs=m(Zs,[["__scopeId","data-v-fd5a7aed"]]),en=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).hero?(a(),$(Qs,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),tn={},sn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},nn=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),on=[nn];function an(s,e){return a(),i("svg",sn,on)}const rn=m(tn,[["render",an]]),ln={class:"box"},cn={key:0,class:"icon"},un=["innerHTML"],dn=["innerHTML"],_n=["innerHTML"],vn={key:4,class:"link-text"},pn={class:"link-text-value"},hn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(x,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",ln,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",cn,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,un)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,dn),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,_n)):f("",!0),e.linkText?(a(),i("div",vn,[c("p",pn,[A(L(e.linkText)+" ",1),h(rn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const fn=m(hn,[["__scopeId","data-v-fb6bac11"]]),mn={key:0,class:"VPFeatures"},gn={class:"container"},bn={class:"items"},$n=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",mn,[c("div",gn,[c("div",bn,[(a(!0),i(I,null,H(n.features,r=>(a(),i("div",{key:r.title,class:M(["item",[t.value]])},[h(fn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const kn=m($n,[["__scopeId","data-v-3190607f"]]),yn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).features?(a(),$(kn,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):f("",!0)}}),Pn={class:"VPHome"},Vn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=j("Content");return a(),i("div",Pn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(en,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(yn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const wn=m(Vn,[["__scopeId","data-v-381d4781"]]),Ln={},Sn={class:"VPPage"};function Mn(s,e){const t=j("Content");return a(),i("div",Sn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const Tn=m(Ln,[["render",Mn]]),In=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:n}=E();return(o,r)=>(a(),i("div",{class:M(["VPContent",{"has-sidebar":l(n),"is-home":l(t).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(mt)],!0):l(t).layout==="page"?(a(),$(Tn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(t).layout==="home"?(a(),$(wn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(t).layout&&l(t).layout!=="doc"?(a(),$(F(l(t).layout),{key:3})):(a(),$(xs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Cn=m(In,[["__scopeId","data-v-a5670ab7"]]),Nn={class:"container"},Bn=["innerHTML"],An=["innerHTML"],Hn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=E();return(o,r)=>l(e).footer&&l(t).footer!==!1?(a(),i("footer",{key:0,class:M(["VPFooter",{"has-sidebar":l(n)}])},[c("div",Nn,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,Bn)):f("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,An)):f("",!0)])],2)):f("",!0)}});const xn=m(Hn,[["__scopeId","data-v-59982766"]]),zn={class:"header"},Dn={class:"outline"},En=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),n=T(!1),o=T(0),r=T();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),je(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,V)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Ue({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:M({open:n.value})},[A(L(l(he)(l(t)))+" ",1),h(ge,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)),h(de,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:p},[c("div",zn,[c("a",{class:"top-link",href:"#",onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)]),c("div",Dn,[h(me,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Fn=m(En,[["__scopeId","data-v-1da04fcb"]]),On={},Gn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Un=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),jn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Rn=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Kn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),qn=[Un,jn,Rn,Kn];function Wn(s,e){return a(),i("svg",Gn,qn)}const Yn=m(On,[["render",Wn]]),Jn=["aria-expanded"],Xn={class:"menu-text"},Zn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=E(),{y:o}=Se(),r=pe([]),d=T(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{r.value=fe(t.value.outline??e.value.outline)});const p=k(()=>r.value.length===0&&!n.value),_=k(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,V)=>l(t).layout!=="home"&&(!p.value||l(o)>=d.value)?(a(),i("div",{key:0,class:M(_.value)},[l(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:V[0]||(V[0]=y=>b.$emit("open-menu"))},[h(Yn,{class:"menu-icon"}),c("span",Xn,L(l(e).sidebarMenuLabel||"Menu"),1)],8,Jn)):f("",!0),h(Fn,{headers:r.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Qn=m(Zn,[["__scopeId","data-v-99bafde1"]]);function eo(){const s=T(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const r=se();return U(()=>r.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const to={},so={class:"VPSwitch",type:"button",role:"switch"},no={class:"check"},oo={key:0,class:"icon"};function ao(s,e){return a(),i("button",so,[c("span",no,[s.$slots.default?(a(),i("span",oo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const ro=m(to,[["render",ao],["__scopeId","data-v-57a4e611"]]),lo={},io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},co=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),uo=[co];function _o(s,e){return a(),i("svg",io,uo)}const vo=m(lo,[["render",_o]]),po={},ho={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fo=Re('',9),mo=[fo];function go(s,e){return a(),i("svg",ho,mo)}const bo=m(po,[["render",go]]),$o=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=P(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(ro,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(e),onClick:l(t)},{default:v(()=>[h(bo,{class:"sun"}),h(vo,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const be=m($o,[["__scopeId","data-v-9fd3178a"]]),ko={key:0,class:"VPNavBarAppearance"},yo=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,n)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",ko,[h(be)])):f("",!0)}});const Po=m(yo,[["__scopeId","data-v-47b73526"]]),$e=T();let Ne=!1,le=0;function Vo(s){const e=T(!1);if(q){!Ne&&wo(),le++;const t=U($e,n=>{var o,r,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(r=s.onFocus)==null||r.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});ve(()=>{t(),le--,le||Lo()})}return Ke(e)}function wo(){document.addEventListener("focusin",Be),Ne=!0,$e.value=document.activeElement}function Lo(){document.removeEventListener("focusin",Be)}function Be(){$e.value=document.activeElement}const So={},Mo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},To=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Io=[To];function Co(s,e){return a(),i("svg",Mo,Io)}const Ae=m(So,[["render",Co]]),No={},Bo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ao=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Ho=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),xo=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),zo=[Ao,Ho,xo];function Do(s,e){return a(),i("svg",Bo,zo)}const Eo=m(No,[["render",Do]]),Fo={class:"VPMenuLink"},Oo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),i("div",Fo,[h(x,{class:M({active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(Oo,[["__scopeId","data-v-12bdcbaf"]]),Go={class:"VPMenuGroup"},Uo={key:0,class:"title"},jo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.text?(a(),i("p",Uo,L(e.text),1)):f("",!0),(a(!0),i(I,null,H(e.items,n=>(a(),i(I,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Ro=m(jo,[["__scopeId","data-v-84ca6b46"]]),Ko={class:"VPMenu"},qo={key:0,class:"items"},Wo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Ko,[e.items?(a(),i("div",qo,[(a(!0),i(I,null,H(e.items,n=>(a(),i(I,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Ro,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Yo=m(Wo,[["__scopeId","data-v-7bc86793"]]),Jo=["aria-expanded","aria-label"],Xo={key:0,class:"text"},Zo=["innerHTML"],Qo={class:"menu"},ea=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=T(!1),t=T();Vo({el:t,onBlur:n});function n(){e.value=!1}return(o,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=d=>e.value=!0),onMouseleave:r[2]||(r[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:r[0]||(r[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Xo,[o.icon?(a(),$(F(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Zo)):f("",!0),h(Ae,{class:"text-icon"})])):(a(),$(Eo,{key:1,class:"icon"}))],8,Jo),c("div",Qo,[h(Yo,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ke=m(ea,[["__scopeId","data-v-be12505d"]]),ta={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},sa=["href","aria-label","innerHTML"],na=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:ta[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,sa))}});const oa=m(na,[["__scopeId","data-v-df955e2b"]]),aa={class:"VPSocialLinks"},ra=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",aa,[(a(!0),i(I,null,H(e.links,({link:n,icon:o,ariaLabel:r})=>(a(),$(oa,{key:n,icon:o,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}});const ae=m(ra,[["__scopeId","data-v-b03b93e5"]]),la={key:0,class:"group translations"},ia={class:"trans-title"},ca={key:1,class:"group"},ua={class:"item appearance"},da={class:"label"},_a={class:"appearance-action"},va={key:2,class:"group"},pa={class:"item social-links"},ha=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),r=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>r.value?(a(),$(ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(a(),i("div",la,[c("p",ia,L(l(o).label),1),(a(!0),i(I,null,H(l(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",ca,[c("div",ua,[c("p",da,L(l(t).darkModeSwitchLabel||"Appearance"),1),c("div",_a,[h(be)])])])):f("",!0),l(t).socialLinks?(a(),i("div",va,[c("div",pa,[h(ae,{class:"social-links-list",links:l(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const fa=m(ha,[["__scopeId","data-v-d232e2f3"]]),ma=s=>(z("data-v-6e364b22"),s=s(),D(),s),ga=["aria-expanded"],ba=ma(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),$a=[ba],ka=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},$a,10,ga))}});const ya=m(ka,[["__scopeId","data-v-6e364b22"]]),Pa=["innerHTML"],Va=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),$(x,{class:M({VPNavBarMenuLink:!0,active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel"]))}});const wa=m(Va,[["__scopeId","data-v-3a9d7cfe"]]),La=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),n=r=>"link"in r?O(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),o=k(()=>n(e.item));return(r,d)=>(a(),$(ke,{class:M({VPNavBarMenuGroup:!0,active:l(O)(l(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||o.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Sa=s=>(z("data-v-b502074c"),s=s(),D(),s),Ma={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ta=Sa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Ia=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Ma,[Ta,(a(!0),i(I,null,H(l(e).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),$(wa,{key:0,item:o},null,8,["item"])):(a(),$(La,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Ca=m(Ia,[["__scopeId","data-v-b502074c"]]);function Na(s,e){const{localeIndex:t}=P();function n(o){var S,N;const r=o.split("."),d=s&&typeof s=="object",p=d&&((N=(S=s.locales)==null?void 0:S[t.value])==null?void 0:N.translations)||null,_=d&&s.translations||null;let b=p,V=_,y=e;const C=r.pop();for(const B of r){let w=null;const R=y==null?void 0:y[B];R&&(w=y=R);const W=V==null?void 0:V[B];W&&(w=V=W);const K=b==null?void 0:b[B];K&&(w=b=K),R||(y=w),W||(V=w),K||(b=w)}return(b==null?void 0:b[C])??(V==null?void 0:V[C])??(y==null?void 0:y[C])??""}return n}const Ba=["aria-label"],Aa={class:"DocSearch-Button-Container"},Ha=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),xa={class:"DocSearch-Button-Placeholder"},za=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",setup(s){const{theme:e}=P(),t={button:{buttonText:"Search",buttonAriaLabel:"Search"}},n=qe(Na)(We(()=>{var o;return(o=e.value.search)==null?void 0:o.options}),t);return(o,r)=>(a(),i("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[c("span",Aa,[Ha,c("span",xa,L(l(n)("button.buttonText")),1)]),za],8,Ba))}});const Da={class:"VPNavBarSearch"},Ea={id:"local-search"},Fa={key:1,id:"docsearch"},Oa=g({__name:"VPNavBarSearch",setup(s){const e=Ye(()=>Je(()=>import("./VPLocalSearchBox.11f5f162.js"),["assets/chunks/VPLocalSearchBox.11f5f162.js","assets/chunks/framework.725e5b03.js"])),t=()=>null,{theme:n}=P(),o=T(!1),r=T(!1);G(()=>{});function d(){o.value||(o.value=!0,setTimeout(p,16))}function p(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}function _(y){const C=y.target,S=C.tagName;return C.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const b=T(!1);ye("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),b.value=!0)}),ye("/",y=>{_(y)||(y.preventDefault(),b.value=!0)});const V="local";return(y,C)=>{var S;return a(),i("div",Da,[l(V)==="local"?(a(),i(I,{key:0},[b.value?(a(),$(l(e),{key:0,onClose:C[0]||(C[0]=N=>b.value=!1)})):f("",!0),c("div",Ea,[h(Ve,{onClick:C[1]||(C[1]=N=>b.value=!0)})])],64)):l(V)==="algolia"?(a(),i(I,{key:1},[o.value?(a(),$(l(t),{key:0,algolia:((S=l(n).search)==null?void 0:S.options)??l(n).algolia,onVnodeBeforeMount:C[2]||(C[2]=N=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),i("div",Fa,[h(Ve,{onClick:d})]))],64)):f("",!0)])}}});const Ga=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$(ae,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}});const Ua=m(Ga,[["__scopeId","data-v-fc60e382"]]),ja=["href"],Ra=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:n}=E(),{currentLang:o}=X();return(r,d)=>(a(),i("div",{class:M(["VPNavBarTitle",{"has-sidebar":l(n)}])},[c("a",{class:"title",href:l(t).logoLink??l(J)(l(o).link)},[u(r.$slots,"nav-bar-title-before",{},void 0,!0),l(t).logo?(a(),$(ee,{key:0,class:"logo",image:l(t).logo},null,8,["image"])):f("",!0),l(t).siteTitle?(a(),i(I,{key:1},[A(L(l(t).siteTitle),1)],64)):l(t).siteTitle===void 0?(a(),i(I,{key:2},[A(L(l(e).title),1)],64)):f("",!0),u(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,ja)],2))}});const Ka=m(Ra,[["__scopeId","data-v-25907968"]]),qa={},Wa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ya=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ja=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Xa=[Ya,Ja];function Za(s,e){return a(),i("svg",Wa,Xa)}const He=m(qa,[["render",Za]]),Qa={class:"items"},er={class:"title"},tr=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,r)=>l(t).length&&l(n).label?(a(),$(ke,{key:0,class:"VPNavBarTranslations",icon:He,label:l(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Qa,[c("p",er,L(l(n).label),1),(a(!0),i(I,null,H(l(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const sr=m(tr,[["__scopeId","data-v-605b2a1c"]]),nr=s=>(z("data-v-75295e80"),s=s(),D(),s),or={class:"container"},ar={class:"title"},rr={class:"content"},lr=nr(()=>c("div",{class:"curtain"},null,-1)),ir={class:"content-body"},cr=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=E(),{frontmatter:n}=P(),o=T({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(r,d)=>(a(),i("div",{class:M(["VPNavBar",o.value])},[c("div",or,[c("div",ar,[h(Ka,null,{"nav-bar-title-before":v(()=>[u(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",rr,[lr,c("div",ir,[u(r.$slots,"nav-bar-content-before",{},void 0,!0),h(Oa,{class:"search"}),h(Ca,{class:"menu"}),h(sr,{class:"translations"}),h(Po,{class:"appearance"}),h(Ua,{class:"social-links"}),h(fa,{class:"extra"}),u(r.$slots,"nav-bar-content-after",{},void 0,!0),h(ya,{class:"hamburger",active:r.isScreenOpen,onClick:d[0]||(d[0]=p=>r.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ur=m(cr,[["__scopeId","data-v-75295e80"]]),dr={key:0,class:"VPNavScreenAppearance"},_r={class:"text"},vr=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(n,o)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",dr,[c("p",_r,L(l(t).darkModeSwitchLabel||"Appearance"),1),h(be)])):f("",!0)}});const pr=m(vr,[["__scopeId","data-v-ede75f40"]]),hr=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(x,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const fr=m(hr,[["__scopeId","data-v-ffca81d4"]]),mr={},gr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},br=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),$r=[br];function kr(s,e){return a(),i("svg",gr,$r)}const yr=m(mr,[["render",kr]]),Pr=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(x,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const xe=m(Pr,[["__scopeId","data-v-9d57445c"]]),Vr={class:"VPNavScreenMenuGroupSection"},wr={key:0,class:"title"},Lr=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Vr,[e.text?(a(),i("p",wr,L(e.text),1)):f("",!0),(a(!0),i(I,null,H(e.items,n=>(a(),$(xe,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Sr=m(Lr,[["__scopeId","data-v-1818b954"]]),Mr=["aria-controls","aria-expanded"],Tr={class:"button-text"},Ir=["id"],Cr={key:1,class:"group"},Nr=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=T(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(r,d)=>(a(),i("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Tr,L(r.text),1),h(yr,{class:"button-icon"})],8,Mr),c("div",{id:n.value,class:"items"},[(a(!0),i(I,null,H(r.items,p=>(a(),i(I,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(xe,{item:p},null,8,["item"])])):(a(),i("div",Cr,[h(Sr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Ir)],2))}});const Br=m(Nr,[["__scopeId","data-v-52260a4f"]]),Ar={key:0,class:"VPNavScreenMenu"},Hr=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Ar,[(a(!0),i(I,null,H(l(e).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),$(fr,{key:0,item:o},null,8,["item"])):(a(),$(Br,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),xr=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$(ae,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}}),zr={class:"list"},Dr=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=T(!1);function o(){n.value=!n.value}return(r,d)=>l(e).length&&l(t).label?(a(),i("div",{key:0,class:M(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(He,{class:"icon lang"}),A(" "+L(l(t).label)+" ",1),h(Ae,{class:"icon chevron"})]),c("ul",zr,[(a(!0),i(I,null,H(l(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(x,{class:"link",href:p.link},{default:v(()=>[A(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Er=m(Dr,[["__scopeId","data-v-9a2cac96"]]),Fr={class:"container"},Or=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=T(null),t=Me(q?document.body:null);return(n,o)=>(a(),$(de,{name:"fade",onEnter:o[0]||(o[0]=r=>t.value=!0),onAfterLeave:o[1]||(o[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Fr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Hr,{class:"menu"}),h(Er,{class:"translations"}),h(pr,{class:"appearance"}),h(xr,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Gr=m(Or,[["__scopeId","data-v-c19630f2"]]),Ur={key:0,class:"VPNav"},jr=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=eo(),{frontmatter:o}=P(),r=k(()=>o.value.navbar!==!1);return Te("close-screen",t),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,p)=>r.value?(a(),i("header",Ur,[h(ur,{"is-screen-open":l(e),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Gr,{open:l(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Rr=m(jr,[["__scopeId","data-v-8d0376b3"]]),Kr=s=>(z("data-v-1a4376dd"),s=s(),D(),s),qr=["role","tabindex"],Wr=Kr(()=>c("div",{class:"indicator"},null,-1)),Yr=["onKeydown"],Jr={key:1,class:"items"},Xr=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:d,hasChildren:p,toggle:_}=kt(k(()=>e.item)),b=k(()=>p.value?"section":"div"),V=k(()=>o.value?"a":"div"),y=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),C=k(()=>o.value?void 0:"button"),S=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":r.value},{"has-active":d.value}]);function N(w){"key"in w&&w.key!=="Enter"||!e.item.link&&_()}function B(){e.item.link&&_()}return(w,R)=>{const W=j("VPSidebarItem",!0);return a(),$(F(b.value),{class:M(["VPSidebarItem",S.value])},{default:v(()=>[w.item.text?(a(),i("div",Z({key:0,class:"item",role:C.value},Ze(w.item.items?{click:N,keydown:N}:{},!0),{tabindex:w.item.items&&0}),[Wr,w.item.link?(a(),$(x,{key:0,tag:V.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(a(),$(F(y.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(F(y.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:Xe(B,["enter"]),tabindex:"0"},[h(ge,{class:"caret-icon"})],40,Yr)):f("",!0)],16,qr)):f("",!0),w.item.items&&w.item.items.length?(a(),i("div",Jr,[w.depth<5?(a(!0),i(I,{key:0},H(w.item.items,K=>(a(),$(W,{key:K.text,item:K,depth:w.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Zr=m(Xr,[["__scopeId","data-v-1a4376dd"]]),ze=s=>(z("data-v-38384e3a"),s=s(),D(),s),Qr=ze(()=>c("div",{class:"curtain"},null,-1)),el={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},tl=ze(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),sl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=E(),n=s,o=T(null),r=Me(q?document.body:null);return U([n,o],()=>{var d;n.open?(r.value=!0,(d=o.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"}),(d,p)=>l(t)?(a(),i("aside",{key:0,class:M(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Qe(()=>{},["stop"]))},[Qr,c("nav",el,[tl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(I,null,H(l(e),_=>(a(),i("div",{key:_.text,class:"group"},[h(Zr,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const nl=m(sl,[["__scopeId","data-v-38384e3a"]]),ol=g({__name:"VPSkipLink",setup(s){const e=se(),t=T();U(()=>e.path,()=>t.value.focus());function n({target:o}){const r=document.getElementById(decodeURIComponent(o.hash).slice(1));if(r){const d=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",d)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",d),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(a(),i(I,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const al=m(ol,[["__scopeId","data-v-abdaa7b4"]]),rl=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=E(),o=se();U(()=>o.path,n),$t(e,n);const{frontmatter:r}=P(),d=et(),p=k(()=>!!d["home-hero-image"]);return Te("hero-image-slot-exists",p),(_,b)=>{const V=j("Content");return l(r).layout!==!1?(a(),i("div",{key:0,class:M(["Layout",l(r).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(al),h(at,{class:"backdrop",show:l(e),onClick:l(n)},null,8,["show","onClick"]),h(Rr,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Qn,{open:l(e),onOpenMenu:l(t)},null,8,["open","onOpenMenu"]),h(nl,{open:l(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Cn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(xn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(V,{key:1}))}}});const ll=m(rl,[["__scopeId","data-v-8574ffd1"]]),il={},cl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ul=c("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),dl=[ul];function _l(s,e){return a(),i("svg",cl,dl)}const vl=m(il,[["render",_l]]);const pl={class:"profile"},hl={class:"avatar"},fl=["src","alt"],ml={class:"data"},gl={class:"name"},bl={key:0,class:"affiliation"},$l={key:0,class:"title"},kl={key:1,class:"at"},yl=["innerHTML"],Pl={key:2,class:"links"},Vl={key:0,class:"sp"},wl=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(s){return(e,t)=>(a(),i("article",{class:M(["VPTeamMembersItem",[e.size]])},[c("div",pl,[c("figure",hl,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,fl)]),c("div",ml,[c("h1",gl,L(e.member.name),1),e.member.title||e.member.org?(a(),i("p",bl,[e.member.title?(a(),i("span",$l,L(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(a(),i("span",kl," @ ")):f("",!0),e.member.org?(a(),$(x,{key:2,class:M(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:v(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(a(),i("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,yl)):f("",!0),e.member.links?(a(),i("div",Pl,[h(ae,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(a(),i("div",Vl,[h(x,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:v(()=>[h(vl,{class:"sp-icon"}),A(" Sponsor ")]),_:1},8,["href"])])):f("",!0)],2))}});const Ll=m(wl,[["__scopeId","data-v-7cfb1dae"]]),Sl={class:"container"},Ml=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(s){const e=s,t=k(()=>[e.size,`count-${e.members.length}`]);return(n,o)=>(a(),i("div",{class:M(["VPTeamMembers",t.value])},[c("div",Sl,[(a(!0),i(I,null,H(n.members,r=>(a(),i("div",{key:r.name,class:"item"},[h(Ll,{size:n.size,member:r},null,8,["size","member"])]))),128))])],2))}});const Cl=m(Ml,[["__scopeId","data-v-08f54381"]]),Nl={Layout:ll,enhanceApp:({app:s})=>{s.component("Badge",st)}};class Bl{constructor(e=10){re(this,"max");re(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}export{Bl as L,Cl as V,Na as c,Nl as t,P as u};
+var De=Object.defineProperty;var Ee=(s,e,t)=>e in s?De(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var re=(s,e,t)=>(Ee(s,typeof e!="symbol"?e+"":e,t),t);import{d as g,o as a,c as i,r as u,n as M,a as A,t as L,_ as m,b as $,w as v,T as de,e as f,u as Fe,i as Oe,f as _e,g as k,h as T,j as G,k as c,l,p as z,m as D,q as O,s as q,v as ie,x as U,y as te,z as ve,A as we,B as Ge,C as j,F as I,D as H,E as pe,G as Y,H as h,I as F,J as Le,K as se,L as Z,M as ne,N as Ue,O as je,P as Se,Q as Re,R as Ke,S as qe,U as We,V as ye,W as Ye,X as Je,Y as Me,Z as Te,$ as Xe,a0 as Ze,a1 as Qe,a2 as et}from"./framework.725e5b03.js";const tt=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:M(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const st=m(tt,[["__scopeId","data-v-99f7fa3b"]]),nt={key:0,class:"VPBackdrop"},ot=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(de,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",nt)):f("",!0)]),_:1}))}});const at=m(ot,[["__scopeId","data-v-2e35c42d"]]),P=Fe;function rt(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ce(s){return/^\//.test(s)?s:`/${s}`}function J(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(Oe(s)||s.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(s))return s;const{site:r}=P(),d=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return _e(d)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:r}=P(),d=k(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:lt(b.link||(_==="root"?"/":`/${_}/`),r.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function lt(s,e,t,n){return e?s.replace(/\/$/,"")+ce(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const it=s=>(z("data-v-ca21a7ba"),s=s(),D(),s),ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},_t=it(()=>c("div",{class:"divider"},null,-1)),vt={class:"quote"},pt={class:"action"},ht=["href","aria-label"],ft=g({__name:"NotFound",setup(s){const{site:e,theme:t}=P(),{localeLinks:n}=X({removeCurrent:!1}),o=T("/");return G(()=>{var d;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(r)))==null?void 0:d.link)||n.value[0].link)}),(r,d)=>{var p,_,b,V,y;return a(),i("div",ct,[c("p",ut,L(((p=l(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",dt,L(((_=l(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),_t,c("blockquote",vt,L(((b=l(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",pt,[c("a",{class:"link",href:l(_e)(o.value),"aria-label":((V=l(t).notFound)==null?void 0:V.linkLabel)??"go to home"},L(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,ht)])])}}});const mt=m(ft,[["__scopeId","data-v-ca21a7ba"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=ce(e);const t=Object.keys(s).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>e.startsWith(ce(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function gt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function bt(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ue(s,e){return Array.isArray(e)?e.some(t=>ue(s,t)):O(s,e.link)?!0:e.items?ue(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function E(){const{frontmatter:s,page:e,theme:t}=P(),n=ie("(min-width: 960px)"),o=T(!1),r=k(()=>{const B=t.value.sidebar,w=e.value.relativePath;return B?Ie(B,w):[]}),d=T(r.value);U(r,(B,w)=>{JSON.stringify(B)!==JSON.stringify(w)&&(d.value=r.value)});const p=k(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=k(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=k(()=>p.value&&n.value),y=k(()=>p.value?gt(d.value):[]);function C(){o.value=!0}function S(){o.value=!1}function N(){o.value?S():C()}return{isOpen:o,sidebar:d,sidebarGroups:y,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:V,open:C,close:S,toggle:N}}function $t(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),ve(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ce=T(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{Ce.value=location.hash});function kt(s){const{page:e}=P(),t=T(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),r=T(!1),d=()=>{r.value=O(e.value.relativePath,s.value.link)};U([e,s,Ce],d),G(d);const p=k(()=>r.value?!0:s.value.items?ue(e.value.relativePath,s.value.items):!1),_=k(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(r.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:p,hasChildren:_,toggle:b}}function yt(){const{hasSidebar:s}=E(),e=ie("(min-width: 960px)"),t=ie("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const Pt=71;function he(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function fe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:Vt(t),link:"#"+t.id,level:n}});return wt(e,s)}function Vt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function wt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const r=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ge(()=>{d(location.hash)}),ve(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>p.some(N=>N.hash===S.hash&&S.offsetParent!==null)),b=window.scrollY,V=window.innerHeight,y=document.body.offsetHeight,C=Math.abs(b+V-y)<1;if(_.length&&C){d(_[_.length-1].hash);return}for(let S=0;S<_.length;S++){const N=_[S],B=_[S+1],[w,R]=St(S,N,B);if(w){d(R);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-Pt}function St(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=j("VPDocOutlineItem",!0);return a(),i("ul",{class:M(t.root?"root":"nested")},[(a(!0),i(I,null,H(t.headers,({children:r,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Mt),r!=null&&r.length?(a(),$(o,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}});const me=m(Tt,[["__scopeId","data-v-266a89cb"]]),It=s=>(z("data-v-82d1df03"),s=s(),D(),s),Ct={class:"content"},Nt={class:"outline-title",role:"heading","aria-level":"2"},Bt={"aria-labelledby":"doc-outline-aria-label"},At=It(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ht=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),n=pe([]);Y(()=>{n.value=fe(e.value.outline??t.value.outline)});const o=T(),r=T();return Lt(o,r),(d,p)=>(a(),i("div",{class:M(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",Ct,[c("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),c("div",Nt,L(l(he)(l(t))),1),c("nav",Bt,[At,h(me,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const xt=m(Ht,[["__scopeId","data-v-82d1df03"]]),zt={class:"VPDocAsideCarbonAds"},Dt=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",zt,[h(l(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Et=s=>(z("data-v-4ccc7a73"),s=s(),D(),s),Ft={class:"VPDocAside"},Ot=Et(()=>c("div",{class:"spacer"},null,-1)),Gt=g({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,n)=>(a(),i("div",Ft,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(xt),u(t.$slots,"aside-outline-after",{},void 0,!0),Ot,u(t.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),$(Dt,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ut=m(Gt,[["__scopeId","data-v-4ccc7a73"]]);function jt(){const{theme:s,page:e}=P();return k(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Rt(){const{page:s,theme:e,frontmatter:t}=P();return k(()=>{var _,b,V,y,C,S,N,B;const n=Ie(e.value.sidebar,s.value.relativePath),o=bt(n),r=o.findIndex(w=>O(s.value.relativePath,w.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((V=o[r-1])==null?void 0:V.docFooterText)??((y=o[r-1])==null?void 0:y.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((C=o[r-1])==null?void 0:C.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((S=o[r+1])==null?void 0:S.docFooterText)??((N=o[r+1])==null?void 0:N.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[r+1])==null?void 0:B.link)}}})}const Kt={},qt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Wt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Yt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Jt=[Wt,Yt];function Xt(s,e){return a(),i("svg",qt,Jt)}const Zt=m(Kt,[["render",Xt]]),x=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&Le.test(e.href));return(o,r)=>(a(),$(F(t.value),{class:M(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Qt={class:"VPLastUpdated"},es=["datetime"],ts=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=P(),r=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=k(()=>r.value.toISOString()),p=T("");return G(()=>{te(()=>{var _,b,V;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((V=e.value.lastUpdated)==null?void 0:V.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(_,b)=>{var V;return a(),i("p",Qt,[A(L(((V=l(e).lastUpdated)==null?void 0:V.text)||l(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,es)])}}});const ss=m(ts,[["__scopeId","data-v-46d1cb64"]]),ns={key:0,class:"VPDocFooter"},os={key:0,class:"edit-info"},as={key:0,class:"edit-link"},rs={key:1,class:"last-updated"},ls={key:1,class:"prev-next"},is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s={class:"pager"},vs=["href"],ps=["innerHTML"],hs=["innerHTML"],fs=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=P(),o=jt(),r=Rt(),d=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=k(()=>d.value||p.value||r.value.prev||r.value.next);return(b,V)=>{var y,C,S,N,B,w;return _.value?(a(),i("footer",ns,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",os,[d.value?(a(),i("div",as,[h(x,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[h(Zt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(l(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",rs,[h(ss)])):f("",!0)])):f("",!0),(y=l(r).prev)!=null&&y.link||(C=l(r).next)!=null&&C.link?(a(),i("nav",ls,[c("div",is,[(S=l(r).prev)!=null&&S.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(J)(l(r).prev.link)},[c("span",{class:"desc",innerHTML:((N=l(e).docFooter)==null?void 0:N.prev)||"Previous page"},null,8,us),c("span",{class:"title",innerHTML:l(r).prev.text},null,8,ds)],8,cs)):f("",!0)]),c("div",_s,[(B=l(r).next)!=null&&B.link?(a(),i("a",{key:0,class:"pager-link next",href:l(J)(l(r).next.link)},[c("span",{class:"desc",innerHTML:((w=l(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,ps),c("span",{class:"title",innerHTML:l(r).next.text},null,8,hs)],8,vs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ms=m(fs,[["__scopeId","data-v-c097fc16"]]),gs={},bs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},$s=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ks=[$s];function ys(s,e){return a(),i("svg",bs,ks)}const ge=m(gs,[["render",ys]]),Ps={key:0,class:"VPDocOutlineDropdown"},Vs={key:0,class:"items"},ws=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=P(),n=T(!1);Y(()=>{n.value=!1});const o=pe([]);return Y(()=>{o.value=fe(e.value.outline??t.value.outline)}),(r,d)=>o.value.length>0?(a(),i("div",Ps,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:M({open:n.value})},[A(L(l(he)(l(t)))+" ",1),h(ge,{class:"icon"})],2),n.value?(a(),i("div",Vs,[h(me,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const Ls=m(ws,[["__scopeId","data-v-260152ac"]]),Ss=s=>(z("data-v-30a5e70a"),s=s(),D(),s),Ms={class:"container"},Ts=Ss(()=>c("div",{class:"aside-curtain"},null,-1)),Is={class:"aside-container"},Cs={class:"aside-content"},Ns={class:"content"},Bs={class:"content-container"},As={class:"main"},Hs=g({__name:"VPDoc",setup(s){const{theme:e}=P(),t=se(),{hasSidebar:n,hasAside:o,leftAside:r}=E(),d=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=j("Content");return a(),i("div",{class:M(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Ms,[l(o)?(a(),i("div",{key:0,class:M(["aside",{"left-aside":l(r)}])},[Ts,c("div",Is,[c("div",Cs,[h(Ut,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ns,[c("div",Bs,[u(p.$slots,"doc-before",{},void 0,!0),h(Ls),c("main",As,[h(b,{class:M(["vp-doc",[d.value,l(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ms,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const xs=m(Hs,[["__scopeId","data-v-30a5e70a"]]),zs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=k(()=>e.href&&Le.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,r)=>(a(),$(F(n.value),{class:M(["VPButton",[o.size,o.theme]]),href:o.href?l(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const Ds=m(zs,[["__scopeId","data-v-b47f9daa"]]),Es=["src","alt"],Fs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),i(I,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(_e)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Es)):(a(),i(I,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Fs,[["__scopeId","data-v-b7111cdf"]]),Os=s=>(z("data-v-fd5a7aed"),s=s(),D(),s),Gs={class:"container"},Us={class:"main"},js={key:0,class:"name"},Rs=["innerHTML"],Ks=["innerHTML"],qs=["innerHTML"],Ws={key:0,class:"actions"},Ys={key:0,class:"image"},Js={class:"image-container"},Xs=Os(()=>c("div",{class:"image-bg"},null,-1)),Zs=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:M(["VPHero",{"has-image":t.image||l(e)}])},[c("div",Gs,[c("div",Us,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",js,[c("span",{innerHTML:t.name,class:"clip"},null,8,Rs)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ks)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,qs)):f("",!0)],!0),t.actions?(a(),i("div",Ws,[(a(!0),i(I,null,H(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(Ds,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||l(e)?(a(),i("div",Ys,[c("div",Js,[Xs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Qs=m(Zs,[["__scopeId","data-v-fd5a7aed"]]),en=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).hero?(a(),$(Qs,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),tn={},sn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},nn=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),on=[nn];function an(s,e){return a(),i("svg",sn,on)}const rn=m(tn,[["render",an]]),ln={class:"box"},cn={key:0,class:"icon"},un=["innerHTML"],dn=["innerHTML"],_n=["innerHTML"],vn={key:4,class:"link-text"},pn={class:"link-text-value"},hn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(x,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",ln,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",cn,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,un)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,dn),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,_n)):f("",!0),e.linkText?(a(),i("div",vn,[c("p",pn,[A(L(e.linkText)+" ",1),h(rn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const fn=m(hn,[["__scopeId","data-v-fb6bac11"]]),mn={key:0,class:"VPFeatures"},gn={class:"container"},bn={class:"items"},$n=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",mn,[c("div",gn,[c("div",bn,[(a(!0),i(I,null,H(n.features,r=>(a(),i("div",{key:r.title,class:M(["item",[t.value]])},[h(fn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const kn=m($n,[["__scopeId","data-v-3190607f"]]),yn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,n)=>l(e).features?(a(),$(kn,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):f("",!0)}}),Pn={class:"VPHome"},Vn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=j("Content");return a(),i("div",Pn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(en,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(yn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const wn=m(Vn,[["__scopeId","data-v-381d4781"]]),Ln={},Sn={class:"VPPage"};function Mn(s,e){const t=j("Content");return a(),i("div",Sn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const Tn=m(Ln,[["render",Mn]]),In=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:n}=E();return(o,r)=>(a(),i("div",{class:M(["VPContent",{"has-sidebar":l(n),"is-home":l(t).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(mt)],!0):l(t).layout==="page"?(a(),$(Tn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(t).layout==="home"?(a(),$(wn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(t).layout&&l(t).layout!=="doc"?(a(),$(F(l(t).layout),{key:3})):(a(),$(xs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Cn=m(In,[["__scopeId","data-v-a5670ab7"]]),Nn={class:"container"},Bn=["innerHTML"],An=["innerHTML"],Hn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=E();return(o,r)=>l(e).footer&&l(t).footer!==!1?(a(),i("footer",{key:0,class:M(["VPFooter",{"has-sidebar":l(n)}])},[c("div",Nn,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,Bn)):f("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,An)):f("",!0)])],2)):f("",!0)}});const xn=m(Hn,[["__scopeId","data-v-59982766"]]),zn={class:"header"},Dn={class:"outline"},En=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),n=T(!1),o=T(0),r=T();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),je(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,V)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Ue({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:M({open:n.value})},[A(L(l(he)(l(t)))+" ",1),h(ge,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)),h(de,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:p},[c("div",zn,[c("a",{class:"top-link",href:"#",onClick:_},L(l(t).returnToTopLabel||"Return to top"),1)]),c("div",Dn,[h(me,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Fn=m(En,[["__scopeId","data-v-1da04fcb"]]),On={},Gn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Un=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),jn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Rn=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Kn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),qn=[Un,jn,Rn,Kn];function Wn(s,e){return a(),i("svg",Gn,qn)}const Yn=m(On,[["render",Wn]]),Jn=["aria-expanded"],Xn={class:"menu-text"},Zn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=E(),{y:o}=Se(),r=pe([]),d=T(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{r.value=fe(t.value.outline??e.value.outline)});const p=k(()=>r.value.length===0&&!n.value),_=k(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,V)=>l(t).layout!=="home"&&(!p.value||l(o)>=d.value)?(a(),i("div",{key:0,class:M(_.value)},[l(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:V[0]||(V[0]=y=>b.$emit("open-menu"))},[h(Yn,{class:"menu-icon"}),c("span",Xn,L(l(e).sidebarMenuLabel||"Menu"),1)],8,Jn)):f("",!0),h(Fn,{headers:r.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Qn=m(Zn,[["__scopeId","data-v-99bafde1"]]);function eo(){const s=T(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const r=se();return U(()=>r.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const to={},so={class:"VPSwitch",type:"button",role:"switch"},no={class:"check"},oo={key:0,class:"icon"};function ao(s,e){return a(),i("button",so,[c("span",no,[s.$slots.default?(a(),i("span",oo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const ro=m(to,[["render",ao],["__scopeId","data-v-57a4e611"]]),lo={},io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},co=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),uo=[co];function _o(s,e){return a(),i("svg",io,uo)}const vo=m(lo,[["render",_o]]),po={},ho={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fo=Re('',9),mo=[fo];function go(s,e){return a(),i("svg",ho,mo)}const bo=m(po,[["render",go]]),$o=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=P(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(ro,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(e),onClick:l(t)},{default:v(()=>[h(bo,{class:"sun"}),h(vo,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const be=m($o,[["__scopeId","data-v-9fd3178a"]]),ko={key:0,class:"VPNavBarAppearance"},yo=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,n)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",ko,[h(be)])):f("",!0)}});const Po=m(yo,[["__scopeId","data-v-47b73526"]]),$e=T();let Ne=!1,le=0;function Vo(s){const e=T(!1);if(q){!Ne&&wo(),le++;const t=U($e,n=>{var o,r,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(r=s.onFocus)==null||r.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});ve(()=>{t(),le--,le||Lo()})}return Ke(e)}function wo(){document.addEventListener("focusin",Be),Ne=!0,$e.value=document.activeElement}function Lo(){document.removeEventListener("focusin",Be)}function Be(){$e.value=document.activeElement}const So={},Mo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},To=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Io=[To];function Co(s,e){return a(),i("svg",Mo,Io)}const Ae=m(So,[["render",Co]]),No={},Bo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ao=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),Ho=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),xo=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),zo=[Ao,Ho,xo];function Do(s,e){return a(),i("svg",Bo,zo)}const Eo=m(No,[["render",Do]]),Fo={class:"VPMenuLink"},Oo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),i("div",Fo,[h(x,{class:M({active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(Oo,[["__scopeId","data-v-12bdcbaf"]]),Go={class:"VPMenuGroup"},Uo={key:0,class:"title"},jo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.text?(a(),i("p",Uo,L(e.text),1)):f("",!0),(a(!0),i(I,null,H(e.items,n=>(a(),i(I,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Ro=m(jo,[["__scopeId","data-v-84ca6b46"]]),Ko={class:"VPMenu"},qo={key:0,class:"items"},Wo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Ko,[e.items?(a(),i("div",qo,[(a(!0),i(I,null,H(e.items,n=>(a(),i(I,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Ro,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Yo=m(Wo,[["__scopeId","data-v-7bc86793"]]),Jo=["aria-expanded","aria-label"],Xo={key:0,class:"text"},Zo=["innerHTML"],Qo={class:"menu"},ea=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=T(!1),t=T();Vo({el:t,onBlur:n});function n(){e.value=!1}return(o,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=d=>e.value=!0),onMouseleave:r[2]||(r[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:r[0]||(r[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Xo,[o.icon?(a(),$(F(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Zo)):f("",!0),h(Ae,{class:"text-icon"})])):(a(),$(Eo,{key:1,class:"icon"}))],8,Jo),c("div",Qo,[h(Yo,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ke=m(ea,[["__scopeId","data-v-be12505d"]]),ta={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},sa=["href","aria-label","innerHTML"],na=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:ta[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,sa))}});const oa=m(na,[["__scopeId","data-v-df955e2b"]]),aa={class:"VPSocialLinks"},ra=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",aa,[(a(!0),i(I,null,H(e.links,({link:n,icon:o,ariaLabel:r})=>(a(),$(oa,{key:n,icon:o,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}});const ae=m(ra,[["__scopeId","data-v-b03b93e5"]]),la={key:0,class:"group translations"},ia={class:"trans-title"},ca={key:1,class:"group"},ua={class:"item appearance"},da={class:"label"},_a={class:"appearance-action"},va={key:2,class:"group"},pa={class:"item social-links"},ha=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),r=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>r.value?(a(),$(ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(a(),i("div",la,[c("p",ia,L(l(o).label),1),(a(!0),i(I,null,H(l(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",ca,[c("div",ua,[c("p",da,L(l(t).darkModeSwitchLabel||"Appearance"),1),c("div",_a,[h(be)])])])):f("",!0),l(t).socialLinks?(a(),i("div",va,[c("div",pa,[h(ae,{class:"social-links-list",links:l(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const fa=m(ha,[["__scopeId","data-v-d232e2f3"]]),ma=s=>(z("data-v-6e364b22"),s=s(),D(),s),ga=["aria-expanded"],ba=ma(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),$a=[ba],ka=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},$a,10,ga))}});const ya=m(ka,[["__scopeId","data-v-6e364b22"]]),Pa=["innerHTML"],Va=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),$(x,{class:M({VPNavBarMenuLink:!0,active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel"]))}});const wa=m(Va,[["__scopeId","data-v-3a9d7cfe"]]),La=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),n=r=>"link"in r?O(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),o=k(()=>n(e.item));return(r,d)=>(a(),$(ke,{class:M({VPNavBarMenuGroup:!0,active:l(O)(l(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||o.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Sa=s=>(z("data-v-b502074c"),s=s(),D(),s),Ma={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ta=Sa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Ia=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Ma,[Ta,(a(!0),i(I,null,H(l(e).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),$(wa,{key:0,item:o},null,8,["item"])):(a(),$(La,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Ca=m(Ia,[["__scopeId","data-v-b502074c"]]);function Na(s,e){const{localeIndex:t}=P();function n(o){var S,N;const r=o.split("."),d=s&&typeof s=="object",p=d&&((N=(S=s.locales)==null?void 0:S[t.value])==null?void 0:N.translations)||null,_=d&&s.translations||null;let b=p,V=_,y=e;const C=r.pop();for(const B of r){let w=null;const R=y==null?void 0:y[B];R&&(w=y=R);const W=V==null?void 0:V[B];W&&(w=V=W);const K=b==null?void 0:b[B];K&&(w=b=K),R||(y=w),W||(V=w),K||(b=w)}return(b==null?void 0:b[C])??(V==null?void 0:V[C])??(y==null?void 0:y[C])??""}return n}const Ba=["aria-label"],Aa={class:"DocSearch-Button-Container"},Ha=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),xa={class:"DocSearch-Button-Placeholder"},za=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",setup(s){const{theme:e}=P(),t={button:{buttonText:"Search",buttonAriaLabel:"Search"}},n=qe(Na)(We(()=>{var o;return(o=e.value.search)==null?void 0:o.options}),t);return(o,r)=>(a(),i("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[c("span",Aa,[Ha,c("span",xa,L(l(n)("button.buttonText")),1)]),za],8,Ba))}});const Da={class:"VPNavBarSearch"},Ea={id:"local-search"},Fa={key:1,id:"docsearch"},Oa=g({__name:"VPNavBarSearch",setup(s){const e=Ye(()=>Je(()=>import("./VPLocalSearchBox.7afa7cdc.js"),["assets/chunks/VPLocalSearchBox.7afa7cdc.js","assets/chunks/framework.725e5b03.js"])),t=()=>null,{theme:n}=P(),o=T(!1),r=T(!1);G(()=>{});function d(){o.value||(o.value=!0,setTimeout(p,16))}function p(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}function _(y){const C=y.target,S=C.tagName;return C.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const b=T(!1);ye("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),b.value=!0)}),ye("/",y=>{_(y)||(y.preventDefault(),b.value=!0)});const V="local";return(y,C)=>{var S;return a(),i("div",Da,[l(V)==="local"?(a(),i(I,{key:0},[b.value?(a(),$(l(e),{key:0,onClose:C[0]||(C[0]=N=>b.value=!1)})):f("",!0),c("div",Ea,[h(Ve,{onClick:C[1]||(C[1]=N=>b.value=!0)})])],64)):l(V)==="algolia"?(a(),i(I,{key:1},[o.value?(a(),$(l(t),{key:0,algolia:((S=l(n).search)==null?void 0:S.options)??l(n).algolia,onVnodeBeforeMount:C[2]||(C[2]=N=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),i("div",Fa,[h(Ve,{onClick:d})]))],64)):f("",!0)])}}});const Ga=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$(ae,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}});const Ua=m(Ga,[["__scopeId","data-v-fc60e382"]]),ja=["href"],Ra=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:n}=E(),{currentLang:o}=X();return(r,d)=>(a(),i("div",{class:M(["VPNavBarTitle",{"has-sidebar":l(n)}])},[c("a",{class:"title",href:l(t).logoLink??l(J)(l(o).link)},[u(r.$slots,"nav-bar-title-before",{},void 0,!0),l(t).logo?(a(),$(ee,{key:0,class:"logo",image:l(t).logo},null,8,["image"])):f("",!0),l(t).siteTitle?(a(),i(I,{key:1},[A(L(l(t).siteTitle),1)],64)):l(t).siteTitle===void 0?(a(),i(I,{key:2},[A(L(l(e).title),1)],64)):f("",!0),u(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,ja)],2))}});const Ka=m(Ra,[["__scopeId","data-v-25907968"]]),qa={},Wa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ya=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ja=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Xa=[Ya,Ja];function Za(s,e){return a(),i("svg",Wa,Xa)}const He=m(qa,[["render",Za]]),Qa={class:"items"},er={class:"title"},tr=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,r)=>l(t).length&&l(n).label?(a(),$(ke,{key:0,class:"VPNavBarTranslations",icon:He,label:l(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Qa,[c("p",er,L(l(n).label),1),(a(!0),i(I,null,H(l(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const sr=m(tr,[["__scopeId","data-v-605b2a1c"]]),nr=s=>(z("data-v-75295e80"),s=s(),D(),s),or={class:"container"},ar={class:"title"},rr={class:"content"},lr=nr(()=>c("div",{class:"curtain"},null,-1)),ir={class:"content-body"},cr=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=E(),{frontmatter:n}=P(),o=T({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(r,d)=>(a(),i("div",{class:M(["VPNavBar",o.value])},[c("div",or,[c("div",ar,[h(Ka,null,{"nav-bar-title-before":v(()=>[u(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",rr,[lr,c("div",ir,[u(r.$slots,"nav-bar-content-before",{},void 0,!0),h(Oa,{class:"search"}),h(Ca,{class:"menu"}),h(sr,{class:"translations"}),h(Po,{class:"appearance"}),h(Ua,{class:"social-links"}),h(fa,{class:"extra"}),u(r.$slots,"nav-bar-content-after",{},void 0,!0),h(ya,{class:"hamburger",active:r.isScreenOpen,onClick:d[0]||(d[0]=p=>r.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ur=m(cr,[["__scopeId","data-v-75295e80"]]),dr={key:0,class:"VPNavScreenAppearance"},_r={class:"text"},vr=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(n,o)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",dr,[c("p",_r,L(l(t).darkModeSwitchLabel||"Appearance"),1),h(be)])):f("",!0)}});const pr=m(vr,[["__scopeId","data-v-ede75f40"]]),hr=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(x,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const fr=m(hr,[["__scopeId","data-v-ffca81d4"]]),mr={},gr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},br=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),$r=[br];function kr(s,e){return a(),i("svg",gr,$r)}const yr=m(mr,[["render",kr]]),Pr=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(x,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const xe=m(Pr,[["__scopeId","data-v-9d57445c"]]),Vr={class:"VPNavScreenMenuGroupSection"},wr={key:0,class:"title"},Lr=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Vr,[e.text?(a(),i("p",wr,L(e.text),1)):f("",!0),(a(!0),i(I,null,H(e.items,n=>(a(),$(xe,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Sr=m(Lr,[["__scopeId","data-v-1818b954"]]),Mr=["aria-controls","aria-expanded"],Tr={class:"button-text"},Ir=["id"],Cr={key:1,class:"group"},Nr=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=T(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(r,d)=>(a(),i("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Tr,L(r.text),1),h(yr,{class:"button-icon"})],8,Mr),c("div",{id:n.value,class:"items"},[(a(!0),i(I,null,H(r.items,p=>(a(),i(I,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(xe,{item:p},null,8,["item"])])):(a(),i("div",Cr,[h(Sr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Ir)],2))}});const Br=m(Nr,[["__scopeId","data-v-52260a4f"]]),Ar={key:0,class:"VPNavScreenMenu"},Hr=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,n)=>l(e).nav?(a(),i("nav",Ar,[(a(!0),i(I,null,H(l(e).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),$(fr,{key:0,item:o},null,8,["item"])):(a(),$(Br,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),xr=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>l(e).socialLinks?(a(),$(ae,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}}),zr={class:"list"},Dr=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=T(!1);function o(){n.value=!n.value}return(r,d)=>l(e).length&&l(t).label?(a(),i("div",{key:0,class:M(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(He,{class:"icon lang"}),A(" "+L(l(t).label)+" ",1),h(Ae,{class:"icon chevron"})]),c("ul",zr,[(a(!0),i(I,null,H(l(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(x,{class:"link",href:p.link},{default:v(()=>[A(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Er=m(Dr,[["__scopeId","data-v-9a2cac96"]]),Fr={class:"container"},Or=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=T(null),t=Me(q?document.body:null);return(n,o)=>(a(),$(de,{name:"fade",onEnter:o[0]||(o[0]=r=>t.value=!0),onAfterLeave:o[1]||(o[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Fr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Hr,{class:"menu"}),h(Er,{class:"translations"}),h(pr,{class:"appearance"}),h(xr,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Gr=m(Or,[["__scopeId","data-v-c19630f2"]]),Ur={key:0,class:"VPNav"},jr=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=eo(),{frontmatter:o}=P(),r=k(()=>o.value.navbar!==!1);return Te("close-screen",t),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,p)=>r.value?(a(),i("header",Ur,[h(ur,{"is-screen-open":l(e),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Gr,{open:l(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Rr=m(jr,[["__scopeId","data-v-8d0376b3"]]),Kr=s=>(z("data-v-1a4376dd"),s=s(),D(),s),qr=["role","tabindex"],Wr=Kr(()=>c("div",{class:"indicator"},null,-1)),Yr=["onKeydown"],Jr={key:1,class:"items"},Xr=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:d,hasChildren:p,toggle:_}=kt(k(()=>e.item)),b=k(()=>p.value?"section":"div"),V=k(()=>o.value?"a":"div"),y=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),C=k(()=>o.value?void 0:"button"),S=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":r.value},{"has-active":d.value}]);function N(w){"key"in w&&w.key!=="Enter"||!e.item.link&&_()}function B(){e.item.link&&_()}return(w,R)=>{const W=j("VPSidebarItem",!0);return a(),$(F(b.value),{class:M(["VPSidebarItem",S.value])},{default:v(()=>[w.item.text?(a(),i("div",Z({key:0,class:"item",role:C.value},Ze(w.item.items?{click:N,keydown:N}:{},!0),{tabindex:w.item.items&&0}),[Wr,w.item.link?(a(),$(x,{key:0,tag:V.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:v(()=>[(a(),$(F(y.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(F(y.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:Xe(B,["enter"]),tabindex:"0"},[h(ge,{class:"caret-icon"})],40,Yr)):f("",!0)],16,qr)):f("",!0),w.item.items&&w.item.items.length?(a(),i("div",Jr,[w.depth<5?(a(!0),i(I,{key:0},H(w.item.items,K=>(a(),$(W,{key:K.text,item:K,depth:w.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Zr=m(Xr,[["__scopeId","data-v-1a4376dd"]]),ze=s=>(z("data-v-38384e3a"),s=s(),D(),s),Qr=ze(()=>c("div",{class:"curtain"},null,-1)),el={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},tl=ze(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),sl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=E(),n=s,o=T(null),r=Me(q?document.body:null);return U([n,o],()=>{var d;n.open?(r.value=!0,(d=o.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"}),(d,p)=>l(t)?(a(),i("aside",{key:0,class:M(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Qe(()=>{},["stop"]))},[Qr,c("nav",el,[tl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(I,null,H(l(e),_=>(a(),i("div",{key:_.text,class:"group"},[h(Zr,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const nl=m(sl,[["__scopeId","data-v-38384e3a"]]),ol=g({__name:"VPSkipLink",setup(s){const e=se(),t=T();U(()=>e.path,()=>t.value.focus());function n({target:o}){const r=document.getElementById(decodeURIComponent(o.hash).slice(1));if(r){const d=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",d)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",d),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(a(),i(I,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const al=m(ol,[["__scopeId","data-v-abdaa7b4"]]),rl=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=E(),o=se();U(()=>o.path,n),$t(e,n);const{frontmatter:r}=P(),d=et(),p=k(()=>!!d["home-hero-image"]);return Te("hero-image-slot-exists",p),(_,b)=>{const V=j("Content");return l(r).layout!==!1?(a(),i("div",{key:0,class:M(["Layout",l(r).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(al),h(at,{class:"backdrop",show:l(e),onClick:l(n)},null,8,["show","onClick"]),h(Rr,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Qn,{open:l(e),onOpenMenu:l(t)},null,8,["open","onOpenMenu"]),h(nl,{open:l(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Cn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(xn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(V,{key:1}))}}});const ll=m(rl,[["__scopeId","data-v-8574ffd1"]]),il={},cl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ul=c("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),dl=[ul];function _l(s,e){return a(),i("svg",cl,dl)}const vl=m(il,[["render",_l]]);const pl={class:"profile"},hl={class:"avatar"},fl=["src","alt"],ml={class:"data"},gl={class:"name"},bl={key:0,class:"affiliation"},$l={key:0,class:"title"},kl={key:1,class:"at"},yl=["innerHTML"],Pl={key:2,class:"links"},Vl={key:0,class:"sp"},wl=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(s){return(e,t)=>(a(),i("article",{class:M(["VPTeamMembersItem",[e.size]])},[c("div",pl,[c("figure",hl,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,fl)]),c("div",ml,[c("h1",gl,L(e.member.name),1),e.member.title||e.member.org?(a(),i("p",bl,[e.member.title?(a(),i("span",$l,L(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(a(),i("span",kl," @ ")):f("",!0),e.member.org?(a(),$(x,{key:2,class:M(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:v(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(a(),i("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,yl)):f("",!0),e.member.links?(a(),i("div",Pl,[h(ae,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(a(),i("div",Vl,[h(x,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:v(()=>[h(vl,{class:"sp-icon"}),A(" Sponsor ")]),_:1},8,["href"])])):f("",!0)],2))}});const Ll=m(wl,[["__scopeId","data-v-7cfb1dae"]]),Sl={class:"container"},Ml=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(s){const e=s,t=k(()=>[e.size,`count-${e.members.length}`]);return(n,o)=>(a(),i("div",{class:M(["VPTeamMembers",t.value])},[c("div",Sl,[(a(!0),i(I,null,H(n.members,r=>(a(),i("div",{key:r.name,class:"item"},[h(Ll,{size:n.size,member:r},null,8,["size","member"])]))),128))])],2))}});const Cl=m(Ml,[["__scopeId","data-v-08f54381"]]),Nl={Layout:ll,enhanceApp:({app:s})=>{s.component("Badge",st)}};class Bl{constructor(e=10){re(this,"max");re(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}export{Bl as L,Cl as V,Na as c,Nl as t,P as u};
diff --git a/assets/docs_contribute_codegen.md.038d4799.js b/assets/docs_contribute_codegen.md.5da044b1.js
similarity index 89%
rename from assets/docs_contribute_codegen.md.038d4799.js
rename to assets/docs_contribute_codegen.md.5da044b1.js
index 65e90dc62b..3117217503 100644
--- a/assets/docs_contribute_codegen.md.038d4799.js
+++ b/assets/docs_contribute_codegen.md.5da044b1.js
@@ -1 +1 @@
-import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"docs/contribute/codegen.md","filePath":"docs/contribute/codegen.md","lastUpdated":1701052174000}'),c={name:"docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default};
+import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"docs/contribute/codegen.md","filePath":"docs/contribute/codegen.md","lastUpdated":1701053760000}'),c={name:"docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default};
diff --git a/assets/docs_contribute_codegen.md.038d4799.lean.js b/assets/docs_contribute_codegen.md.5da044b1.lean.js
similarity index 89%
rename from assets/docs_contribute_codegen.md.038d4799.lean.js
rename to assets/docs_contribute_codegen.md.5da044b1.lean.js
index 65e90dc62b..3117217503 100644
--- a/assets/docs_contribute_codegen.md.038d4799.lean.js
+++ b/assets/docs_contribute_codegen.md.5da044b1.lean.js
@@ -1 +1 @@
-import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"docs/contribute/codegen.md","filePath":"docs/contribute/codegen.md","lastUpdated":1701052174000}'),c={name:"docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default};
+import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"docs/contribute/codegen.md","filePath":"docs/contribute/codegen.md","lastUpdated":1701053760000}'),c={name:"docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default};
diff --git a/assets/docs_contribute_development.md.260bd01b.js b/assets/docs_contribute_development.md.5b7d3e4f.js
similarity index 99%
rename from assets/docs_contribute_development.md.260bd01b.js
rename to assets/docs_contribute_development.md.5b7d3e4f.js
index 43d7b24d5d..d7335ffbd0 100644
--- a/assets/docs_contribute_development.md.260bd01b.js
+++ b/assets/docs_contribute_development.md.5b7d3e4f.js
@@ -1 +1 @@
-import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"docs/contribute/development.md","filePath":"docs/contribute/development.md","lastUpdated":1701052174000}'),t={name:"docs/contribute/development.md"},l=o('

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

',26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"docs/contribute/development.md","filePath":"docs/contribute/development.md","lastUpdated":1701053760000}'),t={name:"docs/contribute/development.md"},l=o('

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

',26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; diff --git a/assets/docs_contribute_development.md.260bd01b.lean.js b/assets/docs_contribute_development.md.5b7d3e4f.lean.js similarity index 87% rename from assets/docs_contribute_development.md.260bd01b.lean.js rename to assets/docs_contribute_development.md.5b7d3e4f.lean.js index a317f56eae..179eccb810 100644 --- a/assets/docs_contribute_development.md.260bd01b.lean.js +++ b/assets/docs_contribute_development.md.5b7d3e4f.lean.js @@ -1 +1 @@ -import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"docs/contribute/development.md","filePath":"docs/contribute/development.md","lastUpdated":1701052174000}'),t={name:"docs/contribute/development.md"},l=o("",26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"docs/contribute/development.md","filePath":"docs/contribute/development.md","lastUpdated":1701053760000}'),t={name:"docs/contribute/development.md"},l=o("",26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; diff --git a/assets/docs_contribute_formatter.md.c3e52bdc.js b/assets/docs_contribute_formatter.md.d7a59564.js similarity index 94% rename from assets/docs_contribute_formatter.md.c3e52bdc.js rename to assets/docs_contribute_formatter.md.d7a59564.js index 2c58f405cb..7460dad7cd 100644 --- a/assets/docs_contribute_formatter.md.c3e52bdc.js +++ b/assets/docs_contribute_formatter.md.d7a59564.js @@ -1 +1 @@ -import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/formatter.md","filePath":"docs/contribute/formatter.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/formatter.md","filePath":"docs/contribute/formatter.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; diff --git a/assets/docs_contribute_formatter.md.c3e52bdc.lean.js b/assets/docs_contribute_formatter.md.d7a59564.lean.js similarity index 94% rename from assets/docs_contribute_formatter.md.c3e52bdc.lean.js rename to assets/docs_contribute_formatter.md.d7a59564.lean.js index 2c58f405cb..7460dad7cd 100644 --- a/assets/docs_contribute_formatter.md.c3e52bdc.lean.js +++ b/assets/docs_contribute_formatter.md.d7a59564.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/formatter.md","filePath":"docs/contribute/formatter.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/formatter.md","filePath":"docs/contribute/formatter.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; diff --git a/assets/docs_contribute_introduction.md.b8b3797b.js b/assets/docs_contribute_introduction.md.5c1fbb9f.js similarity index 98% rename from assets/docs_contribute_introduction.md.b8b3797b.js rename to assets/docs_contribute_introduction.md.5c1fbb9f.js index ec0824cbad..0e8b67eb87 100644 --- a/assets/docs_contribute_introduction.md.b8b3797b.js +++ b/assets/docs_contribute_introduction.md.5c1fbb9f.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/contribute/introduction.md","filePath":"docs/contribute/introduction.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/introduction.md"},n=o('

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
',13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/contribute/introduction.md","filePath":"docs/contribute/introduction.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/introduction.md"},n=o('

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
',13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/docs_contribute_introduction.md.b8b3797b.lean.js b/assets/docs_contribute_introduction.md.5c1fbb9f.lean.js similarity index 87% rename from assets/docs_contribute_introduction.md.b8b3797b.lean.js rename to assets/docs_contribute_introduction.md.5c1fbb9f.lean.js index 56bbcdfec7..4ce80fbd83 100644 --- a/assets/docs_contribute_introduction.md.b8b3797b.lean.js +++ b/assets/docs_contribute_introduction.md.5c1fbb9f.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/contribute/introduction.md","filePath":"docs/contribute/introduction.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/introduction.md"},n=o("",13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/contribute/introduction.md","filePath":"docs/contribute/introduction.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/introduction.md"},n=o("",13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/docs_contribute_linter.md.b1685e29.js b/assets/docs_contribute_linter.md.15e43eac.js similarity index 98% rename from assets/docs_contribute_linter.md.b1685e29.js rename to assets/docs_contribute_linter.md.15e43eac.js index 7b29fcd0a6..0bfb4ad9a9 100644 --- a/assets/docs_contribute_linter.md.b1685e29.js +++ b/assets/docs_contribute_linter.md.15e43eac.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/linter.md","filePath":"docs/contribute/linter.md","lastUpdated":1701052174000}'),l={name:"docs/contribute/linter.md"},o=e(`

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/linter.md","filePath":"docs/contribute/linter.md","lastUpdated":1701053760000}'),l={name:"docs/contribute/linter.md"},o=e(`

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
 just new-ts-rule name
 just new-unicorn-rule name
 just new-react-rule name
diff --git a/assets/docs_contribute_linter.md.b1685e29.lean.js b/assets/docs_contribute_linter.md.15e43eac.lean.js
similarity index 86%
rename from assets/docs_contribute_linter.md.b1685e29.lean.js
rename to assets/docs_contribute_linter.md.15e43eac.lean.js
index 007557fe5a..66088ee24c 100644
--- a/assets/docs_contribute_linter.md.b1685e29.lean.js
+++ b/assets/docs_contribute_linter.md.15e43eac.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/linter.md","filePath":"docs/contribute/linter.md","lastUpdated":1701052174000}'),l={name:"docs/contribute/linter.md"},o=e("",11),t=[o];function p(r,c,i,d,y,u){return a(),n("div",null,t)}const F=s(l,[["render",p]]);export{h as __pageData,F as default};
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/contribute/linter.md","filePath":"docs/contribute/linter.md","lastUpdated":1701053760000}'),l={name:"docs/contribute/linter.md"},o=e("",11),t=[o];function p(r,c,i,d,y,u){return a(),n("div",null,t)}const F=s(l,[["render",p]]);export{h as __pageData,F as default};
diff --git a/assets/docs_contribute_minifier.md.8673c15a.js b/assets/docs_contribute_minifier.md.15260fdc.js
similarity index 96%
rename from assets/docs_contribute_minifier.md.8673c15a.js
rename to assets/docs_contribute_minifier.md.15260fdc.js
index 024058a631..9a7bee6c01 100644
--- a/assets/docs_contribute_minifier.md.8673c15a.js
+++ b/assets/docs_contribute_minifier.md.15260fdc.js
@@ -1 +1 @@
-import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/minifier.md","filePath":"docs/contribute/minifier.md","lastUpdated":1701052174000}'),r={name:"docs/contribute/minifier.md"},a=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[a,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(r,[["render",m]]);export{g as __pageData,v as default};
+import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/minifier.md","filePath":"docs/contribute/minifier.md","lastUpdated":1701053760000}'),r={name:"docs/contribute/minifier.md"},a=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[a,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(r,[["render",m]]);export{g as __pageData,v as default};
diff --git a/assets/docs_contribute_minifier.md.8673c15a.lean.js b/assets/docs_contribute_minifier.md.15260fdc.lean.js
similarity index 96%
rename from assets/docs_contribute_minifier.md.8673c15a.lean.js
rename to assets/docs_contribute_minifier.md.15260fdc.lean.js
index 024058a631..9a7bee6c01 100644
--- a/assets/docs_contribute_minifier.md.8673c15a.lean.js
+++ b/assets/docs_contribute_minifier.md.15260fdc.lean.js
@@ -1 +1 @@
-import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/minifier.md","filePath":"docs/contribute/minifier.md","lastUpdated":1701052174000}'),r={name:"docs/contribute/minifier.md"},a=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[a,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(r,[["render",m]]);export{g as __pageData,v as default};
+import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/minifier.md","filePath":"docs/contribute/minifier.md","lastUpdated":1701053760000}'),r={name:"docs/contribute/minifier.md"},a=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[a,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(r,[["render",m]]);export{g as __pageData,v as default};
diff --git a/assets/docs_contribute_parser.md.dea12757.js b/assets/docs_contribute_parser.md.bb1bc2fa.js
similarity index 97%
rename from assets/docs_contribute_parser.md.dea12757.js
rename to assets/docs_contribute_parser.md.bb1bc2fa.js
index ab6a73980d..af29fd1bc6 100644
--- a/assets/docs_contribute_parser.md.dea12757.js
+++ b/assets/docs_contribute_parser.md.bb1bc2fa.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/contribute/parser.md","filePath":"docs/contribute/parser.md","lastUpdated":1701052174000}'),s={name:"docs/contribute/parser.md"},o=r('

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

',13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/contribute/parser.md","filePath":"docs/contribute/parser.md","lastUpdated":1701053760000}'),s={name:"docs/contribute/parser.md"},o=r('

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

',13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/docs_contribute_parser.md.dea12757.lean.js b/assets/docs_contribute_parser.md.bb1bc2fa.lean.js similarity index 86% rename from assets/docs_contribute_parser.md.dea12757.lean.js rename to assets/docs_contribute_parser.md.bb1bc2fa.lean.js index 19a61d0bc0..4982223782 100644 --- a/assets/docs_contribute_parser.md.dea12757.lean.js +++ b/assets/docs_contribute_parser.md.bb1bc2fa.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/contribute/parser.md","filePath":"docs/contribute/parser.md","lastUpdated":1701052174000}'),s={name:"docs/contribute/parser.md"},o=r("",13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/contribute/parser.md","filePath":"docs/contribute/parser.md","lastUpdated":1701053760000}'),s={name:"docs/contribute/parser.md"},o=r("",13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/docs_contribute_performance.md.32708dc6.js b/assets/docs_contribute_performance.md.4ff20e3f.js similarity index 99% rename from assets/docs_contribute_performance.md.32708dc6.js rename to assets/docs_contribute_performance.md.4ff20e3f.js index c3919af841..3e83a32b8a 100644 --- a/assets/docs_contribute_performance.md.32708dc6.js +++ b/assets/docs_contribute_performance.md.4ff20e3f.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/contribute/performance.md","filePath":"docs/contribute/performance.md","lastUpdated":1701052174000}'),o={name:"docs/contribute/performance.md"},l=n(`

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
+import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/contribute/performance.md","filePath":"docs/contribute/performance.md","lastUpdated":1701053760000}'),o={name:"docs/contribute/performance.md"},l=n(`

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
 debug = 1 # debug info with line tables only
 strip = false # do not strip symbols
[profile.release]
 debug = 1 # debug info with line tables only
diff --git a/assets/docs_contribute_performance.md.32708dc6.lean.js b/assets/docs_contribute_performance.md.4ff20e3f.lean.js
similarity index 87%
rename from assets/docs_contribute_performance.md.32708dc6.lean.js
rename to assets/docs_contribute_performance.md.4ff20e3f.lean.js
index 4185fcbb3c..d31174e4df 100644
--- a/assets/docs_contribute_performance.md.32708dc6.lean.js
+++ b/assets/docs_contribute_performance.md.4ff20e3f.lean.js
@@ -1 +1 @@
-import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/contribute/performance.md","filePath":"docs/contribute/performance.md","lastUpdated":1701052174000}'),o={name:"docs/contribute/performance.md"},l=n("",22),p=[l];function t(c,r,i,d,y,u){return e(),a("div",null,p)}const m=s(o,[["render",t]]);export{E as __pageData,m as default};
+import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/contribute/performance.md","filePath":"docs/contribute/performance.md","lastUpdated":1701053760000}'),o={name:"docs/contribute/performance.md"},l=n("",22),p=[l];function t(c,r,i,d,y,u){return e(),a("div",null,p)}const m=s(o,[["render",t]]);export{E as __pageData,m as default};
diff --git a/assets/docs_contribute_prettier.md.ed67e286.js b/assets/docs_contribute_prettier.md.d0e1731d.js
similarity index 89%
rename from assets/docs_contribute_prettier.md.ed67e286.js
rename to assets/docs_contribute_prettier.md.d0e1731d.js
index 896927ca38..8f6b74b5fb 100644
--- a/assets/docs_contribute_prettier.md.ed67e286.js
+++ b/assets/docs_contribute_prettier.md.d0e1731d.js
@@ -1 +1 @@
-import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/prettier.md","filePath":"docs/contribute/prettier.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default};
+import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/prettier.md","filePath":"docs/contribute/prettier.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default};
diff --git a/assets/docs_contribute_prettier.md.ed67e286.lean.js b/assets/docs_contribute_prettier.md.d0e1731d.lean.js
similarity index 89%
rename from assets/docs_contribute_prettier.md.ed67e286.lean.js
rename to assets/docs_contribute_prettier.md.d0e1731d.lean.js
index 896927ca38..8f6b74b5fb 100644
--- a/assets/docs_contribute_prettier.md.ed67e286.lean.js
+++ b/assets/docs_contribute_prettier.md.d0e1731d.lean.js
@@ -1 +1 @@
-import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/prettier.md","filePath":"docs/contribute/prettier.md","lastUpdated":1701052174000}'),i={name:"docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default};
+import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"docs/contribute/prettier.md","filePath":"docs/contribute/prettier.md","lastUpdated":1701053760000}'),i={name:"docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default};
diff --git a/assets/docs_contribute_resolver.md.668d9bbb.js b/assets/docs_contribute_resolver.md.841f60b8.js
similarity index 94%
rename from assets/docs_contribute_resolver.md.668d9bbb.js
rename to assets/docs_contribute_resolver.md.841f60b8.js
index b1ba73f37b..15d9d30d54 100644
--- a/assets/docs_contribute_resolver.md.668d9bbb.js
+++ b/assets/docs_contribute_resolver.md.841f60b8.js
@@ -1 +1 @@
-import{_ as o,o as r,c as t,k as e,a as s}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/contribute/resolver.md","filePath":"docs/contribute/resolver.md","lastUpdated":1701052174000}'),a={name:"docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[s("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(a,[["render",d]]);export{b as __pageData,k as default};
+import{_ as o,o as r,c as t,k as e,a as s}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/contribute/resolver.md","filePath":"docs/contribute/resolver.md","lastUpdated":1701053760000}'),a={name:"docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[s("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(a,[["render",d]]);export{b as __pageData,k as default};
diff --git a/assets/docs_contribute_resolver.md.668d9bbb.lean.js b/assets/docs_contribute_resolver.md.841f60b8.lean.js
similarity index 94%
rename from assets/docs_contribute_resolver.md.668d9bbb.lean.js
rename to assets/docs_contribute_resolver.md.841f60b8.lean.js
index b1ba73f37b..15d9d30d54 100644
--- a/assets/docs_contribute_resolver.md.668d9bbb.lean.js
+++ b/assets/docs_contribute_resolver.md.841f60b8.lean.js
@@ -1 +1 @@
-import{_ as o,o as r,c as t,k as e,a as s}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/contribute/resolver.md","filePath":"docs/contribute/resolver.md","lastUpdated":1701052174000}'),a={name:"docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[s("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(a,[["render",d]]);export{b as __pageData,k as default};
+import{_ as o,o as r,c as t,k as e,a as s}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/contribute/resolver.md","filePath":"docs/contribute/resolver.md","lastUpdated":1701053760000}'),a={name:"docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[s("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(a,[["render",d]]);export{b as __pageData,k as default};
diff --git a/assets/docs_contribute_showcase.md.04c27e6a.js b/assets/docs_contribute_showcase.md.030540b5.js
similarity index 93%
rename from assets/docs_contribute_showcase.md.04c27e6a.js
rename to assets/docs_contribute_showcase.md.030540b5.js
index c23410c4f8..95438ad654 100644
--- a/assets/docs_contribute_showcase.md.04c27e6a.js
+++ b/assets/docs_contribute_showcase.md.030540b5.js
@@ -1 +1 @@
-import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"docs/contribute/showcase.md","filePath":"docs/contribute/showcase.md","lastUpdated":1701052174000}'),c={name:"docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default};
+import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"docs/contribute/showcase.md","filePath":"docs/contribute/showcase.md","lastUpdated":1701053760000}'),c={name:"docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default};
diff --git a/assets/docs_contribute_showcase.md.04c27e6a.lean.js b/assets/docs_contribute_showcase.md.030540b5.lean.js
similarity index 93%
rename from assets/docs_contribute_showcase.md.04c27e6a.lean.js
rename to assets/docs_contribute_showcase.md.030540b5.lean.js
index c23410c4f8..95438ad654 100644
--- a/assets/docs_contribute_showcase.md.04c27e6a.lean.js
+++ b/assets/docs_contribute_showcase.md.030540b5.lean.js
@@ -1 +1 @@
-import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"docs/contribute/showcase.md","filePath":"docs/contribute/showcase.md","lastUpdated":1701052174000}'),c={name:"docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default};
+import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"docs/contribute/showcase.md","filePath":"docs/contribute/showcase.md","lastUpdated":1701053760000}'),c={name:"docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default};
diff --git a/assets/docs_contribute_transformer.md.d026b587.js b/assets/docs_contribute_transformer.md.16592f8f.js
similarity index 93%
rename from assets/docs_contribute_transformer.md.d026b587.js
rename to assets/docs_contribute_transformer.md.16592f8f.js
index 21cc671afc..84288bd520 100644
--- a/assets/docs_contribute_transformer.md.d026b587.js
+++ b/assets/docs_contribute_transformer.md.16592f8f.js
@@ -1 +1 @@
-import{_ as t,o,c as s,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/contribute/transformer.md","filePath":"docs/contribute/transformer.md","lastUpdated":1701052174000}'),a={name:"docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),s("div",null,i)}const x=t(a,[["render",l]]);export{b as __pageData,x as default};
+import{_ as t,o,c as s,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/contribute/transformer.md","filePath":"docs/contribute/transformer.md","lastUpdated":1701053760000}'),a={name:"docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),s("div",null,i)}const x=t(a,[["render",l]]);export{b as __pageData,x as default};
diff --git a/assets/docs_contribute_transformer.md.d026b587.lean.js b/assets/docs_contribute_transformer.md.16592f8f.lean.js
similarity index 93%
rename from assets/docs_contribute_transformer.md.d026b587.lean.js
rename to assets/docs_contribute_transformer.md.16592f8f.lean.js
index 21cc671afc..84288bd520 100644
--- a/assets/docs_contribute_transformer.md.d026b587.lean.js
+++ b/assets/docs_contribute_transformer.md.16592f8f.lean.js
@@ -1 +1 @@
-import{_ as t,o,c as s,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/contribute/transformer.md","filePath":"docs/contribute/transformer.md","lastUpdated":1701052174000}'),a={name:"docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),s("div",null,i)}const x=t(a,[["render",l]]);export{b as __pageData,x as default};
+import{_ as t,o,c as s,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/contribute/transformer.md","filePath":"docs/contribute/transformer.md","lastUpdated":1701053760000}'),a={name:"docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),s("div",null,i)}const x=t(a,[["render",l]]);export{b as __pageData,x as default};
diff --git a/assets/docs_contribute_vscode.md.dfac2403.js b/assets/docs_contribute_vscode.md.4c08a98c.js
similarity index 95%
rename from assets/docs_contribute_vscode.md.dfac2403.js
rename to assets/docs_contribute_vscode.md.4c08a98c.js
index 98a1e30ea4..81274ab70f 100644
--- a/assets/docs_contribute_vscode.md.dfac2403.js
+++ b/assets/docs_contribute_vscode.md.4c08a98c.js
@@ -1 +1 @@
-import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"docs/contribute/vscode.md","filePath":"docs/contribute/vscode.md","lastUpdated":1701052174000}'),n={name:"docs/contribute/vscode.md"},i=d('

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
',4),c=[i];function a(s,l,r,p,_,u){return o(),t("div",null,c)}const x=e(n,[["render",a]]);export{h as __pageData,x as default}; +import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"docs/contribute/vscode.md","filePath":"docs/contribute/vscode.md","lastUpdated":1701053760000}'),n={name:"docs/contribute/vscode.md"},i=d('

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
',4),c=[i];function a(s,l,r,p,_,u){return o(),t("div",null,c)}const x=e(n,[["render",a]]);export{h as __pageData,x as default}; diff --git a/assets/docs_contribute_vscode.md.dfac2403.lean.js b/assets/docs_contribute_vscode.md.4c08a98c.lean.js similarity index 86% rename from assets/docs_contribute_vscode.md.dfac2403.lean.js rename to assets/docs_contribute_vscode.md.4c08a98c.lean.js index 7626923b1b..ebe3428402 100644 --- a/assets/docs_contribute_vscode.md.dfac2403.lean.js +++ b/assets/docs_contribute_vscode.md.4c08a98c.lean.js @@ -1 +1 @@ -import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"docs/contribute/vscode.md","filePath":"docs/contribute/vscode.md","lastUpdated":1701052174000}'),n={name:"docs/contribute/vscode.md"},i=d("",4),c=[i];function a(s,l,r,p,_,u){return o(),t("div",null,c)}const x=e(n,[["render",a]]);export{h as __pageData,x as default}; +import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"docs/contribute/vscode.md","filePath":"docs/contribute/vscode.md","lastUpdated":1701053760000}'),n={name:"docs/contribute/vscode.md"},i=d("",4),c=[i];function a(s,l,r,p,_,u){return o(),t("div",null,c)}const x=e(n,[["render",a]]);export{h as __pageData,x as default}; diff --git a/assets/docs_guide_benchmarks.md.426cf9b1.js b/assets/docs_guide_benchmarks.md.f62b4c74.js similarity index 90% rename from assets/docs_guide_benchmarks.md.426cf9b1.js rename to assets/docs_guide_benchmarks.md.f62b4c74.js index f5c86c96ac..7eeed2370b 100644 --- a/assets/docs_guide_benchmarks.md.426cf9b1.js +++ b/assets/docs_guide_benchmarks.md.f62b4c74.js @@ -1 +1 @@ -import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/benchmarks.md","filePath":"docs/guide/benchmarks.md","lastUpdated":1701052174000}'),r={name:"docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; +import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/benchmarks.md","filePath":"docs/guide/benchmarks.md","lastUpdated":1701053760000}'),r={name:"docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/docs_guide_benchmarks.md.426cf9b1.lean.js b/assets/docs_guide_benchmarks.md.f62b4c74.lean.js similarity index 90% rename from assets/docs_guide_benchmarks.md.426cf9b1.lean.js rename to assets/docs_guide_benchmarks.md.f62b4c74.lean.js index f5c86c96ac..7eeed2370b 100644 --- a/assets/docs_guide_benchmarks.md.426cf9b1.lean.js +++ b/assets/docs_guide_benchmarks.md.f62b4c74.lean.js @@ -1 +1 @@ -import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/benchmarks.md","filePath":"docs/guide/benchmarks.md","lastUpdated":1701052174000}'),r={name:"docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; +import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/benchmarks.md","filePath":"docs/guide/benchmarks.md","lastUpdated":1701053760000}'),r={name:"docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/docs_guide_introduction.md.138c6418.js b/assets/docs_guide_introduction.md.62db88d2.js similarity index 93% rename from assets/docs_guide_introduction.md.138c6418.js rename to assets/docs_guide_introduction.md.62db88d2.js index 6c51416ba1..460103ae76 100644 --- a/assets/docs_guide_introduction.md.138c6418.js +++ b/assets/docs_guide_introduction.md.62db88d2.js @@ -1 +1 @@ -import{V as a}from"./chunks/theme.996dd6ef.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i('

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

',8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/guide/introduction.md","filePath":"docs/guide/introduction.md","lastUpdated":1701052174000}'),l={name:"docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; +import{V as a}from"./chunks/theme.be7b3ccb.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i('

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

',8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/guide/introduction.md","filePath":"docs/guide/introduction.md","lastUpdated":1701053760000}'),l={name:"docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; diff --git a/assets/docs_guide_introduction.md.138c6418.lean.js b/assets/docs_guide_introduction.md.62db88d2.lean.js similarity index 79% rename from assets/docs_guide_introduction.md.138c6418.lean.js rename to assets/docs_guide_introduction.md.62db88d2.lean.js index 5915ca3d11..f456c7d2d0 100644 --- a/assets/docs_guide_introduction.md.138c6418.lean.js +++ b/assets/docs_guide_introduction.md.62db88d2.lean.js @@ -1 +1 @@ -import{V as a}from"./chunks/theme.996dd6ef.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i("",8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/guide/introduction.md","filePath":"docs/guide/introduction.md","lastUpdated":1701052174000}'),l={name:"docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; +import{V as a}from"./chunks/theme.be7b3ccb.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i("",8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/guide/introduction.md","filePath":"docs/guide/introduction.md","lastUpdated":1701053760000}'),l={name:"docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; diff --git a/assets/docs_guide_philosophy.md.d9540af9.js b/assets/docs_guide_philosophy.md.2be5f5f9.js similarity index 90% rename from assets/docs_guide_philosophy.md.d9540af9.js rename to assets/docs_guide_philosophy.md.2be5f5f9.js index 85a22442b8..20953bbb51 100644 --- a/assets/docs_guide_philosophy.md.d9540af9.js +++ b/assets/docs_guide_philosophy.md.2be5f5f9.js @@ -1 +1 @@ -import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/philosophy.md","filePath":"docs/guide/philosophy.md","lastUpdated":1701052174000}'),i={name:"docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; +import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/philosophy.md","filePath":"docs/guide/philosophy.md","lastUpdated":1701053760000}'),i={name:"docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; diff --git a/assets/docs_guide_philosophy.md.d9540af9.lean.js b/assets/docs_guide_philosophy.md.2be5f5f9.lean.js similarity index 90% rename from assets/docs_guide_philosophy.md.d9540af9.lean.js rename to assets/docs_guide_philosophy.md.2be5f5f9.lean.js index 85a22442b8..20953bbb51 100644 --- a/assets/docs_guide_philosophy.md.d9540af9.lean.js +++ b/assets/docs_guide_philosophy.md.2be5f5f9.lean.js @@ -1 +1 @@ -import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/philosophy.md","filePath":"docs/guide/philosophy.md","lastUpdated":1701052174000}'),i={name:"docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; +import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/philosophy.md","filePath":"docs/guide/philosophy.md","lastUpdated":1701053760000}'),i={name:"docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; diff --git a/assets/docs_guide_usage_benchmarks.md.cf30d29b.js b/assets/docs_guide_usage_benchmarks.md.64291503.js similarity index 80% rename from assets/docs_guide_usage_benchmarks.md.cf30d29b.js rename to assets/docs_guide_usage_benchmarks.md.64291503.js index 74b8d25759..b18aa1cda5 100644 --- a/assets/docs_guide_usage_benchmarks.md.cf30d29b.js +++ b/assets/docs_guide_usage_benchmarks.md.64291503.js @@ -1 +1 @@ -import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/benchmarks.md","filePath":"docs/guide/usage/benchmarks.md","lastUpdated":1701052174000}'),c={name:"docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; +import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/benchmarks.md","filePath":"docs/guide/usage/benchmarks.md","lastUpdated":1701053760000}'),c={name:"docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/docs_guide_usage_benchmarks.md.cf30d29b.lean.js b/assets/docs_guide_usage_benchmarks.md.64291503.lean.js similarity index 80% rename from assets/docs_guide_usage_benchmarks.md.cf30d29b.lean.js rename to assets/docs_guide_usage_benchmarks.md.64291503.lean.js index 74b8d25759..b18aa1cda5 100644 --- a/assets/docs_guide_usage_benchmarks.md.cf30d29b.lean.js +++ b/assets/docs_guide_usage_benchmarks.md.64291503.lean.js @@ -1 +1 @@ -import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/benchmarks.md","filePath":"docs/guide/usage/benchmarks.md","lastUpdated":1701052174000}'),c={name:"docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; +import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/benchmarks.md","filePath":"docs/guide/usage/benchmarks.md","lastUpdated":1701053760000}'),c={name:"docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/docs_guide_usage_linter.md.be302645.js b/assets/docs_guide_usage_linter.md.45344b17.js similarity index 95% rename from assets/docs_guide_usage_linter.md.be302645.js rename to assets/docs_guide_usage_linter.md.45344b17.js index fffd85b478..7d094bf114 100644 --- a/assets/docs_guide_usage_linter.md.be302645.js +++ b/assets/docs_guide_usage_linter.md.45344b17.js @@ -1,4 +1,4 @@ -import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"docs/guide/usage/linter.md","filePath":"docs/guide/usage/linter.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/linter.md"},c=p(`

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
+import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"docs/guide/usage/linter.md","filePath":"docs/guide/usage/linter.md","lastUpdated":1701053760000}'),t={name:"docs/guide/usage/linter.md"},c=p(`

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
   "languageserver": {
     "oxc": {
       "command": "oxc_vscode",
@@ -74,4 +74,4 @@ import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b0
     PATH                      Single file, single path or list of paths
 
 Available options:
-    -h, --help                Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
`,29);function r(i,d,y,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const F=a(t,[["render",r]]);export{b as __pageData,F as default}; + -h, --help Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
`,29);function r(i,d,y,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const m=a(t,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/docs_guide_usage_linter.md.be302645.lean.js b/assets/docs_guide_usage_linter.md.45344b17.lean.js similarity index 75% rename from assets/docs_guide_usage_linter.md.be302645.lean.js rename to assets/docs_guide_usage_linter.md.45344b17.lean.js index 006a7d16d9..57dd95731a 100644 --- a/assets/docs_guide_usage_linter.md.be302645.lean.js +++ b/assets/docs_guide_usage_linter.md.45344b17.lean.js @@ -1 +1 @@ -import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"docs/guide/usage/linter.md","filePath":"docs/guide/usage/linter.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/linter.md"},c=p("",29);function r(i,d,y,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const F=a(t,[["render",r]]);export{b as __pageData,F as default}; +import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"docs/guide/usage/linter.md","filePath":"docs/guide/usage/linter.md","lastUpdated":1701053760000}'),t={name:"docs/guide/usage/linter.md"},c=p("",29);function r(i,d,y,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const m=a(t,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/docs_guide_usage_parser.md.a90d6882.js b/assets/docs_guide_usage_parser.md.879fa23a.js similarity index 93% rename from assets/docs_guide_usage_parser.md.a90d6882.js rename to assets/docs_guide_usage_parser.md.879fa23a.js index d65162cec8..c319858687 100644 --- a/assets/docs_guide_usage_parser.md.a90d6882.js +++ b/assets/docs_guide_usage_parser.md.879fa23a.js @@ -1 +1 @@ -import{_ as a,C as e,o as l,c as p,H as o,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/parser.md","filePath":"docs/guide/usage/parser.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/parser.md"},r=n('

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
',14);function c(i,d,y,E,h,F){const s=e("AppBadgeList");return l(),p("div",null,[o(s),r])}const b=a(t,[["render",c]]);export{g as __pageData,b as default}; +import{_ as a,C as e,o as l,c as p,H as o,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/parser.md","filePath":"docs/guide/usage/parser.md","lastUpdated":1701053760000}'),r={name:"docs/guide/usage/parser.md"},t=n('

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
',14);function c(i,d,y,E,h,u){const s=e("AppBadgeList");return l(),p("div",null,[o(s),t])}const b=a(r,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/docs_guide_usage_parser.md.a90d6882.lean.js b/assets/docs_guide_usage_parser.md.879fa23a.lean.js similarity index 56% rename from assets/docs_guide_usage_parser.md.a90d6882.lean.js rename to assets/docs_guide_usage_parser.md.879fa23a.lean.js index 18ed997529..2f7d7ed510 100644 --- a/assets/docs_guide_usage_parser.md.a90d6882.lean.js +++ b/assets/docs_guide_usage_parser.md.879fa23a.lean.js @@ -1 +1 @@ -import{_ as a,C as e,o as l,c as p,H as o,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/parser.md","filePath":"docs/guide/usage/parser.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/parser.md"},r=n("",14);function c(i,d,y,E,h,F){const s=e("AppBadgeList");return l(),p("div",null,[o(s),r])}const b=a(t,[["render",c]]);export{g as __pageData,b as default}; +import{_ as a,C as e,o as l,c as p,H as o,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/parser.md","filePath":"docs/guide/usage/parser.md","lastUpdated":1701053760000}'),r={name:"docs/guide/usage/parser.md"},t=n("",14);function c(i,d,y,E,h,u){const s=e("AppBadgeList");return l(),p("div",null,[o(s),t])}const b=a(r,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/docs_guide_usage_philosophy.md.7fb423b5.js b/assets/docs_guide_usage_philosophy.md.57f130a7.js similarity index 80% rename from assets/docs_guide_usage_philosophy.md.7fb423b5.js rename to assets/docs_guide_usage_philosophy.md.57f130a7.js index 6519dc186e..1adceccfeb 100644 --- a/assets/docs_guide_usage_philosophy.md.7fb423b5.js +++ b/assets/docs_guide_usage_philosophy.md.57f130a7.js @@ -1 +1 @@ -import{_ as o,o as s,c as a,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/philosophy.md","filePath":"docs/guide/usage/philosophy.md","lastUpdated":1701052174000}'),i={name:"docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return s(),a("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; +import{_ as o,o as s,c as a,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/philosophy.md","filePath":"docs/guide/usage/philosophy.md","lastUpdated":1701053760000}'),i={name:"docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return s(),a("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/docs_guide_usage_philosophy.md.7fb423b5.lean.js b/assets/docs_guide_usage_philosophy.md.57f130a7.lean.js similarity index 80% rename from assets/docs_guide_usage_philosophy.md.7fb423b5.lean.js rename to assets/docs_guide_usage_philosophy.md.57f130a7.lean.js index 6519dc186e..1adceccfeb 100644 --- a/assets/docs_guide_usage_philosophy.md.7fb423b5.lean.js +++ b/assets/docs_guide_usage_philosophy.md.57f130a7.lean.js @@ -1 +1 @@ -import{_ as o,o as s,c as a,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/philosophy.md","filePath":"docs/guide/usage/philosophy.md","lastUpdated":1701052174000}'),i={name:"docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return s(),a("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; +import{_ as o,o as s,c as a,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"docs/guide/usage/philosophy.md","filePath":"docs/guide/usage/philosophy.md","lastUpdated":1701053760000}'),i={name:"docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return s(),a("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/docs_guide_usage_resolver.md.60e2e81f.js b/assets/docs_guide_usage_resolver.md.c3f62e0b.js similarity index 96% rename from assets/docs_guide_usage_resolver.md.60e2e81f.js rename to assets/docs_guide_usage_resolver.md.c3f62e0b.js index c4b62a76bf..0b47c3a85a 100644 --- a/assets/docs_guide_usage_resolver.md.60e2e81f.js +++ b/assets/docs_guide_usage_resolver.md.c3f62e0b.js @@ -1,4 +1,4 @@ -import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const C=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/resolver.md","filePath":"docs/guide/usage/resolver.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/resolver.md"},r=e(`

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
+import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const v=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/resolver.md","filePath":"docs/guide/usage/resolver.md","lastUpdated":1701053760000}'),t={name:"docs/guide/usage/resolver.md"},r=e(`

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
 
 use oxc_resolver::{ResolveOptions, Resolver};
 
@@ -30,4 +30,4 @@ import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b0
         Err(error) => println!("Error: {error}"),
         Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
     }
-}
`,13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const v=a(t,[["render",c]]);export{C as __pageData,v as default}; +}
`,13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const C=a(t,[["render",c]]);export{v as __pageData,C as default}; diff --git a/assets/docs_guide_usage_resolver.md.60e2e81f.lean.js b/assets/docs_guide_usage_resolver.md.c3f62e0b.lean.js similarity index 63% rename from assets/docs_guide_usage_resolver.md.60e2e81f.lean.js rename to assets/docs_guide_usage_resolver.md.c3f62e0b.lean.js index 5975ed358f..15861e4491 100644 --- a/assets/docs_guide_usage_resolver.md.60e2e81f.lean.js +++ b/assets/docs_guide_usage_resolver.md.c3f62e0b.lean.js @@ -1 +1 @@ -import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const C=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/resolver.md","filePath":"docs/guide/usage/resolver.md","lastUpdated":1701052174000}'),t={name:"docs/guide/usage/resolver.md"},r=e("",13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const v=a(t,[["render",c]]);export{C as __pageData,v as default}; +import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const v=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"docs/guide/usage/resolver.md","filePath":"docs/guide/usage/resolver.md","lastUpdated":1701053760000}'),t={name:"docs/guide/usage/resolver.md"},r=e("",13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const C=a(t,[["render",c]]);export{v as __pageData,C as default}; diff --git a/assets/docs_learn_architecture_formatter.md.80783d23.js b/assets/docs_learn_architecture_formatter.md.b8f08359.js similarity index 90% rename from assets/docs_learn_architecture_formatter.md.80783d23.js rename to assets/docs_learn_architecture_formatter.md.b8f08359.js index 3692937242..20ebcbed30 100644 --- a/assets/docs_learn_architecture_formatter.md.80783d23.js +++ b/assets/docs_learn_architecture_formatter.md.b8f08359.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/formatter.md","filePath":"docs/learn/architecture/formatter.md","lastUpdated":1701052174000}'),c={name:"docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return r(),a("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; +import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/formatter.md","filePath":"docs/learn/architecture/formatter.md","lastUpdated":1701053760000}'),c={name:"docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return r(),a("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_formatter.md.80783d23.lean.js b/assets/docs_learn_architecture_formatter.md.b8f08359.lean.js similarity index 90% rename from assets/docs_learn_architecture_formatter.md.80783d23.lean.js rename to assets/docs_learn_architecture_formatter.md.b8f08359.lean.js index 3692937242..20ebcbed30 100644 --- a/assets/docs_learn_architecture_formatter.md.80783d23.lean.js +++ b/assets/docs_learn_architecture_formatter.md.b8f08359.lean.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/formatter.md","filePath":"docs/learn/architecture/formatter.md","lastUpdated":1701052174000}'),c={name:"docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return r(),a("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; +import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/formatter.md","filePath":"docs/learn/architecture/formatter.md","lastUpdated":1701053760000}'),c={name:"docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return r(),a("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_introduction.md.da9ddefa.js b/assets/docs_learn_architecture_introduction.md.5fdf9f2b.js similarity index 90% rename from assets/docs_learn_architecture_introduction.md.da9ddefa.js rename to assets/docs_learn_architecture_introduction.md.5fdf9f2b.js index 2ff1d000bc..7833e5158f 100644 --- a/assets/docs_learn_architecture_introduction.md.da9ddefa.js +++ b/assets/docs_learn_architecture_introduction.md.5fdf9f2b.js @@ -1 +1 @@ -import{_ as e,o,c as n,k as t,a as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/introduction.md","filePath":"docs/learn/architecture/introduction.md","lastUpdated":1701052174000}'),a={name:"docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),n("div",null,i)}const x=e(a,[["render",d]]);export{f as __pageData,x as default}; +import{_ as e,o,c as n,k as t,a as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/introduction.md","filePath":"docs/learn/architecture/introduction.md","lastUpdated":1701053760000}'),a={name:"docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),n("div",null,i)}const x=e(a,[["render",d]]);export{f as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_introduction.md.da9ddefa.lean.js b/assets/docs_learn_architecture_introduction.md.5fdf9f2b.lean.js similarity index 90% rename from assets/docs_learn_architecture_introduction.md.da9ddefa.lean.js rename to assets/docs_learn_architecture_introduction.md.5fdf9f2b.lean.js index 2ff1d000bc..7833e5158f 100644 --- a/assets/docs_learn_architecture_introduction.md.da9ddefa.lean.js +++ b/assets/docs_learn_architecture_introduction.md.5fdf9f2b.lean.js @@ -1 +1 @@ -import{_ as e,o,c as n,k as t,a as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/introduction.md","filePath":"docs/learn/architecture/introduction.md","lastUpdated":1701052174000}'),a={name:"docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),n("div",null,i)}const x=e(a,[["render",d]]);export{f as __pageData,x as default}; +import{_ as e,o,c as n,k as t,a as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/introduction.md","filePath":"docs/learn/architecture/introduction.md","lastUpdated":1701053760000}'),a={name:"docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),n("div",null,i)}const x=e(a,[["render",d]]);export{f as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_linter.md.12e3a00b.js b/assets/docs_learn_architecture_linter.md.2f9c0c5d.js similarity index 91% rename from assets/docs_learn_architecture_linter.md.12e3a00b.js rename to assets/docs_learn_architecture_linter.md.2f9c0c5d.js index 61ba422d4e..df175944f5 100644 --- a/assets/docs_learn_architecture_linter.md.12e3a00b.js +++ b/assets/docs_learn_architecture_linter.md.2f9c0c5d.js @@ -1 +1 @@ -import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/linter.md","filePath":"docs/learn/architecture/linter.md","lastUpdated":1701052174000}'),l={name:"docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; +import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/linter.md","filePath":"docs/learn/architecture/linter.md","lastUpdated":1701053760000}'),l={name:"docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/docs_learn_architecture_linter.md.12e3a00b.lean.js b/assets/docs_learn_architecture_linter.md.2f9c0c5d.lean.js similarity index 91% rename from assets/docs_learn_architecture_linter.md.12e3a00b.lean.js rename to assets/docs_learn_architecture_linter.md.2f9c0c5d.lean.js index 61ba422d4e..df175944f5 100644 --- a/assets/docs_learn_architecture_linter.md.12e3a00b.lean.js +++ b/assets/docs_learn_architecture_linter.md.2f9c0c5d.lean.js @@ -1 +1 @@ -import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/linter.md","filePath":"docs/learn/architecture/linter.md","lastUpdated":1701052174000}'),l={name:"docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; +import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/linter.md","filePath":"docs/learn/architecture/linter.md","lastUpdated":1701053760000}'),l={name:"docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/docs_learn_architecture_minifier.md.bc5e2ca4.js b/assets/docs_learn_architecture_minifier.md.661eaafc.js similarity index 80% rename from assets/docs_learn_architecture_minifier.md.bc5e2ca4.js rename to assets/docs_learn_architecture_minifier.md.661eaafc.js index 537ec2bcbf..2cc6f6cbd4 100644 --- a/assets/docs_learn_architecture_minifier.md.bc5e2ca4.js +++ b/assets/docs_learn_architecture_minifier.md.661eaafc.js @@ -1 +1 @@ -import{_ as i,o as t,c as r,k as e,a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/minifier.md","filePath":"docs/learn/architecture/minifier.md","lastUpdated":1701052174000}'),n={name:"docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[a("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return t(),r("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; +import{_ as i,o as t,c as r,k as e,a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/minifier.md","filePath":"docs/learn/architecture/minifier.md","lastUpdated":1701053760000}'),n={name:"docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[a("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return t(),r("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_minifier.md.bc5e2ca4.lean.js b/assets/docs_learn_architecture_minifier.md.661eaafc.lean.js similarity index 80% rename from assets/docs_learn_architecture_minifier.md.bc5e2ca4.lean.js rename to assets/docs_learn_architecture_minifier.md.661eaafc.lean.js index 537ec2bcbf..2cc6f6cbd4 100644 --- a/assets/docs_learn_architecture_minifier.md.bc5e2ca4.lean.js +++ b/assets/docs_learn_architecture_minifier.md.661eaafc.lean.js @@ -1 +1 @@ -import{_ as i,o as t,c as r,k as e,a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/minifier.md","filePath":"docs/learn/architecture/minifier.md","lastUpdated":1701052174000}'),n={name:"docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[a("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return t(),r("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; +import{_ as i,o as t,c as r,k as e,a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/minifier.md","filePath":"docs/learn/architecture/minifier.md","lastUpdated":1701053760000}'),n={name:"docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[a("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return t(),r("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_parser.md.4ee292fb.js b/assets/docs_learn_architecture_parser.md.4234e563.js similarity index 97% rename from assets/docs_learn_architecture_parser.md.4ee292fb.js rename to assets/docs_learn_architecture_parser.md.4234e563.js index 7a533cbbf0..e443e46a19 100644 --- a/assets/docs_learn_architecture_parser.md.4ee292fb.js +++ b/assets/docs_learn_architecture_parser.md.4234e563.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/parser.md","filePath":"docs/learn/architecture/parser.md","lastUpdated":1701052174000}'),i={name:"docs/learn/architecture/parser.md"},o=r('

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
',8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/parser.md","filePath":"docs/learn/architecture/parser.md","lastUpdated":1701053760000}'),i={name:"docs/learn/architecture/parser.md"},o=r('

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
',8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; diff --git a/assets/docs_learn_architecture_parser.md.4ee292fb.lean.js b/assets/docs_learn_architecture_parser.md.4234e563.lean.js similarity index 87% rename from assets/docs_learn_architecture_parser.md.4ee292fb.lean.js rename to assets/docs_learn_architecture_parser.md.4234e563.lean.js index e38cf163b3..6434e20cb6 100644 --- a/assets/docs_learn_architecture_parser.md.4ee292fb.lean.js +++ b/assets/docs_learn_architecture_parser.md.4234e563.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/parser.md","filePath":"docs/learn/architecture/parser.md","lastUpdated":1701052174000}'),i={name:"docs/learn/architecture/parser.md"},o=r("",8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/parser.md","filePath":"docs/learn/architecture/parser.md","lastUpdated":1701053760000}'),i={name:"docs/learn/architecture/parser.md"},o=r("",8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; diff --git a/assets/docs_learn_architecture_resolver.md.06afd529.js b/assets/docs_learn_architecture_resolver.md.cfbd489f.js similarity index 90% rename from assets/docs_learn_architecture_resolver.md.06afd529.js rename to assets/docs_learn_architecture_resolver.md.cfbd489f.js index 52bda621b2..b4520ed8b1 100644 --- a/assets/docs_learn_architecture_resolver.md.06afd529.js +++ b/assets/docs_learn_architecture_resolver.md.cfbd489f.js @@ -1 +1 @@ -import{_ as r,o as t,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/resolver.md","filePath":"docs/learn/architecture/resolver.md","lastUpdated":1701052174000}'),s={name:"docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return t(),a("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; +import{_ as r,o as t,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/resolver.md","filePath":"docs/learn/architecture/resolver.md","lastUpdated":1701053760000}'),s={name:"docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return t(),a("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/docs_learn_architecture_resolver.md.06afd529.lean.js b/assets/docs_learn_architecture_resolver.md.cfbd489f.lean.js similarity index 90% rename from assets/docs_learn_architecture_resolver.md.06afd529.lean.js rename to assets/docs_learn_architecture_resolver.md.cfbd489f.lean.js index 52bda621b2..b4520ed8b1 100644 --- a/assets/docs_learn_architecture_resolver.md.06afd529.lean.js +++ b/assets/docs_learn_architecture_resolver.md.cfbd489f.lean.js @@ -1 +1 @@ -import{_ as r,o as t,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/resolver.md","filePath":"docs/learn/architecture/resolver.md","lastUpdated":1701052174000}'),s={name:"docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return t(),a("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; +import{_ as r,o as t,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/resolver.md","filePath":"docs/learn/architecture/resolver.md","lastUpdated":1701053760000}'),s={name:"docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return t(),a("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/docs_learn_architecture_transformer.md.8a48936b.js b/assets/docs_learn_architecture_transformer.md.48cf4290.js similarity index 90% rename from assets/docs_learn_architecture_transformer.md.8a48936b.js rename to assets/docs_learn_architecture_transformer.md.48cf4290.js index 9ca94e2b72..329c1a535f 100644 --- a/assets/docs_learn_architecture_transformer.md.8a48936b.js +++ b/assets/docs_learn_architecture_transformer.md.48cf4290.js @@ -1 +1 @@ -import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/transformer.md","filePath":"docs/learn/architecture/transformer.md","lastUpdated":1701052174000}'),s={name:"docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/transformer.md","filePath":"docs/learn/architecture/transformer.md","lastUpdated":1701053760000}'),s={name:"docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_architecture_transformer.md.8a48936b.lean.js b/assets/docs_learn_architecture_transformer.md.48cf4290.lean.js similarity index 90% rename from assets/docs_learn_architecture_transformer.md.8a48936b.lean.js rename to assets/docs_learn_architecture_transformer.md.48cf4290.lean.js index 9ca94e2b72..329c1a535f 100644 --- a/assets/docs_learn_architecture_transformer.md.8a48936b.lean.js +++ b/assets/docs_learn_architecture_transformer.md.48cf4290.lean.js @@ -1 +1 @@ -import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/transformer.md","filePath":"docs/learn/architecture/transformer.md","lastUpdated":1701052174000}'),s={name:"docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"docs/learn/architecture/transformer.md","filePath":"docs/learn/architecture/transformer.md","lastUpdated":1701053760000}'),s={name:"docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/docs_learn_ecmascript_grammar.md.e9677e24.js b/assets/docs_learn_ecmascript_grammar.md.4dc3d487.js similarity index 99% rename from assets/docs_learn_ecmascript_grammar.md.e9677e24.js rename to assets/docs_learn_ecmascript_grammar.md.4dc3d487.js index c4dc4f6ac3..d1fea5dab7 100644 --- a/assets/docs_learn_ecmascript_grammar.md.e9677e24.js +++ b/assets/docs_learn_ecmascript_grammar.md.4dc3d487.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/grammar.md","filePath":"docs/learn/ecmascript/grammar.md","lastUpdated":1701052174000}'),o={name:"docs/learn/ecmascript/grammar.md"},l=e(`

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/grammar.md","filePath":"docs/learn/ecmascript/grammar.md","lastUpdated":1701053760000}'),o={name:"docs/learn/ecmascript/grammar.md"},l=e(`

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
 BindingIdentifier[Yield, Await] :
 LabelIdentifier[Yield, Await] :
IdentifierReference[Yield, Await] :
 BindingIdentifier[Yield, Await] :
diff --git a/assets/docs_learn_ecmascript_grammar.md.e9677e24.lean.js b/assets/docs_learn_ecmascript_grammar.md.4dc3d487.lean.js
similarity index 87%
rename from assets/docs_learn_ecmascript_grammar.md.e9677e24.lean.js
rename to assets/docs_learn_ecmascript_grammar.md.4dc3d487.lean.js
index b1c92dfb31..8002e5d26b 100644
--- a/assets/docs_learn_ecmascript_grammar.md.e9677e24.lean.js
+++ b/assets/docs_learn_ecmascript_grammar.md.4dc3d487.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/grammar.md","filePath":"docs/learn/ecmascript/grammar.md","lastUpdated":1701052174000}'),o={name:"docs/learn/ecmascript/grammar.md"},l=e("",164),p=[l];function t(r,c,i,d,y,E){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{u as __pageData,g as default};
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/grammar.md","filePath":"docs/learn/ecmascript/grammar.md","lastUpdated":1701053760000}'),o={name:"docs/learn/ecmascript/grammar.md"},l=e("",164),p=[l];function t(r,c,i,d,y,E){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{u as __pageData,g as default};
diff --git a/assets/docs_learn_ecmascript_spec.md.03200411.js b/assets/docs_learn_ecmascript_spec.md.c10ef8af.js
similarity index 99%
rename from assets/docs_learn_ecmascript_spec.md.03200411.js
rename to assets/docs_learn_ecmascript_spec.md.c10ef8af.js
index f0507ebc6a..fd34229f4b 100644
--- a/assets/docs_learn_ecmascript_spec.md.03200411.js
+++ b/assets/docs_learn_ecmascript_spec.md.c10ef8af.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/spec.md","filePath":"docs/learn/ecmascript/spec.md","lastUpdated":1701052174000}'),l={name:"docs/learn/ecmascript/spec.md"},o=e(`

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/spec.md","filePath":"docs/learn/ecmascript/spec.md","lastUpdated":1701053760000}'),l={name:"docs/learn/ecmascript/spec.md"},o=e(`

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
   AssignmentExpression
   ArgumentList , AssignmentExpression
ArgumentList :
   AssignmentExpression
diff --git a/assets/docs_learn_ecmascript_spec.md.03200411.lean.js b/assets/docs_learn_ecmascript_spec.md.c10ef8af.lean.js
similarity index 87%
rename from assets/docs_learn_ecmascript_spec.md.03200411.lean.js
rename to assets/docs_learn_ecmascript_spec.md.c10ef8af.lean.js
index 12b5400c52..1330e002a8 100644
--- a/assets/docs_learn_ecmascript_spec.md.03200411.lean.js
+++ b/assets/docs_learn_ecmascript_spec.md.c10ef8af.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/spec.md","filePath":"docs/learn/ecmascript/spec.md","lastUpdated":1701052174000}'),l={name:"docs/learn/ecmascript/spec.md"},o=e("",39),p=[o];function t(r,c,i,y,E,d){return a(),n("div",null,p)}const m=s(l,[["render",t]]);export{u as __pageData,m as default};
+import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecmascript/spec.md","filePath":"docs/learn/ecmascript/spec.md","lastUpdated":1701053760000}'),l={name:"docs/learn/ecmascript/spec.md"},o=e("",39),p=[o];function t(r,c,i,y,E,d){return a(),n("div",null,p)}const m=s(l,[["render",t]]);export{u as __pageData,m as default};
diff --git a/assets/docs_learn_ecosystem.md.8c414ce3.js b/assets/docs_learn_ecosystem.md.81955525.js
similarity index 96%
rename from assets/docs_learn_ecosystem.md.8c414ce3.js
rename to assets/docs_learn_ecosystem.md.81955525.js
index b449bfd78b..d9538f9114 100644
--- a/assets/docs_learn_ecosystem.md.8c414ce3.js
+++ b/assets/docs_learn_ecosystem.md.81955525.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecosystem.md","filePath":"docs/learn/ecosystem.md","lastUpdated":1701052174000}'),o={name:"docs/learn/ecosystem.md"},n=r('

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

',10),c=[n];function s(i,l,p,d,h,m){return t(),a("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecosystem.md","filePath":"docs/learn/ecosystem.md","lastUpdated":1701053760000}'),o={name:"docs/learn/ecosystem.md"},n=r('

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

',10),c=[n];function s(i,l,p,d,h,m){return t(),a("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/docs_learn_ecosystem.md.8c414ce3.lean.js b/assets/docs_learn_ecosystem.md.81955525.lean.js similarity index 86% rename from assets/docs_learn_ecosystem.md.8c414ce3.lean.js rename to assets/docs_learn_ecosystem.md.81955525.lean.js index 16f96e2cbc..99f6d221a5 100644 --- a/assets/docs_learn_ecosystem.md.8c414ce3.lean.js +++ b/assets/docs_learn_ecosystem.md.81955525.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecosystem.md","filePath":"docs/learn/ecosystem.md","lastUpdated":1701052174000}'),o={name:"docs/learn/ecosystem.md"},n=r("",10),c=[n];function s(i,l,p,d,h,m){return t(),a("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; +import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"docs/learn/ecosystem.md","filePath":"docs/learn/ecosystem.md","lastUpdated":1701053760000}'),o={name:"docs/learn/ecosystem.md"},n=r("",10),c=[n];function s(i,l,p,d,h,m){return t(),a("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/docs_learn_performance.md.5eb36f6e.js b/assets/docs_learn_performance.md.33aec0bd.js similarity index 99% rename from assets/docs_learn_performance.md.5eb36f6e.js rename to assets/docs_learn_performance.md.33aec0bd.js index 233c47ff33..e612b58778 100644 --- a/assets/docs_learn_performance.md.5eb36f6e.js +++ b/assets/docs_learn_performance.md.33aec0bd.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/learn/performance.md","filePath":"docs/learn/performance.md","lastUpdated":1701052174000}'),p={name:"docs/learn/performance.md"},o=l(`

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/learn/performance.md","filePath":"docs/learn/performance.md","lastUpdated":1701053760000}'),p={name:"docs/learn/performance.md"},o=l(`

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
     pub node: Node,
     pub body: Vec<Statement>,
 }
diff --git a/assets/docs_learn_performance.md.5eb36f6e.lean.js b/assets/docs_learn_performance.md.33aec0bd.lean.js
similarity index 86%
rename from assets/docs_learn_performance.md.5eb36f6e.lean.js
rename to assets/docs_learn_performance.md.33aec0bd.lean.js
index bec2958b41..90782fdee8 100644
--- a/assets/docs_learn_performance.md.5eb36f6e.lean.js
+++ b/assets/docs_learn_performance.md.33aec0bd.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/learn/performance.md","filePath":"docs/learn/performance.md","lastUpdated":1701052174000}'),p={name:"docs/learn/performance.md"},o=l("",166),e=[o];function t(r,c,y,E,i,d){return a(),n("div",null,e)}const F=s(p,[["render",t]]);export{h as __pageData,F as default};
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"docs/learn/performance.md","filePath":"docs/learn/performance.md","lastUpdated":1701053760000}'),p={name:"docs/learn/performance.md"},o=l("",166),e=[o];function t(r,c,y,E,i,d){return a(),n("div",null,e)}const F=s(p,[["render",t]]);export{h as __pageData,F as default};
diff --git a/assets/docs_learn_references.md.ff70791a.js b/assets/docs_learn_references.md.62c70fb2.js
similarity index 98%
rename from assets/docs_learn_references.md.ff70791a.js
rename to assets/docs_learn_references.md.62c70fb2.js
index 2e5efe594a..51f8ec932d 100644
--- a/assets/docs_learn_references.md.ff70791a.js
+++ b/assets/docs_learn_references.md.62c70fb2.js
@@ -1 +1 @@
-import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"docs/learn/references.md","filePath":"docs/learn/references.md","lastUpdated":1701052174000}'),l={name:"docs/learn/references.md"},i=t('

References

Projects Using Oxc

📚 Learning Resources

Parsers (in active development)

AST

Rust

Blog Posts

',12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"docs/learn/references.md","filePath":"docs/learn/references.md","lastUpdated":1701053760000}'),l={name:"docs/learn/references.md"},i=t('

References

Projects Using Oxc

📚 Learning Resources

Parsers (in active development)

AST

Rust

Blog Posts

',12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; diff --git a/assets/docs_learn_references.md.ff70791a.lean.js b/assets/docs_learn_references.md.62c70fb2.lean.js similarity index 86% rename from assets/docs_learn_references.md.ff70791a.lean.js rename to assets/docs_learn_references.md.62c70fb2.lean.js index 68f196f135..5269377ec3 100644 --- a/assets/docs_learn_references.md.ff70791a.lean.js +++ b/assets/docs_learn_references.md.62c70fb2.lean.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"docs/learn/references.md","filePath":"docs/learn/references.md","lastUpdated":1701052174000}'),l={name:"docs/learn/references.md"},i=t("",12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"docs/learn/references.md","filePath":"docs/learn/references.md","lastUpdated":1701053760000}'),l={name:"docs/learn/references.md"},i=t("",12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; diff --git a/assets/index.md.b39570fc.js b/assets/index.md.b39570fc.js deleted file mode 100644 index cb9f41f692..0000000000 --- a/assets/index.md.b39570fc.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"A collection of JavaScript tools written in Rust","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"Get Started","link":"/docs/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"2x faster than swc","link":"/docs/guide/usage/parser","linkText":"Learn more"},{"title":"Linter ✅","details":"50 - 100x faster than ESLint","link":"/docs/guide/usage/linter","linkText":"Learn more"},{"title":"Resolver ✅","details":"28x faster than enhanced-resolve","link":"/docs/guide/usage/resolver","linkText":"Learn more"},{"title":"Formatter 🚧","details":"Prettier compatible"},{"title":"Transformer 🚧","details":"Babel compatible"},{"title":"Minifier 🚧","details":"Faster and better at compression"},{"title":"Rspack Bundler ✅","details":"Webpack Compatible","link":"https://rspack.dev","external":true},{"title":"Rolldown Bundler","details":"Rust port of Rollup"},{"title":"Ezno Type Checker","details":"A novel TypeScript type checker","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1701052174000}'),i={name:"index.md"};function r(o,n,l,s,c,d){return t(),a("div")}const u=e(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/index.md.b39570fc.lean.js b/assets/index.md.b39570fc.lean.js deleted file mode 100644 index cb9f41f692..0000000000 --- a/assets/index.md.b39570fc.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"A collection of JavaScript tools written in Rust","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"Get Started","link":"/docs/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"2x faster than swc","link":"/docs/guide/usage/parser","linkText":"Learn more"},{"title":"Linter ✅","details":"50 - 100x faster than ESLint","link":"/docs/guide/usage/linter","linkText":"Learn more"},{"title":"Resolver ✅","details":"28x faster than enhanced-resolve","link":"/docs/guide/usage/resolver","linkText":"Learn more"},{"title":"Formatter 🚧","details":"Prettier compatible"},{"title":"Transformer 🚧","details":"Babel compatible"},{"title":"Minifier 🚧","details":"Faster and better at compression"},{"title":"Rspack Bundler ✅","details":"Webpack Compatible","link":"https://rspack.dev","external":true},{"title":"Rolldown Bundler","details":"Rust port of Rollup"},{"title":"Ezno Type Checker","details":"A novel TypeScript type checker","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1701052174000}'),i={name:"index.md"};function r(o,n,l,s,c,d){return t(),a("div")}const u=e(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/index.md.dc0fe200.js b/assets/index.md.dc0fe200.js new file mode 100644 index 0000000000..ead28dede2 --- /dev/null +++ b/assets/index.md.dc0fe200.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"A collection of JavaScript tools written in Rust","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"Get Started","link":"/docs/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"2x faster than SWC","link":"/docs/guide/usage/parser","linkText":"Learn more"},{"title":"Linter ✅","details":"50~100x faster than ESLint","link":"/docs/guide/usage/linter","linkText":"Learn more"},{"title":"Resolver ✅","details":"28x faster than enhanced-resolve","link":"/docs/guide/usage/resolver","linkText":"Learn more"},{"title":"Formatter 🚧","details":"Prettier compatible"},{"title":"Transformer 🚧","details":"Babel compatible"},{"title":"Minifier 🚧","details":"Faster and better at compression"},{"title":"Rspack Bundler ✅","details":"Webpack Compatible","link":"https://rspack.dev","external":true},{"title":"Rolldown Bundler","details":"Rust port of Rollup"},{"title":"Ezno Type Checker","details":"A novel TypeScript type checker","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1701053760000}'),i={name:"index.md"};function r(o,n,l,s,c,d){return t(),a("div")}const u=e(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/index.md.dc0fe200.lean.js b/assets/index.md.dc0fe200.lean.js new file mode 100644 index 0000000000..ead28dede2 --- /dev/null +++ b/assets/index.md.dc0fe200.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"A collection of JavaScript tools written in Rust","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"Get Started","link":"/docs/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"2x faster than SWC","link":"/docs/guide/usage/parser","linkText":"Learn more"},{"title":"Linter ✅","details":"50~100x faster than ESLint","link":"/docs/guide/usage/linter","linkText":"Learn more"},{"title":"Resolver ✅","details":"28x faster than enhanced-resolve","link":"/docs/guide/usage/resolver","linkText":"Learn more"},{"title":"Formatter 🚧","details":"Prettier compatible"},{"title":"Transformer 🚧","details":"Babel compatible"},{"title":"Minifier 🚧","details":"Faster and better at compression"},{"title":"Rspack Bundler ✅","details":"Webpack Compatible","link":"https://rspack.dev","external":true},{"title":"Rolldown Bundler","details":"Rust port of Rollup"},{"title":"Ezno Type Checker","details":"A novel TypeScript type checker","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1701053760000}'),i={name:"index.md"};function r(o,n,l,s,c,d){return t(),a("div")}const u=e(i,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.js b/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.js new file mode 100644 index 0000000000..2733de5cdc --- /dev/null +++ b/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.js @@ -0,0 +1 @@ +import{_ as o,C as a,o as t,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2022-02-10-js-tooling-research.md","filePath":"ja/blog/2022-02-10-js-tooling-research.md","lastUpdated":1701053760000}'),n={name:"ja/blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=a("AppBlogPostHeader");return t(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; diff --git a/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.lean.js b/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.lean.js new file mode 100644 index 0000000000..2733de5cdc --- /dev/null +++ b/assets/ja_blog_2022-02-10-js-tooling-research.md.cbcccc07.lean.js @@ -0,0 +1 @@ +import{_ as o,C as a,o as t,c as r,H as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"High Performance JavaScript Toolchain","description":"","frontmatter":{"title":"High Performance JavaScript Toolchain","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2022-02-10-js-tooling-research.md","filePath":"ja/blog/2022-02-10-js-tooling-research.md","lastUpdated":1701053760000}'),n={name:"ja/blog/2022-02-10-js-tooling-research.md"};function c(l,i,p,d,h,_){const e=a("AppBlogPostHeader");return t(),r("div",null,[s(e)])}const f=o(n,[["render",c]]);export{g as __pageData,f as default}; diff --git a/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.js b/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.js new file mode 100644 index 0000000000..8eaf770982 --- /dev/null +++ b/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.js @@ -0,0 +1 @@ +import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2022-08-08-linter-research.md","filePath":"ja/blog/2022-08-08-linter-research.md","lastUpdated":1701053760000}'),n={name:"ja/blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.lean.js b/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.lean.js new file mode 100644 index 0000000000..8eaf770982 --- /dev/null +++ b/assets/ja_blog_2022-08-08-linter-research.md.50a5b9a3.lean.js @@ -0,0 +1 @@ +import{_ as t,C as r,o as a,c as o,H as s}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"A research on JavaScript linters","description":"","frontmatter":{"title":"A research on JavaScript linters","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2022-08-08-linter-research.md","filePath":"ja/blog/2022-08-08-linter-research.md","lastUpdated":1701053760000}'),n={name:"ja/blog/2022-08-08-linter-research.md"};function c(l,p,i,d,_,h){const e=r("AppBlogPostHeader");return a(),o("div",null,[s(e)])}const u=t(n,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.js b/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.js new file mode 100644 index 0000000000..27f9338568 --- /dev/null +++ b/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.js @@ -0,0 +1 @@ +import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2023-11-07-announcing-oxc.md","filePath":"ja/blog/2023-11-07-announcing-oxc.md","lastUpdated":1701053760000}'),s={name:"ja/blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; diff --git a/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.lean.js b/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.lean.js new file mode 100644 index 0000000000..27f9338568 --- /dev/null +++ b/assets/ja_blog_2023-11-07-announcing-oxc.md.d6db77d4.lean.js @@ -0,0 +1 @@ +import{_ as e,C as o,o as t,c as a,H as c}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"Announcing Oxc","description":"","frontmatter":{"title":"Announcing Oxc","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2023-11-07-announcing-oxc.md","filePath":"ja/blog/2023-11-07-announcing-oxc.md","lastUpdated":1701053760000}'),s={name:"ja/blog/2023-11-07-announcing-oxc.md"};function r(p,i,l,d,_,u){const n=o("AppBlogPostHeader");return t(),a("div",null,[c(n)])}const x=e(s,[["render",r]]);export{m as __pageData,x as default}; diff --git a/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.js b/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.js new file mode 100644 index 0000000000..21b7bb0499 --- /dev/null +++ b/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.js @@ -0,0 +1 @@ +import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2023-11-08-announcing-oxlint.md","filePath":"ja/blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701053760000}'),i={name:"ja/blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.lean.js b/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.lean.js new file mode 100644 index 0000000000..21b7bb0499 --- /dev/null +++ b/assets/ja_blog_2023-11-08-announcing-oxlint.md.e3b3e413.lean.js @@ -0,0 +1 @@ +import{_ as n,C as t,o,c as a,H as l}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Oxlint General Availability","description":"","frontmatter":{"title":"Oxlint General Availability","outline":"deep","authors":["boshen"]},"headers":[],"relativePath":"ja/blog/2023-11-08-announcing-oxlint.md","filePath":"ja/blog/2023-11-08-announcing-oxlint.md","lastUpdated":1701053760000}'),i={name:"ja/blog/2023-11-08-announcing-oxlint.md"};function r(s,c,p,d,_,m){const e=t("AppBlogPostHeader");return o(),a("div",null,[l(e)])}const x=n(i,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/ja_blog_index.md.3de8b9cb.js b/assets/ja_blog_index.md.3de8b9cb.js new file mode 100644 index 0000000000..935ab04b9a --- /dev/null +++ b/assets/ja_blog_index.md.3de8b9cb.js @@ -0,0 +1,7 @@ +import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"ja/blog/index.md","filePath":"ja/blog/index.md","lastUpdated":1701053760000}'),t={name:"ja/blog/index.md"},o=s(`

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
+
+touch test.js
+cargo run -p rome_cli -- check ./test.js
cargo run -p rome_cli
+
+touch test.js
+cargo run -p rome_cli -- check ./test.js

rome_cli will eventually call rome_js_parser::parse

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187

and finally the actual parsing code

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17

Contributing

INFO

The JavaScript / TypeScript parser is 99% complete, the best way to help is to test Rome in your own codebases or take a look at the issues on Github.

`,18),n=[o];function l(i,p,c,h,d,b){return a(),r("div",null,n)}const u=e(t,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/ja_blog_index.md.3de8b9cb.lean.js b/assets/ja_blog_index.md.3de8b9cb.lean.js new file mode 100644 index 0000000000..695c2f8d75 --- /dev/null +++ b/assets/ja_blog_index.md.3de8b9cb.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as r,Q as s}from"./chunks/framework.725e5b03.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"ja/blog/index.md","filePath":"ja/blog/index.md","lastUpdated":1701053760000}'),t={name:"ja/blog/index.md"},o=s("",18),n=[o];function l(i,p,c,h,d,b){return a(),r("div",null,n)}const u=e(t,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/ja_docs_contribute_codegen.md.837767d8.js b/assets/ja_docs_contribute_codegen.md.837767d8.js new file mode 100644 index 0000000000..efb30fbfbd --- /dev/null +++ b/assets/ja_docs_contribute_codegen.md.837767d8.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/codegen.md","filePath":"ja/docs/contribute/codegen.md","lastUpdated":1701053760000}'),c={name:"ja/docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/ja_docs_contribute_codegen.md.837767d8.lean.js b/assets/ja_docs_contribute_codegen.md.837767d8.lean.js new file mode 100644 index 0000000000..efb30fbfbd --- /dev/null +++ b/assets/ja_docs_contribute_codegen.md.837767d8.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,k as e,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Codegen","description":"","frontmatter":{"title":"Codegen","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/codegen.md","filePath":"ja/docs/contribute/codegen.md","lastUpdated":1701053760000}'),c={name:"ja/docs/contribute/codegen.md"},d=e("h1",{id:"codegen",tabindex:"-1"},[n("Codegen "),e("a",{class:"header-anchor",href:"#codegen","aria-label":'Permalink to "Codegen"'},"​")],-1),s=[d];function r(i,l,_,p,g,h){return o(),a("div",null,s)}const u=t(c,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/ja_docs_contribute_development.md.599cc7ae.js b/assets/ja_docs_contribute_development.md.599cc7ae.js new file mode 100644 index 0000000000..d7d8309a75 --- /dev/null +++ b/assets/ja_docs_contribute_development.md.599cc7ae.js @@ -0,0 +1 @@ +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/development.md","filePath":"ja/docs/contribute/development.md","lastUpdated":1701053760000}'),t={name:"ja/docs/contribute/development.md"},l=o('

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

',26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; diff --git a/assets/ja_docs_contribute_development.md.599cc7ae.lean.js b/assets/ja_docs_contribute_development.md.599cc7ae.lean.js new file mode 100644 index 0000000000..a2001bf7f5 --- /dev/null +++ b/assets/ja_docs_contribute_development.md.599cc7ae.lean.js @@ -0,0 +1 @@ +import{_ as s,o as e,c as a,Q as o}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Development","description":"","frontmatter":{"title":"Development","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/development.md","filePath":"ja/docs/contribute/development.md","lastUpdated":1701053760000}'),t={name:"ja/docs/contribute/development.md"},l=o("",26),n=[l];function r(c,p,i,d,h,u){return e(),a("div",null,n)}const y=s(t,[["render",r]]);export{g as __pageData,y as default}; diff --git a/assets/ja_docs_contribute_formatter.md.9f37d059.js b/assets/ja_docs_contribute_formatter.md.9f37d059.js new file mode 100644 index 0000000000..beb80e56dc --- /dev/null +++ b/assets/ja_docs_contribute_formatter.md.9f37d059.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/formatter.md","filePath":"ja/docs/contribute/formatter.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; diff --git a/assets/ja_docs_contribute_formatter.md.9f37d059.lean.js b/assets/ja_docs_contribute_formatter.md.9f37d059.lean.js new file mode 100644 index 0000000000..beb80e56dc --- /dev/null +++ b/assets/ja_docs_contribute_formatter.md.9f37d059.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/formatter.md","filePath":"ja/docs/contribute/formatter.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/formatter.md"},n=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),s=e("p",null,"While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.",-1),c=[n,s];function d(l,m,f,h,p,u){return a(),r("div",null,c)}const v=t(i,[["render",d]]);export{b as __pageData,v as default}; diff --git a/assets/ja_docs_contribute_introduction.md.cb17b786.js b/assets/ja_docs_contribute_introduction.md.cb17b786.js new file mode 100644 index 0000000000..f2365aa376 --- /dev/null +++ b/assets/ja_docs_contribute_introduction.md.cb17b786.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/introduction.md","filePath":"ja/docs/contribute/introduction.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/introduction.md"},n=o('

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
',13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/ja_docs_contribute_introduction.md.cb17b786.lean.js b/assets/ja_docs_contribute_introduction.md.cb17b786.lean.js new file mode 100644 index 0000000000..22f4384abe --- /dev/null +++ b/assets/ja_docs_contribute_introduction.md.cb17b786.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/introduction.md","filePath":"ja/docs/contribute/introduction.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/introduction.md"},n=o("",13),r=[n];function s(l,c,d,u,h,p){return t(),a("div",null,r)}const g=e(i,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/ja_docs_contribute_linter.md.170c9f93.js b/assets/ja_docs_contribute_linter.md.170c9f93.js new file mode 100644 index 0000000000..3578f6ba34 --- /dev/null +++ b/assets/ja_docs_contribute_linter.md.170c9f93.js @@ -0,0 +1,9 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/linter.md","filePath":"ja/docs/contribute/linter.md","lastUpdated":1701053760000}'),l={name:"ja/docs/contribute/linter.md"},o=e(`

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
+just new-ts-rule name
+just new-unicorn-rule name
+just new-react-rule name
+just new-jsx-a11y-rule name
just new-jest-rule name
+just new-ts-rule name
+just new-unicorn-rule name
+just new-react-rule name
+just new-jsx-a11y-rule name
`,11),t=[o];function p(r,c,i,d,y,u){return a(),n("div",null,t)}const F=s(l,[["render",p]]);export{h as __pageData,F as default}; diff --git a/assets/ja_docs_contribute_linter.md.170c9f93.lean.js b/assets/ja_docs_contribute_linter.md.170c9f93.lean.js new file mode 100644 index 0000000000..62c739fe19 --- /dev/null +++ b/assets/ja_docs_contribute_linter.md.170c9f93.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/linter.md","filePath":"ja/docs/contribute/linter.md","lastUpdated":1701053760000}'),l={name:"ja/docs/contribute/linter.md"},o=e("",11),t=[o];function p(r,c,i,d,y,u){return a(),n("div",null,t)}const F=s(l,[["render",p]]);export{h as __pageData,F as default}; diff --git a/assets/ja_docs_contribute_minifier.md.24e36ab1.js b/assets/ja_docs_contribute_minifier.md.24e36ab1.js new file mode 100644 index 0000000000..885673933f --- /dev/null +++ b/assets/ja_docs_contribute_minifier.md.24e36ab1.js @@ -0,0 +1 @@ +import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/minifier.md","filePath":"ja/docs/contribute/minifier.md","lastUpdated":1701053760000}'),a={name:"ja/docs/contribute/minifier.md"},r=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[r,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(a,[["render",m]]);export{g as __pageData,v as default}; diff --git a/assets/ja_docs_contribute_minifier.md.24e36ab1.lean.js b/assets/ja_docs_contribute_minifier.md.24e36ab1.lean.js new file mode 100644 index 0000000000..885673933f --- /dev/null +++ b/assets/ja_docs_contribute_minifier.md.24e36ab1.lean.js @@ -0,0 +1 @@ +import{_ as i,o as t,c as o,k as e,a as s}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/minifier.md","filePath":"ja/docs/contribute/minifier.md","lastUpdated":1701053760000}'),a={name:"ja/docs/contribute/minifier.md"},r=e("h1",{id:"minifier",tabindex:"-1"},[s("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),n=e("p",null,"JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.",-1),c=e("p",null,"However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?",-1),l=e("p",null,"We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].",-1),d=e("p",null,"Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.",-1),f=[r,n,c,l,d];function m(p,u,h,_,w,b){return t(),o("div",null,f)}const v=i(a,[["render",m]]);export{g as __pageData,v as default}; diff --git a/assets/ja_docs_contribute_parser.md.242f07ac.js b/assets/ja_docs_contribute_parser.md.242f07ac.js new file mode 100644 index 0000000000..1752ddd9a3 --- /dev/null +++ b/assets/ja_docs_contribute_parser.md.242f07ac.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/parser.md","filePath":"ja/docs/contribute/parser.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/parser.md"},o=r('

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

',13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/ja_docs_contribute_parser.md.242f07ac.lean.js b/assets/ja_docs_contribute_parser.md.242f07ac.lean.js new file mode 100644 index 0000000000..31a125a287 --- /dev/null +++ b/assets/ja_docs_contribute_parser.md.242f07ac.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/parser.md","filePath":"ja/docs/contribute/parser.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/parser.md"},o=r("",13),n=[o];function c(i,l,p,h,d,b){return a(),t("div",null,n)}const m=e(s,[["render",c]]);export{f as __pageData,m as default}; diff --git a/assets/ja_docs_contribute_performance.md.b4a85950.js b/assets/ja_docs_contribute_performance.md.b4a85950.js new file mode 100644 index 0000000000..216371631f --- /dev/null +++ b/assets/ja_docs_contribute_performance.md.b4a85950.js @@ -0,0 +1,13 @@ +import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/performance.md","filePath":"ja/docs/contribute/performance.md","lastUpdated":1701053760000}'),o={name:"ja/docs/contribute/performance.md"},l=n(`

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
+debug = 1 # debug info with line tables only
+strip = false # do not strip symbols
[profile.release]
+debug = 1 # debug info with line tables only
+strip = false # do not strip symbols

Then build the project

bash
cargo build --release -p oxc_cli --bin oxlint
cargo build --release -p oxc_cli --bin oxlint

The binary is located at ./target/release/oxlint once the project is built.

Under the hood, cargo instruments invokes the xcrun command, equivalent to

bash
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release/oxlint --quiet
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release/oxlint --quiet

Running the command above produces the following output

Starting recording with the Time Profiler template. Launching process: oxlint.
+Ctrl-C to stop the recording
+Target app exited, ending recording...
+Recording completed. Saving output file...
+Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace
Starting recording with the Time Profiler template. Launching process: oxlint.
+Ctrl-C to stop the recording
+Target app exited, ending recording...
+Recording completed. Saving output file...
+Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace

Open the trace file open Launch_oxlint_2023-09-03_4.41.45\\ PM_EB179B85.trace.

To see a top down trace:

  1. On the top panel, click CPUs
  2. On the left input box, click x then select Time Profiler
  3. At the bottom panel, click "Call Tree", turn on "Invert Call Tree" and turn off separate by thread.
`,22),p=[l];function t(c,r,i,d,y,u){return e(),a("div",null,p)}const m=s(o,[["render",t]]);export{E as __pageData,m as default}; diff --git a/assets/ja_docs_contribute_performance.md.b4a85950.lean.js b/assets/ja_docs_contribute_performance.md.b4a85950.lean.js new file mode 100644 index 0000000000..bac3b04877 --- /dev/null +++ b/assets/ja_docs_contribute_performance.md.b4a85950.lean.js @@ -0,0 +1 @@ +import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.725e5b03.js";const E=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/performance.md","filePath":"ja/docs/contribute/performance.md","lastUpdated":1701053760000}'),o={name:"ja/docs/contribute/performance.md"},l=n("",22),p=[l];function t(c,r,i,d,y,u){return e(),a("div",null,p)}const m=s(o,[["render",t]]);export{E as __pageData,m as default}; diff --git a/assets/ja_docs_contribute_prettier.md.0fcbc08e.js b/assets/ja_docs_contribute_prettier.md.0fcbc08e.js new file mode 100644 index 0000000000..13b0fa311c --- /dev/null +++ b/assets/ja_docs_contribute_prettier.md.0fcbc08e.js @@ -0,0 +1 @@ +import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/prettier.md","filePath":"ja/docs/contribute/prettier.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default}; diff --git a/assets/ja_docs_contribute_prettier.md.0fcbc08e.lean.js b/assets/ja_docs_contribute_prettier.md.0fcbc08e.lean.js new file mode 100644 index 0000000000..13b0fa311c --- /dev/null +++ b/assets/ja_docs_contribute_prettier.md.0fcbc08e.lean.js @@ -0,0 +1 @@ +import{_ as t,o as r,c as a,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Prettier","description":"","frontmatter":{"title":"Prettier","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/prettier.md","filePath":"ja/docs/contribute/prettier.md","lastUpdated":1701053760000}'),i={name:"ja/docs/contribute/prettier.md"},s=e("h1",{id:"prettier",tabindex:"-1"},[o("Prettier "),e("a",{class:"header-anchor",href:"#prettier","aria-label":'Permalink to "Prettier"'},"​")],-1),c=[s];function n(d,p,l,_,h,m){return r(),a("div",null,c)}const P=t(i,[["render",n]]);export{u as __pageData,P as default}; diff --git a/assets/ja_docs_contribute_resolver.md.a7d71247.js b/assets/ja_docs_contribute_resolver.md.a7d71247.js new file mode 100644 index 0000000000..346eac8faa --- /dev/null +++ b/assets/ja_docs_contribute_resolver.md.a7d71247.js @@ -0,0 +1 @@ +import{_ as o,o as r,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/resolver.md","filePath":"ja/docs/contribute/resolver.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[a("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(s,[["render",d]]);export{b as __pageData,k as default}; diff --git a/assets/ja_docs_contribute_resolver.md.a7d71247.lean.js b/assets/ja_docs_contribute_resolver.md.a7d71247.lean.js new file mode 100644 index 0000000000..346eac8faa --- /dev/null +++ b/assets/ja_docs_contribute_resolver.md.a7d71247.lean.js @@ -0,0 +1 @@ +import{_ as o,o as r,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/resolver.md","filePath":"ja/docs/contribute/resolver.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/resolver.md"},l=e("h1",{id:"resolver",tabindex:"-1"},[a("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),n=e("p",null,"Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].",-1),i=e("p",null,"[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.",-1),c=[l,n,i];function d(p,u,_,f,v,m){return r(),t("div",null,c)}const k=o(s,[["render",d]]);export{b as __pageData,k as default}; diff --git a/assets/ja_docs_contribute_showcase.md.2c987012.js b/assets/ja_docs_contribute_showcase.md.2c987012.js new file mode 100644 index 0000000000..9b705937eb --- /dev/null +++ b/assets/ja_docs_contribute_showcase.md.2c987012.js @@ -0,0 +1 @@ +import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/showcase.md","filePath":"ja/docs/contribute/showcase.md","lastUpdated":1701053760000}'),c={name:"ja/docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default}; diff --git a/assets/ja_docs_contribute_showcase.md.2c987012.lean.js b/assets/ja_docs_contribute_showcase.md.2c987012.lean.js new file mode 100644 index 0000000000..9b705937eb --- /dev/null +++ b/assets/ja_docs_contribute_showcase.md.2c987012.lean.js @@ -0,0 +1 @@ +import{_ as a,o,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Showcase","description":"","frontmatter":{"title":"Showcase","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/showcase.md","filePath":"ja/docs/contribute/showcase.md","lastUpdated":1701053760000}'),c={name:"ja/docs/contribute/showcase.md"},r=e("h1",{id:"showcase",tabindex:"-1"},[t("Showcase "),e("a",{class:"header-anchor",href:"#showcase","aria-label":'Permalink to "Showcase"'},"​")],-1),n=e("p",null,[t("Example PRs adding "),e("code",null,"oxlint"),t(":")],-1),l=e("ul",null,[e("li",null,[e("a",{href:"https://github.com/toeverything/AFFiNE/pull/4867",target:"_blank",rel:"noreferrer"},"Affine")]),e("li",null,[e("a",{href:"https://github.com/oxc-project/rspack/pull/3999",target:"_blank",rel:"noreferrer"},"Rspack")])],-1),i=[r,n,l];function h(d,p,_,u,f,m){return o(),s("div",null,i)}const k=a(c,[["render",h]]);export{b as __pageData,k as default}; diff --git a/assets/ja_docs_contribute_transformer.md.f632fd4e.js b/assets/ja_docs_contribute_transformer.md.f632fd4e.js new file mode 100644 index 0000000000..84f3ab1d51 --- /dev/null +++ b/assets/ja_docs_contribute_transformer.md.f632fd4e.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/transformer.md","filePath":"ja/docs/contribute/transformer.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),a("div",null,i)}const x=t(s,[["render",l]]);export{b as __pageData,x as default}; diff --git a/assets/ja_docs_contribute_transformer.md.f632fd4e.lean.js b/assets/ja_docs_contribute_transformer.md.f632fd4e.lean.js new file mode 100644 index 0000000000..84f3ab1d51 --- /dev/null +++ b/assets/ja_docs_contribute_transformer.md.f632fd4e.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,k as e,a as r}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/transformer.md","filePath":"ja/docs/contribute/transformer.md","lastUpdated":1701053760000}'),s={name:"ja/docs/contribute/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[r("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=e("p",null,[r("A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the "),e("a",{href:"https://github.com/oxc-project/oxc/issues/974",target:"_blank",rel:"noreferrer"},"umbrella issue"),r(" for details.")],-1),i=[n,c];function l(d,f,m,p,h,u){return o(),a("div",null,i)}const x=t(s,[["render",l]]);export{b as __pageData,x as default}; diff --git a/assets/ja_docs_contribute_vscode.md.f0821a79.js b/assets/ja_docs_contribute_vscode.md.f0821a79.js new file mode 100644 index 0000000000..30d09ad74e --- /dev/null +++ b/assets/ja_docs_contribute_vscode.md.f0821a79.js @@ -0,0 +1 @@ +import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/vscode.md","filePath":"ja/docs/contribute/vscode.md","lastUpdated":1701053760000}'),n={name:"ja/docs/contribute/vscode.md"},a=d('

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
',4),i=[a];function c(s,l,r,p,_,u){return o(),t("div",null,i)}const x=e(n,[["render",c]]);export{h as __pageData,x as default}; diff --git a/assets/ja_docs_contribute_vscode.md.f0821a79.lean.js b/assets/ja_docs_contribute_vscode.md.f0821a79.lean.js new file mode 100644 index 0000000000..e78b38af85 --- /dev/null +++ b/assets/ja_docs_contribute_vscode.md.f0821a79.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as t,Q as d}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"VSCode Extension","description":"","frontmatter":{"title":"VSCode Extension","outline":"deep"},"headers":[],"relativePath":"ja/docs/contribute/vscode.md","filePath":"ja/docs/contribute/vscode.md","lastUpdated":1701053760000}'),n={name:"ja/docs/contribute/vscode.md"},a=d("",4),i=[a];function c(s,l,r,p,_,u){return o(),t("div",null,i)}const x=e(n,[["render",c]]);export{h as __pageData,x as default}; diff --git a/assets/ja_docs_guide_benchmarks.md.eef70013.js b/assets/ja_docs_guide_benchmarks.md.eef70013.js new file mode 100644 index 0000000000..0b80fae2fd --- /dev/null +++ b/assets/ja_docs_guide_benchmarks.md.eef70013.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/benchmarks.md","filePath":"ja/docs/guide/benchmarks.md","lastUpdated":1701053760000}'),r={name:"ja/docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/ja_docs_guide_benchmarks.md.eef70013.lean.js b/assets/ja_docs_guide_benchmarks.md.eef70013.lean.js new file mode 100644 index 0000000000..0b80fae2fd --- /dev/null +++ b/assets/ja_docs_guide_benchmarks.md.eef70013.lean.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as t,k as e,a as c}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/benchmarks.md","filePath":"ja/docs/guide/benchmarks.md","lastUpdated":1701053760000}'),r={name:"ja/docs/guide/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[c("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=e("p",null,"TBD",-1),d=[n,o];function i(h,m,l,_,k,p){return s(),t("div",null,d)}const b=a(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/ja_docs_guide_introduction.md.e93c04aa.js b/assets/ja_docs_guide_introduction.md.e93c04aa.js new file mode 100644 index 0000000000..151cab4042 --- /dev/null +++ b/assets/ja_docs_guide_introduction.md.e93c04aa.js @@ -0,0 +1 @@ +import{V as a}from"./chunks/theme.be7b3ccb.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i('

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

',8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/introduction.md","filePath":"ja/docs/guide/introduction.md","lastUpdated":1701053760000}'),l={name:"ja/docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; diff --git a/assets/ja_docs_guide_introduction.md.e93c04aa.lean.js b/assets/ja_docs_guide_introduction.md.e93c04aa.lean.js new file mode 100644 index 0000000000..1b57980718 --- /dev/null +++ b/assets/ja_docs_guide_introduction.md.e93c04aa.lean.js @@ -0,0 +1 @@ +import{V as a}from"./chunks/theme.be7b3ccb.js";import{o as t,c as r,H as o,l as e,Q as i}from"./chunks/framework.725e5b03.js";import{C as s}from"./chunks/team.fcc5c8bb.js";const n=i("",8),u=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/introduction.md","filePath":"ja/docs/guide/introduction.md","lastUpdated":1701053760000}'),l={name:"ja/docs/guide/introduction.md"},_=Object.assign(l,{setup(h){return(c,d)=>(t(),r("div",null,[n,o(e(a),{size:"medium",members:e(s)},null,8,["members"])]))}});export{u as __pageData,_ as default}; diff --git a/assets/ja_docs_guide_philosophy.md.53319563.js b/assets/ja_docs_guide_philosophy.md.53319563.js new file mode 100644 index 0000000000..e442057d9a --- /dev/null +++ b/assets/ja_docs_guide_philosophy.md.53319563.js @@ -0,0 +1 @@ +import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/philosophy.md","filePath":"ja/docs/guide/philosophy.md","lastUpdated":1701053760000}'),i={name:"ja/docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; diff --git a/assets/ja_docs_guide_philosophy.md.53319563.lean.js b/assets/ja_docs_guide_philosophy.md.53319563.lean.js new file mode 100644 index 0000000000..e442057d9a --- /dev/null +++ b/assets/ja_docs_guide_philosophy.md.53319563.lean.js @@ -0,0 +1 @@ +import{_ as o,o as s,c as t,k as e,a}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/philosophy.md","filePath":"ja/docs/guide/philosophy.md","lastUpdated":1701053760000}'),i={name:"ja/docs/guide/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[a("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=e("p",null,"TBD",-1),l=[h,p];function d(c,r,n,_,m,u){return s(),t("div",null,l)}const P=o(i,[["render",d]]);export{f as __pageData,P as default}; diff --git a/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.js b/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.js new file mode 100644 index 0000000000..799d3b8646 --- /dev/null +++ b/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/usage/benchmarks.md","filePath":"ja/docs/guide/usage/benchmarks.md","lastUpdated":1701053760000}'),c={name:"ja/docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.lean.js b/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.lean.js new file mode 100644 index 0000000000..799d3b8646 --- /dev/null +++ b/assets/ja_docs_guide_usage_benchmarks.md.333e4a26.lean.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Benchmarks","description":"","frontmatter":{"title":"Benchmarks","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/usage/benchmarks.md","filePath":"ja/docs/guide/usage/benchmarks.md","lastUpdated":1701053760000}'),c={name:"ja/docs/guide/usage/benchmarks.md"},n=e("h1",{id:"benchmarks",tabindex:"-1"},[r("Benchmarks "),e("a",{class:"header-anchor",href:"#benchmarks","aria-label":'Permalink to "Benchmarks"'},"​")],-1),o=[n];function d(i,h,m,l,_,k){return s(),t("div",null,o)}const f=a(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/ja_docs_guide_usage_linter.md.6d7c833c.js b/assets/ja_docs_guide_usage_linter.md.6d7c833c.js new file mode 100644 index 0000000000..1dee215804 --- /dev/null +++ b/assets/ja_docs_guide_usage_linter.md.6d7c833c.js @@ -0,0 +1,77 @@ +import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"ja/docs/guide/usage/linter.md","filePath":"ja/docs/guide/usage/linter.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/linter.md"},c=p(`

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
+  "languageserver": {
+    "oxc": {
+      "command": "oxc_vscode",
+      "filetypes": [
+        "typescript",
+        "javascript"
+      ],
+      "rootPatterns": [
+        ".git"
+      ]
+    }
+  }
+}
{
+  "languageserver": {
+    "oxc": {
+      "command": "oxc_vscode",
+      "filetypes": [
+        "typescript",
+        "javascript"
+      ],
+      "rootPatterns": [
+        ".git"
+      ]
+    }
+  }
+}

Continuous Integration

It is recommended to run oxlint before eslint for faster feedback loops, since oxlint only takes a few seconds to run.

GitHub Actions

yaml
jobs:
+  oxlint:
+    name: Lint JS
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - run: npx --yes oxlint@latest
jobs:
+  oxlint:
+    name: Lint JS
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - run: npx --yes oxlint@latest

Nix

Check nixpkgs repository for more detail.

Commands

  • npx oxlint@latest --rules shows the list of rules

  • npx oxlint@latest --help shows usage instructions

    Usage: oxlint [-A=NAME | -D=NAME]... [--fix] [PATH]...
    +
    +Allowing / Denying Multiple Lints
    +  For example \`-D correctness -A no-debugger\` or \`-A all -D no-debugger\`.
    +  The default category is "-D correctness".
    +  Use "--rules" for rule names.
    +  Use "--help --help" for rule categories.
    +    -A, --allow=NAME          Allow the rule or category (suppress the lint)
    +    -D, --deny=NAME           Deny the rule or category (emit an error)
    +
    +Enable Plugins
    +        --import-plugin       Enable the experimental import plugin and detect ESM problems
    +        --jest-plugin         Enable the Jest plugin and detect test problems
    +        --jsx-a11y-plugin     Enable the JSX-a11y plugin and detect accessibility problems
    +
    +Available positional items:
    +    PATH                      Single file, single path or list of paths
    +
    +Available options:
    +    -h, --help                Prints help information
    Usage: oxlint [-A=NAME | -D=NAME]... [--fix] [PATH]...
    +
    +Allowing / Denying Multiple Lints
    +  For example \`-D correctness -A no-debugger\` or \`-A all -D no-debugger\`.
    +  The default category is "-D correctness".
    +  Use "--rules" for rule names.
    +  Use "--help --help" for rule categories.
    +    -A, --allow=NAME          Allow the rule or category (suppress the lint)
    +    -D, --deny=NAME           Deny the rule or category (emit an error)
    +
    +Enable Plugins
    +        --import-plugin       Enable the experimental import plugin and detect ESM problems
    +        --jest-plugin         Enable the Jest plugin and detect test problems
    +        --jsx-a11y-plugin     Enable the JSX-a11y plugin and detect accessibility problems
    +
    +Available positional items:
    +    PATH                      Single file, single path or list of paths
    +
    +Available options:
    +    -h, --help                Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
`,29);function r(i,y,d,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const F=a(t,[["render",r]]);export{b as __pageData,F as default}; diff --git a/assets/ja_docs_guide_usage_linter.md.6d7c833c.lean.js b/assets/ja_docs_guide_usage_linter.md.6d7c833c.lean.js new file mode 100644 index 0000000000..d0ca926b17 --- /dev/null +++ b/assets/ja_docs_guide_usage_linter.md.6d7c833c.lean.js @@ -0,0 +1 @@ +import{_ as a,C as n,o as l,c as e,H as o,Q as p}from"./chunks/framework.725e5b03.js";const b=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxlint","alt":"npm"},{"src":"https://img.shields.io/github/stars/oxc-project/oxc","alt":"GitHub Repo stars"}]},"headers":[],"relativePath":"ja/docs/guide/usage/linter.md","filePath":"ja/docs/guide/usage/linter.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/linter.md"},c=p("",29);function r(i,y,d,E,u,h){const s=n("AppBadgeList");return l(),e("div",null,[o(s),c])}const F=a(t,[["render",r]]);export{b as __pageData,F as default}; diff --git a/assets/ja_docs_guide_usage_parser.md.0185a423.js b/assets/ja_docs_guide_usage_parser.md.0185a423.js new file mode 100644 index 0000000000..639919e953 --- /dev/null +++ b/assets/ja_docs_guide_usage_parser.md.0185a423.js @@ -0,0 +1 @@ +import{_ as a,C as e,o as l,c as o,H as p,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"ja/docs/guide/usage/parser.md","filePath":"ja/docs/guide/usage/parser.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/parser.md"},r=n('

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
',14);function c(i,d,y,E,h,u){const s=e("AppBadgeList");return l(),o("div",null,[p(s),r])}const b=a(t,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/ja_docs_guide_usage_parser.md.0185a423.lean.js b/assets/ja_docs_guide_usage_parser.md.0185a423.lean.js new file mode 100644 index 0000000000..a102e3ca19 --- /dev/null +++ b/assets/ja_docs_guide_usage_parser.md.0185a423.lean.js @@ -0,0 +1 @@ +import{_ as a,C as e,o as l,c as o,H as p,Q as n}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-parser","alt":"npm"}]},"headers":[],"relativePath":"ja/docs/guide/usage/parser.md","filePath":"ja/docs/guide/usage/parser.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/parser.md"},r=n("",14);function c(i,d,y,E,h,u){const s=e("AppBadgeList");return l(),o("div",null,[p(s),r])}const b=a(t,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/ja_docs_guide_usage_philosophy.md.cc97835a.js b/assets/ja_docs_guide_usage_philosophy.md.cc97835a.js new file mode 100644 index 0000000000..5e09084bd1 --- /dev/null +++ b/assets/ja_docs_guide_usage_philosophy.md.cc97835a.js @@ -0,0 +1 @@ +import{_ as o,o as a,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/usage/philosophy.md","filePath":"ja/docs/guide/usage/philosophy.md","lastUpdated":1701053760000}'),i={name:"ja/docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return a(),s("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/ja_docs_guide_usage_philosophy.md.cc97835a.lean.js b/assets/ja_docs_guide_usage_philosophy.md.cc97835a.lean.js new file mode 100644 index 0000000000..5e09084bd1 --- /dev/null +++ b/assets/ja_docs_guide_usage_philosophy.md.cc97835a.lean.js @@ -0,0 +1 @@ +import{_ as o,o as a,c as s,k as e,a as t}from"./chunks/framework.725e5b03.js";const y=JSON.parse('{"title":"Philosophy","description":"","frontmatter":{"title":"Philosophy","outline":"deep"},"headers":[],"relativePath":"ja/docs/guide/usage/philosophy.md","filePath":"ja/docs/guide/usage/philosophy.md","lastUpdated":1701053760000}'),i={name:"ja/docs/guide/usage/philosophy.md"},h=e("h1",{id:"philosophy",tabindex:"-1"},[t("Philosophy "),e("a",{class:"header-anchor",href:"#philosophy","aria-label":'Permalink to "Philosophy"'},"​")],-1),p=[h];function d(l,r,c,n,_,u){return a(),s("div",null,p)}const f=o(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/ja_docs_guide_usage_resolver.md.8d81200e.js b/assets/ja_docs_guide_usage_resolver.md.8d81200e.js new file mode 100644 index 0000000000..49d990ab21 --- /dev/null +++ b/assets/ja_docs_guide_usage_resolver.md.8d81200e.js @@ -0,0 +1,33 @@ +import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const v=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"ja/docs/guide/usage/resolver.md","filePath":"ja/docs/guide/usage/resolver.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/resolver.md"},r=e(`

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
+
+use oxc_resolver::{ResolveOptions, Resolver};
+
+fn main() {
+    let path = env::args().nth(1).expect("require path");
+    let request = env::args().nth(2).expect("require request");
+    let path = PathBuf::from(path).canonicalize().unwrap();
+
+    println!("path: {path:?}");
+    println!("request: {request}");
+
+    match Resolver::new(ResolveOptions::default()).resolve(path, &request) {
+        Err(error) => println!("Error: {error}"),
+        Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
+    }
+}
use std::{env, path::PathBuf};
+
+use oxc_resolver::{ResolveOptions, Resolver};
+
+fn main() {
+    let path = env::args().nth(1).expect("require path");
+    let request = env::args().nth(2).expect("require request");
+    let path = PathBuf::from(path).canonicalize().unwrap();
+
+    println!("path: {path:?}");
+    println!("request: {request}");
+
+    match Resolver::new(ResolveOptions::default()).resolve(path, &request) {
+        Err(error) => println!("Error: {error}"),
+        Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
+    }
+}
`,13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const C=a(t,[["render",c]]);export{v as __pageData,C as default}; diff --git a/assets/ja_docs_guide_usage_resolver.md.8d81200e.lean.js b/assets/ja_docs_guide_usage_resolver.md.8d81200e.lean.js new file mode 100644 index 0000000000..7aa8743f8d --- /dev/null +++ b/assets/ja_docs_guide_usage_resolver.md.8d81200e.lean.js @@ -0,0 +1 @@ +import{_ as a,C as n,o as l,c as p,H as o,Q as e}from"./chunks/framework.725e5b03.js";const v=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep","badges":[{"src":"https://img.shields.io/npm/dw/oxc-resolver","alt":"npm"}]},"headers":[],"relativePath":"ja/docs/guide/usage/resolver.md","filePath":"ja/docs/guide/usage/resolver.md","lastUpdated":1701053760000}'),t={name:"ja/docs/guide/usage/resolver.md"},r=e("",13);function c(y,E,i,F,d,u){const s=n("AppBadgeList");return l(),p("div",null,[o(s),r])}const C=a(t,[["render",c]]);export{v as __pageData,C as default}; diff --git a/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.js b/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.js new file mode 100644 index 0000000000..71291c7219 --- /dev/null +++ b/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/formatter.md","filePath":"ja/docs/learn/architecture/formatter.md","lastUpdated":1701053760000}'),c={name:"ja/docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return a(),r("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.lean.js b/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.lean.js new file mode 100644 index 0000000000..71291c7219 --- /dev/null +++ b/assets/ja_docs_learn_architecture_formatter.md.e9e4c97a.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Formatter","description":"","frontmatter":{"title":"Formatter","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/formatter.md","filePath":"ja/docs/learn/architecture/formatter.md","lastUpdated":1701053760000}'),c={name:"ja/docs/learn/architecture/formatter.md"},s=e("h1",{id:"formatter",tabindex:"-1"},[o("Formatter "),e("a",{class:"header-anchor",href:"#formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),n=[s];function d(i,m,l,f,_,h){return a(),r("div",null,n)}const x=t(c,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_introduction.md.45104dba.js b/assets/ja_docs_learn_architecture_introduction.md.45104dba.js new file mode 100644 index 0000000000..87d28232fb --- /dev/null +++ b/assets/ja_docs_learn_architecture_introduction.md.45104dba.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,k as t,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/introduction.md","filePath":"ja/docs/learn/architecture/introduction.md","lastUpdated":1701053760000}'),r={name:"ja/docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[n("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),a("div",null,i)}const x=e(r,[["render",d]]);export{f as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_introduction.md.45104dba.lean.js b/assets/ja_docs_learn_architecture_introduction.md.45104dba.lean.js new file mode 100644 index 0000000000..87d28232fb --- /dev/null +++ b/assets/ja_docs_learn_architecture_introduction.md.45104dba.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,k as t,a as n}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{"title":"Introduction","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/introduction.md","filePath":"ja/docs/learn/architecture/introduction.md","lastUpdated":1701053760000}'),r={name:"ja/docs/learn/architecture/introduction.md"},c=t("h1",{id:"introduction",tabindex:"-1"},[n("Introduction "),t("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1),i=[c];function d(s,l,u,_,h,p){return o(),a("div",null,i)}const x=e(r,[["render",d]]);export{f as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_linter.md.a9524693.js b/assets/ja_docs_learn_architecture_linter.md.a9524693.js new file mode 100644 index 0000000000..a923ad03a4 --- /dev/null +++ b/assets/ja_docs_learn_architecture_linter.md.a9524693.js @@ -0,0 +1 @@ +import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/linter.md","filePath":"ja/docs/learn/architecture/linter.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/ja_docs_learn_architecture_linter.md.a9524693.lean.js b/assets/ja_docs_learn_architecture_linter.md.a9524693.lean.js new file mode 100644 index 0000000000..a923ad03a4 --- /dev/null +++ b/assets/ja_docs_learn_architecture_linter.md.a9524693.lean.js @@ -0,0 +1 @@ +import{_ as a,o as r,c as n,k as e,a as t}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Linter","description":"","frontmatter":{"title":"Linter","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/linter.md","filePath":"ja/docs/learn/architecture/linter.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/architecture/linter.md"},i=e("h1",{id:"example",tabindex:"-1"},[t("Example "),e("a",{class:"header-anchor",href:"#example","aria-label":'Permalink to "Example"'},"​")],-1),o=e("p",null,[t("See "),e("code",null,"crates/oxc_linter/examples/linter.rs"),t(" for the bare minimum linter implementation.")],-1),c=[i,o];function s(d,m,p,_,h,u){return r(),n("div",null,c)}const k=a(l,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.js b/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.js new file mode 100644 index 0000000000..a6add6002c --- /dev/null +++ b/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/minifier.md","filePath":"ja/docs/learn/architecture/minifier.md","lastUpdated":1701053760000}'),n={name:"ja/docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[r("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return a(),t("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.lean.js b/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.lean.js new file mode 100644 index 0000000000..a6add6002c --- /dev/null +++ b/assets/ja_docs_learn_architecture_minifier.md.6c9d6ee0.lean.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as t,k as e,a as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Minifier","description":"","frontmatter":{"title":"Minifier","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/minifier.md","filePath":"ja/docs/learn/architecture/minifier.md","lastUpdated":1701053760000}'),n={name:"ja/docs/learn/architecture/minifier.md"},c=e("h1",{id:"minifier",tabindex:"-1"},[r("Minifier "),e("a",{class:"header-anchor",href:"#minifier","aria-label":'Permalink to "Minifier"'},"​")],-1),o=[c];function s(d,f,l,m,_,h){return a(),t("div",null,o)}const x=i(n,[["render",s]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_parser.md.f8c02391.js b/assets/ja_docs_learn_architecture_parser.md.f8c02391.js new file mode 100644 index 0000000000..2f44353389 --- /dev/null +++ b/assets/ja_docs_learn_architecture_parser.md.f8c02391.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/parser.md","filePath":"ja/docs/learn/architecture/parser.md","lastUpdated":1701053760000}'),i={name:"ja/docs/learn/architecture/parser.md"},o=r('

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
',8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; diff --git a/assets/ja_docs_learn_architecture_parser.md.f8c02391.lean.js b/assets/ja_docs_learn_architecture_parser.md.f8c02391.lean.js new file mode 100644 index 0000000000..cc4ccc1108 --- /dev/null +++ b/assets/ja_docs_learn_architecture_parser.md.f8c02391.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Parser","description":"","frontmatter":{"title":"Parser","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/parser.md","filePath":"ja/docs/learn/architecture/parser.md","lastUpdated":1701053760000}'),i={name:"ja/docs/learn/architecture/parser.md"},o=r("",8),n=[o];function s(c,l,d,p,h,f){return a(),t("div",null,n)}const _=e(i,[["render",s]]);export{u as __pageData,_ as default}; diff --git a/assets/ja_docs_learn_architecture_resolver.md.751b4d95.js b/assets/ja_docs_learn_architecture_resolver.md.751b4d95.js new file mode 100644 index 0000000000..a324efabe8 --- /dev/null +++ b/assets/ja_docs_learn_architecture_resolver.md.751b4d95.js @@ -0,0 +1 @@ +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/resolver.md","filePath":"ja/docs/learn/architecture/resolver.md","lastUpdated":1701053760000}'),s={name:"ja/docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return a(),t("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/ja_docs_learn_architecture_resolver.md.751b4d95.lean.js b/assets/ja_docs_learn_architecture_resolver.md.751b4d95.lean.js new file mode 100644 index 0000000000..a324efabe8 --- /dev/null +++ b/assets/ja_docs_learn_architecture_resolver.md.751b4d95.lean.js @@ -0,0 +1 @@ +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const f=JSON.parse('{"title":"Resolver","description":"","frontmatter":{"title":"Resolver","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/resolver.md","filePath":"ja/docs/learn/architecture/resolver.md","lastUpdated":1701053760000}'),s={name:"ja/docs/learn/architecture/resolver.md"},c=e("h1",{id:"resolver",tabindex:"-1"},[o("Resolver "),e("a",{class:"header-anchor",href:"#resolver","aria-label":'Permalink to "Resolver"'},"​")],-1),l=[c];function n(d,i,_,h,p,v){return a(),t("div",null,l)}const u=r(s,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.js b/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.js new file mode 100644 index 0000000000..70001a5a18 --- /dev/null +++ b/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.js @@ -0,0 +1 @@ +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/transformer.md","filePath":"ja/docs/learn/architecture/transformer.md","lastUpdated":1701053760000}'),s={name:"ja/docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.lean.js b/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.lean.js new file mode 100644 index 0000000000..70001a5a18 --- /dev/null +++ b/assets/ja_docs_learn_architecture_transformer.md.ea5219ab.lean.js @@ -0,0 +1 @@ +import{_ as r,o as a,c as t,k as e,a as o}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Transformer","description":"","frontmatter":{"title":"Transformer","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/architecture/transformer.md","filePath":"ja/docs/learn/architecture/transformer.md","lastUpdated":1701053760000}'),s={name:"ja/docs/learn/architecture/transformer.md"},n=e("h1",{id:"transformer",tabindex:"-1"},[o("Transformer "),e("a",{class:"header-anchor",href:"#transformer","aria-label":'Permalink to "Transformer"'},"​")],-1),c=[n];function d(i,m,f,l,_,h){return a(),t("div",null,c)}const x=r(s,[["render",d]]);export{u as __pageData,x as default}; diff --git a/assets/ja_docs_learn_ecmascript_grammar.md.53196869.js b/assets/ja_docs_learn_ecmascript_grammar.md.53196869.js new file mode 100644 index 0000000000..817acf772b --- /dev/null +++ b/assets/ja_docs_learn_ecmascript_grammar.md.53196869.js @@ -0,0 +1,401 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecmascript/grammar.md","filePath":"ja/docs/learn/ecmascript/grammar.md","lastUpdated":1701053760000}'),o={name:"ja/docs/learn/ecmascript/grammar.md"},l=e(`

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
+BindingIdentifier[Yield, Await] :
+LabelIdentifier[Yield, Await] :
IdentifierReference[Yield, Await] :
+BindingIdentifier[Yield, Await] :
+LabelIdentifier[Yield, Await] :

estree and some ASTs do not distinguish the above identifiers, and the specification does not explain them in plain text.

BindingIdentifiers are declarations and IdentifierReferences are references to binding identifiers. For example in var foo = bar, foo is a BindingIdentifier and bar is a IdentifierReference in the grammar:

VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] opt
+
+Initializer[In, Yield, Await] :
+    = AssignmentExpression[?In, ?Yield, ?Await]
VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] opt
+
+Initializer[In, Yield, Await] :
+    = AssignmentExpression[?In, ?Yield, ?Await]

follow AssignmentExpression into PrimaryExpression we get

PrimaryExpression[Yield, Await] :
+    IdentifierReference[?Yield, ?Await]
PrimaryExpression[Yield, Await] :
+    IdentifierReference[?Yield, ?Await]

Declaring these identifiers differently in the AST will greatly simply downstream tools, especially for semantic analysis.

rust
pub struct BindingIdentifier {
+    pub node: Node,
+    pub name: Atom,
+}
+
+pub struct IdentifierReference {
+    pub node: Node,
+    pub name: Atom,
+}
pub struct BindingIdentifier {
+    pub node: Node,
+    pub name: Atom,
+}
+
+pub struct IdentifierReference {
+    pub node: Node,
+    pub name: Atom,
+}

Class and Strict Mode

ECMAScript Class is born after strict mode, so they decided that everything inside a class must be strict mode for simplicity. It is stated as such in #sec-class-definitions with just a Node: A class definition is always strict mode code.

It is easy to declare strict mode by associating it with function scopes, but a class declaration does not have a scope, we need to keep an extra state just for parsing classes.

rust
https://github.com/swc-project/swc/blob/f9c4eff94a133fa497778328fa0734aa22d5697c/crates/swc_ecma_parser/src/parser/class_and_fn.rs#L85
https://github.com/swc-project/swc/blob/f9c4eff94a133fa497778328fa0734aa22d5697c/crates/swc_ecma_parser/src/parser/class_and_fn.rs#L85

Legacy Octal and Use Strict

#sec-string-literals-early-errors disallows escaped legacy octal inside strings "\\01":

EscapeSequence ::
+    LegacyOctalEscapeSequence
+    NonOctalDecimalEscapeSequence
+
+It is a Syntax Error if the source text matched by this production is strict mode code.
EscapeSequence ::
+    LegacyOctalEscapeSequence
+    NonOctalDecimalEscapeSequence
+
+It is a Syntax Error if the source text matched by this production is strict mode code.

The best place to detect this is inside the lexer, it can ask the parser for strict mode state and throw errors accordingly.

But, this becomes impossible when mixed with directives:

javascript
https://github.com/tc39/test262/blob/747bed2e8aaafe8fdf2c65e8a10dd7ae64f66c47/test/language/literals/string/legacy-octal-escape-sequence-prologue-strict.js#L16-L19
https://github.com/tc39/test262/blob/747bed2e8aaafe8fdf2c65e8a10dd7ae64f66c47/test/language/literals/string/legacy-octal-escape-sequence-prologue-strict.js#L16-L19

use strict is declared after the escaped legacy octal, yet the syntax error needs to be thrown. Fortunately, no real code uses directives with legacy octals ... unless you want to pass the test262 case from above.


Non-simple Parameter and Strict Mode

Identical function parameters is allowed in non-strict mode function foo(a, a) { }, and we can forbid this by adding use strict: function foo(a, a) { "use strict" }. Later on in es6, other grammars were added to function parameters, for example function foo({ a }, b = c) {}.

Now, what happens if we write the following where "01" is a strict mode error?

javaScript
function foo(value=(function() { return "\\01" }())) {
+    "use strict";
+    return value;
+}
function foo(value=(function() { return "\\01" }())) {
+    "use strict";
+    return value;
+}

More specifically, what should we do if there is a strict mode syntax error inside the parameters thinking from the parser perspective? So in #sec-function-definitions-static-semantics-early-errors, it just bans this by stating

FunctionDeclaration :
+FunctionExpression :
+
+It is a Syntax Error if FunctionBodyContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false.
FunctionDeclaration :
+FunctionExpression :
+
+It is a Syntax Error if FunctionBodyContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false.

Chrome throws this error with a mysterious message "Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list".

A more in-depth explanation is described in this blog post by the author of ESLint.

INFO

Fun fact, the above rule does not apply if we are targeting es5 in TypeScript, it transpiles to

javaScript
function foo(a, b) {
+    "use strict";
+    if (b === void 0) { b = "\\01"; }
+}
function foo(a, b) {
+    "use strict";
+    if (b === void 0) { b = "\\01"; }
+}

Parenthesized Expression

Parenthesized expressions are supposed to not have any semantic meanings? For instance the AST for ((x)) can just be a single IdentifierReference, not ParenthesizedExpression -> ParenthesizedExpression -> IdentifierReference. And this is the case for JavaScript grammar.

But ... who would have thought it can have run-time meanings. Found in this estree issue, it shows that

javascript
> fn = function () {};
+> fn.name
+< "fn"
+
+> (fn) = function () {};
+> fn.name
+< ''
> fn = function () {};
+> fn.name
+< "fn"
+
+> (fn) = function () {};
+> fn.name
+< ''

So eventually acorn and babel added the preserveParens option for compatibility.


Function Declaration in If Statement

If we follow the grammar precisely in #sec-ecmascript-language-statements-and-declarations:

Statement[Yield, Await, Return] :
+    ... lots of statements
+
+Declaration[Yield, Await] :
+    ... declarations
Statement[Yield, Await, Return] :
+    ... lots of statements
+
+Declaration[Yield, Await] :
+    ... declarations

The Statement node we define for our AST would obviously not contain Declaration,

but in Annex B #sec-functiondeclarations-in-ifstatement-statement-clauses, it allows declaration inside the statement position of if statements in non-strict mode:

javascript
if (x) function foo() {}
+else function bar() {}
if (x) function foo() {}
+else function bar() {}

Label statement is legit

We probably have never written a single line of labelled statement, but it is legit in modern JavaScript and not banned by strict mode.

The following syntax is correct, it returns a labelled statement (not object literal).

javascript
<Foo
+  bar={() => {
+    baz: "quaz";
+  }}
+/>
+//   ^^^^^^^^^^^ \`LabelledStatement\`
<Foo
+  bar={() => {
+    baz: "quaz";
+  }}
+/>
+//   ^^^^^^^^^^^ \`LabelledStatement\`

let is not a keyword

let is not a keyword so it is allowed to appear anywhere unless the grammar explicitly states let is not allowed in such positions. Parsers need to peek at the token after the let token and decide what it needs to be parsed into, e.g.:

javascript
let a;
+let = foo;
+let instanceof x;
+let + 1;
+while (true) let;
+a = let[0];
let a;
+let = foo;
+let instanceof x;
+let + 1;
+while (true) let;
+a = let[0];

For-in / For-of and the [In] context

If we look at the grammar for for-in and for-of in #prod-ForInOfStatement, it is immediately confusing to understand how to parse these.

There are two major obstacles for us to understand: the [lookahead ≠ let] part and the [+In] part.

If we have parsed to for (let, we need to check the peeking token is:

  • not in to disallow for (let in)
  • is {, [ or an identifier to allow for (let {} = foo), for (let [] = foo) and for (let bar = foo)

Once reached the of or in keyword, the right-hand side expression needs to be passed with the correct [+In] context to disallow the two in expressions in #prod-RelationalExpression:

RelationalExpression[In, Yield, Await] :
+    [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await]
+    [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await]
+
+Note 2: The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.
RelationalExpression[In, Yield, Await] :
+    [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await]
+    [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await]
+
+Note 2: The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.

And this is the only application for the [In] context in the entire specification.

Also to note, the grammar [lookahead ∉ { let, async of }] forbids for (async of ...), and it needs to be explicitly guarded against.


Block-Level Function Declarations

In Annex B.3.2 #sec-block-level-function-declarations-web-legacy-compatibility-semantics, an entire page is dedicated to explain how FunctionDeclaration is supposed to behave in Block statements. It boils down to

javascript
https://github.com/acornjs/acorn/blob/11735729c4ebe590e406f952059813f250a4cbd1/acorn/src/scope.js#L30-L35
https://github.com/acornjs/acorn/blob/11735729c4ebe590e406f952059813f250a4cbd1/acorn/src/scope.js#L30-L35

The name of a FunctionDeclaration needs to be treated the same as a var declaration if its inside a function declaration. This code snippet errors with a re-declaration error since bar is inside a block scope:

javascript
function foo() {
+  if (true) {
+    var bar;
+    function bar() {} // redeclaration error
+  }
+}
function foo() {
+  if (true) {
+    var bar;
+    function bar() {} // redeclaration error
+  }
+}

meanwhile, the following does not error because it is inside a function scope, function bar is treated as a var declaration:

javascript
function foo() {
+  var bar;
+  function bar() {}
+}
function foo() {
+  var bar;
+  function bar() {}
+}

Grammar Context

The syntactic grammar has 5 context parameters for allowing and disallowing certain constructs, namely [In], [Return], [Yield], [Await] and [Default].

It is best to keep a context during parsing, for example in Rome:

rust
https://github.com/rome/tools/blob/5a059c0413baf1d54436ac0c149a829f0dfd1f4d/crates/rome_js_parser/src/state.rs#L404-L425
https://github.com/rome/tools/blob/5a059c0413baf1d54436ac0c149a829f0dfd1f4d/crates/rome_js_parser/src/state.rs#L404-L425

And toggle and check these flags accordingly by following the grammar.

AssignmentPattern vs BindingPattern

In estree, the left-hand side of an AssignmentExpression is a Pattern:

extend interface AssignmentExpression {
+    left: Pattern;
+}
extend interface AssignmentExpression {
+    left: Pattern;
+}

and the left-hand side of a VariableDeclarator is a Pattern:

interface VariableDeclarator <: Node {
+    type: "VariableDeclarator";
+    id: Pattern;
+    init: Expression | null;
+}
interface VariableDeclarator <: Node {
+    type: "VariableDeclarator";
+    id: Pattern;
+    init: Expression | null;
+}

A Pattern can be a Identifier, ObjectPattern, ArrayPattern:

interface Identifier <: Expression, Pattern {
+    type: "Identifier";
+    name: string;
+}
+
+interface ObjectPattern <: Pattern {
+    type: "ObjectPattern";
+    properties: [ AssignmentProperty ];
+}
+
+interface ArrayPattern <: Pattern {
+    type: "ArrayPattern";
+    elements: [ Pattern | null ];
+}
interface Identifier <: Expression, Pattern {
+    type: "Identifier";
+    name: string;
+}
+
+interface ObjectPattern <: Pattern {
+    type: "ObjectPattern";
+    properties: [ AssignmentProperty ];
+}
+
+interface ArrayPattern <: Pattern {
+    type: "ArrayPattern";
+    elements: [ Pattern | null ];
+}

But from the specification perspective, we have the following JavaScript:

javascript
// AssignmentExpression:
+{ foo } = bar;
+  ^^^ IdentifierReference
+[ foo ] = bar;
+  ^^^ IdentifierReference
+
+// VariableDeclarator
+var { foo } = bar;
+      ^^^ BindingIdentifier
+var [ foo ] = bar;
+      ^^^ BindingIdentifier
// AssignmentExpression:
+{ foo } = bar;
+  ^^^ IdentifierReference
+[ foo ] = bar;
+  ^^^ IdentifierReference
+
+// VariableDeclarator
+var { foo } = bar;
+      ^^^ BindingIdentifier
+var [ foo ] = bar;
+      ^^^ BindingIdentifier

This starts to become confusing because we now have a situation where we cannot directly distinguish whether the Identifier is a BindingIdentifier or a IdentifierReference inside a Pattern:

rust
enum Pattern {
+    Identifier, // Is this a \`BindingIdentifier\` or a \`IdentifierReference\`?
+    ArrayPattern,
+    ObjectPattern,
+}
enum Pattern {
+    Identifier, // Is this a \`BindingIdentifier\` or a \`IdentifierReference\`?
+    ArrayPattern,
+    ObjectPattern,
+}

This will lead to all sorts of unnecessary code further down the parser pipeline. For example, when setting up the scope for semantic analysis, we need to inspect the parents of this Identifier to determine whether we should bind it to the scope or not.

A better solution is to fully understand the specification and decide what to do.

The grammar for AssignmentExpression and VariableDeclaration are defined as:

13.15 Assignment Operators
+
+AssignmentExpression[In, Yield, Await] :
+    LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
+
+13.15.5 Destructuring Assignment
+
+In certain circumstances when processing an instance of the production
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+the interpretation of LeftHandSideExpression is refined using the following grammar:
+
+AssignmentPattern[Yield, Await] :
+    ObjectAssignmentPattern[?Yield, ?Await]
+    ArrayAssignmentPattern[?Yield, ?Await]
13.15 Assignment Operators
+
+AssignmentExpression[In, Yield, Await] :
+    LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
+
+13.15.5 Destructuring Assignment
+
+In certain circumstances when processing an instance of the production
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+the interpretation of LeftHandSideExpression is refined using the following grammar:
+
+AssignmentPattern[Yield, Await] :
+    ObjectAssignmentPattern[?Yield, ?Await]
+    ArrayAssignmentPattern[?Yield, ?Await]
14.3.2 Variable Statement
+
+VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
+    BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
14.3.2 Variable Statement
+
+VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
+    BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

The specification distinguishes this two grammar by defining them separately with an AssignmentPattern and a BindingPattern.

So in situations like this, do not be afraid to deviate from estree and define extra AST nodes for our parser:

rust
enum BindingPattern {
+    BindingIdentifier,
+    ObjectBindingPattern,
+    ArrayBindingPattern,
+}
+
+enum AssignmentPattern {
+    IdentifierReference,
+    ObjectAssignmentPattern,
+    ArrayAssignmentPattern,
+}
enum BindingPattern {
+    BindingIdentifier,
+    ObjectBindingPattern,
+    ArrayBindingPattern,
+}
+
+enum AssignmentPattern {
+    IdentifierReference,
+    ObjectAssignmentPattern,
+    ArrayAssignmentPattern,
+}

I was in a super confusing state for a whole week until I finally reached enlightenment: we need to define an AssignmentPattern node and a BindingPattern node instead of a single Pattern node.

  • estree must be correct because people have been using it for years so it cannot be wrong?
  • how are we going to cleanly distinguish the Identifiers inside the patterns without defining two separate nodes? I just cannot find where the grammar is?
  • After a whole day of navigating the specification ... the grammar for AssignmentPattern is in the 5th subsection of the main section "13.15 Assignment Operators" with the subtitle "Supplemental Syntax" 🤯 - this is really out of place because all grammar is defined in the main section, not like this one defined after the "Runtime Semantics" section

:::caution The following cases are really difficult to grasp. Here be dragons. :::

Ambiguous Grammar

Let's first think like a parser and solve the problem - given the / token, is it a division operator or the start of a regex expression?

javascript
a / b;
+a / / regex /;
+a /= / regex /;
+/ regex / / b;
+/=/ / /=/;
a / b;
+a / / regex /;
+a /= / regex /;
+/ regex / / b;
+/=/ / /=/;

It is almost impossible, isn't it? Let's break these down and follow the grammar.

The first thing we need to understand is that the syntactic grammar drives the lexical grammar as stated in #sec-ecmascript-language-lexical-grammar

There are several situations where the identification of lexical input elements is sensitive to the syntactic grammar context that is consuming the input elements.

This means that the parser is responsible for telling the lexer which token to return next. The above example indicates that the lexer needs to return either a / token or a RegExp token. For getting the correct / or RegExp token, the specification says:

The InputElementRegExp goal symbol is used in all syntactic grammar contexts where a RegularExpressionLiteral is permitted ... In all other contexts, InputElementDiv is used as the lexical goal symbol.

And the syntax for InputElementDiv and InputElementRegExp are

InputElementDiv ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    DivPunctuator <---------- the \`/\` and \`/=\` token
+    RightBracePunctuator
+
+InputElementRegExp ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    RightBracePunctuator
+    RegularExpressionLiteral <-------- the \`RegExp\` token
InputElementDiv ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    DivPunctuator <---------- the \`/\` and \`/=\` token
+    RightBracePunctuator
+
+InputElementRegExp ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    RightBracePunctuator
+    RegularExpressionLiteral <-------- the \`RegExp\` token

This means whenever the grammar reaches RegularExpressionLiteral, / need to be tokenized as a RegExp token (and throw an error if it does not have a matching /). All other cases we'll tokenize / as a slash token.

Let's walk through an example:

a / / regex /
+^ ------------ PrimaryExpression:: IdentifierReference
+  ^ ---------- MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
+    ^^^^^^^^ - PrimaryExpression: RegularExpressionLiteral
a / / regex /
+^ ------------ PrimaryExpression:: IdentifierReference
+  ^ ---------- MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
+    ^^^^^^^^ - PrimaryExpression: RegularExpressionLiteral

This statement does not match any other start of Statement, so it'll go down the ExpressionStatement route:

ExpressionStatement --> Expression --> AssignmentExpression --> ... --> MultiplicativeExpression --> ... --> MemberExpression --> PrimaryExpression --> IdentifierReference.

We stopped at IdentifierReference and not RegularExpressionLiteral, the statement "In all other contexts, InputElementDiv is used as the lexical goal symbol" applies. The first slash is a DivPunctuator token.

Since this is a DivPunctuator token, the grammar MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression is matched, the right-hand side is expected to be an ExponentiationExpression.

Now we are at the second slash in a / /. By following ExponentiationExpression, we reach PrimaryExpression: RegularExpressionLiteral because RegularExpressionLiteral is the only matching grammar with a /:

RegularExpressionLiteral ::
+    / RegularExpressionBody / RegularExpressionFlags
RegularExpressionLiteral ::
+    / RegularExpressionBody / RegularExpressionFlags

This second / will be tokenized as RegExp because the specification states "The InputElementRegExp goal symbol is used in all syntactic grammar contexts where a RegularExpressionLiteral is permitted".

INFO

As an exercise, try and follow the grammar for /=/ / /=/.


Cover Grammar

Read the V8 blog post on this topic first.

To summarize, the specification states the following three cover grammars:

CoverParenthesizedExpressionAndArrowParameterList

PrimaryExpression[Yield, Await] :
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+When processing an instance of the production
+PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+    the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
+
+ParenthesizedExpression[Yield, Await] :
+    ( Expression[+In, ?Yield, ?Await] )
PrimaryExpression[Yield, Await] :
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+When processing an instance of the production
+PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+    the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
+
+ParenthesizedExpression[Yield, Await] :
+    ( Expression[+In, ?Yield, ?Await] )
ArrowFunction[In, Yield, Await] :
+    ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In]
+
+ArrowParameters[Yield, Await] :
+    BindingIdentifier[?Yield, ?Await]
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
ArrowFunction[In, Yield, Await] :
+    ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In]
+
+ArrowParameters[Yield, Await] :
+    BindingIdentifier[?Yield, ?Await]
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]

These definitions defines:

javascript
let foo = (a, b, c); // SequenceExpression
+let bar = (a, b, c) => {}; // ArrowExpression
+          ^^^^^^^^^ CoverParenthesizedExpressionAndArrowParameterList
let foo = (a, b, c); // SequenceExpression
+let bar = (a, b, c) => {}; // ArrowExpression
+          ^^^^^^^^^ CoverParenthesizedExpressionAndArrowParameterList

A simple but cumbersome approach to solving this problem is to parse it as a Vec<Expression> first, then write a converter function to convert it to ArrowParameters node, i.e. each individual Expression need to be converted to a BindingPattern.

It should be noted that, if we are building the scope tree within the parser, i.e. create the scope for arrow expression during parsing, but do not create one for a sequence expression, it is not obvious how to do this. esbuild solved this problem by creating a temporary scope first, and then dropping it if it is not an ArrowExpression.

This is stated in its architecture document:

This is mostly pretty straightforward except for a few places where the parser has pushed a scope and is in the middle of parsing a declaration only to discover that it's not a declaration after all. This happens in TypeScript when a function is forward-declared without a body, and in JavaScript when it's ambiguous whether a parenthesized expression is an arrow function or not until we reach the => token afterwards. This would be solved by doing three passes instead of two so we finish parsing before starting to set up scopes and declare symbols, but we're trying to do this in just two passes. So instead we call popAndDiscardScope() or popAndFlattenScope() instead of popScope() to modify the scope tree later if our assumptions turn out to be incorrect.


CoverCallExpressionAndAsyncArrowHead

CallExpression :
+    CoverCallExpressionAndAsyncArrowHead
+
+When processing an instance of the production
+CallExpression : CoverCallExpressionAndAsyncArrowHead
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+CallMemberExpression[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
CallExpression :
+    CoverCallExpressionAndAsyncArrowHead
+
+When processing an instance of the production
+CallExpression : CoverCallExpressionAndAsyncArrowHead
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+CallMemberExpression[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
AsyncArrowFunction[In, Yield, Await] :
+    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
+
+CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+When processing an instance of the production
+AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+AsyncArrowHead :
+    async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
AsyncArrowFunction[In, Yield, Await] :
+    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
+
+CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+When processing an instance of the production
+AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+AsyncArrowHead :
+    async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

These definitions define:

javascript
async (a, b, c); // CallExpression
+async (a, b, c) => {} // AsyncArrowFunction
+^^^^^^^^^^^^^^^ CoverCallExpressionAndAsyncArrowHead
async (a, b, c); // CallExpression
+async (a, b, c) => {} // AsyncArrowFunction
+^^^^^^^^^^^^^^^ CoverCallExpressionAndAsyncArrowHead

This looks strange because async is not a keyword. The first async is a function name.


CoverInitializedName

13.2.5 Object Initializer
+
+ObjectLiteral[Yield, Await] :
+    ...
+
+PropertyDefinition[Yield, Await] :
+    CoverInitializedName[?Yield, ?Await]
+
+Note 3: In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar.
+The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
+
+13.2.5.1 Static Semantics: Early Errors
+
+In addition to describing an actual object initializer the ObjectLiteral productions are also used as a cover grammar for ObjectAssignmentPattern and may be recognized as part of a CoverParenthesizedExpressionAndArrowParameterList. When ObjectLiteral appears in a context where ObjectAssignmentPattern is required the following Early Error rules are not applied. In addition, they are not applied when initially parsing a CoverParenthesizedExpressionAndArrowParameterList or CoverCallExpressionAndAsyncArrowHead.
+
+PropertyDefinition : CoverInitializedName
+    I* t is a Syntax Error if any source text is matched by this production.
13.2.5 Object Initializer
+
+ObjectLiteral[Yield, Await] :
+    ...
+
+PropertyDefinition[Yield, Await] :
+    CoverInitializedName[?Yield, ?Await]
+
+Note 3: In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar.
+The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
+
+13.2.5.1 Static Semantics: Early Errors
+
+In addition to describing an actual object initializer the ObjectLiteral productions are also used as a cover grammar for ObjectAssignmentPattern and may be recognized as part of a CoverParenthesizedExpressionAndArrowParameterList. When ObjectLiteral appears in a context where ObjectAssignmentPattern is required the following Early Error rules are not applied. In addition, they are not applied when initially parsing a CoverParenthesizedExpressionAndArrowParameterList or CoverCallExpressionAndAsyncArrowHead.
+
+PropertyDefinition : CoverInitializedName
+    I* t is a Syntax Error if any source text is matched by this production.
13.15.1 Static Semantics: Early Errors
+
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+If LeftHandSideExpression is an ObjectLiteral or an ArrayLiteral, the following Early Error rules are applied:
+    * LeftHandSideExpression must cover an AssignmentPattern.
13.15.1 Static Semantics: Early Errors
+
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+If LeftHandSideExpression is an ObjectLiteral or an ArrayLiteral, the following Early Error rules are applied:
+    * LeftHandSideExpression must cover an AssignmentPattern.

These definitions define:

javascript
({ prop = value } = {}); // ObjectAssignmentPattern
+({ prop = value }); // ObjectLiteral with SyntaxError
({ prop = value } = {}); // ObjectAssignmentPattern
+({ prop = value }); // ObjectLiteral with SyntaxError

Parsers need to parse ObjectLiteral with CoverInitializedName, and throw the syntax error if it does not reach = for ObjectAssignmentPattern.

As an exercise, which one of the following = should throw a syntax error?

javascript
let { x = 1 } = { x = 1 } = { x = 1 }
let { x = 1 } = { x = 1 } = { x = 1 }
`,164),p=[l];function t(r,c,i,d,y,E){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{u as __pageData,g as default}; diff --git a/assets/ja_docs_learn_ecmascript_grammar.md.53196869.lean.js b/assets/ja_docs_learn_ecmascript_grammar.md.53196869.lean.js new file mode 100644 index 0000000000..f9fc1911dd --- /dev/null +++ b/assets/ja_docs_learn_ecmascript_grammar.md.53196869.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Grammar","description":"","frontmatter":{"title":"Grammar","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecmascript/grammar.md","filePath":"ja/docs/learn/ecmascript/grammar.md","lastUpdated":1701053760000}'),o={name:"ja/docs/learn/ecmascript/grammar.md"},l=e("",164),p=[l];function t(r,c,i,d,y,E){return a(),n("div",null,p)}const g=s(o,[["render",t]]);export{u as __pageData,g as default}; diff --git a/assets/ja_docs_learn_ecmascript_spec.md.550d6650.js b/assets/ja_docs_learn_ecmascript_spec.md.550d6650.js new file mode 100644 index 0000000000..a5d9c8a2ca --- /dev/null +++ b/assets/ja_docs_learn_ecmascript_spec.md.550d6650.js @@ -0,0 +1,57 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecmascript/spec.md","filePath":"ja/docs/learn/ecmascript/spec.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/ecmascript/spec.md"},o=e(`

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
+  AssignmentExpression
+  ArgumentList , AssignmentExpression
ArgumentList :
+  AssignmentExpression
+  ArgumentList , AssignmentExpression

means

javascript
a, b = 1, c = 2
+^_____________^ ArgumentList
+   ^__________^ ArgumentList, AssignmentExpression,
+          ^___^ AssignmentExpression
a, b = 1, c = 2
+^_____________^ ArgumentList
+   ^__________^ ArgumentList, AssignmentExpression,
+          ^___^ AssignmentExpression

Optional

The _opt_ suffix for optional syntax. For example,

VariableDeclaration :
+  BindingIdentifier Initializer_opt
VariableDeclaration :
+  BindingIdentifier Initializer_opt

means

javascript
var binding_identifier;
+var binding_identifier = Initializer;
+                       ______________ Initializer_opt
var binding_identifier;
+var binding_identifier = Initializer;
+                       ______________ Initializer_opt

Parameters

The [Return] and [In] are parameters of the grammar.

For example

ScriptBody :
+    StatementList[~Yield, ~Await, ~Return]
ScriptBody :
+    StatementList[~Yield, ~Await, ~Return]

means top-level yield, await and return are not allowed in scripts, but

ModuleItem :
+  ImportDeclaration
+  ExportDeclaration
+  StatementListItem[~Yield, +Await, ~Return]
ModuleItem :
+  ImportDeclaration
+  ExportDeclaration
+  StatementListItem[~Yield, +Await, ~Return]

allows for top-level await.

Source Text

Chapter 11.2 Types of Source Code tells us that there is a huge distinction between script code and module code. And there is a use strict mode that makes the grammar saner by disallowing old JavaScript behaviors.

Script Code is not strict, use strict need to be inserted at the top of the file to make script code strict. In html we write <script src="javascript.js"></script>.

Module Code is automatically strict. In html we write <script type="module" src="main.mjs"></script>.

ECMAScript Language: Lexical Grammar

For more in-depth explanation, read the V8 blog on Understanding the ECMAScript spec.

Automatic Semicolon Insertion

This section describes all the rules where we can omit a semicolon while writing JavaScript. All the explanation boils down to

rust
    pub fn asi(&mut self) -> Result<()> {
+        if self.eat(Kind::Semicolon) || self.can_insert_semicolon() {
+            return Ok(());
+        }
+        let range = self.prev_node_end..self.cur_token().start;
+        Err(SyntaxError::AutoSemicolonInsertion(range.into()))
+    }
+
+    pub const fn can_insert_semicolon(&self) -> bool {
+        self.cur_token().is_on_new_line || matches!(self.cur_kind(), Kind::RCurly | Kind::Eof)
+    }
    pub fn asi(&mut self) -> Result<()> {
+        if self.eat(Kind::Semicolon) || self.can_insert_semicolon() {
+            return Ok(());
+        }
+        let range = self.prev_node_end..self.cur_token().start;
+        Err(SyntaxError::AutoSemicolonInsertion(range.into()))
+    }
+
+    pub const fn can_insert_semicolon(&self) -> bool {
+        self.cur_token().is_on_new_line || matches!(self.cur_kind(), Kind::RCurly | Kind::Eof)
+    }

The asi function need to be manually called where applicable, for example in the end of statement:

rust
    fn parse_debugger_statement(&mut self) -> Result<Statement<'a>> {
+        let node = self.start_node();
+        self.expect(Kind::Debugger)?;
+        // highlight-next-line
+        self.asi()?;
+        self.ast.debugger_statement(self.finish_node(node))
+    }
    fn parse_debugger_statement(&mut self) -> Result<Statement<'a>> {
+        let node = self.start_node();
+        self.expect(Kind::Debugger)?;
+        // highlight-next-line
+        self.asi()?;
+        self.ast.debugger_statement(self.finish_node(node))
+    }

INFO

This section on asi is written with a parser in mind, it explicitly states that the source text is parsed from left to right, which makes it almost impossible to write the parser in any other way. The author of jsparagus made a rant about this here.

The specification for this feature is both very-high-level and weirdly procedural (“When, as the source text is parsed from left to right, a token is encountered...”, as if the specification is telling a story about a browser. As far as I know, this is the only place in the spec where anything is assumed or implied about the internal implementation details of parsing.) But it would be hard to specify ASI any other way.

Expressions, Statements, Functions, Classes, Scripts and Modules

It takes a while to understand the syntactic grammar, then apply them to writing a parser.

`,39),p=[o];function t(r,c,i,y,E,d){return a(),n("div",null,p)}const m=s(l,[["render",t]]);export{u as __pageData,m as default}; diff --git a/assets/ja_docs_learn_ecmascript_spec.md.550d6650.lean.js b/assets/ja_docs_learn_ecmascript_spec.md.550d6650.lean.js new file mode 100644 index 0000000000..25adc0be67 --- /dev/null +++ b/assets/ja_docs_learn_ecmascript_spec.md.550d6650.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"Specification","description":"","frontmatter":{"title":"Specification","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecmascript/spec.md","filePath":"ja/docs/learn/ecmascript/spec.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/ecmascript/spec.md"},o=e("",39),p=[o];function t(r,c,i,y,E,d){return a(),n("div",null,p)}const m=s(l,[["render",t]]);export{u as __pageData,m as default}; diff --git a/assets/ja_docs_learn_ecosystem.md.c9d3c686.js b/assets/ja_docs_learn_ecosystem.md.c9d3c686.js new file mode 100644 index 0000000000..adaf5ef1a6 --- /dev/null +++ b/assets/ja_docs_learn_ecosystem.md.c9d3c686.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecosystem.md","filePath":"ja/docs/learn/ecosystem.md","lastUpdated":1701053760000}'),o={name:"ja/docs/learn/ecosystem.md"},n=r('

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

',10),c=[n];function s(i,l,p,d,h,m){return a(),t("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/ja_docs_learn_ecosystem.md.c9d3c686.lean.js b/assets/ja_docs_learn_ecosystem.md.c9d3c686.lean.js new file mode 100644 index 0000000000..47e30ce5c0 --- /dev/null +++ b/assets/ja_docs_learn_ecosystem.md.c9d3c686.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as r}from"./chunks/framework.725e5b03.js";const _=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{"title":"Ecosystem","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/ecosystem.md","filePath":"ja/docs/learn/ecosystem.md","lastUpdated":1701053760000}'),o={name:"ja/docs/learn/ecosystem.md"},n=r("",10),c=[n];function s(i,l,p,d,h,m){return a(),t("div",null,c)}const f=e(o,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/assets/ja_docs_learn_performance.md.239666b7.js b/assets/ja_docs_learn_performance.md.239666b7.js new file mode 100644 index 0000000000..356848b914 --- /dev/null +++ b/assets/ja_docs_learn_performance.md.239666b7.js @@ -0,0 +1,469 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/performance.md","filePath":"ja/docs/learn/performance.md","lastUpdated":1701053760000}'),p={name:"ja/docs/learn/performance.md"},o=l(`

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
+    pub node: Node,
+    pub body: Vec<Statement>,
+}
+
+pub enum Statement {
+    VariableDeclarationStatement(VariableDeclaration),
+}
+
+pub struct VariableDeclaration {
+    pub node: Node,
+    pub declarations: Vec<VariableDeclarator>,
+}
pub struct Program {
+    pub node: Node,
+    pub body: Vec<Statement>,
+}
+
+pub enum Statement {
+    VariableDeclarationStatement(VariableDeclaration),
+}
+
+pub struct VariableDeclaration {
+    pub node: Node,
+    pub declarations: Vec<VariableDeclarator>,
+}

In Rust, declaring a tree is relatively straightforward, as it involves using structs and enums.

Memory Allocation

I worked on this version of AST for a couple of months while writing the parser. And one day I decided to profile it. The profiler showed the program was spending a lot of time calling drop.

💡 Nodes of the AST are allocated on the heap via Box or Vec, they are allocated individually so they are dropped in sequential order.

Is there a solution to mitigate this?

So while working on the parser I studied some of the other JavaScript parsers written in Rust, mainly ratel and jsparagus.

Both of these parsers declare their AST with a lifetime annotation,

rust
pub enum Statement<'ast> {
+    Expression(ExpressionNode<'ast>),
+}
pub enum Statement<'ast> {
+    Expression(ExpressionNode<'ast>),
+}

and they have an accompanying file called arena.rs.

I did not understand what it does so I neglected them until I started reading about their usage of memory arenas: bumpalo and toolshed.

In summary, memory arena allocates memory upfront in chunks or pages and deallocate altogether when the arena is dropped. The AST is allocated on the arena so dropping the AST is a fast operation.

Another nice side effect that comes with this is that, the AST is constructed in a specific order, and tree traversal also follows the same order, resulting in linear memory access during the visitation process. This access pattern will be efficient since all nearby memory will be read into the CPU cache in pages, resulting in faster access times.

Unfortunately it can be challenging for Rust beginners to use memory arenas because all data structures and relevant functions need to be parameterized by lifetime annotations. It took me five attempts to allocate the AST inside bumpalo.

Changing to a memory arena for the AST resulted around 20% performance improvement.

Enum Sizes

Due to the recursive nature of ASTs, we need to define the types in a way to avoid the "recursive without indirection" error:

error[E0072]: recursive types \`Enum\` and \`Variant\` have infinite size
+ --> crates/oxc_linter/src/lib.rs:1:1
+  |
+1 | enum Enum {
+  | ^^^^^^^^^
+2 |     Variant(Variant),
+  |             ------- recursive without indirection
+3 | }
+4 | struct Variant {
+  | ^^^^^^^^^^^^^^
+5 |     field: Enum,
+  |            ---- recursive without indirection
+  |
+help: insert some indirection (e.g., a \`Box\`, \`Rc\`, or \`&\`) to break the cycle
+  |
+2 ~     Variant(Box<Variant>),
+3 | }
+4 | struct Variant {
+5 ~     field: Box<Enum>,
error[E0072]: recursive types \`Enum\` and \`Variant\` have infinite size
+ --> crates/oxc_linter/src/lib.rs:1:1
+  |
+1 | enum Enum {
+  | ^^^^^^^^^
+2 |     Variant(Variant),
+  |             ------- recursive without indirection
+3 | }
+4 | struct Variant {
+  | ^^^^^^^^^^^^^^
+5 |     field: Enum,
+  |            ---- recursive without indirection
+  |
+help: insert some indirection (e.g., a \`Box\`, \`Rc\`, or \`&\`) to break the cycle
+  |
+2 ~     Variant(Box<Variant>),
+3 | }
+4 | struct Variant {
+5 ~     field: Box<Enum>,

There are two ways to do this. Either box the enum in the enum variant or box the struct field.

I found the same question in the Rust forum back in 2017, Is there a better way to represent an abstract syntax tree?

Aleksey (matklad) told us to box the enum variants to keep the Expression enum small. But what does this mean?

As it turns out, the memory layout of a Rust enum is dependent on the sizes of all its variants, its total byte size dependents on the largest variant. For example, the following enum will take up 56 bytes (1 byte for the tag, 48 bytes for the payload, and 8 bytes for alignment).

rust
enum Enum {
+    A, // 0 byte payload
+    B(String), // 24 byte payload
+    C { first: String, last: String }, // 48 byte payload
+}
enum Enum {
+    A, // 0 byte payload
+    B(String), // 24 byte payload
+    C { first: String, last: String }, // 48 byte payload
+}

In a typical JavaScript AST, the Expression enum holds 45 variants and the Statement enum holds 20 variants. They take up more than 200 bytes if not boxed by enum variants. These 200 bytes have to be passed around, and also accessed every time we do a matches!(expr, Expression::Variant(_)) check, which is not very cache friendly for performance.

So to make memory access efficient, it is best to box the enum variants.

The perf-book describes additional info on how to find large types.

I also copied the test for restricting small enum sizes.

rust
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn no_bloat_enum_sizes() {
+    use std::mem::size_of;
+    use crate::ast::*;
+    assert_eq!(size_of::<Statement>(), 16);
+    assert_eq!(size_of::<Expression>(), 16);
+    assert_eq!(size_of::<Declaration>(), 16);
+}
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn no_bloat_enum_sizes() {
+    use std::mem::size_of;
+    use crate::ast::*;
+    assert_eq!(size_of::<Statement>(), 16);
+    assert_eq!(size_of::<Expression>(), 16);
+    assert_eq!(size_of::<Declaration>(), 16);
+}

Boxing the enum variants resulted around 10% speed-up.

Span

Occasionally, we may not realize that a smaller memory footprint is possible until we spend some extra time examining the data structures.

In this instance, the leaf of all AST nodes contains a small data structure called the "span", which is used for storing the byte offset from the source text and comprises two usizes.

rust
pub struct Node {
+    pub start: usize,
+    pub end: usize,
+}
pub struct Node {
+    pub start: usize,
+    pub end: usize,
+}

It was pointed out to me that I can safely change usize to u32 to reduce peak memory because larger than u32 is a 4GB file.

Changing to u32 improved the performance up to 5% performance on large files.

Strings and Identifiers

Inside the AST, one may attempt to use a string reference to the source text for identifier names and string literals.

rust
pub struct StringLiteral<'a> {
+    pub value: &'a str,
+}
+
+pub struct Identifier<'a> {
+    pub name: &'a str,
+}
pub struct StringLiteral<'a> {
+    pub value: &'a str,
+}
+
+pub struct Identifier<'a> {
+    pub name: &'a str,
+}

But unfortunately in JavaScript, strings and identifiers can have escape sequences, i.e. '\\251', '\\xA9' and '©' are the same for the copyright symbol.

This implies that we must compute the escaped values and allocate a new String.

String interning

When there are lots of heap-allocated strings, a technique called string interning can be used to reduce total memory by storing only one copy of each distinct string value.

string-cache is a popular and widely used library published by the servo team. Initially, I used the string-cache library for identifiers and strings in the AST. The performance of the parser was fast in a single thread, but when I started implementing the linter where there are multiples parser running parallel with rayon, CPU utilization was at about 50% of all cores.

Upon profiling, a method called parking_lot::raw_mutex::RawMutex::lock_slow showed up on the top of the execution time. I did not know much about locks and multi-core programming, but a global lock was just strange to start with, so I decided to remove the string-cache library to enable full CPU utilization.

Removing string-cache from the AST improved the performance of parallel parsing by about 30%.

string-cache

Half a year later, while working on another performance-critical project, the string-cache library resurfaced again. It was blocking all the threads during parallel text parsing.

I decided to study what string-cache does because I am prepared this time after reading the book Rust Atomics and Locks by Mara Bos.

Here are the relevantcode around the lock. Please note that the code was written eight years ago in 2015.

rust
pub(crate) static DYNAMIC_SET: Lazy<Mutex<Set>> = Lazy::new(|| {
+    Mutex::new({
+
+// ... in another place
+let ptr: std::ptr::NonNull<Entry> =
+    DYNAMIC_SET.lock().insert(string_to_add, hash.g);
pub(crate) static DYNAMIC_SET: Lazy<Mutex<Set>> = Lazy::new(|| {
+    Mutex::new({
+
+// ... in another place
+let ptr: std::ptr::NonNull<Entry> =
+    DYNAMIC_SET.lock().insert(string_to_add, hash.g);

So this is straightforward. It locks the data structure Set every time a string is being inserted. As this routine is called frequently within a parser, its performance is impacted negatively by synchronization.

Now let's take a look at the Set data structure and see what it does:

rust
pub(crate) fn insert(&mut self, string: Cow<str>, hash: u32) -> NonNull<Entry> {
+    let bucket_index = (hash & BUCKET_MASK) as usize;
+    {
+        let mut ptr: Option<&mut Box<Entry>> = self.buckets[bucket_index].as_mut();
+
+        while let Some(entry) = ptr.take() {
+            if entry.hash == hash && *entry.string == *string {
+                if entry.ref_count.fetch_add(1, SeqCst) > 0 {
+                    return NonNull::from(&mut **entry);
+                }
+                entry.ref_count.fetch_sub(1, SeqCst);
+                break;
+            }
+            ptr = entry.next_in_bucket.as_mut();
+        }
+    }
+    debug_assert!(mem::align_of::<Entry>() >= ENTRY_ALIGNMENT);
+    let string = string.into_owned();
+    let mut entry = Box::new(Entry {
+        next_in_bucket: self.buckets[bucket_index].take(),
+        hash,
+        ref_count: AtomicIsize::new(1),
+        string: string.into_boxed_str(),
+    });
+    let ptr = NonNull::from(&mut *entry);
+    self.buckets[bucket_index] = Some(entry);
+
+    ptr
+}
pub(crate) fn insert(&mut self, string: Cow<str>, hash: u32) -> NonNull<Entry> {
+    let bucket_index = (hash & BUCKET_MASK) as usize;
+    {
+        let mut ptr: Option<&mut Box<Entry>> = self.buckets[bucket_index].as_mut();
+
+        while let Some(entry) = ptr.take() {
+            if entry.hash == hash && *entry.string == *string {
+                if entry.ref_count.fetch_add(1, SeqCst) > 0 {
+                    return NonNull::from(&mut **entry);
+                }
+                entry.ref_count.fetch_sub(1, SeqCst);
+                break;
+            }
+            ptr = entry.next_in_bucket.as_mut();
+        }
+    }
+    debug_assert!(mem::align_of::<Entry>() >= ENTRY_ALIGNMENT);
+    let string = string.into_owned();
+    let mut entry = Box::new(Entry {
+        next_in_bucket: self.buckets[bucket_index].take(),
+        hash,
+        ref_count: AtomicIsize::new(1),
+        string: string.into_boxed_str(),
+    });
+    let ptr = NonNull::from(&mut *entry);
+    self.buckets[bucket_index] = Some(entry);
+
+    ptr
+}

It looks like it is looking for a bucket to store the string and it inserts the string if it is not in the bucket.

💡 Is this linear probing? If this is linear probing then this Set is just a HashMap without saying it is a HashMap. 💡 If this is a HashMap, then Mutex<HashMap> is a concurrent hashmap.

Although the solution may seem straightforward when we know what to look for, it took me a month to figure this out because I was unaware of the issue. When it became evident that this is just a concurrent hashmap, applying the Mutex to the buckets instead of the entire hashmap was a clear and logical solution. Within an hour of implementing this change, I submitted a pull request and was happy with the outcome 😃.

https://github.com/servo/string-cache/pull/268
https://github.com/servo/string-cache/pull/268

It is worth mentioning that string interning is a battlefield within the Rust community. For the example shown in this blog post, there are single-threaded libraries such string-interner, lasso, lalrpop-intern, intaglio and strena.

Since we are parsing files in parallel, an option is to utilize a multi-threaded string interner library such as ustr. However, after profiling both ustr and the enhanced version of string-cache, it became apparent that the performance was still below expectations compared to the approach I am going to explain below.

Some preliminary guesses for the sub-par performance are:

  • Hashing - the interners need to hash the string for deduplication
  • Indirection - we need to read the string value from a "far away" heap, which is not cache friendly

String Inlining

So we are back to the initial problem of having to allocate lots of strings. Fortunately, there is a partial solution to this problem if we look at what kind of data we are dealing with: short JavaScript variable names and some short strings. There is a technique called string inlining, where we store all of the bytes of a string on the stack.

In essence, we want the following enum to store our string.

rust
enum Str {
+    Static(&'static str),
+    Inline(InlineReprensation),
+    Heap(String),
+}
enum Str {
+    Static(&'static str),
+    Inline(InlineReprensation),
+    Heap(String),
+}

To minimize the size of the enum, InlineRepresentation should have the same size as String.

rust
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn test_size() {
+    use std::mem::size_of;
+    assert_eq!(size_of::<String>(), size_of::<InlineReprensation>());
+}
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn test_size() {
+    use std::mem::size_of;
+    assert_eq!(size_of::<String>(), size_of::<InlineReprensation>());
+}

Many crates in the Rust community aim to optimize memory usage. This is yet another battlefield within the community. The most popular ones are

Each of these crates have unique characteristics and approaches to achieving memory optimization, leading to a variety of trade-offs and considerations when choosing which one to use. For example smol_str and flexstr clones are O(1). flexstr can store 22 bytes, smol_str and smartstring can store 23 bytes, and compact_str can store 24 bytes on 64-bit systems.

https://fasterthanli.me has a deep dive on this topic.

Changing String to compact_str::CompactStr reduced memory allocations by a large amount.

Lexer

Token

The job of the lexer (also known as tokenizer) is to turn source text into structured data called a token.

rust
pub struct Token {
+    pub kind: Kind,
+}
pub struct Token {
+    pub kind: Kind,
+}

To make it easier to work with, a token kind is typically defined as an enum in Rust. The variants of the enums hold the corresponding data for each token.

rust
pub enum Kind {
+    // Keywords
+    For,
+    While,
+    ...
+    // Literals
+    String(String),
+    Num(f64),
+    ...
+}
pub enum Kind {
+    // Keywords
+    For,
+    While,
+    ...
+    // Literals
+    String(String),
+    Num(f64),
+    ...
+}

This enum currently uses 32 bytes, and a lexer often need to construct millions of this token Kind. Every time it constructs a Kind::For or Kind::While, it has to allocate 32 bytes of memory on the stack.

A clever way to improve this is to break up the enum variant to keep Kind to a single byte and move the values into another enum,

rust
pub struct Token<'a> {
+    pub kind: Kind,
+    pub value: TokenValue
+}
+
+pub enum TokenValue {
+    None,
+    String(String),
+    Num(f64),
+}
pub struct Token<'a> {
+    pub kind: Kind,
+    pub value: TokenValue
+}
+
+pub enum TokenValue {
+    None,
+    String(String),
+    Num(f64),
+}

Since we control all the parsing code, it is our job to keep this safe by always declaring the corresponding token value to its kind.

While a TokenValue of 32 bytes is already quite small, it may still have a negative impact on performance because it is allocated frequently.

Let's take a look at the String type and see what we can find, by using the "go-to definition" in our code editors, we'll go through String -> Vec -> RawVec:

rust
pub struct String {
+    vec: Vec<u8>,
+}
+
+pub struct Vec {
+    buf: RawVec<T, A>,
+    len: usize,
+}
+
+pub struct RawVec {
+    ptr: Unique<T>,
+    cap: usize,
+    alloc: A,
+}
pub struct String {
+    vec: Vec<u8>,
+}
+
+pub struct Vec {
+    buf: RawVec<T, A>,
+    len: usize,
+}
+
+pub struct RawVec {
+    ptr: Unique<T>,
+    cap: usize,
+    alloc: A,
+}

As advertised, a String is just a Vec of u8s, and a Vec has a length and a capacity field. Since we are never going to mutate this string, an optimization in terms of memory usage would be to drop the cap field and use a string slice (&str) instead.

rust
pub enum TokenValue<'a> {
+    None,
+    String(&'a str),
+    Num(f64),
+}
pub enum TokenValue<'a> {
+    None,
+    String(&'a str),
+    Num(f64),
+}

TokenValue becomes 24 bytes.

While using a string slice instead of String in TokenValue would reduce memory usage, it does come with the downside of adding a lifetime annotation. This can lead to issues with the borrow checker and the lifetime annotation will propagate to the rest of the codebase, making our code somewhat difficult to manage. I lost the borrow checking game 8 months ago but finally won when I revisited this.

When it makes sense, we can always go for the owned version of the immutable data instead of using references. For example Box<str> for String and Box<[u8]> for Vec<u8>.

In summary, we can always come up with tricks to keep our data structures small, and it will sometimes reward us performance improvement.

Cow

I first encountered the term Cow when I was studying jsparagus's code, it has an infrastructure called AutoCow.

I vaguely understood what the code was doing. When a JavaScript string is being tokenized, it allocates a new string when it encounters an escaped sequence or it returns the original string slice if it doesn't:

rust
fn finish(&mut self, lexer: &Lexer<'alloc>) -> &'alloc str {
+    match self.value.take() {
+        Some(arena_string) => arena_string.into_bump_str(),
+        None => &self.start[..self.start.len() - lexer.chars.as_str().len()],
+    }
+}
fn finish(&mut self, lexer: &Lexer<'alloc>) -> &'alloc str {
+    match self.value.take() {
+        Some(arena_string) => arena_string.into_bump_str(),
+        None => &self.start[..self.start.len() - lexer.chars.as_str().len()],
+    }
+}

This is clever because 99.9% of the time it will not allocate a new string because escaped strings are rare.

But the term Cow or "clone-on-write smart pointer" never made sense to me.

The type Cow is a smart pointer providing clone-on-write functionality: it can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. The type is designed to work with general borrowed data via the Borrow trait.

If you are new to Rust (like I was), then this description just doesn't help (I still don't understand what it is talking about).

It was pointed out to me that clone-on-write is just a use case of this data structure. A better name should be called RefOrOwned because it is a type that contains either owned data or a reference.

SIMD

When I was going through the old Rust blogs, the Announcing the Portable SIMD Project Group caught my attention. I always wanted to play around with SIMD but never got the chance. After some research, I found a use case that may apply to a parser: How quickly can you remove spaces from a string? by Daniel Lemire. So it turns out this has been done before, in a JSON parser called RapidJSON, which uses SIMD to remove whitespaces.

So eventually with the help of portable-SIMD and RapidJSON's code, not only did I manage to skip whitespaces, I also managed to skip multi-line comments as well.

Both changes improved the performance by a few percent.

Keyword match

At the top of the performance profile, there is a hot code path that takes about 1 - 2% of the total execution time.

It tries to match a string to a JavaScript keyword:

rust
fn match_keyword(s: &str) -> Self {
+    match s {
+        "as" => As,
+        "do" => Do,
+        "if" => If,
+        ...
+        "constructor" => Constructor,
+        _ => Ident,
+    }
+}
fn match_keyword(s: &str) -> Self {
+    match s {
+        "as" => As,
+        "do" => Do,
+        "if" => If,
+        ...
+        "constructor" => Constructor,
+        _ => Ident,
+    }
+}

With the addition of TypeScript, there are 84 strings for us to match from. After some research, I found a blog from V8 Blazingly fast parsing, part 1: optimizing the scanner, it describes its keyword matching code in detail.

Since the list of keywords is static, we can compute a perfect hash function that for each identifier gives us at most one candidate keyword. V8 uses gperf to compute this function. The result computes a hash from the length and first two identifier characters to find the single candidate keyword. We only compare the identifier with the keyword if the length of that keyword matches the input identifier length.

So a quick hash plus an integer comparison should be faster than 84 string comparisons. But we tried again and again to no avail.

As it turns out, LLVM already optimized our code. By using --emit=llvm-ir on rustc, we find the relevant code:

  switch i64 %s.1, label %bb6 [
+    i64 2, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit.i"
+    i64 3, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit280.i"
+    i64 4, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit325.i"
+    i64 5, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit380.i"
+    i64 6, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit450.i"
+    i64 7, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit540.i"
+    i64 8, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit590.i"
+    i64 9, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit625.i"
+    i64 10, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit655.i"
+    i64 11, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit665.i"
+  ], !dbg !191362
  switch i64 %s.1, label %bb6 [
+    i64 2, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit.i"
+    i64 3, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit280.i"
+    i64 4, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit325.i"
+    i64 5, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit380.i"
+    i64 6, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit450.i"
+    i64 7, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit540.i"
+    i64 8, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit590.i"
+    i64 9, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit625.i"
+    i64 10, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit655.i"
+    i64 11, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit665.i"
+  ], !dbg !191362

%s is the string, %s.1 is its length ... it is branching on the string length! The compiler is smarter than us 😃.

(Yes, we got so serious with this so we started looking at LLVM IR and assembly code.)

Later on, @strager posted a very educational YouTube video Faster than Rust and C++: the PERFECT hash table on this topic. The video taught us a systematic approach to reasoning about fine-tuning performance problems

In the end, we concluded that the simple keyword match is enough for us since it was only about 1 - 2% of the performance, and the effort is not worth it after spending a few days on it - Rust does not have all the pieces we need to build this perfect hashmap.

Linter

A linter is a program that analyzes the source code for problems.

The simplest linter visits each AST node and checks for rules. The visitor pattern can be used:

rust
pub trait Visit<'a>: Sized {
+    // ... lots of visit functions
+
+    fn visit_debugger_statement(&mut self, stmt: &'a DebuggerStatement) {
+        // report error
+    }
+}
pub trait Visit<'a>: Sized {
+    // ... lots of visit functions
+
+    fn visit_debugger_statement(&mut self, stmt: &'a DebuggerStatement) {
+        // report error
+    }
+}

Parent Pointing Tree

It is easy to go down the AST by using visitors, but what if we want to go up the tree to collect some information?

This problem is particularly challenging to solve in Rust, because it is not possible to add a pointer to the nodes of the AST.

Let's forget about ASTs for a second and focus on generic trees with the property of a node having a pointer to its parent. To build a generic tree, each tree node needs to be the same type Node, we can reference their parent by using Rc:

rust
struct Node {
+    parent: Option<Rc<Node>>,
+}
struct Node {
+    parent: Option<Rc<Node>>,
+}

It is tedious to work with this pattern if we need mutation, and it is not performant because the nodes have to be dropped at different times.

A more efficient solution is to use a Vec as its backing storage and use indexes for pointers.

rust
struct Tree {
+    nodes: Vec<Node>
+}
+
+struct Node {
+    parent: Option<usize> // index into \`nodes\`
+}
struct Tree {
+    nodes: Vec<Node>
+}
+
+struct Node {
+    parent: Option<usize> // index into \`nodes\`
+}

indextree is a nice library for this task.

Back to our AST, we can build a indextree by having the nodes point to an enum that wraps every single kind of AST node. We call this the untyped AST.

rust
struct Node<'a> {
+    kind: AstKind<'a>
+}
+
+enum AstKind<'a> {
+    BlockStatement(&'a BlockStatement<'a>),
+    // ...
+    ArrayExpression(&'a ArrayExpression<'a>),
+    // ...
+    Class(&'a Class<'a>),
+    // ...
+}
struct Node<'a> {
+    kind: AstKind<'a>
+}
+
+enum AstKind<'a> {
+    BlockStatement(&'a BlockStatement<'a>),
+    // ...
+    ArrayExpression(&'a ArrayExpression<'a>),
+    // ...
+    Class(&'a Class<'a>),
+    // ...
+}

The last missing piece is to have callbacks inside the visitor pattern that builds this tree.

rust
pub trait Visit<'a> {
+    fn enter_node(&mut self, _kind: AstKind<'a>) {}
+    fn leave_node(&mut self, _kind: AstKind<'a>) {}
+
+    fn visit_block_statement(&mut self, stmt: &'a BlockStatement<'a>) {
+        let kind = AstKind::BlockStatement(stmt);
+        self.enter_node(kind);
+        self.visit_statements(&stmt.body);
+        self.leave_node(kind);
+    }
+}
+
+impl<'a> Visit<'a> for TreeBuilder<'a> {
+    fn enter_node(&mut self, kind: AstKind<'a>) {
+        self.push_ast_node(kind);
+    }
+
+    fn leave_node(&mut self, kind: AstKind<'a>) {
+        self.pop_ast_node();
+    }
+}
pub trait Visit<'a> {
+    fn enter_node(&mut self, _kind: AstKind<'a>) {}
+    fn leave_node(&mut self, _kind: AstKind<'a>) {}
+
+    fn visit_block_statement(&mut self, stmt: &'a BlockStatement<'a>) {
+        let kind = AstKind::BlockStatement(stmt);
+        self.enter_node(kind);
+        self.visit_statements(&stmt.body);
+        self.leave_node(kind);
+    }
+}
+
+impl<'a> Visit<'a> for TreeBuilder<'a> {
+    fn enter_node(&mut self, kind: AstKind<'a>) {
+        self.push_ast_node(kind);
+    }
+
+    fn leave_node(&mut self, kind: AstKind<'a>) {
+        self.pop_ast_node();
+    }
+}

The final data structure becomes indextree::Arena<Node<'a>> where each Node has a pointer to an AstKind<'a>. indextree::Node::parent can be called to get the parent of any node.

The nice benefit of making this parent pointing tree is that it becomes convenient to visit AST nodes without having to implement any visitors. A linter becomes a simple loop over all the nodes inside the indextree:

rust
for node in nodes {
+    match node.get().kind {
+        AstKind::DebuggerStatement(stmt) => {
+        // report error
+        }
+        _ => {}
+    }
+}
for node in nodes {
+    match node.get().kind {
+        AstKind::DebuggerStatement(stmt) => {
+        // report error
+        }
+        _ => {}
+    }
+}

A full example is provided here.

At first glance, this process may seem slow and inefficient. However, visiting the typed AST through a memory arena and pushing a pointer into indextree are efficient linear memory access patterns. The current benchmark indicates that this approach is 84 times faster than ESLint, so it is certainly fast enough for our purposes.

Processing files in parallel

The linter uses the ignore crate for directory traversal, it supports .gitignore and adds additional ignore files such as .eslintignore.

A small problem with this crate is that it does not have a parallel interface, There is no par_iter for ignore::Walk::new(".").

Instead, primitives need to be used

rust
let walk = Walk::new(&self.options);
+rayon::spawn(move || {
+    walk.iter().for_each(|path| {
+        tx_path.send(path).unwrap();
+    });
+});
+
+let linter = Arc::clone(&self.linter);
+rayon::spawn(move || {
+    while let Ok(path) = rx_path.recv() {
+        let tx_error = tx_error.clone();
+        let linter = Arc::clone(&linter);
+        rayon::spawn(move || {
+            if let Some(diagnostics) = Self::lint_path(&linter, &path) {
+                tx_error.send(diagnostics).unwrap();
+            }
+            drop(tx_error);
+        });
+    }
+});
let walk = Walk::new(&self.options);
+rayon::spawn(move || {
+    walk.iter().for_each(|path| {
+        tx_path.send(path).unwrap();
+    });
+});
+
+let linter = Arc::clone(&self.linter);
+rayon::spawn(move || {
+    while let Ok(path) = rx_path.recv() {
+        let tx_error = tx_error.clone();
+        let linter = Arc::clone(&linter);
+        rayon::spawn(move || {
+            if let Some(diagnostics) = Self::lint_path(&linter, &path) {
+                tx_error.send(diagnostics).unwrap();
+            }
+            drop(tx_error);
+        });
+    }
+});

This unlocks a useful feature where we can print all diagnostics in a single thread, which leads us to the final topic of this article.

Printing is slow

Printing the diagnostics was fast, but I have been working on this project for so long that it felt like an eternity to print thousands of diagnostic messages every time I run the linter on huge monorepos. So I started searching through the Rust GitHub issues and eventually found the relevant ones:

In summary, a println! call will lock stdout every time it encounters a newline, this is called line buffering. To make things print faster, we need to opt-in for block buffering which is documented here.

rust
use std::io::{self, Write};
+
+let stdout = io::stdout(); // get the global stdout entity
+let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
+writeln!(handle, "foo: {}", 42); // add \`?\` if you care about errors here
use std::io::{self, Write};
+
+let stdout = io::stdout(); // get the global stdout entity
+let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
+writeln!(handle, "foo: {}", 42); // add \`?\` if you care about errors here

Or acquire the lock on stdout.

rust
let stdout = io::stdout(); // get the global stdout entity
+let mut handle = stdout.lock(); // acquire a lock on it
+writeln!(handle, "foo: {}", 42); // add \`?\` if you care about errors here
let stdout = io::stdout(); // get the global stdout entity
+let mut handle = stdout.lock(); // acquire a lock on it
+writeln!(handle, "foo: {}", 42); // add \`?\` if you care about errors here
`,166),e=[o];function t(r,c,y,E,i,d){return a(),n("div",null,e)}const F=s(p,[["render",t]]);export{h as __pageData,F as default}; diff --git a/assets/ja_docs_learn_performance.md.239666b7.lean.js b/assets/ja_docs_learn_performance.md.239666b7.lean.js new file mode 100644 index 0000000000..c4706584d2 --- /dev/null +++ b/assets/ja_docs_learn_performance.md.239666b7.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.725e5b03.js";const h=JSON.parse('{"title":"Performance","description":"","frontmatter":{"title":"Performance","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/performance.md","filePath":"ja/docs/learn/performance.md","lastUpdated":1701053760000}'),p={name:"ja/docs/learn/performance.md"},o=l("",166),e=[o];function t(r,c,y,E,i,d){return a(),n("div",null,e)}const F=s(p,[["render",t]]);export{h as __pageData,F as default}; diff --git a/assets/ja_docs_learn_references.md.fa521212.js b/assets/ja_docs_learn_references.md.fa521212.js new file mode 100644 index 0000000000..ca3d9bc7aa --- /dev/null +++ b/assets/ja_docs_learn_references.md.fa521212.js @@ -0,0 +1 @@ +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/references.md","filePath":"ja/docs/learn/references.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/references.md"},i=t('

References

Projects Using Oxc

📚 Learning Resources

Parsers (in active development)

AST

Rust

Blog Posts

',12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; diff --git a/assets/ja_docs_learn_references.md.fa521212.lean.js b/assets/ja_docs_learn_references.md.fa521212.lean.js new file mode 100644 index 0000000000..1a320a3f84 --- /dev/null +++ b/assets/ja_docs_learn_references.md.fa521212.lean.js @@ -0,0 +1 @@ +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.725e5b03.js";const g=JSON.parse('{"title":"References","description":"","frontmatter":{"title":"References","outline":"deep"},"headers":[],"relativePath":"ja/docs/learn/references.md","filePath":"ja/docs/learn/references.md","lastUpdated":1701053760000}'),l={name:"ja/docs/learn/references.md"},i=t("",12),s=[i];function n(o,c,h,u,p,f){return r(),a("div",null,s)}const d=e(l,[["render",n]]);export{g as __pageData,d as default}; diff --git a/assets/ja_index.md.2f58577e.js b/assets/ja_index.md.2f58577e.js new file mode 100644 index 0000000000..0dedd68f1d --- /dev/null +++ b/assets/ja_index.md.2f58577e.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"Rust製JavaScriptツールコレクション","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"はじめる","link":"/ja/docs/guide/introduction"},{"theme":"alt","text":"GitHubで見る","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"SWCの2倍速","link":"/ja/docs/guide/usage/parser","linkText":"さらに学ぶ"},{"title":"Linter ✅","details":"ESLintの50~100倍速","link":"/ja/docs/guide/usage/linter","linkText":"さらに学ぶ"},{"title":"Resolver ✅","details":"enhanced-resolveの28倍速","link":"/ja/docs/guide/usage/resolver","linkText":"さらに学ぶ"},{"title":"Formatter 🚧","details":"Prettier互換"},{"title":"Transformer 🚧","details":"Babel互換"},{"title":"Minifier 🚧","details":"より早く効率的な圧縮"},{"title":"Rspack ✅","details":"Webpack互換","link":"https://rspack.dev","external":true},{"title":"Rolldown","details":"Rust製Rollup"},{"title":"Ezno Type Checker","details":"新しいTypeScript型チェッカー","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"ja/index.md","filePath":"ja/index.md","lastUpdated":1701053760000}'),i={name:"ja/index.md"};function r(l,n,o,s,d,c){return t(),a("div")}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/ja_index.md.2f58577e.lean.js b/assets/ja_index.md.2f58577e.lean.js new file mode 100644 index 0000000000..0dedd68f1d --- /dev/null +++ b/assets/ja_index.md.2f58577e.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.725e5b03.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"The JavaScript Oxidation Compiler","tagline":"Rust製JavaScriptツールコレクション","image":{"src":"https://raw.githubusercontent.com/oxc-project/oxc-assets/main/logo-round.png","alt":"The JavaScript Oxidation Compiler"},"actions":[{"theme":"brand","text":"はじめる","link":"/ja/docs/guide/introduction"},{"theme":"alt","text":"GitHubで見る","link":"https://github.com/oxc-project/oxc"}]},"features":[{"title":"Parser ✅","details":"SWCの2倍速","link":"/ja/docs/guide/usage/parser","linkText":"さらに学ぶ"},{"title":"Linter ✅","details":"ESLintの50~100倍速","link":"/ja/docs/guide/usage/linter","linkText":"さらに学ぶ"},{"title":"Resolver ✅","details":"enhanced-resolveの28倍速","link":"/ja/docs/guide/usage/resolver","linkText":"さらに学ぶ"},{"title":"Formatter 🚧","details":"Prettier互換"},{"title":"Transformer 🚧","details":"Babel互換"},{"title":"Minifier 🚧","details":"より早く効率的な圧縮"},{"title":"Rspack ✅","details":"Webpack互換","link":"https://rspack.dev","external":true},{"title":"Rolldown","details":"Rust製Rollup"},{"title":"Ezno Type Checker","details":"新しいTypeScript型チェッカー","link":"https://github.com/kaleidawave/ezno","external":true}]},"headers":[],"relativePath":"ja/index.md","filePath":"ja/index.md","lastUpdated":1701053760000}'),i={name:"ja/index.md"};function r(l,n,o,s,d,c){return t(),a("div")}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/style.82c265ef.css b/assets/style.dd858c05.css similarity index 99% rename from assets/style.82c265ef.css rename to assets/style.dd858c05.css index 1776387912..c486c8f27c 100644 --- a/assets/style.82c265ef.css +++ b/assets/style.dd858c05.css @@ -1 +1 @@ -@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-99f7fa3b]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.vp-doc h1>.VPBadge[data-v-99f7fa3b]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-99f7fa3b]{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-99f7fa3b]{vertical-align:middle}.vp-doc h4>.VPBadge[data-v-99f7fa3b],.vp-doc h5>.VPBadge[data-v-99f7fa3b],.vp-doc h6>.VPBadge[data-v-99f7fa3b]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-99f7fa3b]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-99f7fa3b]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-99f7fa3b]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-99f7fa3b]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-2e35c42d]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-2e35c42d],.VPBackdrop.fade-leave-to[data-v-2e35c42d]{opacity:0}.VPBackdrop.fade-leave-active[data-v-2e35c42d]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-2e35c42d]{display:none}}.NotFound[data-v-ca21a7ba]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-ca21a7ba]{padding:96px 32px 168px}}.code[data-v-ca21a7ba]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-ca21a7ba]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-ca21a7ba]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-ca21a7ba]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-ca21a7ba]{padding-top:20px}.link[data-v-ca21a7ba]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-ca21a7ba]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-266a89cb]{position:relative;z-index:1}.nested[data-v-266a89cb]{padding-left:16px}.outline-link[data-v-266a89cb]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-266a89cb]:hover,.outline-link.active[data-v-266a89cb]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-266a89cb]{padding-left:13px}.VPDocAsideOutline[data-v-82d1df03]{display:none}.VPDocAsideOutline.has-outline[data-v-82d1df03]{display:block}.content[data-v-82d1df03]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-82d1df03]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-82d1df03]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-4ccc7a73]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-4ccc7a73]{flex-grow:1}.VPDocAside[data-v-4ccc7a73] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-4ccc7a73] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-4ccc7a73] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-46d1cb64]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-46d1cb64]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-c097fc16]{margin-top:64px}.edit-info[data-v-c097fc16]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-c097fc16]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-c097fc16]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-c097fc16]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-c097fc16]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-c097fc16]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-c097fc16]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-c097fc16]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-c097fc16]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-c097fc16]{margin-left:auto;text-align:right}.desc[data-v-c097fc16]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-c097fc16]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDocOutlineDropdown[data-v-260152ac]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-260152ac]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-default-soft);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-260152ac]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-260152ac]{color:var(--vp-c-text-1)}.icon[data-v-260152ac]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-260152ac] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-260152ac]{transform:rotate(90deg)}.items[data-v-260152ac]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-30a5e70a]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-30a5e70a]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-30a5e70a]{display:block}}@media (min-width: 768px){.VPDoc[data-v-30a5e70a]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-30a5e70a]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-30a5e70a]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-30a5e70a]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-30a5e70a]{display:flex;justify-content:center}.VPDoc .aside[data-v-30a5e70a]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-30a5e70a]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-30a5e70a]{max-width:1104px}}.container[data-v-30a5e70a]{margin:0 auto;width:100%}.aside[data-v-30a5e70a]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-30a5e70a]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-30a5e70a]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-30a5e70a]::-webkit-scrollbar{display:none}.aside-curtain[data-v-30a5e70a]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-30a5e70a]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-30a5e70a]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-30a5e70a]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-30a5e70a]{order:1;margin:0;min-width:640px}}.content-container[data-v-30a5e70a]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-30a5e70a]{max-width:688px}.external-link-icon-enabled[data-v-30a5e70a] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-b47f9daa]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-b47f9daa]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-b47f9daa]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-b47f9daa]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-b47f9daa]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-b47f9daa]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-b47f9daa]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-b47f9daa]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-b47f9daa]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-b47f9daa]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-b47f9daa]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-b47f9daa]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-b47f9daa]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-b7111cdf]{display:none}.dark .VPImage.light[data-v-b7111cdf]{display:none}.VPHero[data-v-fd5a7aed]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-fd5a7aed]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-fd5a7aed]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-fd5a7aed]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-fd5a7aed]{flex-direction:row}}.main[data-v-fd5a7aed]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-fd5a7aed]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-fd5a7aed]{text-align:left}}@media (min-width: 960px){.main[data-v-fd5a7aed]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-fd5a7aed]{max-width:592px}}.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-fd5a7aed],.VPHero.has-image .text[data-v-fd5a7aed]{margin:0 auto}.name[data-v-fd5a7aed]{color:var(--vp-home-hero-name-color)}.clip[data-v-fd5a7aed]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-fd5a7aed],.VPHero.has-image .text[data-v-fd5a7aed]{margin:0}}.tagline[data-v-fd5a7aed]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-fd5a7aed]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-fd5a7aed]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-fd5a7aed]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-fd5a7aed]{margin:0}}.actions[data-v-fd5a7aed]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-fd5a7aed]{justify-content:center}@media (min-width: 640px){.actions[data-v-fd5a7aed]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-fd5a7aed]{justify-content:flex-start}}.action[data-v-fd5a7aed]{flex-shrink:0;padding:6px}.image[data-v-fd5a7aed]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-fd5a7aed]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-fd5a7aed]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-fd5a7aed]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-fd5a7aed]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-fd5a7aed]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-fd5a7aed]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-fd5a7aed]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-fd5a7aed]{width:320px;height:320px}}[data-v-fd5a7aed] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-fd5a7aed] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-fd5a7aed] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-fb6bac11]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-fb6bac11]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-fb6bac11]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-fb6bac11]>.VPImage{margin-bottom:20px}.icon[data-v-fb6bac11]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-fb6bac11]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-fb6bac11]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-fb6bac11]{padding-top:8px}.link-text-value[data-v-fb6bac11]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-fb6bac11]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-3190607f]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-3190607f]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-3190607f]{padding:0 64px}}.container[data-v-3190607f]{margin:0 auto;max-width:1152px}.items[data-v-3190607f]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-3190607f]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-3190607f],.item.grid-4[data-v-3190607f],.item.grid-6[data-v-3190607f]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-3190607f],.item.grid-4[data-v-3190607f]{width:50%}.item.grid-3[data-v-3190607f],.item.grid-6[data-v-3190607f]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-3190607f]{width:25%}}.VPHome[data-v-381d4781]{padding-bottom:96px}.VPHome[data-v-381d4781] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-381d4781]{padding-bottom:128px}}.VPContent[data-v-a5670ab7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-a5670ab7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-a5670ab7]{margin:0}@media (min-width: 960px){.VPContent[data-v-a5670ab7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-a5670ab7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-a5670ab7]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-59982766]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-59982766]{display:none}@media (min-width: 768px){.VPFooter[data-v-59982766]{padding:32px}}.container[data-v-59982766]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-59982766],.copyright[data-v-59982766]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-1da04fcb]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-1da04fcb]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-1da04fcb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-1da04fcb]{color:var(--vp-c-text-1)}.icon[data-v-1da04fcb]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-1da04fcb] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-1da04fcb]{transform:rotate(90deg)}.items[data-v-1da04fcb]{position:absolute;top:64px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.header[data-v-1da04fcb]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-1da04fcb]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-1da04fcb]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-1da04fcb]{transition:all .2s ease-out}.flyout-leave-active[data-v-1da04fcb]{transition:all .15s ease-in}.flyout-enter-from[data-v-1da04fcb],.flyout-leave-to[data-v-1da04fcb]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-99bafde1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-99bafde1]{position:fixed}.VPLocalNav.reached-top[data-v-99bafde1]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-99bafde1]{display:none}}.menu[data-v-99bafde1]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-99bafde1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-99bafde1]{padding:0 32px}}.menu-icon[data-v-99bafde1]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-99bafde1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-99bafde1]{padding:12px 32px 11px}}.VPSwitch[data-v-57a4e611]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-57a4e611]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-57a4e611]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-57a4e611]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-57a4e611] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-57a4e611] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-9fd3178a]{opacity:1}.moon[data-v-9fd3178a],.dark .sun[data-v-9fd3178a]{opacity:0}.dark .moon[data-v-9fd3178a]{opacity:1}.dark .VPSwitchAppearance[data-v-9fd3178a] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-47b73526]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-47b73526]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-12bdcbaf]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-12bdcbaf]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-12bdcbaf]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-12bdcbaf]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-84ca6b46]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-84ca6b46]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-84ca6b46]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-84ca6b46]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7bc86793]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7bc86793] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7bc86793] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7bc86793] .group:last-child{padding-bottom:0}.VPMenu[data-v-7bc86793] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7bc86793] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7bc86793] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7bc86793] .action{padding-left:24px}.VPFlyout[data-v-be12505d]{position:relative}.VPFlyout[data-v-be12505d]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-be12505d]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-be12505d]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-be12505d]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-be12505d]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-be12505d],.button[aria-expanded=true]+.menu[data-v-be12505d]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-be12505d]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-be12505d]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-be12505d]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-be12505d]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-be12505d]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-be12505d]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-be12505d]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-df955e2b]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-df955e2b]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-df955e2b]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-b03b93e5]{display:flex;justify-content:center}.VPNavBarExtra[data-v-d232e2f3]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-d232e2f3]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-d232e2f3]{display:none}}.trans-title[data-v-d232e2f3]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-d232e2f3],.item.social-links[data-v-d232e2f3]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-d232e2f3]{min-width:176px}.appearance-action[data-v-d232e2f3]{margin-right:-2px}.social-links-list[data-v-d232e2f3]{margin:-4px -8px}.VPNavBarHamburger[data-v-6e364b22]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6e364b22]{display:none}}.container[data-v-6e364b22]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6e364b22]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6e364b22]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6e364b22]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6e364b22]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6e364b22]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6e364b22]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6e364b22],.VPNavBarHamburger.active:hover .middle[data-v-6e364b22],.VPNavBarHamburger.active:hover .bottom[data-v-6e364b22]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6e364b22],.middle[data-v-6e364b22],.bottom[data-v-6e364b22]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6e364b22]{top:0;left:0;transform:translate(0)}.middle[data-v-6e364b22]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6e364b22]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-3a9d7cfe]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-3a9d7cfe],.VPNavBarMenuLink[data-v-3a9d7cfe]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-b502074c]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-b502074c]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-fc60e382]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-fc60e382]{display:flex;align-items:center}}.title[data-v-25907968]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-25907968]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-25907968]{border-bottom-color:var(--vp-c-divider)}}[data-v-25907968] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-605b2a1c]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-605b2a1c]{display:flex;align-items:center}}.title[data-v-605b2a1c]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-75295e80]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-75295e80]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-75295e80]{padding:0}.VPNavBar[data-v-75295e80]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-75295e80]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-75295e80],.container>.content[data-v-75295e80]{pointer-events:none}.container[data-v-75295e80] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-75295e80]{max-width:100%}}.title[data-v-75295e80]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-75295e80]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-75295e80]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-75295e80]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-75295e80]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-75295e80]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-75295e80]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-75295e80]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-75295e80]{column-gap:.5rem}}.menu+.translations[data-v-75295e80]:before,.menu+.appearance[data-v-75295e80]:before,.menu+.social-links[data-v-75295e80]:before,.translations+.appearance[data-v-75295e80]:before,.appearance+.social-links[data-v-75295e80]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-75295e80]:before,.translations+.appearance[data-v-75295e80]:before{margin-right:16px}.appearance+.social-links[data-v-75295e80]:before{margin-left:16px}.social-links[data-v-75295e80]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-75295e80]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-75295e80]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-75295e80]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenAppearance[data-v-ede75f40]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ede75f40]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-ffca81d4]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-ffca81d4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-9d57445c]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-9d57445c]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-1818b954]{display:block}.title[data-v-1818b954]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-52260a4f]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-52260a4f]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-52260a4f]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-52260a4f]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-52260a4f]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-52260a4f]{transform:rotate(45deg)}.button[data-v-52260a4f]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-52260a4f]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-52260a4f]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-52260a4f]:first-child{padding-top:0}.group+.group[data-v-52260a4f],.group+.item[data-v-52260a4f]{padding-top:4px}.VPNavScreenTranslations[data-v-9a2cac96]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-9a2cac96]{height:auto}.title[data-v-9a2cac96]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-9a2cac96]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-9a2cac96]{margin-right:8px}.icon.chevron[data-v-9a2cac96]{margin-left:4px}.list[data-v-9a2cac96]{padding:4px 0 0 24px}.link[data-v-9a2cac96]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-c19630f2]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-c19630f2],.VPNavScreen.fade-leave-active[data-v-c19630f2]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-c19630f2],.VPNavScreen.fade-leave-active .container[data-v-c19630f2]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-c19630f2],.VPNavScreen.fade-leave-to[data-v-c19630f2]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-c19630f2],.VPNavScreen.fade-leave-to .container[data-v-c19630f2]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-c19630f2]{display:none}}.container[data-v-c19630f2]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-c19630f2],.menu+.appearance[data-v-c19630f2],.translations+.appearance[data-v-c19630f2]{margin-top:24px}.menu+.social-links[data-v-c19630f2]{margin-top:16px}.appearance+.social-links[data-v-c19630f2]{margin-top:16px}.VPNav[data-v-8d0376b3]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-8d0376b3]{position:fixed}}.VPSidebarItem.level-0[data-v-1a4376dd]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-1a4376dd]{padding-bottom:10px}.item[data-v-1a4376dd]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-1a4376dd]{cursor:pointer}.indicator[data-v-1a4376dd]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-1a4376dd]{background-color:var(--vp-c-brand-1)}.link[data-v-1a4376dd]{display:flex;align-items:center;flex-grow:1}.text[data-v-1a4376dd]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-1a4376dd]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-1a4376dd],.VPSidebarItem.level-2 .text[data-v-1a4376dd],.VPSidebarItem.level-3 .text[data-v-1a4376dd],.VPSidebarItem.level-4 .text[data-v-1a4376dd],.VPSidebarItem.level-5 .text[data-v-1a4376dd]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-1a4376dd]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-1.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-2.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-3.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-4.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-5.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-1a4376dd]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-1a4376dd]{color:var(--vp-c-brand-1)}.caret[data-v-1a4376dd]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-1a4376dd]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-1a4376dd]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-1a4376dd]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-1a4376dd]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-1a4376dd],.VPSidebarItem.level-2 .items[data-v-1a4376dd],.VPSidebarItem.level-3 .items[data-v-1a4376dd],.VPSidebarItem.level-4 .items[data-v-1a4376dd],.VPSidebarItem.level-5 .items[data-v-1a4376dd]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-1a4376dd]{display:none}.VPSidebar[data-v-38384e3a]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-38384e3a]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-38384e3a]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-38384e3a]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-38384e3a]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-38384e3a]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-38384e3a]{outline:0}.group+.group[data-v-38384e3a]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-38384e3a]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-abdaa7b4]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-abdaa7b4]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-abdaa7b4]{top:14px;left:16px}}.Layout[data-v-8574ffd1]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-1cbeba34]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-1cbeba34]{margin:0 auto;max-width:1152px}.love[data-v-1cbeba34]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-1cbeba34]{width:28px;height:28px;fill:currentColor}.message[data-v-1cbeba34]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-1cbeba34]{padding-top:32px}.action[data-v-1cbeba34]{padding-top:40px;text-align:center}.VPTeamPage[data-v-25943f6d]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-25943f6d]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-25943f6d-s],.VPTeamMembers+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-25943f6d-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-25943f6d-s],.VPTeamMembers+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:96px}}.VPTeamMembers[data-v-25943f6d-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-25943f6d-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-25943f6d-s]{padding:0 64px}}.VPTeamPageTitle[data-v-2a957129]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-2a957129]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-2a957129]{padding:80px 64px 48px}}.title[data-v-2a957129]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-2a957129]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-2a957129]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-2a957129]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-a43e1cf6]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-a43e1cf6]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-a43e1cf6]{padding:0 64px}}.title[data-v-a43e1cf6]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-a43e1cf6]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-a43e1cf6]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-a43e1cf6]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-a43e1cf6]{padding-top:40px}.VPTeamMembersItem[data-v-7cfb1dae]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-7cfb1dae]{padding:32px}.VPTeamMembersItem.small .data[data-v-7cfb1dae]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-7cfb1dae]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-7cfb1dae]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-7cfb1dae]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-7cfb1dae]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-7cfb1dae]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-7cfb1dae]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-7cfb1dae]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-7cfb1dae]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-7cfb1dae]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-7cfb1dae]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-7cfb1dae]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-7cfb1dae]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-7cfb1dae]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-7cfb1dae]{text-align:center}.avatar[data-v-7cfb1dae]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-7cfb1dae]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-7cfb1dae]{margin:0;font-weight:600}.affiliation[data-v-7cfb1dae]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-7cfb1dae]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-7cfb1dae]:hover{color:var(--vp-c-brand-1)}.desc[data-v-7cfb1dae]{margin:0 auto}.desc[data-v-7cfb1dae] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-7cfb1dae]{display:flex;justify-content:center;height:56px}.sp-link[data-v-7cfb1dae]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-7cfb1dae]:hover,.sp .sp-link.link[data-v-7cfb1dae]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-7cfb1dae]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-08f54381]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-08f54381]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-08f54381]{max-width:876px}.VPTeamMembers.medium .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-08f54381]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-08f54381]{max-width:760px}.container[data-v-08f54381]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.AppBadgeList[data-v-095e1027]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px;min-height:20px;padding:0;list-style:none}.badge[data-v-095e1027]{margin:0}.authors[data-v-1f4911dd]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px;list-style:none;padding:0;margin:0}.author[data-v-1f4911dd]{display:flex;gap:10px;margin:0}.author-text[data-v-1f4911dd]{display:flex;flex-direction:column;margin:0}.author-name[data-v-1f4911dd]{line-height:1.25}.author-title[data-v-1f4911dd]{font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.author-avatar[data-v-1f4911dd]{width:48px;height:48px}.VPLocalSearchBox[data-v-5e5b049d]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-5e5b049d]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-5e5b049d]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-5e5b049d]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-5e5b049d]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-5e5b049d]{padding:0 8px}}.search-bar[data-v-5e5b049d]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-5e5b049d]{margin:8px}@media (max-width: 767px){.search-icon[data-v-5e5b049d]{display:none}}.search-input[data-v-5e5b049d]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-5e5b049d]{padding:6px 4px}}.search-actions[data-v-5e5b049d]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-5e5b049d]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-5e5b049d]{display:none}}.search-actions button[data-v-5e5b049d]{padding:8px}.search-actions button[data-v-5e5b049d]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-5e5b049d]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-5e5b049d]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-5e5b049d]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-5e5b049d]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-5e5b049d]{display:none}}.search-keyboard-shortcuts kbd[data-v-5e5b049d]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-5e5b049d]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-5e5b049d]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-5e5b049d]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-5e5b049d]{margin:8px}}.titles[data-v-5e5b049d]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-5e5b049d]{display:flex;align-items:center;gap:4px}.title.main[data-v-5e5b049d]{font-weight:500}.title-icon[data-v-5e5b049d]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-5e5b049d]{opacity:.5}.result.selected[data-v-5e5b049d]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-5e5b049d]{position:relative}.excerpt[data-v-5e5b049d]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-5e5b049d]{opacity:1}.excerpt[data-v-5e5b049d] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-5e5b049d] mark,.excerpt[data-v-5e5b049d] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-5e5b049d] .vp-code-group .tabs{display:none}.excerpt[data-v-5e5b049d] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-5e5b049d]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-5e5b049d]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-5e5b049d],.result.selected .title-icon[data-v-5e5b049d]{color:var(--vp-c-brand-1)!important}.no-results[data-v-5e5b049d]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-5e5b049d]{flex:none} +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-99f7fa3b]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.vp-doc h1>.VPBadge[data-v-99f7fa3b]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-99f7fa3b]{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-99f7fa3b]{vertical-align:middle}.vp-doc h4>.VPBadge[data-v-99f7fa3b],.vp-doc h5>.VPBadge[data-v-99f7fa3b],.vp-doc h6>.VPBadge[data-v-99f7fa3b]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-99f7fa3b]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-99f7fa3b]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-99f7fa3b]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-99f7fa3b]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-2e35c42d]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-2e35c42d],.VPBackdrop.fade-leave-to[data-v-2e35c42d]{opacity:0}.VPBackdrop.fade-leave-active[data-v-2e35c42d]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-2e35c42d]{display:none}}.NotFound[data-v-ca21a7ba]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-ca21a7ba]{padding:96px 32px 168px}}.code[data-v-ca21a7ba]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-ca21a7ba]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-ca21a7ba]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-ca21a7ba]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-ca21a7ba]{padding-top:20px}.link[data-v-ca21a7ba]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-ca21a7ba]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-266a89cb]{position:relative;z-index:1}.nested[data-v-266a89cb]{padding-left:16px}.outline-link[data-v-266a89cb]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-266a89cb]:hover,.outline-link.active[data-v-266a89cb]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-266a89cb]{padding-left:13px}.VPDocAsideOutline[data-v-82d1df03]{display:none}.VPDocAsideOutline.has-outline[data-v-82d1df03]{display:block}.content[data-v-82d1df03]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-82d1df03]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-82d1df03]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-4ccc7a73]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-4ccc7a73]{flex-grow:1}.VPDocAside[data-v-4ccc7a73] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-4ccc7a73] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-4ccc7a73] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-46d1cb64]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-46d1cb64]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-c097fc16]{margin-top:64px}.edit-info[data-v-c097fc16]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-c097fc16]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-c097fc16]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-c097fc16]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-c097fc16]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-c097fc16]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-c097fc16]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-c097fc16]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-c097fc16]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-c097fc16]{margin-left:auto;text-align:right}.desc[data-v-c097fc16]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-c097fc16]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDocOutlineDropdown[data-v-260152ac]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-260152ac]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-default-soft);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-260152ac]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-260152ac]{color:var(--vp-c-text-1)}.icon[data-v-260152ac]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-260152ac] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-260152ac]{transform:rotate(90deg)}.items[data-v-260152ac]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-30a5e70a]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-30a5e70a]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-30a5e70a]{display:block}}@media (min-width: 768px){.VPDoc[data-v-30a5e70a]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-30a5e70a]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-30a5e70a]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-30a5e70a]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-30a5e70a]{display:flex;justify-content:center}.VPDoc .aside[data-v-30a5e70a]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-30a5e70a]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-30a5e70a]{max-width:1104px}}.container[data-v-30a5e70a]{margin:0 auto;width:100%}.aside[data-v-30a5e70a]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-30a5e70a]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-30a5e70a]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-30a5e70a]::-webkit-scrollbar{display:none}.aside-curtain[data-v-30a5e70a]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-30a5e70a]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-30a5e70a]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-30a5e70a]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-30a5e70a]{order:1;margin:0;min-width:640px}}.content-container[data-v-30a5e70a]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-30a5e70a]{max-width:688px}.external-link-icon-enabled[data-v-30a5e70a] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-b47f9daa]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-b47f9daa]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-b47f9daa]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-b47f9daa]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-b47f9daa]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-b47f9daa]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-b47f9daa]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-b47f9daa]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-b47f9daa]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-b47f9daa]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-b47f9daa]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-b47f9daa]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-b47f9daa]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-b7111cdf]{display:none}.dark .VPImage.light[data-v-b7111cdf]{display:none}.VPHero[data-v-fd5a7aed]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-fd5a7aed]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-fd5a7aed]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-fd5a7aed]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-fd5a7aed]{flex-direction:row}}.main[data-v-fd5a7aed]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-fd5a7aed]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-fd5a7aed]{text-align:left}}@media (min-width: 960px){.main[data-v-fd5a7aed]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-fd5a7aed]{max-width:592px}}.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-fd5a7aed],.VPHero.has-image .text[data-v-fd5a7aed]{margin:0 auto}.name[data-v-fd5a7aed]{color:var(--vp-home-hero-name-color)}.clip[data-v-fd5a7aed]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-fd5a7aed],.text[data-v-fd5a7aed]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-fd5a7aed],.VPHero.has-image .text[data-v-fd5a7aed]{margin:0}}.tagline[data-v-fd5a7aed]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-fd5a7aed]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-fd5a7aed]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-fd5a7aed]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-fd5a7aed]{margin:0}}.actions[data-v-fd5a7aed]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-fd5a7aed]{justify-content:center}@media (min-width: 640px){.actions[data-v-fd5a7aed]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-fd5a7aed]{justify-content:flex-start}}.action[data-v-fd5a7aed]{flex-shrink:0;padding:6px}.image[data-v-fd5a7aed]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-fd5a7aed]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-fd5a7aed]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-fd5a7aed]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-fd5a7aed]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-fd5a7aed]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-fd5a7aed]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-fd5a7aed]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-fd5a7aed]{width:320px;height:320px}}[data-v-fd5a7aed] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-fd5a7aed] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-fd5a7aed] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-fb6bac11]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-fb6bac11]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-fb6bac11]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-fb6bac11]>.VPImage{margin-bottom:20px}.icon[data-v-fb6bac11]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-fb6bac11]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-fb6bac11]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-fb6bac11]{padding-top:8px}.link-text-value[data-v-fb6bac11]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-fb6bac11]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-3190607f]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-3190607f]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-3190607f]{padding:0 64px}}.container[data-v-3190607f]{margin:0 auto;max-width:1152px}.items[data-v-3190607f]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-3190607f]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-3190607f],.item.grid-4[data-v-3190607f],.item.grid-6[data-v-3190607f]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-3190607f],.item.grid-4[data-v-3190607f]{width:50%}.item.grid-3[data-v-3190607f],.item.grid-6[data-v-3190607f]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-3190607f]{width:25%}}.VPHome[data-v-381d4781]{padding-bottom:96px}.VPHome[data-v-381d4781] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-381d4781]{padding-bottom:128px}}.VPContent[data-v-a5670ab7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-a5670ab7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-a5670ab7]{margin:0}@media (min-width: 960px){.VPContent[data-v-a5670ab7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-a5670ab7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-a5670ab7]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-59982766]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-59982766]{display:none}@media (min-width: 768px){.VPFooter[data-v-59982766]{padding:32px}}.container[data-v-59982766]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-59982766],.copyright[data-v-59982766]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-1da04fcb]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-1da04fcb]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-1da04fcb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-1da04fcb]{color:var(--vp-c-text-1)}.icon[data-v-1da04fcb]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-1da04fcb] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-1da04fcb]{transform:rotate(90deg)}.items[data-v-1da04fcb]{position:absolute;top:64px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.header[data-v-1da04fcb]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-1da04fcb]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-1da04fcb]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-1da04fcb]{transition:all .2s ease-out}.flyout-leave-active[data-v-1da04fcb]{transition:all .15s ease-in}.flyout-enter-from[data-v-1da04fcb],.flyout-leave-to[data-v-1da04fcb]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-99bafde1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-99bafde1]{position:fixed}.VPLocalNav.reached-top[data-v-99bafde1]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-99bafde1]{display:none}}.menu[data-v-99bafde1]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-99bafde1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-99bafde1]{padding:0 32px}}.menu-icon[data-v-99bafde1]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-99bafde1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-99bafde1]{padding:12px 32px 11px}}.VPSwitch[data-v-57a4e611]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-57a4e611]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-57a4e611]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-57a4e611]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-57a4e611] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-57a4e611] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-9fd3178a]{opacity:1}.moon[data-v-9fd3178a],.dark .sun[data-v-9fd3178a]{opacity:0}.dark .moon[data-v-9fd3178a]{opacity:1}.dark .VPSwitchAppearance[data-v-9fd3178a] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-47b73526]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-47b73526]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-12bdcbaf]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-12bdcbaf]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-12bdcbaf]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-12bdcbaf]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-84ca6b46]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-84ca6b46]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-84ca6b46]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-84ca6b46]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7bc86793]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7bc86793] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7bc86793] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7bc86793] .group:last-child{padding-bottom:0}.VPMenu[data-v-7bc86793] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7bc86793] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7bc86793] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7bc86793] .action{padding-left:24px}.VPFlyout[data-v-be12505d]{position:relative}.VPFlyout[data-v-be12505d]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-be12505d]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-be12505d]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-be12505d]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-be12505d]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-be12505d],.button[aria-expanded=true]+.menu[data-v-be12505d]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-be12505d]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-be12505d]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-be12505d]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-be12505d]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-be12505d]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-be12505d]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-be12505d]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-df955e2b]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-df955e2b]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-df955e2b]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-b03b93e5]{display:flex;justify-content:center}.VPNavBarExtra[data-v-d232e2f3]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-d232e2f3]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-d232e2f3]{display:none}}.trans-title[data-v-d232e2f3]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-d232e2f3],.item.social-links[data-v-d232e2f3]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-d232e2f3]{min-width:176px}.appearance-action[data-v-d232e2f3]{margin-right:-2px}.social-links-list[data-v-d232e2f3]{margin:-4px -8px}.VPNavBarHamburger[data-v-6e364b22]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6e364b22]{display:none}}.container[data-v-6e364b22]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6e364b22]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6e364b22]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6e364b22]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6e364b22]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6e364b22]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6e364b22]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6e364b22],.VPNavBarHamburger.active:hover .middle[data-v-6e364b22],.VPNavBarHamburger.active:hover .bottom[data-v-6e364b22]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6e364b22],.middle[data-v-6e364b22],.bottom[data-v-6e364b22]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6e364b22]{top:0;left:0;transform:translate(0)}.middle[data-v-6e364b22]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6e364b22]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-3a9d7cfe]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-3a9d7cfe],.VPNavBarMenuLink[data-v-3a9d7cfe]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-b502074c]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-b502074c]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-fc60e382]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-fc60e382]{display:flex;align-items:center}}.title[data-v-25907968]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-25907968]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-25907968]{border-bottom-color:var(--vp-c-divider)}}[data-v-25907968] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-605b2a1c]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-605b2a1c]{display:flex;align-items:center}}.title[data-v-605b2a1c]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-75295e80]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-75295e80]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-75295e80]{padding:0}.VPNavBar[data-v-75295e80]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-75295e80]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-75295e80],.container>.content[data-v-75295e80]{pointer-events:none}.container[data-v-75295e80] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-75295e80]{max-width:100%}}.title[data-v-75295e80]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-75295e80]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-75295e80]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-75295e80]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-75295e80]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-75295e80]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-75295e80]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-75295e80]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-75295e80]{column-gap:.5rem}}.menu+.translations[data-v-75295e80]:before,.menu+.appearance[data-v-75295e80]:before,.menu+.social-links[data-v-75295e80]:before,.translations+.appearance[data-v-75295e80]:before,.appearance+.social-links[data-v-75295e80]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-75295e80]:before,.translations+.appearance[data-v-75295e80]:before{margin-right:16px}.appearance+.social-links[data-v-75295e80]:before{margin-left:16px}.social-links[data-v-75295e80]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-75295e80]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-75295e80]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-75295e80]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenAppearance[data-v-ede75f40]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ede75f40]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-ffca81d4]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-ffca81d4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-9d57445c]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-9d57445c]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-1818b954]{display:block}.title[data-v-1818b954]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-52260a4f]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-52260a4f]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-52260a4f]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-52260a4f]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-52260a4f]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-52260a4f]{transform:rotate(45deg)}.button[data-v-52260a4f]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-52260a4f]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-52260a4f]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-52260a4f]:first-child{padding-top:0}.group+.group[data-v-52260a4f],.group+.item[data-v-52260a4f]{padding-top:4px}.VPNavScreenTranslations[data-v-9a2cac96]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-9a2cac96]{height:auto}.title[data-v-9a2cac96]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-9a2cac96]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-9a2cac96]{margin-right:8px}.icon.chevron[data-v-9a2cac96]{margin-left:4px}.list[data-v-9a2cac96]{padding:4px 0 0 24px}.link[data-v-9a2cac96]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-c19630f2]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-c19630f2],.VPNavScreen.fade-leave-active[data-v-c19630f2]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-c19630f2],.VPNavScreen.fade-leave-active .container[data-v-c19630f2]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-c19630f2],.VPNavScreen.fade-leave-to[data-v-c19630f2]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-c19630f2],.VPNavScreen.fade-leave-to .container[data-v-c19630f2]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-c19630f2]{display:none}}.container[data-v-c19630f2]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-c19630f2],.menu+.appearance[data-v-c19630f2],.translations+.appearance[data-v-c19630f2]{margin-top:24px}.menu+.social-links[data-v-c19630f2]{margin-top:16px}.appearance+.social-links[data-v-c19630f2]{margin-top:16px}.VPNav[data-v-8d0376b3]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-8d0376b3]{position:fixed}}.VPSidebarItem.level-0[data-v-1a4376dd]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-1a4376dd]{padding-bottom:10px}.item[data-v-1a4376dd]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-1a4376dd]{cursor:pointer}.indicator[data-v-1a4376dd]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-1a4376dd],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-1a4376dd]{background-color:var(--vp-c-brand-1)}.link[data-v-1a4376dd]{display:flex;align-items:center;flex-grow:1}.text[data-v-1a4376dd]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-1a4376dd]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-1a4376dd],.VPSidebarItem.level-2 .text[data-v-1a4376dd],.VPSidebarItem.level-3 .text[data-v-1a4376dd],.VPSidebarItem.level-4 .text[data-v-1a4376dd],.VPSidebarItem.level-5 .text[data-v-1a4376dd]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-1a4376dd],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-1a4376dd]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-1.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-2.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-3.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-4.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-5.has-active>.item>.text[data-v-1a4376dd],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-1a4376dd],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-1a4376dd]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-1a4376dd],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-1a4376dd]{color:var(--vp-c-brand-1)}.caret[data-v-1a4376dd]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-1a4376dd]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-1a4376dd]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-1a4376dd]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-1a4376dd]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-1a4376dd],.VPSidebarItem.level-2 .items[data-v-1a4376dd],.VPSidebarItem.level-3 .items[data-v-1a4376dd],.VPSidebarItem.level-4 .items[data-v-1a4376dd],.VPSidebarItem.level-5 .items[data-v-1a4376dd]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-1a4376dd]{display:none}.VPSidebar[data-v-38384e3a]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-38384e3a]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-38384e3a]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-38384e3a]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-38384e3a]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-38384e3a]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-38384e3a]{outline:0}.group+.group[data-v-38384e3a]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-38384e3a]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-abdaa7b4]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-abdaa7b4]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-abdaa7b4]{top:14px;left:16px}}.Layout[data-v-8574ffd1]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-1cbeba34]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-1cbeba34]{margin:0 auto;max-width:1152px}.love[data-v-1cbeba34]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-1cbeba34]{width:28px;height:28px;fill:currentColor}.message[data-v-1cbeba34]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-1cbeba34]{padding-top:32px}.action[data-v-1cbeba34]{padding-top:40px;text-align:center}.VPTeamPage[data-v-25943f6d]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-25943f6d]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-25943f6d-s],.VPTeamMembers+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-25943f6d-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-25943f6d-s],.VPTeamMembers+.VPTeamPageSection[data-v-25943f6d-s]{margin-top:96px}}.VPTeamMembers[data-v-25943f6d-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-25943f6d-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-25943f6d-s]{padding:0 64px}}.VPTeamPageTitle[data-v-2a957129]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-2a957129]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-2a957129]{padding:80px 64px 48px}}.title[data-v-2a957129]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-2a957129]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-2a957129]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-2a957129]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-a43e1cf6]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-a43e1cf6]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-a43e1cf6]{padding:0 64px}}.title[data-v-a43e1cf6]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-a43e1cf6]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-a43e1cf6]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-a43e1cf6]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-a43e1cf6]{padding-top:40px}.VPTeamMembersItem[data-v-7cfb1dae]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-7cfb1dae]{padding:32px}.VPTeamMembersItem.small .data[data-v-7cfb1dae]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-7cfb1dae]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-7cfb1dae]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-7cfb1dae]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-7cfb1dae]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-7cfb1dae]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-7cfb1dae]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-7cfb1dae]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-7cfb1dae]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-7cfb1dae]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-7cfb1dae]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-7cfb1dae]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-7cfb1dae]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-7cfb1dae]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-7cfb1dae]{text-align:center}.avatar[data-v-7cfb1dae]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-7cfb1dae]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-7cfb1dae]{margin:0;font-weight:600}.affiliation[data-v-7cfb1dae]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-7cfb1dae]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-7cfb1dae]:hover{color:var(--vp-c-brand-1)}.desc[data-v-7cfb1dae]{margin:0 auto}.desc[data-v-7cfb1dae] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-7cfb1dae]{display:flex;justify-content:center;height:56px}.sp-link[data-v-7cfb1dae]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-7cfb1dae]:hover,.sp .sp-link.link[data-v-7cfb1dae]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-7cfb1dae]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-08f54381]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-08f54381]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-08f54381]{max-width:876px}.VPTeamMembers.medium .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-08f54381]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-08f54381]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-08f54381]{max-width:760px}.container[data-v-08f54381]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.AppBadgeList[data-v-095e1027]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px;min-height:20px;padding:0;list-style:none}.badge[data-v-095e1027]{margin:0}.authors[data-v-f35b0a27]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px;list-style:none;padding:0;margin:0}.author[data-v-f35b0a27]{display:flex;gap:10px;margin:0}.author-text[data-v-f35b0a27]{display:flex;flex-direction:column;margin:0}.author-name[data-v-f35b0a27]{line-height:1.25}.author-title[data-v-f35b0a27]{font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.author-avatar[data-v-f35b0a27]{width:48px;height:48px}.VPLocalSearchBox[data-v-5e5b049d]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-5e5b049d]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-5e5b049d]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-5e5b049d]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-5e5b049d]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-5e5b049d]{padding:0 8px}}.search-bar[data-v-5e5b049d]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-5e5b049d]{margin:8px}@media (max-width: 767px){.search-icon[data-v-5e5b049d]{display:none}}.search-input[data-v-5e5b049d]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-5e5b049d]{padding:6px 4px}}.search-actions[data-v-5e5b049d]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-5e5b049d]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-5e5b049d]{display:none}}.search-actions button[data-v-5e5b049d]{padding:8px}.search-actions button[data-v-5e5b049d]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-5e5b049d]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-5e5b049d]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-5e5b049d]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-5e5b049d]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-5e5b049d]{display:none}}.search-keyboard-shortcuts kbd[data-v-5e5b049d]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-5e5b049d]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-5e5b049d]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-5e5b049d]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-5e5b049d]{margin:8px}}.titles[data-v-5e5b049d]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-5e5b049d]{display:flex;align-items:center;gap:4px}.title.main[data-v-5e5b049d]{font-weight:500}.title-icon[data-v-5e5b049d]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-5e5b049d]{opacity:.5}.result.selected[data-v-5e5b049d]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-5e5b049d]{position:relative}.excerpt[data-v-5e5b049d]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-5e5b049d]{opacity:1}.excerpt[data-v-5e5b049d] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-5e5b049d] mark,.excerpt[data-v-5e5b049d] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-5e5b049d] .vp-code-group .tabs{display:none}.excerpt[data-v-5e5b049d] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-5e5b049d]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-5e5b049d]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-5e5b049d],.result.selected .title-icon[data-v-5e5b049d]{color:var(--vp-c-brand-1)!important}.no-results[data-v-5e5b049d]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-5e5b049d]{flex:none} diff --git a/blog/2022-02-10-js-tooling-research.html b/blog/2022-02-10-js-tooling-research.html index 8fb2757e17..2dee1000ce 100644 --- a/blog/2022-02-10-js-tooling-research.html +++ b/blog/2022-02-10-js-tooling-research.html @@ -1,18 +1,18 @@ - + High Performance JavaScript Toolchain | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ - - + + \ No newline at end of file diff --git a/blog/2022-08-08-linter-research.html b/blog/2022-08-08-linter-research.html index 836561d67c..1ef1707b0f 100644 --- a/blog/2022-08-08-linter-research.html +++ b/blog/2022-08-08-linter-research.html @@ -1,18 +1,18 @@ - + A research on JavaScript linters | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ - - + + \ No newline at end of file diff --git a/blog/2023-11-07-announcing-oxc.html b/blog/2023-11-07-announcing-oxc.html index 7d73f24a99..8c50570e85 100644 --- a/blog/2023-11-07-announcing-oxc.html +++ b/blog/2023-11-07-announcing-oxc.html @@ -1,18 +1,18 @@ - + Announcing Oxc | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ - - + + \ No newline at end of file diff --git a/blog/2023-11-08-announcing-oxlint.html b/blog/2023-11-08-announcing-oxlint.html index 7fff4336d3..48ff291238 100644 --- a/blog/2023-11-08-announcing-oxlint.html +++ b/blog/2023-11-08-announcing-oxlint.html @@ -1,18 +1,18 @@ - + Oxlint General Availability | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ - - + + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index f58fc0fa96..07cab62d5a 100644 --- a/blog/index.html +++ b/blog/index.html @@ -1,18 +1,18 @@ - + The JavaScript Oxidation Compiler | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,14 +30,14 @@ -
Skip to content

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
+    
Skip to content

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
 
 touch test.js
 cargo run -p rome_cli -- check ./test.js
cargo run -p rome_cli
 
 touch test.js
-cargo run -p rome_cli -- check ./test.js

rome_cli will eventually call rome_js_parser::parse

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187

and finally the actual parsing code

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17

Contributing

INFO

The JavaScript / TypeScript parser is 99% complete, the best way to help is to test Rome in your own codebases or take a look at the issues on Github.

- +cargo run -p rome_cli -- check ./test.js

rome_cli will eventually call rome_js_parser::parse

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187

and finally the actual parsing code

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17

Contributing

INFO

The JavaScript / TypeScript parser is 99% complete, the best way to help is to test Rome in your own codebases or take a look at the issues on Github.

+ \ No newline at end of file diff --git a/docs/contribute/codegen.html b/docs/contribute/codegen.html index 153973e9e3..a215ff914e 100644 --- a/docs/contribute/codegen.html +++ b/docs/contribute/codegen.html @@ -1,18 +1,18 @@ - + Codegen | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/contribute/development.html b/docs/contribute/development.html index 9e49b80aee..d0d49699cb 100644 --- a/docs/contribute/development.html +++ b/docs/contribute/development.html @@ -1,18 +1,18 @@ - + Development | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

- +
Skip to content

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

+ \ No newline at end of file diff --git a/docs/contribute/formatter.html b/docs/contribute/formatter.html index 7338eacfe4..b8bc178c34 100644 --- a/docs/contribute/formatter.html +++ b/docs/contribute/formatter.html @@ -1,18 +1,18 @@ - + Formatter | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Formatter

While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.

- +
Skip to content

Formatter

While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.

+ \ No newline at end of file diff --git a/docs/contribute/introduction.html b/docs/contribute/introduction.html index 18432426a6..f13c32778d 100644 --- a/docs/contribute/introduction.html +++ b/docs/contribute/introduction.html @@ -1,18 +1,18 @@ - + Introduction | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
- +
Skip to content

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
+ \ No newline at end of file diff --git a/docs/contribute/linter.html b/docs/contribute/linter.html index 936a65da2a..06864b1b45 100644 --- a/docs/contribute/linter.html +++ b/docs/contribute/linter.html @@ -1,18 +1,18 @@ - + Linter | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
+    
Skip to content

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
 just new-ts-rule name
 just new-unicorn-rule name
 just new-react-rule name
@@ -38,8 +38,8 @@
 just new-ts-rule name
 just new-unicorn-rule name
 just new-react-rule name
-just new-jsx-a11y-rule name
- +just new-jsx-a11y-rule name
+ \ No newline at end of file diff --git a/docs/contribute/minifier.html b/docs/contribute/minifier.html index 5e2e3a65b9..c1cb1b894b 100644 --- a/docs/contribute/minifier.html +++ b/docs/contribute/minifier.html @@ -1,18 +1,18 @@ - + Minifier | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Minifier

JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.

However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?

We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].

Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.

- +
Skip to content

Minifier

JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.

However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?

We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].

Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.

+ \ No newline at end of file diff --git a/docs/contribute/parser.html b/docs/contribute/parser.html index 4a65ad6ebd..8be146e625 100644 --- a/docs/contribute/parser.html +++ b/docs/contribute/parser.html @@ -1,18 +1,18 @@ - + Parser | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

- +
Skip to content

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

+ \ No newline at end of file diff --git a/docs/contribute/performance.html b/docs/contribute/performance.html index a0a609319d..20880e7eb5 100644 --- a/docs/contribute/performance.html +++ b/docs/contribute/performance.html @@ -1,18 +1,18 @@ - + Performance | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
+    
Skip to content

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
 debug = 1 # debug info with line tables only
 strip = false # do not strip symbols
[profile.release]
 debug = 1 # debug info with line tables only
@@ -42,8 +42,8 @@
 Ctrl-C to stop the recording
 Target app exited, ending recording...
 Recording completed. Saving output file...
-Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace

Open the trace file open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace.

To see a top down trace:

  1. On the top panel, click CPUs
  2. On the left input box, click x then select Time Profiler
  3. At the bottom panel, click "Call Tree", turn on "Invert Call Tree" and turn off separate by thread.
- +Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace

Open the trace file open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace.

To see a top down trace:

  1. On the top panel, click CPUs
  2. On the left input box, click x then select Time Profiler
  3. At the bottom panel, click "Call Tree", turn on "Invert Call Tree" and turn off separate by thread.
+ \ No newline at end of file diff --git a/docs/contribute/prettier.html b/docs/contribute/prettier.html index 464316bba6..94dfaff586 100644 --- a/docs/contribute/prettier.html +++ b/docs/contribute/prettier.html @@ -1,18 +1,18 @@ - + Prettier | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/contribute/resolver.html b/docs/contribute/resolver.html index b051755be9..16400fcc28 100644 --- a/docs/contribute/resolver.html +++ b/docs/contribute/resolver.html @@ -1,18 +1,18 @@ - + Resolver | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Resolver

Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].

[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.

- +
Skip to content

Resolver

Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].

[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.

+ \ No newline at end of file diff --git a/docs/contribute/showcase.html b/docs/contribute/showcase.html index 101ebbfff7..fb1eb84f78 100644 --- a/docs/contribute/showcase.html +++ b/docs/contribute/showcase.html @@ -1,18 +1,18 @@ - + Showcase | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Showcase

Example PRs adding oxlint:

- +
Skip to content

Showcase

Example PRs adding oxlint:

+ \ No newline at end of file diff --git a/docs/contribute/transformer.html b/docs/contribute/transformer.html index 735dc4915f..a5cb9c0012 100644 --- a/docs/contribute/transformer.html +++ b/docs/contribute/transformer.html @@ -1,18 +1,18 @@ - + Transformer | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Transformer

A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the umbrella issue for details.

- +
Skip to content

Transformer

A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the umbrella issue for details.

+ \ No newline at end of file diff --git a/docs/contribute/vscode.html b/docs/contribute/vscode.html index 64f783aea4..58f78e5a8f 100644 --- a/docs/contribute/vscode.html +++ b/docs/contribute/vscode.html @@ -1,18 +1,18 @@ - + VSCode Extension | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
- +
Skip to content

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
+ \ No newline at end of file diff --git a/docs/guide/benchmarks.html b/docs/guide/benchmarks.html index c025628a3d..4b551ed28f 100644 --- a/docs/guide/benchmarks.html +++ b/docs/guide/benchmarks.html @@ -1,18 +1,18 @@ - + Benchmarks | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/guide/introduction.html b/docs/guide/introduction.html index 3e63dd9bc8..571523d6c0 100644 --- a/docs/guide/introduction.html +++ b/docs/guide/introduction.html @@ -1,18 +1,18 @@ - + Introduction | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

- +
Skip to content

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

+ \ No newline at end of file diff --git a/docs/guide/philosophy.html b/docs/guide/philosophy.html index 1f90fece43..651fedc33b 100644 --- a/docs/guide/philosophy.html +++ b/docs/guide/philosophy.html @@ -1,18 +1,18 @@ - + Philosophy | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Philosophy

TBD

- +
Skip to content

Philosophy

TBD

+ \ No newline at end of file diff --git a/docs/guide/usage/benchmarks.html b/docs/guide/usage/benchmarks.html index 1b7ff23226..37b1ef6832 100644 --- a/docs/guide/usage/benchmarks.html +++ b/docs/guide/usage/benchmarks.html @@ -1,18 +1,18 @@ - + Benchmarks | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/guide/usage/linter.html b/docs/guide/usage/linter.html index 342b9f9c2d..cb17589714 100644 --- a/docs/guide/usage/linter.html +++ b/docs/guide/usage/linter.html @@ -1,18 +1,18 @@ - + Linter | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content
  • npm
  • GitHub Repo stars

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
+    
Skip to content
  • npm
  • GitHub Repo stars

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
   "languageserver": {
     "oxc": {
       "command": "oxc_vscode",
@@ -106,8 +106,8 @@
     PATH                      Single file, single path or list of paths
 
 Available options:
-    -h, --help                Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
- + -h, --help Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
+ \ No newline at end of file diff --git a/docs/guide/usage/parser.html b/docs/guide/usage/parser.html index 795ea22299..3f75a8955e 100644 --- a/docs/guide/usage/parser.html +++ b/docs/guide/usage/parser.html @@ -1,18 +1,18 @@ - + Parser | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
  • npm

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
- +
Skip to content
  • npm

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
+ \ No newline at end of file diff --git a/docs/guide/usage/philosophy.html b/docs/guide/usage/philosophy.html index 875f025e80..69dbfd7dfb 100644 --- a/docs/guide/usage/philosophy.html +++ b/docs/guide/usage/philosophy.html @@ -1,18 +1,18 @@ - + Philosophy | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/guide/usage/resolver.html b/docs/guide/usage/resolver.html index 9aa90ceb1e..19927f0bf6 100644 --- a/docs/guide/usage/resolver.html +++ b/docs/guide/usage/resolver.html @@ -1,18 +1,18 @@ - + Resolver | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content
  • npm

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
+    
Skip to content
  • npm

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
 
 use oxc_resolver::{ResolveOptions, Resolver};
 
@@ -62,8 +62,8 @@
         Err(error) => println!("Error: {error}"),
         Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
     }
-}
- +}
+ \ No newline at end of file diff --git a/docs/learn/architecture/formatter.html b/docs/learn/architecture/formatter.html index 405d66bf7f..f48e31c062 100644 --- a/docs/learn/architecture/formatter.html +++ b/docs/learn/architecture/formatter.html @@ -1,18 +1,18 @@ - + Formatter | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/learn/architecture/introduction.html b/docs/learn/architecture/introduction.html index 448240f4a0..47afa4b4cf 100644 --- a/docs/learn/architecture/introduction.html +++ b/docs/learn/architecture/introduction.html @@ -1,18 +1,18 @@ - + Introduction | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Introduction

- +
Skip to content

Introduction

+ \ No newline at end of file diff --git a/docs/learn/architecture/linter.html b/docs/learn/architecture/linter.html index 2002819dab..99ba7a333d 100644 --- a/docs/learn/architecture/linter.html +++ b/docs/learn/architecture/linter.html @@ -1,18 +1,18 @@ - + Linter | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Example

See crates/oxc_linter/examples/linter.rs for the bare minimum linter implementation.

- +
Skip to content

Example

See crates/oxc_linter/examples/linter.rs for the bare minimum linter implementation.

+ \ No newline at end of file diff --git a/docs/learn/architecture/minifier.html b/docs/learn/architecture/minifier.html index df1993c9b7..d6228142fa 100644 --- a/docs/learn/architecture/minifier.html +++ b/docs/learn/architecture/minifier.html @@ -1,18 +1,18 @@ - + Minifier | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/learn/architecture/parser.html b/docs/learn/architecture/parser.html index d7331ab388..a436877f5f 100644 --- a/docs/learn/architecture/parser.html +++ b/docs/learn/architecture/parser.html @@ -1,18 +1,18 @@ - + Parser | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
- +
Skip to content

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
+ \ No newline at end of file diff --git a/docs/learn/architecture/resolver.html b/docs/learn/architecture/resolver.html index 2589b1226f..d77699c8db 100644 --- a/docs/learn/architecture/resolver.html +++ b/docs/learn/architecture/resolver.html @@ -1,18 +1,18 @@ - + Resolver | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/learn/architecture/transformer.html b/docs/learn/architecture/transformer.html index 31d4a44a0c..5b25d2367b 100644 --- a/docs/learn/architecture/transformer.html +++ b/docs/learn/architecture/transformer.html @@ -1,18 +1,18 @@ - + Transformer | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/docs/learn/ecmascript/grammar.html b/docs/learn/ecmascript/grammar.html index f2277ba468..7fba5b73ae 100644 --- a/docs/learn/ecmascript/grammar.html +++ b/docs/learn/ecmascript/grammar.html @@ -1,18 +1,18 @@ - + Grammar | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
+    
Skip to content

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
 BindingIdentifier[Yield, Await] :
 LabelIdentifier[Yield, Await] :
IdentifierReference[Yield, Await] :
 BindingIdentifier[Yield, Await] :
@@ -430,8 +430,8 @@
 If LeftHandSideExpression is an ObjectLiteral or an ArrayLiteral, the following Early Error rules are applied:
     * LeftHandSideExpression must cover an AssignmentPattern.

These definitions define:

javascript
({ prop = value } = {}); // ObjectAssignmentPattern
 ({ prop = value }); // ObjectLiteral with SyntaxError
({ prop = value } = {}); // ObjectAssignmentPattern
-({ prop = value }); // ObjectLiteral with SyntaxError

Parsers need to parse ObjectLiteral with CoverInitializedName, and throw the syntax error if it does not reach = for ObjectAssignmentPattern.

As an exercise, which one of the following = should throw a syntax error?

javascript
let { x = 1 } = { x = 1 } = { x = 1 }
let { x = 1 } = { x = 1 } = { x = 1 }
- +({ prop = value }); // ObjectLiteral with SyntaxError

Parsers need to parse ObjectLiteral with CoverInitializedName, and throw the syntax error if it does not reach = for ObjectAssignmentPattern.

As an exercise, which one of the following = should throw a syntax error?

javascript
let { x = 1 } = { x = 1 } = { x = 1 }
let { x = 1 } = { x = 1 } = { x = 1 }
+ \ No newline at end of file diff --git a/docs/learn/ecmascript/spec.html b/docs/learn/ecmascript/spec.html index 39608d19df..6bff4ae563 100644 --- a/docs/learn/ecmascript/spec.html +++ b/docs/learn/ecmascript/spec.html @@ -1,18 +1,18 @@ - + Specification | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
+    
Skip to content

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
   AssignmentExpression
   ArgumentList , AssignmentExpression
ArgumentList :
   AssignmentExpression
@@ -86,8 +86,8 @@
         // highlight-next-line
         self.asi()?;
         self.ast.debugger_statement(self.finish_node(node))
-    }

INFO

This section on asi is written with a parser in mind, it explicitly states that the source text is parsed from left to right, which makes it almost impossible to write the parser in any other way. The author of jsparagus made a rant about this here.

The specification for this feature is both very-high-level and weirdly procedural (“When, as the source text is parsed from left to right, a token is encountered...”, as if the specification is telling a story about a browser. As far as I know, this is the only place in the spec where anything is assumed or implied about the internal implementation details of parsing.) But it would be hard to specify ASI any other way.

Expressions, Statements, Functions, Classes, Scripts and Modules

It takes a while to understand the syntactic grammar, then apply them to writing a parser.

- + }

INFO

This section on asi is written with a parser in mind, it explicitly states that the source text is parsed from left to right, which makes it almost impossible to write the parser in any other way. The author of jsparagus made a rant about this here.

The specification for this feature is both very-high-level and weirdly procedural (“When, as the source text is parsed from left to right, a token is encountered...”, as if the specification is telling a story about a browser. As far as I know, this is the only place in the spec where anything is assumed or implied about the internal implementation details of parsing.) But it would be hard to specify ASI any other way.

Expressions, Statements, Functions, Classes, Scripts and Modules

It takes a while to understand the syntactic grammar, then apply them to writing a parser.

+ \ No newline at end of file diff --git a/docs/learn/ecosystem.html b/docs/learn/ecosystem.html index 9d5f41c934..bcdca513e5 100644 --- a/docs/learn/ecosystem.html +++ b/docs/learn/ecosystem.html @@ -1,18 +1,18 @@ - + Ecosystem | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

- +
Skip to content

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

+ \ No newline at end of file diff --git a/docs/learn/performance.html b/docs/learn/performance.html index e56cbdc56f..380fe2c0df 100644 --- a/docs/learn/performance.html +++ b/docs/learn/performance.html @@ -1,18 +1,18 @@ - + Performance | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,7 +30,7 @@ -
Skip to content

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
+    
Skip to content

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
     pub node: Node,
     pub body: Vec<Statement>,
 }
@@ -498,8 +498,8 @@
 let mut handle = stdout.lock(); // acquire a lock on it
 writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
let stdout = io::stdout(); // get the global stdout entity
 let mut handle = stdout.lock(); // acquire a lock on it
-writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
- +writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
+ \ No newline at end of file diff --git a/docs/learn/references.html b/docs/learn/references.html index 9711ab79f2..e4df9063d5 100644 --- a/docs/learn/references.html +++ b/docs/learn/references.html @@ -1,18 +1,18 @@ - + References | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ - - + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 63dea1430d..b9ea4f560b 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"docs_contribute_showcase.md":"04c27e6a","docs_contribute_vscode.md":"dfac2403","docs_contribute_transformer.md":"d026b587","docs_learn_ecosystem.md":"8c414ce3","docs_learn_ecmascript_spec.md":"03200411","docs_guide_benchmarks.md":"426cf9b1","index.md":"b39570fc","blog_index.md":"a20bd3b9","docs_learn_architecture_linter.md":"12e3a00b","docs_learn_ecmascript_grammar.md":"e9677e24","docs_learn_architecture_resolver.md":"06afd529","docs_contribute_introduction.md":"b8b3797b","docs_guide_philosophy.md":"d9540af9","docs_contribute_codegen.md":"038d4799","docs_learn_architecture_formatter.md":"80783d23","docs_learn_architecture_minifier.md":"bc5e2ca4","blog_2022-02-10-js-tooling-research.md":"e5bf29cc","docs_guide_usage_resolver.md":"60e2e81f","docs_contribute_resolver.md":"668d9bbb","docs_contribute_prettier.md":"ed67e286","blog_2023-11-08-announcing-oxlint.md":"706d95fb","docs_guide_usage_parser.md":"a90d6882","docs_guide_usage_benchmarks.md":"cf30d29b","docs_learn_architecture_transformer.md":"8a48936b","docs_guide_usage_linter.md":"be302645","docs_contribute_linter.md":"b1685e29","docs_guide_introduction.md":"138c6418","docs_learn_performance.md":"5eb36f6e","docs_learn_architecture_introduction.md":"da9ddefa","docs_learn_references.md":"ff70791a","blog_2023-11-07-announcing-oxc.md":"3a2f4a1d","blog_2022-08-08-linter-research.md":"7364aab2","docs_contribute_performance.md":"32708dc6","docs_contribute_parser.md":"dea12757","docs_contribute_formatter.md":"c3e52bdc","docs_contribute_development.md":"260bd01b","docs_learn_architecture_parser.md":"4ee292fb","docs_contribute_minifier.md":"8673c15a","docs_guide_usage_philosophy.md":"7fb423b5"} +{"docs_contribute_resolver.md":"841f60b8","docs_contribute_vscode.md":"4c08a98c","docs_learn_architecture_minifier.md":"661eaafc","docs_guide_philosophy.md":"2be5f5f9","docs_guide_usage_benchmarks.md":"64291503","docs_guide_usage_resolver.md":"c3f62e0b","blog_2022-02-10-js-tooling-research.md":"62856b03","docs_contribute_codegen.md":"5da044b1","docs_learn_architecture_parser.md":"4234e563","docs_learn_architecture_resolver.md":"cfbd489f","docs_contribute_transformer.md":"16592f8f","docs_contribute_minifier.md":"15260fdc","docs_contribute_prettier.md":"d0e1731d","docs_learn_ecmascript_spec.md":"c10ef8af","docs_contribute_parser.md":"bb1bc2fa","docs_learn_ecosystem.md":"81955525","docs_contribute_performance.md":"4ff20e3f","docs_learn_references.md":"62c70fb2","blog_index.md":"e44a5676","docs_guide_usage_philosophy.md":"57f130a7","docs_learn_architecture_transformer.md":"48cf4290","docs_guide_usage_linter.md":"45344b17","docs_contribute_linter.md":"15e43eac","docs_guide_usage_parser.md":"879fa23a","docs_contribute_development.md":"5b7d3e4f","docs_guide_benchmarks.md":"f62b4c74","docs_contribute_showcase.md":"030540b5","ja_docs_guide_usage_benchmarks.md":"333e4a26","ja_docs_guide_introduction.md":"e93c04aa","ja_docs_guide_philosophy.md":"53319563","docs_contribute_formatter.md":"d7a59564","ja_blog_2023-11-07-announcing-oxc.md":"d6db77d4","ja_docs_learn_ecmascript_spec.md":"550d6650","ja_blog_2023-11-08-announcing-oxlint.md":"e3b3e413","ja_blog_index.md":"3de8b9cb","ja_docs_contribute_codegen.md":"837767d8","ja_docs_contribute_development.md":"599cc7ae","docs_contribute_introduction.md":"5c1fbb9f","index.md":"dc0fe200","ja_docs_contribute_formatter.md":"9f37d059","docs_learn_architecture_linter.md":"2f9c0c5d","docs_learn_architecture_introduction.md":"5fdf9f2b","ja_docs_contribute_introduction.md":"cb17b786","docs_learn_performance.md":"33aec0bd","ja_docs_guide_usage_linter.md":"6d7c833c","ja_docs_contribute_linter.md":"170c9f93","ja_docs_contribute_minifier.md":"24e36ab1","ja_docs_contribute_resolver.md":"a7d71247","ja_docs_contribute_parser.md":"242f07ac","ja_docs_contribute_showcase.md":"2c987012","ja_docs_contribute_prettier.md":"0fcbc08e","ja_docs_contribute_vscode.md":"f0821a79","ja_docs_guide_benchmarks.md":"eef70013","blog_2022-08-08-linter-research.md":"2f4287c0","ja_docs_learn_architecture_parser.md":"f8c02391","ja_docs_guide_usage_parser.md":"0185a423","ja_docs_contribute_performance.md":"b4a85950","ja_docs_guide_usage_philosophy.md":"cc97835a","ja_docs_guide_usage_resolver.md":"8d81200e","ja_docs_contribute_transformer.md":"f632fd4e","ja_docs_learn_architecture_introduction.md":"45104dba","ja_docs_learn_architecture_linter.md":"a9524693","ja_docs_learn_architecture_minifier.md":"6c9d6ee0","ja_docs_learn_architecture_resolver.md":"751b4d95","ja_docs_learn_architecture_transformer.md":"ea5219ab","ja_blog_2022-08-08-linter-research.md":"50a5b9a3","docs_learn_ecmascript_grammar.md":"4dc3d487","blog_2023-11-08-announcing-oxlint.md":"9976ed49","ja_blog_2022-02-10-js-tooling-research.md":"cbcccc07","blog_2023-11-07-announcing-oxc.md":"899bda23","ja_docs_learn_ecosystem.md":"c9d3c686","ja_docs_learn_references.md":"fa521212","docs_guide_introduction.md":"62db88d2","docs_learn_architecture_formatter.md":"b8f08359","ja_docs_learn_ecmascript_grammar.md":"53196869","ja_index.md":"2f58577e","ja_docs_learn_performance.md":"239666b7","ja_docs_learn_architecture_formatter.md":"e9e4c97a"} diff --git a/index.html b/index.html index 9cbeeebf6d..5087b5a176 100644 --- a/index.html +++ b/index.html @@ -1,18 +1,18 @@ - + The JavaScript Oxidation Compiler | The JavaScript Oxidation Compiler - + - + - + - + @@ -30,8 +30,8 @@ -
Skip to content

The JavaScript Oxidation Compiler

A collection of JavaScript tools written in Rust

The JavaScript Oxidation Compiler
- +
Skip to content

The JavaScript Oxidation Compiler

A collection of JavaScript tools written in Rust

The JavaScript Oxidation Compiler
+ \ No newline at end of file diff --git a/ja/blog/2022-02-10-js-tooling-research.html b/ja/blog/2022-02-10-js-tooling-research.html new file mode 100644 index 0000000000..ed5386fdad --- /dev/null +++ b/ja/blog/2022-02-10-js-tooling-research.html @@ -0,0 +1,37 @@ + + + + + + High Performance JavaScript Toolchain | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/blog/2022-08-08-linter-research.html b/ja/blog/2022-08-08-linter-research.html new file mode 100644 index 0000000000..5a082222ee --- /dev/null +++ b/ja/blog/2022-08-08-linter-research.html @@ -0,0 +1,37 @@ + + + + + + A research on JavaScript linters | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/blog/2023-11-07-announcing-oxc.html b/ja/blog/2023-11-07-announcing-oxc.html new file mode 100644 index 0000000000..3e259cd76a --- /dev/null +++ b/ja/blog/2023-11-07-announcing-oxc.html @@ -0,0 +1,37 @@ + + + + + + Announcing Oxc | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/blog/2023-11-08-announcing-oxlint.html b/ja/blog/2023-11-08-announcing-oxlint.html new file mode 100644 index 0000000000..08fb19f888 --- /dev/null +++ b/ja/blog/2023-11-08-announcing-oxlint.html @@ -0,0 +1,37 @@ + + + + + + Oxlint General Availability | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/blog/index.html b/ja/blog/index.html new file mode 100644 index 0000000000..5881f78b0d --- /dev/null +++ b/ja/blog/index.html @@ -0,0 +1,43 @@ + + + + + + The JavaScript Oxidation Compiler | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Rome uses a different set of techniques for parsing JavaScript and TypeScript. This tutorial summarizes them in learning order for better understanding.

History

  • The Rome codebase was rewritten from TypeScript to Rust, see Rome will be rewritten in Rust
  • The decision was made after talking to the author of rslint and rust-analyzer
  • rust-analyzer proved that IDE-centric tools built around concrete syntax tree are possible
  • rslint proved that it is possible to write a JavaScript parser in Rust, with the same base libraries as rust-analyzer
  • Rome ported the rslint codebase to their own repo with permission from rslint's author

Concrete Syntax Tree

  • The base library is called rowan, see overview of rowan
  • Rowan, also known as red-green trees, is named after the real green rowan tree that makes red berries
  • The origin of red-green trees is described in this blog post, by the authors of the C# programming language
  • The whole point of rowan is to define a lossless concrete syntax tree (CST) that describes all the details of the source code and provides a set of traversal APIs (parent, children, siblings, etc)
  • Read the advantage of having a CST over an AST: Pure AST based linting sucks
  • CST provides the ability to build a fully recoverable parser

Grammar

Entry Point

The Rome codebase is getting large and slightly difficult to find the parser entry point.

For first-time contributors, the rome_cli crate is the binary entry point for running the code:

bash
cargo run -p rome_cli
+
+touch test.js
+cargo run -p rome_cli -- check ./test.js
cargo run -p rome_cli
+
+touch test.js
+cargo run -p rome_cli -- check ./test.js

rome_cli will eventually call rome_js_parser::parse

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187

and finally the actual parsing code

rust
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17
https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17

Contributing

INFO

The JavaScript / TypeScript parser is 99% complete, the best way to help is to test Rome in your own codebases or take a look at the issues on Github.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/codegen.html b/ja/docs/contribute/codegen.html new file mode 100644 index 0000000000..f45802619a --- /dev/null +++ b/ja/docs/contribute/codegen.html @@ -0,0 +1,37 @@ + + + + + + Codegen | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/development.html b/ja/docs/contribute/development.html new file mode 100644 index 0000000000..40ed157d76 --- /dev/null +++ b/ja/docs/contribute/development.html @@ -0,0 +1,37 @@ + + + + + + Development | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Development

This page explains how to set up enrionment for OXC development.

Clone Repository

bash
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git
git clone --recurse-submodules --shallow-submodules git@github.com:oxc-project/oxc.git

The --recurse-submodules and --shallow-submodules flags are needed to initialize git submodules that are needed to run conformance tests.

Set Up Project

Install Rust

If you have not yet installed Rust, follow the official instruction and install Rust.

After installing Rust, run the following command at the project root:

bash
rustup show
rustup show

rustup show reads the ./rust-toolchain.toml file and installs the correct Rust toolchain and components for this project.

Install Project Tools

cargo-binstall

Some Cargo tools are required to develop OXC, and it is recommended to use cargo binstall, which provides a low-complexity mechanism to install rust binaries and is fater way than building them from source by running cargo install.

bash
cargo install cargo-binstall
cargo install cargo-binstall

You can also download the pre-compiled binary and save it in ~/.cargo/bin.

just

OXC utilizes just, which is a handy way to save and run project-specific commands:

bash
cargo binstall just -y
cargo binstall just -y

Dependencies

Run the following command in justfile at the project root to install dependencies:

bash
just init
just init

You can see the list of available commands by running just.

You can run just ready (or, just r in short) to make sure the whole project builds and runs correctly.


Now you are ready to develop OXC! You can check out good first issues or ask us on Discord.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/formatter.html b/ja/docs/contribute/formatter.html new file mode 100644 index 0000000000..9a0108d4de --- /dev/null +++ b/ja/docs/contribute/formatter.html @@ -0,0 +1,37 @@ + + + + + + Formatter | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Formatter

While [prettier] has established itself as the de facto code formatter for JavaScript, there is a significant demand in the developer community for a less opinionated alternative. Recognizing this need, our ambition is to undertake research and development to create a new JavaScript formatter that offers increased flexibility and customization options. Unfortunately we are currently lacking the resources to do so.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/introduction.html b/ja/docs/contribute/introduction.html new file mode 100644 index 0000000000..503a0d13c6 --- /dev/null +++ b/ja/docs/contribute/introduction.html @@ -0,0 +1,37 @@ + + + + + + Introduction | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Introduction

Thank you for getting interested in contributing to OXC project! Before starting, please make sure to read the following rules and policy.

General Rules

  • We welcome and appreciate any form of contributions.
  • Please create an issue or discussion if you want to make an architectural change.

PR Rules

Action Policy

Taken from Astral's values:

We bias towards action, even in the face of uncertainty. We favor pragmatic doing over prolonged debating; we favor asking for forgiveness over permission. We value decisiveness — especially when a decision isn’t clear cut, and especially when a decision is reversible.

A bias towards action is not the same as recklessness. Rather, it’s a bias towards making responsible decisions and acting on them with urgency, even if we’re left with lingering ambiguity or known unknowns.

Development Policy

  • All performance issues (runtime and compilation speed) are considered as bugs in this project.
  • Embrace data-oriented design.
  • APIs should be simple and well-documented.
  • Third-party dependencies should be minimal.
  • Avoid the regex crate when possible. Regexes are slow, most of them can be rewritten in a performant way by using Rust iterator and string methods.
  • Avoid macros, traits or any Rust techniques that would penalize compilation speed.

Maintenance Policy

  • Monitor code coverage for unused code. Aim for 99% code coverage.
  • CI time should be actively monitored and reduced to speed up merging of PRs. The current CI time on GitHub actions is around 3 minutes.
+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/linter.html b/ja/docs/contribute/linter.html new file mode 100644 index 0000000000..c082014e81 --- /dev/null +++ b/ja/docs/contribute/linter.html @@ -0,0 +1,45 @@ + + + + + + Linter | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Linter

Development

Create a ./test.ts and then

bash
just watch "run -p oxc_cli --bin oxlint -- test.ts"
just watch "run -p oxc_cli --bin oxlint -- test.ts"

Rule generation

Create a new lint rule by providing the ESLint name

bash
just new-rule name
just new-rule name

Then add the rule to crates/oxc_linter/src/rules.rs:

  1. Add to mod
  2. Add to oxc_macros::declare_all_lint_rules at the bottom of the file

For other plugins, there are also:

bash
just new-jest-rule name
+just new-ts-rule name
+just new-unicorn-rule name
+just new-react-rule name
+just new-jsx-a11y-rule name
just new-jest-rule name
+just new-ts-rule name
+just new-unicorn-rule name
+just new-react-rule name
+just new-jsx-a11y-rule name
+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/minifier.html b/ja/docs/contribute/minifier.html new file mode 100644 index 0000000000..43b53aacec --- /dev/null +++ b/ja/docs/contribute/minifier.html @@ -0,0 +1,37 @@ + + + + + + Minifier | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Minifier

JavaScript minification plays a crucial role in optimizing website performance as it reduces the amount of data sent to users, resulting in faster page loads. This holds tremendous economic value, particularly for e-commerce websites, where every second can equate to millions of dollars.

However, existing minifiers typically require a trade-off between compression quality and speed. You have to choose between the slowest for the best compression or the fastest for less compression. But what if we could develop a faster minifier without compromising on compression?

We are actively working on a prototype that aims to achieve this goal, by porting all test cases from well-known minifiers such as [google-closure-compiler], [terser], [esbuild], and [tdewolff-minify].

Preliminary results indicate that we are on track to achieve our objectives. With the Oxc minifier, you can expect faster minification times without sacrificing compression quality.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/parser.html b/ja/docs/contribute/parser.html new file mode 100644 index 0000000000..f3681adf69 --- /dev/null +++ b/ja/docs/contribute/parser.html @@ -0,0 +1,37 @@ + + + + + + Parser | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Parser

We aim to be the fastest Rust-based ready-for-production parser.

Conformance Tests

bash
just c
just c

Aliased to just coverage, runs the following conformance test suites by using the conformance runner found in tasks/coverage.

Test262

JavaScript has the ECMAScript Test Suite called Test262. The goal of Test262 is to provide test material that covers every observable behavior specified in the specification. Parser conformance uses the parse phase tests.

Babel

When new language features are added to JavaScript, it is required to have them implemented by Babel, this means Babel has another set of parser tests.

TypeScript

The TypeScript conformance tests can be found here.

Test Runner

Rome has implemented a test runner for the above test suites, they can be found .

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/performance.html b/ja/docs/contribute/performance.html new file mode 100644 index 0000000000..1b2f4e6e38 --- /dev/null +++ b/ja/docs/contribute/performance.html @@ -0,0 +1,49 @@ + + + + + + Performance | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Performance Tuning

Compile Time

While Rust has gained a reputation for its comparatively slower compilation speed, we have dedicated significant effort to fine-tune the Rust compilation speed. Our aim is to minimize any impact on your development workflow, ensuring that developing your own Oxc based tools remains a smooth and efficient experience.

This is demonstrated by our CI runs, where warm runs complete in 5 minutes.

Profile

Mac Xcode Instruments

Mac Xcode instruments can be used to produce a CPU profile.

To install Xcode Instruments, install the Command Line Tools:

bash
xcode-select --install
xcode-select --install

For normal Rust builds, cargo instruments can be used as the glue for profiling and creating the trace file.

First, change the profile for showing debug symbols.

toml
[profile.release]
+debug = 1 # debug info with line tables only
+strip = false # do not strip symbols
[profile.release]
+debug = 1 # debug info with line tables only
+strip = false # do not strip symbols

Then build the project

bash
cargo build --release -p oxc_cli --bin oxlint
cargo build --release -p oxc_cli --bin oxlint

The binary is located at ./target/release/oxlint once the project is built.

Under the hood, cargo instruments invokes the xcrun command, equivalent to

bash
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release/oxlint --quiet
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release/oxlint --quiet

Running the command above produces the following output

Starting recording with the Time Profiler template. Launching process: oxlint.
+Ctrl-C to stop the recording
+Target app exited, ending recording...
+Recording completed. Saving output file...
+Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace
Starting recording with the Time Profiler template. Launching process: oxlint.
+Ctrl-C to stop the recording
+Target app exited, ending recording...
+Recording completed. Saving output file...
+Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace

Open the trace file open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace.

To see a top down trace:

  1. On the top panel, click CPUs
  2. On the left input box, click x then select Time Profiler
  3. At the bottom panel, click "Call Tree", turn on "Invert Call Tree" and turn off separate by thread.
+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/prettier.html b/ja/docs/contribute/prettier.html new file mode 100644 index 0000000000..78588ce3e8 --- /dev/null +++ b/ja/docs/contribute/prettier.html @@ -0,0 +1,37 @@ + + + + + + Prettier | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/resolver.html b/ja/docs/contribute/resolver.html new file mode 100644 index 0000000000..d37310950d --- /dev/null +++ b/ja/docs/contribute/resolver.html @@ -0,0 +1,37 @@ + + + + + + Resolver | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Resolver

Module resolution plays a crucial role in JavaScript tooling, especially for tasks like multi-file analysis or bundling. However, it can often become a performance bottleneck. To address this, we are actively working on porting [enhanced-resolve].

[eslint-plugin-import] will be our first application for the resolver, since it is currently a performance and complexity blocker for a lot of projects.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/showcase.html b/ja/docs/contribute/showcase.html new file mode 100644 index 0000000000..f3915ce6b9 --- /dev/null +++ b/ja/docs/contribute/showcase.html @@ -0,0 +1,37 @@ + + + + + + Showcase | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Showcase

Example PRs adding oxlint:

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/transformer.html b/ja/docs/contribute/transformer.html new file mode 100644 index 0000000000..a5b6e05d8b --- /dev/null +++ b/ja/docs/contribute/transformer.html @@ -0,0 +1,37 @@ + + + + + + Transformer | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Transformer

A transformer is responsible for turning higher versions of ECMAScript to a lower version that can be used in older browsers. We are currently focusing on an esnext to es2015 transpiler. See the umbrella issue for details.

+ + + + \ No newline at end of file diff --git a/ja/docs/contribute/vscode.html b/ja/docs/contribute/vscode.html new file mode 100644 index 0000000000..b7a01c6bf2 --- /dev/null +++ b/ja/docs/contribute/vscode.html @@ -0,0 +1,37 @@ + + + + + + VSCode Extension | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

VSCode Extension

Development

Build the extension and run it inside vscode:

  1. pnpm install
  2. pnpm run build
  3. pnpm run package
  4. open vscode and run the command palette "Extensions: Install from VSIX..."
  5. find the oxc-vscode-x.x.x.vsix file from ./editor/vscode directory
  6. open a .js / .ts file, add debugger; and save
  7. see the warning eslint(no-debugger): debugger statement is not allowed - oxc
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/benchmarks.html b/ja/docs/guide/benchmarks.html new file mode 100644 index 0000000000..4f41e6b417 --- /dev/null +++ b/ja/docs/guide/benchmarks.html @@ -0,0 +1,37 @@ + + + + + + Benchmarks | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/introduction.html b/ja/docs/guide/introduction.html new file mode 100644 index 0000000000..584e65bad5 --- /dev/null +++ b/ja/docs/guide/introduction.html @@ -0,0 +1,37 @@ + + + + + + Introduction | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

What is OXC?

The Oxidation Compiler is a collection of high-performance tools for the JavaScript and TypeScript language.

We are building a parser, linter, formatter, transpiler, minifier, resolver ... all written in Rust.

Our goal is to create and empower the fastest and most user friendly tools for The Third Age of JavaScript.

Philosophy

This project shares the same philosophies as Biome and Ruff.

  1. JavaScript tooling could be rewritten in a more performant language.
  2. An integrated toolchain can tap into efficiencies that are not available to a disparate set of tools.

Core Team

+ + + + \ No newline at end of file diff --git a/ja/docs/guide/philosophy.html b/ja/docs/guide/philosophy.html new file mode 100644 index 0000000000..7d1825b856 --- /dev/null +++ b/ja/docs/guide/philosophy.html @@ -0,0 +1,37 @@ + + + + + + Philosophy | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/usage/benchmarks.html b/ja/docs/guide/usage/benchmarks.html new file mode 100644 index 0000000000..834018c2e5 --- /dev/null +++ b/ja/docs/guide/usage/benchmarks.html @@ -0,0 +1,37 @@ + + + + + + Benchmarks | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/usage/linter.html b/ja/docs/guide/usage/linter.html new file mode 100644 index 0000000000..37bdca2bda --- /dev/null +++ b/ja/docs/guide/usage/linter.html @@ -0,0 +1,113 @@ + + + + + + Linter | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
  • npm
  • GitHub Repo stars

oxlint

Features

  • Runs 50-100x faster than ESLint, and scales with the number of CPU cores (Benchmark)
  • No configuration required
  • Convention over configuration
  • Reports errors and useless code by default
  • Supports .eslintignore
  • Supports ESLint comment disabling

Adoptions

  • A 5M LOC typescript codebase previously running ESLint parallelized across 48 workers in CI taking 75 mins (12m wall time), it is now 8 seconds on a single worker. (Source)

Installation

Install oxlint:

sh
$ npm add -D oxlint
$ npm add -D oxlint
sh
$ pnpm add -D oxlint
$ pnpm add -D oxlint
sh
$ yarn add -D oxlint
$ yarn add -D oxlint
sh
$ bun add -D oxlint
$ bun add -D oxlint

You can also run oxlint directly:

sh
$ npx oxlint@latest
$ npx oxlint@latest
sh
$ pnpm dlx oxlint@latest
$ pnpm dlx oxlint@latest
sh
$ yarn dlx oxlint@latest
$ yarn dlx oxlint@latest
sh
$ bunx oxlint@latest
$ bunx oxlint@latest
sh
$ deno run oxlint@latest
$ deno run oxlint@latest

You can download the binary files from the latest GitHub releases.

Integration

IDEs

VSCode Extension

You can download the official VSCode extension.

Vim / Nvim (coc)

Add the following config to coc-settings.json:

javascript
{
+  "languageserver": {
+    "oxc": {
+      "command": "oxc_vscode",
+      "filetypes": [
+        "typescript",
+        "javascript"
+      ],
+      "rootPatterns": [
+        ".git"
+      ]
+    }
+  }
+}
{
+  "languageserver": {
+    "oxc": {
+      "command": "oxc_vscode",
+      "filetypes": [
+        "typescript",
+        "javascript"
+      ],
+      "rootPatterns": [
+        ".git"
+      ]
+    }
+  }
+}

Continuous Integration

It is recommended to run oxlint before eslint for faster feedback loops, since oxlint only takes a few seconds to run.

GitHub Actions

yaml
jobs:
+  oxlint:
+    name: Lint JS
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - run: npx --yes oxlint@latest
jobs:
+  oxlint:
+    name: Lint JS
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - run: npx --yes oxlint@latest

Nix

Check nixpkgs repository for more detail.

Commands

  • npx oxlint@latest --rules shows the list of rules

  • npx oxlint@latest --help shows usage instructions

    Usage: oxlint [-A=NAME | -D=NAME]... [--fix] [PATH]...
    +
    +Allowing / Denying Multiple Lints
    +  For example `-D correctness -A no-debugger` or `-A all -D no-debugger`.
    +  The default category is "-D correctness".
    +  Use "--rules" for rule names.
    +  Use "--help --help" for rule categories.
    +    -A, --allow=NAME          Allow the rule or category (suppress the lint)
    +    -D, --deny=NAME           Deny the rule or category (emit an error)
    +
    +Enable Plugins
    +        --import-plugin       Enable the experimental import plugin and detect ESM problems
    +        --jest-plugin         Enable the Jest plugin and detect test problems
    +        --jsx-a11y-plugin     Enable the JSX-a11y plugin and detect accessibility problems
    +
    +Available positional items:
    +    PATH                      Single file, single path or list of paths
    +
    +Available options:
    +    -h, --help                Prints help information
    Usage: oxlint [-A=NAME | -D=NAME]... [--fix] [PATH]...
    +
    +Allowing / Denying Multiple Lints
    +  For example `-D correctness -A no-debugger` or `-A all -D no-debugger`.
    +  The default category is "-D correctness".
    +  Use "--rules" for rule names.
    +  Use "--help --help" for rule categories.
    +    -A, --allow=NAME          Allow the rule or category (suppress the lint)
    +    -D, --deny=NAME           Deny the rule or category (emit an error)
    +
    +Enable Plugins
    +        --import-plugin       Enable the experimental import plugin and detect ESM problems
    +        --jest-plugin         Enable the Jest plugin and detect test problems
    +        --jsx-a11y-plugin     Enable the JSX-a11y plugin and detect accessibility problems
    +
    +Available positional items:
    +    PATH                      Single file, single path or list of paths
    +
    +Available options:
    +    -h, --help                Prints help information

System Requirements

oxlint is built for the following systems:

  • darwin-arm64
  • darwin-x64
  • linux-arm64
  • linux-x64
  • win32-arm64
  • win32-x64
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/usage/parser.html b/ja/docs/guide/usage/parser.html new file mode 100644 index 0000000000..0231b80cae --- /dev/null +++ b/ja/docs/guide/usage/parser.html @@ -0,0 +1,37 @@ + + + + + + Parser | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
  • npm

Parser

Features

  • 2x faster then SWC parser
  • By far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust

You can check benchmark for more detail.

Installation

Rust

Install crates:

sh
$ cargo install oxc
$ cargo install oxc
sh
$ cargo install oxc_ast
$ cargo install oxc_ast
sh
$ cargo install oxc_parser
$ cargo install oxc_parser
  • The umbrella crate oxc exports all public crates from this repository
  • The AST and parser crates oxc_ast and oxc_parser are production ready

Node.js

Install oxc-parser:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/usage/philosophy.html b/ja/docs/guide/usage/philosophy.html new file mode 100644 index 0000000000..978f07903d --- /dev/null +++ b/ja/docs/guide/usage/philosophy.html @@ -0,0 +1,37 @@ + + + + + + Philosophy | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/guide/usage/resolver.html b/ja/docs/guide/usage/resolver.html new file mode 100644 index 0000000000..a2f7b65332 --- /dev/null +++ b/ja/docs/guide/usage/resolver.html @@ -0,0 +1,69 @@ + + + + + + Resolver | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
  • npm

Resolver

Node.js Module Resolution.

  • Feature complete
  • All configuration options are aligned with enhanced-resolve

Installation

Rust

Install oxc_resolver crate:

sh
$ cargo install oxc_resolver
$ cargo install oxc_resolver

You should also check documentation.

Node.js

Install oxc-resolver:

sh
$ npm add -D oxc-parser
$ npm add -D oxc-parser
sh
$ pnpm add -D oxc-parser
$ pnpm add -D oxc-parser
sh
$ yarn add -D oxc-parser
$ yarn add -D oxc-parser
sh
$ bun add -D oxc-parser
$ bun add -D oxc-parser

Example

rust
use std::{env, path::PathBuf};
+
+use oxc_resolver::{ResolveOptions, Resolver};
+
+fn main() {
+    let path = env::args().nth(1).expect("require path");
+    let request = env::args().nth(2).expect("require request");
+    let path = PathBuf::from(path).canonicalize().unwrap();
+
+    println!("path: {path:?}");
+    println!("request: {request}");
+
+    match Resolver::new(ResolveOptions::default()).resolve(path, &request) {
+        Err(error) => println!("Error: {error}"),
+        Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
+    }
+}
use std::{env, path::PathBuf};
+
+use oxc_resolver::{ResolveOptions, Resolver};
+
+fn main() {
+    let path = env::args().nth(1).expect("require path");
+    let request = env::args().nth(2).expect("require request");
+    let path = PathBuf::from(path).canonicalize().unwrap();
+
+    println!("path: {path:?}");
+    println!("request: {request}");
+
+    match Resolver::new(ResolveOptions::default()).resolve(path, &request) {
+        Err(error) => println!("Error: {error}"),
+        Ok(resolution) => println!("Resolved: {}", resolution.full_path().to_string_lossy()),
+    }
+}
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/formatter.html b/ja/docs/learn/architecture/formatter.html new file mode 100644 index 0000000000..cbe9345edc --- /dev/null +++ b/ja/docs/learn/architecture/formatter.html @@ -0,0 +1,37 @@ + + + + + + Formatter | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/introduction.html b/ja/docs/learn/architecture/introduction.html new file mode 100644 index 0000000000..2da01c7c20 --- /dev/null +++ b/ja/docs/learn/architecture/introduction.html @@ -0,0 +1,37 @@ + + + + + + Introduction | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/linter.html b/ja/docs/learn/architecture/linter.html new file mode 100644 index 0000000000..d7cbbb85c7 --- /dev/null +++ b/ja/docs/learn/architecture/linter.html @@ -0,0 +1,37 @@ + + + + + + Linter | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Example

See crates/oxc_linter/examples/linter.rs for the bare minimum linter implementation.

+ + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/minifier.html b/ja/docs/learn/architecture/minifier.html new file mode 100644 index 0000000000..6b6f8a94ba --- /dev/null +++ b/ja/docs/learn/architecture/minifier.html @@ -0,0 +1,37 @@ + + + + + + Minifier | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/parser.html b/ja/docs/learn/architecture/parser.html new file mode 100644 index 0000000000..a5ba736171 --- /dev/null +++ b/ja/docs/learn/architecture/parser.html @@ -0,0 +1,37 @@ + + + + + + Parser | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Parser

Oxc maintains its own AST and parser, which is by far the fastest and most conformant JavaScript and TypeScript (including JSX and TSX) parser written in Rust.

As the parser often represents a key performance bottleneck in JavaScript tooling, any minor improvements can have a cascading effect on our downstream tools. By developing our parser, we have the opportunity to explore and implement well-researched performance techniques.

While many existing JavaScript tools rely on [estree] as their AST specification, a notable drawback is its abundance of ambiguous nodes. This ambiguity often leads to confusion during development with [estree].

The Oxc AST differs slightly from the [estree] AST by removing ambiguous nodes and introducing distinct types. For example, instead of using a generic [estree] Identifier, the Oxc AST provides specific types such as BindingIdentifier, IdentifierReference, and IdentifierName.

This clear distinction greatly enhances the development experience by aligning more closely with the ECMAScript specification.

How is it so fast

  • AST is allocated in a memory arena for fast AST memory allocation and deallocation
  • Short strings are inlined by CompactString
  • No other heap allocations are done except the above two
  • Scope binding, symbol resolution and some syntax errors are not done in the parser, they are delegated to the semantic analyzer
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/resolver.html b/ja/docs/learn/architecture/resolver.html new file mode 100644 index 0000000000..11316d9001 --- /dev/null +++ b/ja/docs/learn/architecture/resolver.html @@ -0,0 +1,37 @@ + + + + + + Resolver | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/docs/learn/architecture/transformer.html b/ja/docs/learn/architecture/transformer.html new file mode 100644 index 0000000000..6c9f7f331d --- /dev/null +++ b/ja/docs/learn/architecture/transformer.html @@ -0,0 +1,37 @@ + + + + + + Transformer | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/ecmascript/grammar.html b/ja/docs/learn/ecmascript/grammar.html new file mode 100644 index 0000000000..c7c4917d67 --- /dev/null +++ b/ja/docs/learn/ecmascript/grammar.html @@ -0,0 +1,437 @@ + + + + + + Grammar | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

JavaScript has one of the most challenging grammar to parse, this tutorial details all the sweat and tears I had while learning it.

LL(1) Grammar

According to Wikipedia,

an LL grammar is a context-free grammar that can be parsed by an LL parser, which parses the input from Left to right

The first L means the scanning the source from Left to right, and the second L means the construction of a Leftmost derivation tree.

Context-free and the (1) in LL(1) means a tree can be constructed by just peeking at the next token and nothing else.

LL Grammars are of particular interest in academia because we are lazy human beings and we want to write programs that generate parsers automatically so we don't need to write parsers by hand.

Unfortunately, most industrial programming languages do not have a nice LL(1) grammar, and this applies to JavaScript too.

INFO

Mozilla started the jsparagus project a few years ago and wrote a LALR parser generator in Python. They haven't updated it much in the past two years and they sent a strong message at the end of js-quirks.md

What have we learned today?

  • Do not write a JS parser.
  • JavaScript has some syntactic horrors in it. But hey, you don't make the world's most widely used programming language by avoiding all mistakes. You do it by shipping a serviceable tool, in the right circumstances, for the right users.

The only practical way to parse JavaScript is to write a recursive descent parser by hand because of the nature of its grammar, so let's learn all the quirks in the grammar before we shoot ourselves in the foot.

The list below starts simple and will become difficult to grasp, so please take grab a coffee and take your time.

Identifiers

There are three types of identifiers defined in #sec-identifiers,

IdentifierReference[Yield, Await] :
+BindingIdentifier[Yield, Await] :
+LabelIdentifier[Yield, Await] :
IdentifierReference[Yield, Await] :
+BindingIdentifier[Yield, Await] :
+LabelIdentifier[Yield, Await] :

estree and some ASTs do not distinguish the above identifiers, and the specification does not explain them in plain text.

BindingIdentifiers are declarations and IdentifierReferences are references to binding identifiers. For example in var foo = bar, foo is a BindingIdentifier and bar is a IdentifierReference in the grammar:

VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] opt
+
+Initializer[In, Yield, Await] :
+    = AssignmentExpression[?In, ?Yield, ?Await]
VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] opt
+
+Initializer[In, Yield, Await] :
+    = AssignmentExpression[?In, ?Yield, ?Await]

follow AssignmentExpression into PrimaryExpression we get

PrimaryExpression[Yield, Await] :
+    IdentifierReference[?Yield, ?Await]
PrimaryExpression[Yield, Await] :
+    IdentifierReference[?Yield, ?Await]

Declaring these identifiers differently in the AST will greatly simply downstream tools, especially for semantic analysis.

rust
pub struct BindingIdentifier {
+    pub node: Node,
+    pub name: Atom,
+}
+
+pub struct IdentifierReference {
+    pub node: Node,
+    pub name: Atom,
+}
pub struct BindingIdentifier {
+    pub node: Node,
+    pub name: Atom,
+}
+
+pub struct IdentifierReference {
+    pub node: Node,
+    pub name: Atom,
+}

Class and Strict Mode

ECMAScript Class is born after strict mode, so they decided that everything inside a class must be strict mode for simplicity. It is stated as such in #sec-class-definitions with just a Node: A class definition is always strict mode code.

It is easy to declare strict mode by associating it with function scopes, but a class declaration does not have a scope, we need to keep an extra state just for parsing classes.

rust
https://github.com/swc-project/swc/blob/f9c4eff94a133fa497778328fa0734aa22d5697c/crates/swc_ecma_parser/src/parser/class_and_fn.rs#L85
https://github.com/swc-project/swc/blob/f9c4eff94a133fa497778328fa0734aa22d5697c/crates/swc_ecma_parser/src/parser/class_and_fn.rs#L85

Legacy Octal and Use Strict

#sec-string-literals-early-errors disallows escaped legacy octal inside strings "\01":

EscapeSequence ::
+    LegacyOctalEscapeSequence
+    NonOctalDecimalEscapeSequence
+
+It is a Syntax Error if the source text matched by this production is strict mode code.
EscapeSequence ::
+    LegacyOctalEscapeSequence
+    NonOctalDecimalEscapeSequence
+
+It is a Syntax Error if the source text matched by this production is strict mode code.

The best place to detect this is inside the lexer, it can ask the parser for strict mode state and throw errors accordingly.

But, this becomes impossible when mixed with directives:

javascript
https://github.com/tc39/test262/blob/747bed2e8aaafe8fdf2c65e8a10dd7ae64f66c47/test/language/literals/string/legacy-octal-escape-sequence-prologue-strict.js#L16-L19
https://github.com/tc39/test262/blob/747bed2e8aaafe8fdf2c65e8a10dd7ae64f66c47/test/language/literals/string/legacy-octal-escape-sequence-prologue-strict.js#L16-L19

use strict is declared after the escaped legacy octal, yet the syntax error needs to be thrown. Fortunately, no real code uses directives with legacy octals ... unless you want to pass the test262 case from above.


Non-simple Parameter and Strict Mode

Identical function parameters is allowed in non-strict mode function foo(a, a) { }, and we can forbid this by adding use strict: function foo(a, a) { "use strict" }. Later on in es6, other grammars were added to function parameters, for example function foo({ a }, b = c) {}.

Now, what happens if we write the following where "01" is a strict mode error?

javaScript
function foo(value=(function() { return "\01" }())) {
+    "use strict";
+    return value;
+}
function foo(value=(function() { return "\01" }())) {
+    "use strict";
+    return value;
+}

More specifically, what should we do if there is a strict mode syntax error inside the parameters thinking from the parser perspective? So in #sec-function-definitions-static-semantics-early-errors, it just bans this by stating

FunctionDeclaration :
+FunctionExpression :
+
+It is a Syntax Error if FunctionBodyContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false.
FunctionDeclaration :
+FunctionExpression :
+
+It is a Syntax Error if FunctionBodyContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false.

Chrome throws this error with a mysterious message "Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list".

A more in-depth explanation is described in this blog post by the author of ESLint.

INFO

Fun fact, the above rule does not apply if we are targeting es5 in TypeScript, it transpiles to

javaScript
function foo(a, b) {
+    "use strict";
+    if (b === void 0) { b = "\01"; }
+}
function foo(a, b) {
+    "use strict";
+    if (b === void 0) { b = "\01"; }
+}

Parenthesized Expression

Parenthesized expressions are supposed to not have any semantic meanings? For instance the AST for ((x)) can just be a single IdentifierReference, not ParenthesizedExpression -> ParenthesizedExpression -> IdentifierReference. And this is the case for JavaScript grammar.

But ... who would have thought it can have run-time meanings. Found in this estree issue, it shows that

javascript
> fn = function () {};
+> fn.name
+< "fn"
+
+> (fn) = function () {};
+> fn.name
+< ''
> fn = function () {};
+> fn.name
+< "fn"
+
+> (fn) = function () {};
+> fn.name
+< ''

So eventually acorn and babel added the preserveParens option for compatibility.


Function Declaration in If Statement

If we follow the grammar precisely in #sec-ecmascript-language-statements-and-declarations:

Statement[Yield, Await, Return] :
+    ... lots of statements
+
+Declaration[Yield, Await] :
+    ... declarations
Statement[Yield, Await, Return] :
+    ... lots of statements
+
+Declaration[Yield, Await] :
+    ... declarations

The Statement node we define for our AST would obviously not contain Declaration,

but in Annex B #sec-functiondeclarations-in-ifstatement-statement-clauses, it allows declaration inside the statement position of if statements in non-strict mode:

javascript
if (x) function foo() {}
+else function bar() {}
if (x) function foo() {}
+else function bar() {}

Label statement is legit

We probably have never written a single line of labelled statement, but it is legit in modern JavaScript and not banned by strict mode.

The following syntax is correct, it returns a labelled statement (not object literal).

javascript
<Foo
+  bar={() => {
+    baz: "quaz";
+  }}
+/>
+//   ^^^^^^^^^^^ `LabelledStatement`
<Foo
+  bar={() => {
+    baz: "quaz";
+  }}
+/>
+//   ^^^^^^^^^^^ `LabelledStatement`

let is not a keyword

let is not a keyword so it is allowed to appear anywhere unless the grammar explicitly states let is not allowed in such positions. Parsers need to peek at the token after the let token and decide what it needs to be parsed into, e.g.:

javascript
let a;
+let = foo;
+let instanceof x;
+let + 1;
+while (true) let;
+a = let[0];
let a;
+let = foo;
+let instanceof x;
+let + 1;
+while (true) let;
+a = let[0];

For-in / For-of and the [In] context

If we look at the grammar for for-in and for-of in #prod-ForInOfStatement, it is immediately confusing to understand how to parse these.

There are two major obstacles for us to understand: the [lookahead ≠ let] part and the [+In] part.

If we have parsed to for (let, we need to check the peeking token is:

  • not in to disallow for (let in)
  • is {, [ or an identifier to allow for (let {} = foo), for (let [] = foo) and for (let bar = foo)

Once reached the of or in keyword, the right-hand side expression needs to be passed with the correct [+In] context to disallow the two in expressions in #prod-RelationalExpression:

RelationalExpression[In, Yield, Await] :
+    [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await]
+    [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await]
+
+Note 2: The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.
RelationalExpression[In, Yield, Await] :
+    [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await]
+    [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await]
+
+Note 2: The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.

And this is the only application for the [In] context in the entire specification.

Also to note, the grammar [lookahead ∉ { let, async of }] forbids for (async of ...), and it needs to be explicitly guarded against.


Block-Level Function Declarations

In Annex B.3.2 #sec-block-level-function-declarations-web-legacy-compatibility-semantics, an entire page is dedicated to explain how FunctionDeclaration is supposed to behave in Block statements. It boils down to

javascript
https://github.com/acornjs/acorn/blob/11735729c4ebe590e406f952059813f250a4cbd1/acorn/src/scope.js#L30-L35
https://github.com/acornjs/acorn/blob/11735729c4ebe590e406f952059813f250a4cbd1/acorn/src/scope.js#L30-L35

The name of a FunctionDeclaration needs to be treated the same as a var declaration if its inside a function declaration. This code snippet errors with a re-declaration error since bar is inside a block scope:

javascript
function foo() {
+  if (true) {
+    var bar;
+    function bar() {} // redeclaration error
+  }
+}
function foo() {
+  if (true) {
+    var bar;
+    function bar() {} // redeclaration error
+  }
+}

meanwhile, the following does not error because it is inside a function scope, function bar is treated as a var declaration:

javascript
function foo() {
+  var bar;
+  function bar() {}
+}
function foo() {
+  var bar;
+  function bar() {}
+}

Grammar Context

The syntactic grammar has 5 context parameters for allowing and disallowing certain constructs, namely [In], [Return], [Yield], [Await] and [Default].

It is best to keep a context during parsing, for example in Rome:

rust
https://github.com/rome/tools/blob/5a059c0413baf1d54436ac0c149a829f0dfd1f4d/crates/rome_js_parser/src/state.rs#L404-L425
https://github.com/rome/tools/blob/5a059c0413baf1d54436ac0c149a829f0dfd1f4d/crates/rome_js_parser/src/state.rs#L404-L425

And toggle and check these flags accordingly by following the grammar.

AssignmentPattern vs BindingPattern

In estree, the left-hand side of an AssignmentExpression is a Pattern:

extend interface AssignmentExpression {
+    left: Pattern;
+}
extend interface AssignmentExpression {
+    left: Pattern;
+}

and the left-hand side of a VariableDeclarator is a Pattern:

interface VariableDeclarator <: Node {
+    type: "VariableDeclarator";
+    id: Pattern;
+    init: Expression | null;
+}
interface VariableDeclarator <: Node {
+    type: "VariableDeclarator";
+    id: Pattern;
+    init: Expression | null;
+}

A Pattern can be a Identifier, ObjectPattern, ArrayPattern:

interface Identifier <: Expression, Pattern {
+    type: "Identifier";
+    name: string;
+}
+
+interface ObjectPattern <: Pattern {
+    type: "ObjectPattern";
+    properties: [ AssignmentProperty ];
+}
+
+interface ArrayPattern <: Pattern {
+    type: "ArrayPattern";
+    elements: [ Pattern | null ];
+}
interface Identifier <: Expression, Pattern {
+    type: "Identifier";
+    name: string;
+}
+
+interface ObjectPattern <: Pattern {
+    type: "ObjectPattern";
+    properties: [ AssignmentProperty ];
+}
+
+interface ArrayPattern <: Pattern {
+    type: "ArrayPattern";
+    elements: [ Pattern | null ];
+}

But from the specification perspective, we have the following JavaScript:

javascript
// AssignmentExpression:
+{ foo } = bar;
+  ^^^ IdentifierReference
+[ foo ] = bar;
+  ^^^ IdentifierReference
+
+// VariableDeclarator
+var { foo } = bar;
+      ^^^ BindingIdentifier
+var [ foo ] = bar;
+      ^^^ BindingIdentifier
// AssignmentExpression:
+{ foo } = bar;
+  ^^^ IdentifierReference
+[ foo ] = bar;
+  ^^^ IdentifierReference
+
+// VariableDeclarator
+var { foo } = bar;
+      ^^^ BindingIdentifier
+var [ foo ] = bar;
+      ^^^ BindingIdentifier

This starts to become confusing because we now have a situation where we cannot directly distinguish whether the Identifier is a BindingIdentifier or a IdentifierReference inside a Pattern:

rust
enum Pattern {
+    Identifier, // Is this a `BindingIdentifier` or a `IdentifierReference`?
+    ArrayPattern,
+    ObjectPattern,
+}
enum Pattern {
+    Identifier, // Is this a `BindingIdentifier` or a `IdentifierReference`?
+    ArrayPattern,
+    ObjectPattern,
+}

This will lead to all sorts of unnecessary code further down the parser pipeline. For example, when setting up the scope for semantic analysis, we need to inspect the parents of this Identifier to determine whether we should bind it to the scope or not.

A better solution is to fully understand the specification and decide what to do.

The grammar for AssignmentExpression and VariableDeclaration are defined as:

13.15 Assignment Operators
+
+AssignmentExpression[In, Yield, Await] :
+    LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
+
+13.15.5 Destructuring Assignment
+
+In certain circumstances when processing an instance of the production
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+the interpretation of LeftHandSideExpression is refined using the following grammar:
+
+AssignmentPattern[Yield, Await] :
+    ObjectAssignmentPattern[?Yield, ?Await]
+    ArrayAssignmentPattern[?Yield, ?Await]
13.15 Assignment Operators
+
+AssignmentExpression[In, Yield, Await] :
+    LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
+
+13.15.5 Destructuring Assignment
+
+In certain circumstances when processing an instance of the production
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+the interpretation of LeftHandSideExpression is refined using the following grammar:
+
+AssignmentPattern[Yield, Await] :
+    ObjectAssignmentPattern[?Yield, ?Await]
+    ArrayAssignmentPattern[?Yield, ?Await]
14.3.2 Variable Statement
+
+VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
+    BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
14.3.2 Variable Statement
+
+VariableDeclaration[In, Yield, Await] :
+    BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
+    BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

The specification distinguishes this two grammar by defining them separately with an AssignmentPattern and a BindingPattern.

So in situations like this, do not be afraid to deviate from estree and define extra AST nodes for our parser:

rust
enum BindingPattern {
+    BindingIdentifier,
+    ObjectBindingPattern,
+    ArrayBindingPattern,
+}
+
+enum AssignmentPattern {
+    IdentifierReference,
+    ObjectAssignmentPattern,
+    ArrayAssignmentPattern,
+}
enum BindingPattern {
+    BindingIdentifier,
+    ObjectBindingPattern,
+    ArrayBindingPattern,
+}
+
+enum AssignmentPattern {
+    IdentifierReference,
+    ObjectAssignmentPattern,
+    ArrayAssignmentPattern,
+}

I was in a super confusing state for a whole week until I finally reached enlightenment: we need to define an AssignmentPattern node and a BindingPattern node instead of a single Pattern node.

  • estree must be correct because people have been using it for years so it cannot be wrong?
  • how are we going to cleanly distinguish the Identifiers inside the patterns without defining two separate nodes? I just cannot find where the grammar is?
  • After a whole day of navigating the specification ... the grammar for AssignmentPattern is in the 5th subsection of the main section "13.15 Assignment Operators" with the subtitle "Supplemental Syntax" 🤯 - this is really out of place because all grammar is defined in the main section, not like this one defined after the "Runtime Semantics" section

:::caution The following cases are really difficult to grasp. Here be dragons. :::

Ambiguous Grammar

Let's first think like a parser and solve the problem - given the / token, is it a division operator or the start of a regex expression?

javascript
a / b;
+a / / regex /;
+a /= / regex /;
+/ regex / / b;
+/=/ / /=/;
a / b;
+a / / regex /;
+a /= / regex /;
+/ regex / / b;
+/=/ / /=/;

It is almost impossible, isn't it? Let's break these down and follow the grammar.

The first thing we need to understand is that the syntactic grammar drives the lexical grammar as stated in #sec-ecmascript-language-lexical-grammar

There are several situations where the identification of lexical input elements is sensitive to the syntactic grammar context that is consuming the input elements.

This means that the parser is responsible for telling the lexer which token to return next. The above example indicates that the lexer needs to return either a / token or a RegExp token. For getting the correct / or RegExp token, the specification says:

The InputElementRegExp goal symbol is used in all syntactic grammar contexts where a RegularExpressionLiteral is permitted ... In all other contexts, InputElementDiv is used as the lexical goal symbol.

And the syntax for InputElementDiv and InputElementRegExp are

InputElementDiv ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    DivPunctuator <---------- the `/` and `/=` token
+    RightBracePunctuator
+
+InputElementRegExp ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    RightBracePunctuator
+    RegularExpressionLiteral <-------- the `RegExp` token
InputElementDiv ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    DivPunctuator <---------- the `/` and `/=` token
+    RightBracePunctuator
+
+InputElementRegExp ::
+    WhiteSpace
+    LineTerminator
+    Comment
+    CommonToken
+    RightBracePunctuator
+    RegularExpressionLiteral <-------- the `RegExp` token

This means whenever the grammar reaches RegularExpressionLiteral, / need to be tokenized as a RegExp token (and throw an error if it does not have a matching /). All other cases we'll tokenize / as a slash token.

Let's walk through an example:

a / / regex /
+^ ------------ PrimaryExpression:: IdentifierReference
+  ^ ---------- MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
+    ^^^^^^^^ - PrimaryExpression: RegularExpressionLiteral
a / / regex /
+^ ------------ PrimaryExpression:: IdentifierReference
+  ^ ---------- MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
+    ^^^^^^^^ - PrimaryExpression: RegularExpressionLiteral

This statement does not match any other start of Statement, so it'll go down the ExpressionStatement route:

ExpressionStatement --> Expression --> AssignmentExpression --> ... --> MultiplicativeExpression --> ... --> MemberExpression --> PrimaryExpression --> IdentifierReference.

We stopped at IdentifierReference and not RegularExpressionLiteral, the statement "In all other contexts, InputElementDiv is used as the lexical goal symbol" applies. The first slash is a DivPunctuator token.

Since this is a DivPunctuator token, the grammar MultiplicativeExpression: MultiplicativeExpression MultiplicativeOperator ExponentiationExpression is matched, the right-hand side is expected to be an ExponentiationExpression.

Now we are at the second slash in a / /. By following ExponentiationExpression, we reach PrimaryExpression: RegularExpressionLiteral because RegularExpressionLiteral is the only matching grammar with a /:

RegularExpressionLiteral ::
+    / RegularExpressionBody / RegularExpressionFlags
RegularExpressionLiteral ::
+    / RegularExpressionBody / RegularExpressionFlags

This second / will be tokenized as RegExp because the specification states "The InputElementRegExp goal symbol is used in all syntactic grammar contexts where a RegularExpressionLiteral is permitted".

INFO

As an exercise, try and follow the grammar for /=/ / /=/.


Cover Grammar

Read the V8 blog post on this topic first.

To summarize, the specification states the following three cover grammars:

CoverParenthesizedExpressionAndArrowParameterList

PrimaryExpression[Yield, Await] :
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+When processing an instance of the production
+PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+    the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
+
+ParenthesizedExpression[Yield, Await] :
+    ( Expression[+In, ?Yield, ?Await] )
PrimaryExpression[Yield, Await] :
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+When processing an instance of the production
+PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+    the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
+
+ParenthesizedExpression[Yield, Await] :
+    ( Expression[+In, ?Yield, ?Await] )
ArrowFunction[In, Yield, Await] :
+    ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In]
+
+ArrowParameters[Yield, Await] :
+    BindingIdentifier[?Yield, ?Await]
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
ArrowFunction[In, Yield, Await] :
+    ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In]
+
+ArrowParameters[Yield, Await] :
+    BindingIdentifier[?Yield, ?Await]
+    CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]

These definitions defines:

javascript
let foo = (a, b, c); // SequenceExpression
+let bar = (a, b, c) => {}; // ArrowExpression
+          ^^^^^^^^^ CoverParenthesizedExpressionAndArrowParameterList
let foo = (a, b, c); // SequenceExpression
+let bar = (a, b, c) => {}; // ArrowExpression
+          ^^^^^^^^^ CoverParenthesizedExpressionAndArrowParameterList

A simple but cumbersome approach to solving this problem is to parse it as a Vec<Expression> first, then write a converter function to convert it to ArrowParameters node, i.e. each individual Expression need to be converted to a BindingPattern.

It should be noted that, if we are building the scope tree within the parser, i.e. create the scope for arrow expression during parsing, but do not create one for a sequence expression, it is not obvious how to do this. esbuild solved this problem by creating a temporary scope first, and then dropping it if it is not an ArrowExpression.

This is stated in its architecture document:

This is mostly pretty straightforward except for a few places where the parser has pushed a scope and is in the middle of parsing a declaration only to discover that it's not a declaration after all. This happens in TypeScript when a function is forward-declared without a body, and in JavaScript when it's ambiguous whether a parenthesized expression is an arrow function or not until we reach the => token afterwards. This would be solved by doing three passes instead of two so we finish parsing before starting to set up scopes and declare symbols, but we're trying to do this in just two passes. So instead we call popAndDiscardScope() or popAndFlattenScope() instead of popScope() to modify the scope tree later if our assumptions turn out to be incorrect.


CoverCallExpressionAndAsyncArrowHead

CallExpression :
+    CoverCallExpressionAndAsyncArrowHead
+
+When processing an instance of the production
+CallExpression : CoverCallExpressionAndAsyncArrowHead
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+CallMemberExpression[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
CallExpression :
+    CoverCallExpressionAndAsyncArrowHead
+
+When processing an instance of the production
+CallExpression : CoverCallExpressionAndAsyncArrowHead
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+CallMemberExpression[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
AsyncArrowFunction[In, Yield, Await] :
+    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
+
+CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+When processing an instance of the production
+AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+AsyncArrowHead :
+    async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
AsyncArrowFunction[In, Yield, Await] :
+    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
+
+CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
+    MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+When processing an instance of the production
+AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
+the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
+
+AsyncArrowHead :
+    async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

These definitions define:

javascript
async (a, b, c); // CallExpression
+async (a, b, c) => {} // AsyncArrowFunction
+^^^^^^^^^^^^^^^ CoverCallExpressionAndAsyncArrowHead
async (a, b, c); // CallExpression
+async (a, b, c) => {} // AsyncArrowFunction
+^^^^^^^^^^^^^^^ CoverCallExpressionAndAsyncArrowHead

This looks strange because async is not a keyword. The first async is a function name.


CoverInitializedName

13.2.5 Object Initializer
+
+ObjectLiteral[Yield, Await] :
+    ...
+
+PropertyDefinition[Yield, Await] :
+    CoverInitializedName[?Yield, ?Await]
+
+Note 3: In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar.
+The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
+
+13.2.5.1 Static Semantics: Early Errors
+
+In addition to describing an actual object initializer the ObjectLiteral productions are also used as a cover grammar for ObjectAssignmentPattern and may be recognized as part of a CoverParenthesizedExpressionAndArrowParameterList. When ObjectLiteral appears in a context where ObjectAssignmentPattern is required the following Early Error rules are not applied. In addition, they are not applied when initially parsing a CoverParenthesizedExpressionAndArrowParameterList or CoverCallExpressionAndAsyncArrowHead.
+
+PropertyDefinition : CoverInitializedName
+    I* t is a Syntax Error if any source text is matched by this production.
13.2.5 Object Initializer
+
+ObjectLiteral[Yield, Await] :
+    ...
+
+PropertyDefinition[Yield, Await] :
+    CoverInitializedName[?Yield, ?Await]
+
+Note 3: In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar.
+The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
+
+13.2.5.1 Static Semantics: Early Errors
+
+In addition to describing an actual object initializer the ObjectLiteral productions are also used as a cover grammar for ObjectAssignmentPattern and may be recognized as part of a CoverParenthesizedExpressionAndArrowParameterList. When ObjectLiteral appears in a context where ObjectAssignmentPattern is required the following Early Error rules are not applied. In addition, they are not applied when initially parsing a CoverParenthesizedExpressionAndArrowParameterList or CoverCallExpressionAndAsyncArrowHead.
+
+PropertyDefinition : CoverInitializedName
+    I* t is a Syntax Error if any source text is matched by this production.
13.15.1 Static Semantics: Early Errors
+
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+If LeftHandSideExpression is an ObjectLiteral or an ArrayLiteral, the following Early Error rules are applied:
+    * LeftHandSideExpression must cover an AssignmentPattern.
13.15.1 Static Semantics: Early Errors
+
+AssignmentExpression : LeftHandSideExpression = AssignmentExpression
+If LeftHandSideExpression is an ObjectLiteral or an ArrayLiteral, the following Early Error rules are applied:
+    * LeftHandSideExpression must cover an AssignmentPattern.

These definitions define:

javascript
({ prop = value } = {}); // ObjectAssignmentPattern
+({ prop = value }); // ObjectLiteral with SyntaxError
({ prop = value } = {}); // ObjectAssignmentPattern
+({ prop = value }); // ObjectLiteral with SyntaxError

Parsers need to parse ObjectLiteral with CoverInitializedName, and throw the syntax error if it does not reach = for ObjectAssignmentPattern.

As an exercise, which one of the following = should throw a syntax error?

javascript
let { x = 1 } = { x = 1 } = { x = 1 }
let { x = 1 } = { x = 1 } = { x = 1 }
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/ecmascript/spec.html b/ja/docs/learn/ecmascript/spec.html new file mode 100644 index 0000000000..cdbeda8094 --- /dev/null +++ b/ja/docs/learn/ecmascript/spec.html @@ -0,0 +1,93 @@ + + + + + + Specification | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

The ECMAScript® 2023 Language Specification details everything about the JavaScript language, so anyone can implement their own JavaScript engine.

The following chapters need to be studied for our parser:

  • Chapter 5: Notational Conventions
  • Chapter 11: ECMAScript Language: Source Text
  • Chapter 12: ECMAScript Language: Lexical Grammar
  • Chapter 13 - 16: Expressions, Statements, Functions, Classes, Scripts and Modules
  • Annex B: Additional ECMAScript Features for Web Browsers
  • Annex C: The Strict Mode of ECMAScript

For navigation inside the specification:

  • Anything clickable has a permanent link, they are shown on the URL as anchors, for example #sec-identifiers
  • Hovering over things may show a tooltip, clicking on References shows all its references

Notational Conventions

Chapter 5.1.5 Grammar Notation is the section we need to read.

The things to note here are:

Recursion

This is how lists are presented in the grammar.

ArgumentList :
+  AssignmentExpression
+  ArgumentList , AssignmentExpression
ArgumentList :
+  AssignmentExpression
+  ArgumentList , AssignmentExpression

means

javascript
a, b = 1, c = 2
+^_____________^ ArgumentList
+   ^__________^ ArgumentList, AssignmentExpression,
+          ^___^ AssignmentExpression
a, b = 1, c = 2
+^_____________^ ArgumentList
+   ^__________^ ArgumentList, AssignmentExpression,
+          ^___^ AssignmentExpression

Optional

The _opt_ suffix for optional syntax. For example,

VariableDeclaration :
+  BindingIdentifier Initializer_opt
VariableDeclaration :
+  BindingIdentifier Initializer_opt

means

javascript
var binding_identifier;
+var binding_identifier = Initializer;
+                       ______________ Initializer_opt
var binding_identifier;
+var binding_identifier = Initializer;
+                       ______________ Initializer_opt

Parameters

The [Return] and [In] are parameters of the grammar.

For example

ScriptBody :
+    StatementList[~Yield, ~Await, ~Return]
ScriptBody :
+    StatementList[~Yield, ~Await, ~Return]

means top-level yield, await and return are not allowed in scripts, but

ModuleItem :
+  ImportDeclaration
+  ExportDeclaration
+  StatementListItem[~Yield, +Await, ~Return]
ModuleItem :
+  ImportDeclaration
+  ExportDeclaration
+  StatementListItem[~Yield, +Await, ~Return]

allows for top-level await.

Source Text

Chapter 11.2 Types of Source Code tells us that there is a huge distinction between script code and module code. And there is a use strict mode that makes the grammar saner by disallowing old JavaScript behaviors.

Script Code is not strict, use strict need to be inserted at the top of the file to make script code strict. In html we write <script src="javascript.js"></script>.

Module Code is automatically strict. In html we write <script type="module" src="main.mjs"></script>.

ECMAScript Language: Lexical Grammar

For more in-depth explanation, read the V8 blog on Understanding the ECMAScript spec.

Automatic Semicolon Insertion

This section describes all the rules where we can omit a semicolon while writing JavaScript. All the explanation boils down to

rust
    pub fn asi(&mut self) -> Result<()> {
+        if self.eat(Kind::Semicolon) || self.can_insert_semicolon() {
+            return Ok(());
+        }
+        let range = self.prev_node_end..self.cur_token().start;
+        Err(SyntaxError::AutoSemicolonInsertion(range.into()))
+    }
+
+    pub const fn can_insert_semicolon(&self) -> bool {
+        self.cur_token().is_on_new_line || matches!(self.cur_kind(), Kind::RCurly | Kind::Eof)
+    }
    pub fn asi(&mut self) -> Result<()> {
+        if self.eat(Kind::Semicolon) || self.can_insert_semicolon() {
+            return Ok(());
+        }
+        let range = self.prev_node_end..self.cur_token().start;
+        Err(SyntaxError::AutoSemicolonInsertion(range.into()))
+    }
+
+    pub const fn can_insert_semicolon(&self) -> bool {
+        self.cur_token().is_on_new_line || matches!(self.cur_kind(), Kind::RCurly | Kind::Eof)
+    }

The asi function need to be manually called where applicable, for example in the end of statement:

rust
    fn parse_debugger_statement(&mut self) -> Result<Statement<'a>> {
+        let node = self.start_node();
+        self.expect(Kind::Debugger)?;
+        // highlight-next-line
+        self.asi()?;
+        self.ast.debugger_statement(self.finish_node(node))
+    }
    fn parse_debugger_statement(&mut self) -> Result<Statement<'a>> {
+        let node = self.start_node();
+        self.expect(Kind::Debugger)?;
+        // highlight-next-line
+        self.asi()?;
+        self.ast.debugger_statement(self.finish_node(node))
+    }

INFO

This section on asi is written with a parser in mind, it explicitly states that the source text is parsed from left to right, which makes it almost impossible to write the parser in any other way. The author of jsparagus made a rant about this here.

The specification for this feature is both very-high-level and weirdly procedural (“When, as the source text is parsed from left to right, a token is encountered...”, as if the specification is telling a story about a browser. As far as I know, this is the only place in the spec where anything is assumed or implied about the internal implementation details of parsing.) But it would be hard to specify ASI any other way.

Expressions, Statements, Functions, Classes, Scripts and Modules

It takes a while to understand the syntactic grammar, then apply them to writing a parser.

+ + + + \ No newline at end of file diff --git a/ja/docs/learn/ecosystem.html b/ja/docs/learn/ecosystem.html new file mode 100644 index 0000000000..0b4de5f916 --- /dev/null +++ b/ja/docs/learn/ecosystem.html @@ -0,0 +1,37 @@ + + + + + + Ecosystem | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Contributing to oxc will benefit the whole frontend development community. It would be a great pleasure if you could join as well.

We are being integrated into:

Rspack

A fast Rust-based web bundler.

Rolldown

To be announced.

Ezno Type Checker

A JavaScript compiler and TypeScript checker written in Rust with a focus on static analysis and runtime performance.

Tyvm

An experimental bytecode interpreter for type-level Typescript.

+ + + + \ No newline at end of file diff --git a/ja/docs/learn/performance.html b/ja/docs/learn/performance.html new file mode 100644 index 0000000000..3450b934a4 --- /dev/null +++ b/ja/docs/learn/performance.html @@ -0,0 +1,505 @@ + + + + + + Performance | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Pursuit of Performance on Building a JavaScript Compiler

Originally posted on https://rustmagazine.org/issue-3/javascript-compiler/

On Performance

After two years of writing Rust, performance has become an ingrained discipline for me - it boils down to allocate less memory and use fewer CPU cycles.

However, achieving optimal performance can be difficult without the knowledge of the problem domain or awareness of potential solutions.

I will take you on my journey of performance and optimization in the following sections. My preferred method of learning is through a combination of research, trial, and error, so the following sections will be organized as such.

Parsing

Oxc is a standard compiler that includes an abstract syntax tree (AST), a lexer, and a recursive descent parser.

Abstract Syntax Tree (AST)

The first architectural design for a compiler is its AST.

All JavaScript tools work on the AST level, for example:

  • A linter (e.g. ESLint) checks the AST for errors
  • A formatter (e.g.prettier) prints the AST back to JavaScript text
  • A minifier (e.g. terser) transforms the AST
  • A bundler connects all import and export statements between ASTs from different files

It will be painful to build these tools if the AST is not user-friendly.

For JavaScript, the most used AST specification is estree. My first AST version replicates estree:

rust
pub struct Program {
+    pub node: Node,
+    pub body: Vec<Statement>,
+}
+
+pub enum Statement {
+    VariableDeclarationStatement(VariableDeclaration),
+}
+
+pub struct VariableDeclaration {
+    pub node: Node,
+    pub declarations: Vec<VariableDeclarator>,
+}
pub struct Program {
+    pub node: Node,
+    pub body: Vec<Statement>,
+}
+
+pub enum Statement {
+    VariableDeclarationStatement(VariableDeclaration),
+}
+
+pub struct VariableDeclaration {
+    pub node: Node,
+    pub declarations: Vec<VariableDeclarator>,
+}

In Rust, declaring a tree is relatively straightforward, as it involves using structs and enums.

Memory Allocation

I worked on this version of AST for a couple of months while writing the parser. And one day I decided to profile it. The profiler showed the program was spending a lot of time calling drop.

💡 Nodes of the AST are allocated on the heap via Box or Vec, they are allocated individually so they are dropped in sequential order.

Is there a solution to mitigate this?

So while working on the parser I studied some of the other JavaScript parsers written in Rust, mainly ratel and jsparagus.

Both of these parsers declare their AST with a lifetime annotation,

rust
pub enum Statement<'ast> {
+    Expression(ExpressionNode<'ast>),
+}
pub enum Statement<'ast> {
+    Expression(ExpressionNode<'ast>),
+}

and they have an accompanying file called arena.rs.

I did not understand what it does so I neglected them until I started reading about their usage of memory arenas: bumpalo and toolshed.

In summary, memory arena allocates memory upfront in chunks or pages and deallocate altogether when the arena is dropped. The AST is allocated on the arena so dropping the AST is a fast operation.

Another nice side effect that comes with this is that, the AST is constructed in a specific order, and tree traversal also follows the same order, resulting in linear memory access during the visitation process. This access pattern will be efficient since all nearby memory will be read into the CPU cache in pages, resulting in faster access times.

Unfortunately it can be challenging for Rust beginners to use memory arenas because all data structures and relevant functions need to be parameterized by lifetime annotations. It took me five attempts to allocate the AST inside bumpalo.

Changing to a memory arena for the AST resulted around 20% performance improvement.

Enum Sizes

Due to the recursive nature of ASTs, we need to define the types in a way to avoid the "recursive without indirection" error:

error[E0072]: recursive types `Enum` and `Variant` have infinite size
+ --> crates/oxc_linter/src/lib.rs:1:1
+  |
+1 | enum Enum {
+  | ^^^^^^^^^
+2 |     Variant(Variant),
+  |             ------- recursive without indirection
+3 | }
+4 | struct Variant {
+  | ^^^^^^^^^^^^^^
+5 |     field: Enum,
+  |            ---- recursive without indirection
+  |
+help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
+  |
+2 ~     Variant(Box<Variant>),
+3 | }
+4 | struct Variant {
+5 ~     field: Box<Enum>,
error[E0072]: recursive types `Enum` and `Variant` have infinite size
+ --> crates/oxc_linter/src/lib.rs:1:1
+  |
+1 | enum Enum {
+  | ^^^^^^^^^
+2 |     Variant(Variant),
+  |             ------- recursive without indirection
+3 | }
+4 | struct Variant {
+  | ^^^^^^^^^^^^^^
+5 |     field: Enum,
+  |            ---- recursive without indirection
+  |
+help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
+  |
+2 ~     Variant(Box<Variant>),
+3 | }
+4 | struct Variant {
+5 ~     field: Box<Enum>,

There are two ways to do this. Either box the enum in the enum variant or box the struct field.

I found the same question in the Rust forum back in 2017, Is there a better way to represent an abstract syntax tree?

Aleksey (matklad) told us to box the enum variants to keep the Expression enum small. But what does this mean?

As it turns out, the memory layout of a Rust enum is dependent on the sizes of all its variants, its total byte size dependents on the largest variant. For example, the following enum will take up 56 bytes (1 byte for the tag, 48 bytes for the payload, and 8 bytes for alignment).

rust
enum Enum {
+    A, // 0 byte payload
+    B(String), // 24 byte payload
+    C { first: String, last: String }, // 48 byte payload
+}
enum Enum {
+    A, // 0 byte payload
+    B(String), // 24 byte payload
+    C { first: String, last: String }, // 48 byte payload
+}

In a typical JavaScript AST, the Expression enum holds 45 variants and the Statement enum holds 20 variants. They take up more than 200 bytes if not boxed by enum variants. These 200 bytes have to be passed around, and also accessed every time we do a matches!(expr, Expression::Variant(_)) check, which is not very cache friendly for performance.

So to make memory access efficient, it is best to box the enum variants.

The perf-book describes additional info on how to find large types.

I also copied the test for restricting small enum sizes.

rust
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn no_bloat_enum_sizes() {
+    use std::mem::size_of;
+    use crate::ast::*;
+    assert_eq!(size_of::<Statement>(), 16);
+    assert_eq!(size_of::<Expression>(), 16);
+    assert_eq!(size_of::<Declaration>(), 16);
+}
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn no_bloat_enum_sizes() {
+    use std::mem::size_of;
+    use crate::ast::*;
+    assert_eq!(size_of::<Statement>(), 16);
+    assert_eq!(size_of::<Expression>(), 16);
+    assert_eq!(size_of::<Declaration>(), 16);
+}

Boxing the enum variants resulted around 10% speed-up.

Span

Occasionally, we may not realize that a smaller memory footprint is possible until we spend some extra time examining the data structures.

In this instance, the leaf of all AST nodes contains a small data structure called the "span", which is used for storing the byte offset from the source text and comprises two usizes.

rust
pub struct Node {
+    pub start: usize,
+    pub end: usize,
+}
pub struct Node {
+    pub start: usize,
+    pub end: usize,
+}

It was pointed out to me that I can safely change usize to u32 to reduce peak memory because larger than u32 is a 4GB file.

Changing to u32 improved the performance up to 5% performance on large files.

Strings and Identifiers

Inside the AST, one may attempt to use a string reference to the source text for identifier names and string literals.

rust
pub struct StringLiteral<'a> {
+    pub value: &'a str,
+}
+
+pub struct Identifier<'a> {
+    pub name: &'a str,
+}
pub struct StringLiteral<'a> {
+    pub value: &'a str,
+}
+
+pub struct Identifier<'a> {
+    pub name: &'a str,
+}

But unfortunately in JavaScript, strings and identifiers can have escape sequences, i.e. '\251', '\xA9' and '©' are the same for the copyright symbol.

This implies that we must compute the escaped values and allocate a new String.

String interning

When there are lots of heap-allocated strings, a technique called string interning can be used to reduce total memory by storing only one copy of each distinct string value.

string-cache is a popular and widely used library published by the servo team. Initially, I used the string-cache library for identifiers and strings in the AST. The performance of the parser was fast in a single thread, but when I started implementing the linter where there are multiples parser running parallel with rayon, CPU utilization was at about 50% of all cores.

Upon profiling, a method called parking_lot::raw_mutex::RawMutex::lock_slow showed up on the top of the execution time. I did not know much about locks and multi-core programming, but a global lock was just strange to start with, so I decided to remove the string-cache library to enable full CPU utilization.

Removing string-cache from the AST improved the performance of parallel parsing by about 30%.

string-cache

Half a year later, while working on another performance-critical project, the string-cache library resurfaced again. It was blocking all the threads during parallel text parsing.

I decided to study what string-cache does because I am prepared this time after reading the book Rust Atomics and Locks by Mara Bos.

Here are the relevantcode around the lock. Please note that the code was written eight years ago in 2015.

rust
pub(crate) static DYNAMIC_SET: Lazy<Mutex<Set>> = Lazy::new(|| {
+    Mutex::new({
+
+// ... in another place
+let ptr: std::ptr::NonNull<Entry> =
+    DYNAMIC_SET.lock().insert(string_to_add, hash.g);
pub(crate) static DYNAMIC_SET: Lazy<Mutex<Set>> = Lazy::new(|| {
+    Mutex::new({
+
+// ... in another place
+let ptr: std::ptr::NonNull<Entry> =
+    DYNAMIC_SET.lock().insert(string_to_add, hash.g);

So this is straightforward. It locks the data structure Set every time a string is being inserted. As this routine is called frequently within a parser, its performance is impacted negatively by synchronization.

Now let's take a look at the Set data structure and see what it does:

rust
pub(crate) fn insert(&mut self, string: Cow<str>, hash: u32) -> NonNull<Entry> {
+    let bucket_index = (hash & BUCKET_MASK) as usize;
+    {
+        let mut ptr: Option<&mut Box<Entry>> = self.buckets[bucket_index].as_mut();
+
+        while let Some(entry) = ptr.take() {
+            if entry.hash == hash && *entry.string == *string {
+                if entry.ref_count.fetch_add(1, SeqCst) > 0 {
+                    return NonNull::from(&mut **entry);
+                }
+                entry.ref_count.fetch_sub(1, SeqCst);
+                break;
+            }
+            ptr = entry.next_in_bucket.as_mut();
+        }
+    }
+    debug_assert!(mem::align_of::<Entry>() >= ENTRY_ALIGNMENT);
+    let string = string.into_owned();
+    let mut entry = Box::new(Entry {
+        next_in_bucket: self.buckets[bucket_index].take(),
+        hash,
+        ref_count: AtomicIsize::new(1),
+        string: string.into_boxed_str(),
+    });
+    let ptr = NonNull::from(&mut *entry);
+    self.buckets[bucket_index] = Some(entry);
+
+    ptr
+}
pub(crate) fn insert(&mut self, string: Cow<str>, hash: u32) -> NonNull<Entry> {
+    let bucket_index = (hash & BUCKET_MASK) as usize;
+    {
+        let mut ptr: Option<&mut Box<Entry>> = self.buckets[bucket_index].as_mut();
+
+        while let Some(entry) = ptr.take() {
+            if entry.hash == hash && *entry.string == *string {
+                if entry.ref_count.fetch_add(1, SeqCst) > 0 {
+                    return NonNull::from(&mut **entry);
+                }
+                entry.ref_count.fetch_sub(1, SeqCst);
+                break;
+            }
+            ptr = entry.next_in_bucket.as_mut();
+        }
+    }
+    debug_assert!(mem::align_of::<Entry>() >= ENTRY_ALIGNMENT);
+    let string = string.into_owned();
+    let mut entry = Box::new(Entry {
+        next_in_bucket: self.buckets[bucket_index].take(),
+        hash,
+        ref_count: AtomicIsize::new(1),
+        string: string.into_boxed_str(),
+    });
+    let ptr = NonNull::from(&mut *entry);
+    self.buckets[bucket_index] = Some(entry);
+
+    ptr
+}

It looks like it is looking for a bucket to store the string and it inserts the string if it is not in the bucket.

💡 Is this linear probing? If this is linear probing then this Set is just a HashMap without saying it is a HashMap. 💡 If this is a HashMap, then Mutex<HashMap> is a concurrent hashmap.

Although the solution may seem straightforward when we know what to look for, it took me a month to figure this out because I was unaware of the issue. When it became evident that this is just a concurrent hashmap, applying the Mutex to the buckets instead of the entire hashmap was a clear and logical solution. Within an hour of implementing this change, I submitted a pull request and was happy with the outcome 😃.

https://github.com/servo/string-cache/pull/268
https://github.com/servo/string-cache/pull/268

It is worth mentioning that string interning is a battlefield within the Rust community. For the example shown in this blog post, there are single-threaded libraries such string-interner, lasso, lalrpop-intern, intaglio and strena.

Since we are parsing files in parallel, an option is to utilize a multi-threaded string interner library such as ustr. However, after profiling both ustr and the enhanced version of string-cache, it became apparent that the performance was still below expectations compared to the approach I am going to explain below.

Some preliminary guesses for the sub-par performance are:

  • Hashing - the interners need to hash the string for deduplication
  • Indirection - we need to read the string value from a "far away" heap, which is not cache friendly

String Inlining

So we are back to the initial problem of having to allocate lots of strings. Fortunately, there is a partial solution to this problem if we look at what kind of data we are dealing with: short JavaScript variable names and some short strings. There is a technique called string inlining, where we store all of the bytes of a string on the stack.

In essence, we want the following enum to store our string.

rust
enum Str {
+    Static(&'static str),
+    Inline(InlineReprensation),
+    Heap(String),
+}
enum Str {
+    Static(&'static str),
+    Inline(InlineReprensation),
+    Heap(String),
+}

To minimize the size of the enum, InlineRepresentation should have the same size as String.

rust
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn test_size() {
+    use std::mem::size_of;
+    assert_eq!(size_of::<String>(), size_of::<InlineReprensation>());
+}
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
+#[test]
+fn test_size() {
+    use std::mem::size_of;
+    assert_eq!(size_of::<String>(), size_of::<InlineReprensation>());
+}

Many crates in the Rust community aim to optimize memory usage. This is yet another battlefield within the community. The most popular ones are

Each of these crates have unique characteristics and approaches to achieving memory optimization, leading to a variety of trade-offs and considerations when choosing which one to use. For example smol_str and flexstr clones are O(1). flexstr can store 22 bytes, smol_str and smartstring can store 23 bytes, and compact_str can store 24 bytes on 64-bit systems.

https://fasterthanli.me has a deep dive on this topic.

Changing String to compact_str::CompactStr reduced memory allocations by a large amount.

Lexer

Token

The job of the lexer (also known as tokenizer) is to turn source text into structured data called a token.

rust
pub struct Token {
+    pub kind: Kind,
+}
pub struct Token {
+    pub kind: Kind,
+}

To make it easier to work with, a token kind is typically defined as an enum in Rust. The variants of the enums hold the corresponding data for each token.

rust
pub enum Kind {
+    // Keywords
+    For,
+    While,
+    ...
+    // Literals
+    String(String),
+    Num(f64),
+    ...
+}
pub enum Kind {
+    // Keywords
+    For,
+    While,
+    ...
+    // Literals
+    String(String),
+    Num(f64),
+    ...
+}

This enum currently uses 32 bytes, and a lexer often need to construct millions of this token Kind. Every time it constructs a Kind::For or Kind::While, it has to allocate 32 bytes of memory on the stack.

A clever way to improve this is to break up the enum variant to keep Kind to a single byte and move the values into another enum,

rust
pub struct Token<'a> {
+    pub kind: Kind,
+    pub value: TokenValue
+}
+
+pub enum TokenValue {
+    None,
+    String(String),
+    Num(f64),
+}
pub struct Token<'a> {
+    pub kind: Kind,
+    pub value: TokenValue
+}
+
+pub enum TokenValue {
+    None,
+    String(String),
+    Num(f64),
+}

Since we control all the parsing code, it is our job to keep this safe by always declaring the corresponding token value to its kind.

While a TokenValue of 32 bytes is already quite small, it may still have a negative impact on performance because it is allocated frequently.

Let's take a look at the String type and see what we can find, by using the "go-to definition" in our code editors, we'll go through String -> Vec -> RawVec:

rust
pub struct String {
+    vec: Vec<u8>,
+}
+
+pub struct Vec {
+    buf: RawVec<T, A>,
+    len: usize,
+}
+
+pub struct RawVec {
+    ptr: Unique<T>,
+    cap: usize,
+    alloc: A,
+}
pub struct String {
+    vec: Vec<u8>,
+}
+
+pub struct Vec {
+    buf: RawVec<T, A>,
+    len: usize,
+}
+
+pub struct RawVec {
+    ptr: Unique<T>,
+    cap: usize,
+    alloc: A,
+}

As advertised, a String is just a Vec of u8s, and a Vec has a length and a capacity field. Since we are never going to mutate this string, an optimization in terms of memory usage would be to drop the cap field and use a string slice (&str) instead.

rust
pub enum TokenValue<'a> {
+    None,
+    String(&'a str),
+    Num(f64),
+}
pub enum TokenValue<'a> {
+    None,
+    String(&'a str),
+    Num(f64),
+}

TokenValue becomes 24 bytes.

While using a string slice instead of String in TokenValue would reduce memory usage, it does come with the downside of adding a lifetime annotation. This can lead to issues with the borrow checker and the lifetime annotation will propagate to the rest of the codebase, making our code somewhat difficult to manage. I lost the borrow checking game 8 months ago but finally won when I revisited this.

When it makes sense, we can always go for the owned version of the immutable data instead of using references. For example Box<str> for String and Box<[u8]> for Vec<u8>.

In summary, we can always come up with tricks to keep our data structures small, and it will sometimes reward us performance improvement.

Cow

I first encountered the term Cow when I was studying jsparagus's code, it has an infrastructure called AutoCow.

I vaguely understood what the code was doing. When a JavaScript string is being tokenized, it allocates a new string when it encounters an escaped sequence or it returns the original string slice if it doesn't:

rust
fn finish(&mut self, lexer: &Lexer<'alloc>) -> &'alloc str {
+    match self.value.take() {
+        Some(arena_string) => arena_string.into_bump_str(),
+        None => &self.start[..self.start.len() - lexer.chars.as_str().len()],
+    }
+}
fn finish(&mut self, lexer: &Lexer<'alloc>) -> &'alloc str {
+    match self.value.take() {
+        Some(arena_string) => arena_string.into_bump_str(),
+        None => &self.start[..self.start.len() - lexer.chars.as_str().len()],
+    }
+}

This is clever because 99.9% of the time it will not allocate a new string because escaped strings are rare.

But the term Cow or "clone-on-write smart pointer" never made sense to me.

The type Cow is a smart pointer providing clone-on-write functionality: it can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. The type is designed to work with general borrowed data via the Borrow trait.

If you are new to Rust (like I was), then this description just doesn't help (I still don't understand what it is talking about).

It was pointed out to me that clone-on-write is just a use case of this data structure. A better name should be called RefOrOwned because it is a type that contains either owned data or a reference.

SIMD

When I was going through the old Rust blogs, the Announcing the Portable SIMD Project Group caught my attention. I always wanted to play around with SIMD but never got the chance. After some research, I found a use case that may apply to a parser: How quickly can you remove spaces from a string? by Daniel Lemire. So it turns out this has been done before, in a JSON parser called RapidJSON, which uses SIMD to remove whitespaces.

So eventually with the help of portable-SIMD and RapidJSON's code, not only did I manage to skip whitespaces, I also managed to skip multi-line comments as well.

Both changes improved the performance by a few percent.

Keyword match

At the top of the performance profile, there is a hot code path that takes about 1 - 2% of the total execution time.

It tries to match a string to a JavaScript keyword:

rust
fn match_keyword(s: &str) -> Self {
+    match s {
+        "as" => As,
+        "do" => Do,
+        "if" => If,
+        ...
+        "constructor" => Constructor,
+        _ => Ident,
+    }
+}
fn match_keyword(s: &str) -> Self {
+    match s {
+        "as" => As,
+        "do" => Do,
+        "if" => If,
+        ...
+        "constructor" => Constructor,
+        _ => Ident,
+    }
+}

With the addition of TypeScript, there are 84 strings for us to match from. After some research, I found a blog from V8 Blazingly fast parsing, part 1: optimizing the scanner, it describes its keyword matching code in detail.

Since the list of keywords is static, we can compute a perfect hash function that for each identifier gives us at most one candidate keyword. V8 uses gperf to compute this function. The result computes a hash from the length and first two identifier characters to find the single candidate keyword. We only compare the identifier with the keyword if the length of that keyword matches the input identifier length.

So a quick hash plus an integer comparison should be faster than 84 string comparisons. But we tried again and again to no avail.

As it turns out, LLVM already optimized our code. By using --emit=llvm-ir on rustc, we find the relevant code:

  switch i64 %s.1, label %bb6 [
+    i64 2, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit.i"
+    i64 3, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit280.i"
+    i64 4, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit325.i"
+    i64 5, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit380.i"
+    i64 6, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit450.i"
+    i64 7, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit540.i"
+    i64 8, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit590.i"
+    i64 9, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit625.i"
+    i64 10, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit655.i"
+    i64 11, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit665.i"
+  ], !dbg !191362
  switch i64 %s.1, label %bb6 [
+    i64 2, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit.i"
+    i64 3, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit280.i"
+    i64 4, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit325.i"
+    i64 5, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit380.i"
+    i64 6, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit450.i"
+    i64 7, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit540.i"
+    i64 8, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit590.i"
+    i64 9, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit625.i"
+    i64 10, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit655.i"
+    i64 11, label %"_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h46d405acb5da4997E.exit665.i"
+  ], !dbg !191362

%s is the string, %s.1 is its length ... it is branching on the string length! The compiler is smarter than us 😃.

(Yes, we got so serious with this so we started looking at LLVM IR and assembly code.)

Later on, @strager posted a very educational YouTube video Faster than Rust and C++: the PERFECT hash table on this topic. The video taught us a systematic approach to reasoning about fine-tuning performance problems

In the end, we concluded that the simple keyword match is enough for us since it was only about 1 - 2% of the performance, and the effort is not worth it after spending a few days on it - Rust does not have all the pieces we need to build this perfect hashmap.

Linter

A linter is a program that analyzes the source code for problems.

The simplest linter visits each AST node and checks for rules. The visitor pattern can be used:

rust
pub trait Visit<'a>: Sized {
+    // ... lots of visit functions
+
+    fn visit_debugger_statement(&mut self, stmt: &'a DebuggerStatement) {
+        // report error
+    }
+}
pub trait Visit<'a>: Sized {
+    // ... lots of visit functions
+
+    fn visit_debugger_statement(&mut self, stmt: &'a DebuggerStatement) {
+        // report error
+    }
+}

Parent Pointing Tree

It is easy to go down the AST by using visitors, but what if we want to go up the tree to collect some information?

This problem is particularly challenging to solve in Rust, because it is not possible to add a pointer to the nodes of the AST.

Let's forget about ASTs for a second and focus on generic trees with the property of a node having a pointer to its parent. To build a generic tree, each tree node needs to be the same type Node, we can reference their parent by using Rc:

rust
struct Node {
+    parent: Option<Rc<Node>>,
+}
struct Node {
+    parent: Option<Rc<Node>>,
+}

It is tedious to work with this pattern if we need mutation, and it is not performant because the nodes have to be dropped at different times.

A more efficient solution is to use a Vec as its backing storage and use indexes for pointers.

rust
struct Tree {
+    nodes: Vec<Node>
+}
+
+struct Node {
+    parent: Option<usize> // index into `nodes`
+}
struct Tree {
+    nodes: Vec<Node>
+}
+
+struct Node {
+    parent: Option<usize> // index into `nodes`
+}

indextree is a nice library for this task.

Back to our AST, we can build a indextree by having the nodes point to an enum that wraps every single kind of AST node. We call this the untyped AST.

rust
struct Node<'a> {
+    kind: AstKind<'a>
+}
+
+enum AstKind<'a> {
+    BlockStatement(&'a BlockStatement<'a>),
+    // ...
+    ArrayExpression(&'a ArrayExpression<'a>),
+    // ...
+    Class(&'a Class<'a>),
+    // ...
+}
struct Node<'a> {
+    kind: AstKind<'a>
+}
+
+enum AstKind<'a> {
+    BlockStatement(&'a BlockStatement<'a>),
+    // ...
+    ArrayExpression(&'a ArrayExpression<'a>),
+    // ...
+    Class(&'a Class<'a>),
+    // ...
+}

The last missing piece is to have callbacks inside the visitor pattern that builds this tree.

rust
pub trait Visit<'a> {
+    fn enter_node(&mut self, _kind: AstKind<'a>) {}
+    fn leave_node(&mut self, _kind: AstKind<'a>) {}
+
+    fn visit_block_statement(&mut self, stmt: &'a BlockStatement<'a>) {
+        let kind = AstKind::BlockStatement(stmt);
+        self.enter_node(kind);
+        self.visit_statements(&stmt.body);
+        self.leave_node(kind);
+    }
+}
+
+impl<'a> Visit<'a> for TreeBuilder<'a> {
+    fn enter_node(&mut self, kind: AstKind<'a>) {
+        self.push_ast_node(kind);
+    }
+
+    fn leave_node(&mut self, kind: AstKind<'a>) {
+        self.pop_ast_node();
+    }
+}
pub trait Visit<'a> {
+    fn enter_node(&mut self, _kind: AstKind<'a>) {}
+    fn leave_node(&mut self, _kind: AstKind<'a>) {}
+
+    fn visit_block_statement(&mut self, stmt: &'a BlockStatement<'a>) {
+        let kind = AstKind::BlockStatement(stmt);
+        self.enter_node(kind);
+        self.visit_statements(&stmt.body);
+        self.leave_node(kind);
+    }
+}
+
+impl<'a> Visit<'a> for TreeBuilder<'a> {
+    fn enter_node(&mut self, kind: AstKind<'a>) {
+        self.push_ast_node(kind);
+    }
+
+    fn leave_node(&mut self, kind: AstKind<'a>) {
+        self.pop_ast_node();
+    }
+}

The final data structure becomes indextree::Arena<Node<'a>> where each Node has a pointer to an AstKind<'a>. indextree::Node::parent can be called to get the parent of any node.

The nice benefit of making this parent pointing tree is that it becomes convenient to visit AST nodes without having to implement any visitors. A linter becomes a simple loop over all the nodes inside the indextree:

rust
for node in nodes {
+    match node.get().kind {
+        AstKind::DebuggerStatement(stmt) => {
+        // report error
+        }
+        _ => {}
+    }
+}
for node in nodes {
+    match node.get().kind {
+        AstKind::DebuggerStatement(stmt) => {
+        // report error
+        }
+        _ => {}
+    }
+}

A full example is provided here.

At first glance, this process may seem slow and inefficient. However, visiting the typed AST through a memory arena and pushing a pointer into indextree are efficient linear memory access patterns. The current benchmark indicates that this approach is 84 times faster than ESLint, so it is certainly fast enough for our purposes.

Processing files in parallel

The linter uses the ignore crate for directory traversal, it supports .gitignore and adds additional ignore files such as .eslintignore.

A small problem with this crate is that it does not have a parallel interface, There is no par_iter for ignore::Walk::new(".").

Instead, primitives need to be used

rust
let walk = Walk::new(&self.options);
+rayon::spawn(move || {
+    walk.iter().for_each(|path| {
+        tx_path.send(path).unwrap();
+    });
+});
+
+let linter = Arc::clone(&self.linter);
+rayon::spawn(move || {
+    while let Ok(path) = rx_path.recv() {
+        let tx_error = tx_error.clone();
+        let linter = Arc::clone(&linter);
+        rayon::spawn(move || {
+            if let Some(diagnostics) = Self::lint_path(&linter, &path) {
+                tx_error.send(diagnostics).unwrap();
+            }
+            drop(tx_error);
+        });
+    }
+});
let walk = Walk::new(&self.options);
+rayon::spawn(move || {
+    walk.iter().for_each(|path| {
+        tx_path.send(path).unwrap();
+    });
+});
+
+let linter = Arc::clone(&self.linter);
+rayon::spawn(move || {
+    while let Ok(path) = rx_path.recv() {
+        let tx_error = tx_error.clone();
+        let linter = Arc::clone(&linter);
+        rayon::spawn(move || {
+            if let Some(diagnostics) = Self::lint_path(&linter, &path) {
+                tx_error.send(diagnostics).unwrap();
+            }
+            drop(tx_error);
+        });
+    }
+});

This unlocks a useful feature where we can print all diagnostics in a single thread, which leads us to the final topic of this article.

Printing is slow

Printing the diagnostics was fast, but I have been working on this project for so long that it felt like an eternity to print thousands of diagnostic messages every time I run the linter on huge monorepos. So I started searching through the Rust GitHub issues and eventually found the relevant ones:

In summary, a println! call will lock stdout every time it encounters a newline, this is called line buffering. To make things print faster, we need to opt-in for block buffering which is documented here.

rust
use std::io::{self, Write};
+
+let stdout = io::stdout(); // get the global stdout entity
+let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
+writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
use std::io::{self, Write};
+
+let stdout = io::stdout(); // get the global stdout entity
+let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
+writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here

Or acquire the lock on stdout.

rust
let stdout = io::stdout(); // get the global stdout entity
+let mut handle = stdout.lock(); // acquire a lock on it
+writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
let stdout = io::stdout(); // get the global stdout entity
+let mut handle = stdout.lock(); // acquire a lock on it
+writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
+ + + + \ No newline at end of file diff --git a/ja/docs/learn/references.html b/ja/docs/learn/references.html new file mode 100644 index 0000000000..82549750ae --- /dev/null +++ b/ja/docs/learn/references.html @@ -0,0 +1,37 @@ + + + + + + References | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ja/index.html b/ja/index.html new file mode 100644 index 0000000000..1a7be9abfd --- /dev/null +++ b/ja/index.html @@ -0,0 +1,37 @@ + + + + + + The JavaScript Oxidation Compiler | The JavaScript Oxidation Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

The JavaScript Oxidation Compiler

Rust製JavaScriptツールコレクション

The JavaScript Oxidation Compiler
+ + + + \ No newline at end of file