From 2f4541e35bed2f2ec66778a4c5d852f1cd7d5d7c Mon Sep 17 00:00:00 2001 From: Dania Rifki Date: Tue, 6 Oct 2026 15:12:54 +0700 Subject: [PATCH 01/20] refactor(docs): migrate VitePress to Starlight --- .github/workflows/static.yml | 2 +- README.md | 4 +- doc/.gitignore | 8 +- doc/README.md | 17 +- doc/astro.config.mjs | 301 + doc/docs/.vitepress/config.mts | 627 -- doc/docs/.vitepress/env.d.ts | 19 - .../theme/components/CompilerModal.vue | 66 - .../theme/components/HomeFooter.vue | 42 - .../theme/components/YueDisplay.vue | 51 - .../theme/components/prism-manual.js | 6 - doc/docs/.vitepress/theme/custom.css | 244 - doc/docs/.vitepress/theme/index.ts | 67 - doc/docs/de/doc/extras/mascot.md | 39 - doc/docs/de/index.md | 26 - doc/docs/de/try/index.md | 7 - doc/docs/doc/extras/mascot.md | 39 - doc/docs/id-id/doc/extras/mascot.md | 39 - doc/docs/id-id/index.md | 24 - doc/docs/id-id/try/index.md | 13 - doc/docs/index.md | 24 - doc/docs/pt-br/doc/extras/mascot.md | 39 - doc/docs/pt-br/index.md | 26 - doc/docs/pt-br/try/index.md | 7 - doc/docs/try/index.md | 13 - doc/docs/zh/doc/extras/mascot.md | 39 - doc/docs/zh/index.md | 24 - doc/docs/zh/try/index.md | 13 - doc/package.json | 30 +- doc/pnpm-lock.yaml | 5801 +++++++++++++---- doc/pnpm-workspace.yaml | 4 +- doc/{docs/.vitepress => }/public/favicon.ico | Bin .../image/favicon/android-chrome-192x192.png | Bin .../image/favicon/android-chrome-512x512.png | Bin .../public/image/favicon/apple-touch-icon.png | Bin .../public/image/favicon/favicon-16x16.png | Bin .../public/image/favicon/favicon-32x32.png | Bin .../public/image/favicon/favicon.ico | Bin ...ctrichearts_20260211A_yuescript_xiaoyu.png | Bin ...ctrichearts_20260211A_yuescript_xiaoyu.zip | Bin ...hearts_20260211A_yuescript_xiaoyu_full.png | Bin ...earts_20260211A_yuescript_xiaoyu_trans.png | Bin .../public/image/yuescript.png | Bin .../public/image/yuescript.svg | 0 doc/{docs/.vitepress => }/public/js/.gitkeep | 0 doc/scripts/check-docs.mjs | 140 + doc/src/components/AggregateContent.astro | 15 + doc/src/components/CompilerFooter.astro | 195 + doc/src/components/Head.astro | 24 + doc/src/components/HeaderLinks.astro | 23 + doc/src/components/MarkdownContent.astro | 9 + .../theme => src}/components/YueCompiler.vue | 274 +- doc/src/content.config.ts | 7 + .../content}/docs/de/doc/advanced/do.md | 34 +- .../docs/de/doc/advanced/line-decorators.md | 27 +- .../content}/docs/de/doc/advanced/macro.md | 97 +- .../de/doc/advanced/the-yuescript-library.md | 6 +- .../content}/docs/de/doc/advanced/try.md | 20 +- .../docs/de/doc/assignment/assignment.md | 41 +- .../assignment/destructuring-assignment.md | 83 +- .../docs/de/doc/assignment/if-assignment.md | 34 +- ...ause-controlling-destructive-assignment.md | 27 +- .../de/doc/assignment/varargs-assignment.md | 13 +- .../docs/de/doc/control-flow/conditionals.md | 69 +- .../docs/de/doc/control-flow/continue.md | 20 +- .../docs/de/doc/control-flow/for-loop.md | 55 +- .../content}/docs/de/doc/control-flow/goto.md | 34 +- .../docs/de/doc/control-flow/switch.md | 83 +- .../docs/de/doc/control-flow/while-loop.md | 41 +- .../de/doc/data-structures/comprehensions.md | 118 +- .../de/doc/data-structures/table-literals.md | 69 +- .../docs/de/doc/extras/license-mit.md | 6 +- doc/src/content/docs/de/doc/extras/mascot.md | 43 + .../docs/de/doc/functions/backcalls.md | 34 +- .../de/doc/functions/function-literals.md | 167 +- .../docs/de/doc/functions/function-stubs.md | 13 +- .../de/doc/getting-started/installation.md | 6 +- .../de/doc/getting-started/introduction.md | 13 +- .../docs/de/doc/getting-started/usage.md | 6 +- doc/{ => src/content}/docs/de/doc/index.md | 7 +- .../docs/de/doc/language-basics/attributes.md | 27 +- .../docs/de/doc/language-basics/comment.md | 13 +- .../docs/de/doc/language-basics/literals.md | 41 +- .../docs/de/doc/language-basics/module.md | 62 +- .../docs/de/doc/language-basics/operator.md | 111 +- .../docs/de/doc/language-basics/whitespace.md | 20 +- .../objects/object-oriented-programming.md | 167 +- .../docs/de/doc/objects/with-statement.md | 62 +- doc/src/content/docs/de/index.md | 41 + doc/src/content/docs/de/try/index.md | 9 + doc/{ => src/content}/docs/doc/advanced/do.md | 34 +- .../docs/doc/advanced/line-decorators.md | 27 +- .../content}/docs/doc/advanced/macro.md | 97 +- .../doc/advanced/the-yuescript-library.md | 6 +- .../content}/docs/doc/advanced/try.md | 20 +- .../docs/doc/assignment/assignment.md | 41 +- .../assignment/destructuring-assignment.md | 83 +- .../docs/doc/assignment/if-assignment.md | 34 +- ...ause-controlling-destructive-assignment.md | 27 +- .../docs/doc/assignment/varargs-assignment.md | 13 +- .../docs/doc/control-flow/conditionals.md | 69 +- .../docs/doc/control-flow/continue.md | 20 +- .../docs/doc/control-flow/for-loop.md | 55 +- .../content}/docs/doc/control-flow/goto.md | 34 +- .../content}/docs/doc/control-flow/switch.md | 83 +- .../docs/doc/control-flow/while-loop.md | 41 +- .../doc/data-structures/comprehensions.md | 118 +- .../doc/data-structures/table-literals.md | 69 +- .../content}/docs/doc/extras/license-mit.md | 6 +- doc/src/content/docs/doc/extras/mascot.md | 43 + .../content}/docs/doc/functions/backcalls.md | 34 +- .../docs/doc/functions/function-literals.md | 167 +- .../docs/doc/functions/function-stubs.md | 13 +- .../docs/doc/getting-started/installation.md | 6 +- .../docs/doc/getting-started/introduction.md | 13 +- .../docs/doc/getting-started/usage.md | 6 +- doc/{ => src/content}/docs/doc/index.md | 7 +- .../docs/doc/language-basics/attributes.md | 27 +- .../docs/doc/language-basics/comment.md | 13 +- .../docs/doc/language-basics/literals.md | 41 +- .../docs/doc/language-basics/module.md | 62 +- .../docs/doc/language-basics/operator.md | 111 +- .../docs/doc/language-basics/whitespace.md | 20 +- .../objects/object-oriented-programming.md | 167 +- .../docs/doc/objects/with-statement.md | 62 +- .../content}/docs/id-id/doc/advanced/do.md | 34 +- .../id-id/doc/advanced/line-decorators.md | 27 +- .../content}/docs/id-id/doc/advanced/macro.md | 97 +- .../doc/advanced/the-yuescript-library.md | 6 +- .../content}/docs/id-id/doc/advanced/try.md | 20 +- .../docs/id-id/doc/assignment/assignment.md | 41 +- .../assignment/destructuring-assignment.md | 83 +- .../id-id/doc/assignment/if-assignment.md | 34 +- ...ause-controlling-destructive-assignment.md | 27 +- .../doc/assignment/varargs-assignment.md | 13 +- .../id-id/doc/control-flow/conditionals.md | 69 +- .../docs/id-id/doc/control-flow/continue.md | 20 +- .../docs/id-id/doc/control-flow/for-loop.md | 55 +- .../docs/id-id/doc/control-flow/goto.md | 34 +- .../docs/id-id/doc/control-flow/switch.md | 83 +- .../docs/id-id/doc/control-flow/while-loop.md | 41 +- .../doc/data-structures/comprehensions.md | 118 +- .../doc/data-structures/table-literals.md | 69 +- .../docs/id-id/doc/extras/license-mit.md | 6 +- .../content/docs/id-id/doc/extras/mascot.md | 43 + .../docs/id-id/doc/functions/backcalls.md | 34 +- .../id-id/doc/functions/function-literals.md | 167 +- .../id-id/doc/functions/function-stubs.md | 13 +- .../id-id/doc/getting-started/installation.md | 6 +- .../id-id/doc/getting-started/introduction.md | 13 +- .../docs/id-id/doc/getting-started/usage.md | 6 +- doc/{ => src/content}/docs/id-id/doc/index.md | 7 +- .../id-id/doc/language-basics/attributes.md | 27 +- .../docs/id-id/doc/language-basics/comment.md | 13 +- .../id-id/doc/language-basics/literals.md | 41 +- .../docs/id-id/doc/language-basics/module.md | 62 +- .../id-id/doc/language-basics/operator.md | 111 +- .../id-id/doc/language-basics/whitespace.md | 20 +- .../objects/object-oriented-programming.md | 167 +- .../docs/id-id/doc/objects/with-statement.md | 62 +- doc/src/content/docs/id-id/index.md | 41 + doc/src/content/docs/id-id/try/index.md | 12 + doc/src/content/docs/index.md | 43 + .../content}/docs/pt-br/doc/advanced/do.md | 34 +- .../pt-br/doc/advanced/line-decorators.md | 27 +- .../content}/docs/pt-br/doc/advanced/macro.md | 97 +- .../doc/advanced/the-yuescript-library.md | 6 +- .../content}/docs/pt-br/doc/advanced/try.md | 20 +- .../docs/pt-br/doc/assignment/assignment.md | 41 +- .../assignment/destructuring-assignment.md | 83 +- .../pt-br/doc/assignment/if-assignment.md | 34 +- ...ause-controlling-destructive-assignment.md | 27 +- .../doc/assignment/varargs-assignment.md | 13 +- .../pt-br/doc/control-flow/conditionals.md | 69 +- .../docs/pt-br/doc/control-flow/continue.md | 20 +- .../docs/pt-br/doc/control-flow/for-loop.md | 55 +- .../docs/pt-br/doc/control-flow/goto.md | 34 +- .../docs/pt-br/doc/control-flow/switch.md | 83 +- .../docs/pt-br/doc/control-flow/while-loop.md | 41 +- .../doc/data-structures/comprehensions.md | 118 +- .../doc/data-structures/table-literals.md | 69 +- .../docs/pt-br/doc/extras/license-mit.md | 6 +- .../content/docs/pt-br/doc/extras/mascot.md | 43 + .../docs/pt-br/doc/functions/backcalls.md | 34 +- .../pt-br/doc/functions/function-literals.md | 167 +- .../pt-br/doc/functions/function-stubs.md | 13 +- .../pt-br/doc/getting-started/installation.md | 6 +- .../pt-br/doc/getting-started/introduction.md | 13 +- .../docs/pt-br/doc/getting-started/usage.md | 6 +- doc/{ => src/content}/docs/pt-br/doc/index.md | 7 +- .../pt-br/doc/language-basics/attributes.md | 27 +- .../docs/pt-br/doc/language-basics/comment.md | 13 +- .../pt-br/doc/language-basics/literals.md | 41 +- .../docs/pt-br/doc/language-basics/module.md | 62 +- .../pt-br/doc/language-basics/operator.md | 111 +- .../pt-br/doc/language-basics/whitespace.md | 20 +- .../objects/object-oriented-programming.md | 167 +- .../docs/pt-br/doc/objects/with-statement.md | 62 +- doc/src/content/docs/pt-br/index.md | 41 + doc/src/content/docs/pt-br/try/index.md | 9 + doc/src/content/docs/try/index.md | 12 + .../content}/docs/zh/doc/advanced/do.md | 34 +- .../docs/zh/doc/advanced/line-decorators.md | 27 +- .../content}/docs/zh/doc/advanced/macro.md | 97 +- .../zh/doc/advanced/the-yuescript-library.md | 6 +- .../content}/docs/zh/doc/advanced/try.md | 20 +- .../docs/zh/doc/assignment/assignment.md | 41 +- .../assignment/destructuring-assignment.md | 83 +- .../docs/zh/doc/assignment/if-assignment.md | 34 +- ...ause-controlling-destructive-assignment.md | 27 +- .../zh/doc/assignment/varargs-assignment.md | 13 +- .../docs/zh/doc/control-flow/conditionals.md | 69 +- .../docs/zh/doc/control-flow/continue.md | 20 +- .../docs/zh/doc/control-flow/for-loop.md | 55 +- .../content}/docs/zh/doc/control-flow/goto.md | 34 +- .../docs/zh/doc/control-flow/switch.md | 83 +- .../docs/zh/doc/control-flow/while-loop.md | 41 +- .../zh/doc/data-structures/comprehensions.md | 118 +- .../zh/doc/data-structures/table-literals.md | 69 +- .../docs/zh/doc/extras/license-mit.md | 6 +- doc/src/content/docs/zh/doc/extras/mascot.md | 43 + .../docs/zh/doc/functions/backcalls.md | 34 +- .../zh/doc/functions/function-literals.md | 167 +- .../docs/zh/doc/functions/function-stubs.md | 13 +- .../zh/doc/getting-started/installation.md | 6 +- .../zh/doc/getting-started/introduction.md | 13 +- .../docs/zh/doc/getting-started/usage.md | 6 +- doc/{ => src/content}/docs/zh/doc/index.md | 7 +- .../docs/zh/doc/language-basics/attributes.md | 27 +- .../docs/zh/doc/language-basics/comment.md | 13 +- .../docs/zh/doc/language-basics/literals.md | 41 +- .../docs/zh/doc/language-basics/module.md | 62 +- .../docs/zh/doc/language-basics/operator.md | 111 +- .../docs/zh/doc/language-basics/whitespace.md | 20 +- .../objects/object-oriented-programming.md | 167 +- .../docs/zh/doc/objects/with-statement.md | 62 +- doc/src/content/docs/zh/index.md | 41 + doc/src/content/docs/zh/try/index.md | 12 + .../grammars/yuescript.tmLanguage.json | 0 doc/src/locales.mjs | 15 + doc/src/pages/[...locale]/all-in-one.astro | 40 + doc/src/styles/custom.css | 681 ++ doc/tsconfig.json | 19 +- doc/yue-de.md | 3570 ---------- doc/yue-en.md | 3591 ---------- doc/yue-id-id.md | 3579 ---------- doc/yue-pt-br.md | 3580 ---------- doc/yue-zh.md | 3555 ---------- makefile | 4 +- spec/inputs/compile_doc.yue | 81 +- spec/outputs/compile_doc.lua | 92 +- 251 files changed, 12766 insertions(+), 22995 deletions(-) create mode 100644 doc/astro.config.mjs delete mode 100644 doc/docs/.vitepress/config.mts delete mode 100644 doc/docs/.vitepress/env.d.ts delete mode 100755 doc/docs/.vitepress/theme/components/CompilerModal.vue delete mode 100644 doc/docs/.vitepress/theme/components/HomeFooter.vue delete mode 100755 doc/docs/.vitepress/theme/components/YueDisplay.vue delete mode 100644 doc/docs/.vitepress/theme/components/prism-manual.js delete mode 100644 doc/docs/.vitepress/theme/custom.css delete mode 100644 doc/docs/.vitepress/theme/index.ts delete mode 100644 doc/docs/de/doc/extras/mascot.md delete mode 100644 doc/docs/de/index.md delete mode 100755 doc/docs/de/try/index.md delete mode 100644 doc/docs/doc/extras/mascot.md delete mode 100644 doc/docs/id-id/doc/extras/mascot.md delete mode 100644 doc/docs/id-id/index.md delete mode 100755 doc/docs/id-id/try/index.md delete mode 100644 doc/docs/index.md delete mode 100644 doc/docs/pt-br/doc/extras/mascot.md delete mode 100644 doc/docs/pt-br/index.md delete mode 100755 doc/docs/pt-br/try/index.md delete mode 100755 doc/docs/try/index.md delete mode 100644 doc/docs/zh/doc/extras/mascot.md delete mode 100644 doc/docs/zh/index.md delete mode 100755 doc/docs/zh/try/index.md rename doc/{docs/.vitepress => }/public/favicon.ico (100%) rename doc/{docs/.vitepress => }/public/image/favicon/android-chrome-192x192.png (100%) rename doc/{docs/.vitepress => }/public/image/favicon/android-chrome-512x512.png (100%) rename doc/{docs/.vitepress => }/public/image/favicon/apple-touch-icon.png (100%) rename doc/{docs/.vitepress => }/public/image/favicon/favicon-16x16.png (100%) rename doc/{docs/.vitepress => }/public/image/favicon/favicon-32x32.png (100%) rename doc/{docs/.vitepress => }/public/image/favicon/favicon.ico (100%) rename doc/{docs/.vitepress => }/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png (100%) rename doc/{docs/.vitepress => }/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.zip (100%) rename doc/{docs/.vitepress => }/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_full.png (100%) rename doc/{docs/.vitepress => }/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_trans.png (100%) rename doc/{docs/.vitepress => }/public/image/yuescript.png (100%) rename doc/{docs/.vitepress => }/public/image/yuescript.svg (100%) rename doc/{docs/.vitepress => }/public/js/.gitkeep (100%) create mode 100644 doc/scripts/check-docs.mjs create mode 100644 doc/src/components/AggregateContent.astro create mode 100644 doc/src/components/CompilerFooter.astro create mode 100644 doc/src/components/Head.astro create mode 100644 doc/src/components/HeaderLinks.astro create mode 100644 doc/src/components/MarkdownContent.astro rename doc/{docs/.vitepress/theme => src}/components/YueCompiler.vue (81%) mode change 100755 => 100644 create mode 100644 doc/src/content.config.ts rename doc/{ => src/content}/docs/de/doc/advanced/do.md (65%) rename doc/{ => src/content}/docs/de/doc/advanced/line-decorators.md (56%) rename doc/{ => src/content}/docs/de/doc/advanced/macro.md (85%) rename doc/{ => src/content}/docs/de/doc/advanced/the-yuescript-library.md (99%) rename doc/{ => src/content}/docs/de/doc/advanced/try.md (83%) rename doc/{ => src/content}/docs/de/doc/assignment/assignment.md (74%) rename doc/{ => src/content}/docs/de/doc/assignment/destructuring-assignment.md (76%) rename doc/{ => src/content}/docs/de/doc/assignment/if-assignment.md (73%) rename doc/{ => src/content}/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md (80%) rename doc/{ => src/content}/docs/de/doc/assignment/varargs-assignment.md (70%) rename doc/{ => src/content}/docs/de/doc/control-flow/conditionals.md (70%) rename doc/{ => src/content}/docs/de/doc/control-flow/continue.md (67%) rename doc/{ => src/content}/docs/de/doc/control-flow/for-loop.md (74%) rename doc/{ => src/content}/docs/de/doc/control-flow/goto.md (78%) rename doc/{ => src/content}/docs/de/doc/control-flow/switch.md (80%) rename doc/{ => src/content}/docs/de/doc/control-flow/while-loop.md (66%) rename doc/{ => src/content}/docs/de/doc/data-structures/comprehensions.md (73%) rename doc/{ => src/content}/docs/de/doc/data-structures/table-literals.md (70%) rename doc/{ => src/content}/docs/de/doc/extras/license-mit.md (96%) create mode 100644 doc/src/content/docs/de/doc/extras/mascot.md rename doc/{ => src/content}/docs/de/doc/functions/backcalls.md (68%) rename doc/{ => src/content}/docs/de/doc/functions/function-literals.md (77%) rename doc/{ => src/content}/docs/de/doc/functions/function-stubs.md (88%) rename doc/{ => src/content}/docs/de/doc/getting-started/installation.md (95%) rename doc/{ => src/content}/docs/de/doc/getting-started/introduction.md (93%) rename doc/{ => src/content}/docs/de/doc/getting-started/usage.md (98%) rename doc/{ => src/content}/docs/de/doc/index.md (59%) mode change 100755 => 100644 rename doc/{ => src/content}/docs/de/doc/language-basics/attributes.md (63%) rename doc/{ => src/content}/docs/de/doc/language-basics/comment.md (70%) rename doc/{ => src/content}/docs/de/doc/language-basics/literals.md (78%) rename doc/{ => src/content}/docs/de/doc/language-basics/module.md (80%) rename doc/{ => src/content}/docs/de/doc/language-basics/operator.md (80%) rename doc/{ => src/content}/docs/de/doc/language-basics/whitespace.md (79%) rename doc/{ => src/content}/docs/de/doc/objects/object-oriented-programming.md (81%) rename doc/{ => src/content}/docs/de/doc/objects/with-statement.md (74%) create mode 100644 doc/src/content/docs/de/index.md create mode 100644 doc/src/content/docs/de/try/index.md rename doc/{ => src/content}/docs/doc/advanced/do.md (63%) rename doc/{ => src/content}/docs/doc/advanced/line-decorators.md (55%) rename doc/{ => src/content}/docs/doc/advanced/macro.md (86%) rename doc/{ => src/content}/docs/doc/advanced/the-yuescript-library.md (99%) rename doc/{ => src/content}/docs/doc/advanced/try.md (83%) rename doc/{ => src/content}/docs/doc/assignment/assignment.md (74%) rename doc/{ => src/content}/docs/doc/assignment/destructuring-assignment.md (75%) rename doc/{ => src/content}/docs/doc/assignment/if-assignment.md (73%) rename doc/{ => src/content}/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md (79%) rename doc/{ => src/content}/docs/doc/assignment/varargs-assignment.md (70%) rename doc/{ => src/content}/docs/doc/control-flow/conditionals.md (68%) rename doc/{ => src/content}/docs/doc/control-flow/continue.md (66%) rename doc/{ => src/content}/docs/doc/control-flow/for-loop.md (73%) rename doc/{ => src/content}/docs/doc/control-flow/goto.md (76%) rename doc/{ => src/content}/docs/doc/control-flow/switch.md (79%) rename doc/{ => src/content}/docs/doc/control-flow/while-loop.md (65%) rename doc/{ => src/content}/docs/doc/data-structures/comprehensions.md (72%) rename doc/{ => src/content}/docs/doc/data-structures/table-literals.md (68%) rename doc/{ => src/content}/docs/doc/extras/license-mit.md (95%) create mode 100644 doc/src/content/docs/doc/extras/mascot.md rename doc/{ => src/content}/docs/doc/functions/backcalls.md (66%) rename doc/{ => src/content}/docs/doc/functions/function-literals.md (77%) rename doc/{ => src/content}/docs/doc/functions/function-stubs.md (87%) rename doc/{ => src/content}/docs/doc/getting-started/installation.md (94%) rename doc/{ => src/content}/docs/doc/getting-started/introduction.md (92%) rename doc/{ => src/content}/docs/doc/getting-started/usage.md (98%) rename doc/{ => src/content}/docs/doc/index.md (59%) mode change 100755 => 100644 rename doc/{ => src/content}/docs/doc/language-basics/attributes.md (61%) rename doc/{ => src/content}/docs/doc/language-basics/comment.md (68%) rename doc/{ => src/content}/docs/doc/language-basics/literals.md (76%) rename doc/{ => src/content}/docs/doc/language-basics/module.md (79%) rename doc/{ => src/content}/docs/doc/language-basics/operator.md (79%) rename doc/{ => src/content}/docs/doc/language-basics/whitespace.md (77%) rename doc/{ => src/content}/docs/doc/objects/object-oriented-programming.md (80%) rename doc/{ => src/content}/docs/doc/objects/with-statement.md (73%) rename doc/{ => src/content}/docs/id-id/doc/advanced/do.md (64%) rename doc/{ => src/content}/docs/id-id/doc/advanced/line-decorators.md (55%) rename doc/{ => src/content}/docs/id-id/doc/advanced/macro.md (85%) rename doc/{ => src/content}/docs/id-id/doc/advanced/the-yuescript-library.md (99%) rename doc/{ => src/content}/docs/id-id/doc/advanced/try.md (83%) rename doc/{ => src/content}/docs/id-id/doc/assignment/assignment.md (75%) rename doc/{ => src/content}/docs/id-id/doc/assignment/destructuring-assignment.md (75%) rename doc/{ => src/content}/docs/id-id/doc/assignment/if-assignment.md (73%) rename doc/{ => src/content}/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md (79%) rename doc/{ => src/content}/docs/id-id/doc/assignment/varargs-assignment.md (71%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/conditionals.md (70%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/continue.md (66%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/for-loop.md (72%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/goto.md (77%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/switch.md (79%) rename doc/{ => src/content}/docs/id-id/doc/control-flow/while-loop.md (64%) rename doc/{ => src/content}/docs/id-id/doc/data-structures/comprehensions.md (72%) rename doc/{ => src/content}/docs/id-id/doc/data-structures/table-literals.md (68%) rename doc/{ => src/content}/docs/id-id/doc/extras/license-mit.md (96%) create mode 100644 doc/src/content/docs/id-id/doc/extras/mascot.md rename doc/{ => src/content}/docs/id-id/doc/functions/backcalls.md (66%) rename doc/{ => src/content}/docs/id-id/doc/functions/function-literals.md (76%) rename doc/{ => src/content}/docs/id-id/doc/functions/function-stubs.md (88%) rename doc/{ => src/content}/docs/id-id/doc/getting-started/installation.md (95%) rename doc/{ => src/content}/docs/id-id/doc/getting-started/introduction.md (92%) rename doc/{ => src/content}/docs/id-id/doc/getting-started/usage.md (98%) rename doc/{ => src/content}/docs/id-id/doc/index.md (59%) mode change 100755 => 100644 rename doc/{ => src/content}/docs/id-id/doc/language-basics/attributes.md (63%) rename doc/{ => src/content}/docs/id-id/doc/language-basics/comment.md (69%) rename doc/{ => src/content}/docs/id-id/doc/language-basics/literals.md (77%) rename doc/{ => src/content}/docs/id-id/doc/language-basics/module.md (79%) rename doc/{ => src/content}/docs/id-id/doc/language-basics/operator.md (79%) rename doc/{ => src/content}/docs/id-id/doc/language-basics/whitespace.md (78%) rename doc/{ => src/content}/docs/id-id/doc/objects/object-oriented-programming.md (80%) rename doc/{ => src/content}/docs/id-id/doc/objects/with-statement.md (74%) create mode 100644 doc/src/content/docs/id-id/index.md create mode 100644 doc/src/content/docs/id-id/try/index.md create mode 100644 doc/src/content/docs/index.md rename doc/{ => src/content}/docs/pt-br/doc/advanced/do.md (64%) rename doc/{ => src/content}/docs/pt-br/doc/advanced/line-decorators.md (55%) rename doc/{ => src/content}/docs/pt-br/doc/advanced/macro.md (85%) rename doc/{ => src/content}/docs/pt-br/doc/advanced/the-yuescript-library.md (99%) rename doc/{ => src/content}/docs/pt-br/doc/advanced/try.md (83%) rename doc/{ => src/content}/docs/pt-br/doc/assignment/assignment.md (75%) rename doc/{ => src/content}/docs/pt-br/doc/assignment/destructuring-assignment.md (75%) rename doc/{ => src/content}/docs/pt-br/doc/assignment/if-assignment.md (74%) rename doc/{ => src/content}/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md (80%) rename doc/{ => src/content}/docs/pt-br/doc/assignment/varargs-assignment.md (70%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/conditionals.md (69%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/continue.md (67%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/for-loop.md (74%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/goto.md (77%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/switch.md (80%) rename doc/{ => src/content}/docs/pt-br/doc/control-flow/while-loop.md (64%) rename doc/{ => src/content}/docs/pt-br/doc/data-structures/comprehensions.md (72%) rename doc/{ => src/content}/docs/pt-br/doc/data-structures/table-literals.md (69%) rename doc/{ => src/content}/docs/pt-br/doc/extras/license-mit.md (95%) create mode 100644 doc/src/content/docs/pt-br/doc/extras/mascot.md rename doc/{ => src/content}/docs/pt-br/doc/functions/backcalls.md (67%) rename doc/{ => src/content}/docs/pt-br/doc/functions/function-literals.md (77%) rename doc/{ => src/content}/docs/pt-br/doc/functions/function-stubs.md (88%) rename doc/{ => src/content}/docs/pt-br/doc/getting-started/installation.md (95%) rename doc/{ => src/content}/docs/pt-br/doc/getting-started/introduction.md (93%) rename doc/{ => src/content}/docs/pt-br/doc/getting-started/usage.md (99%) rename doc/{ => src/content}/docs/pt-br/doc/index.md (60%) mode change 100755 => 100644 rename doc/{ => src/content}/docs/pt-br/doc/language-basics/attributes.md (63%) rename doc/{ => src/content}/docs/pt-br/doc/language-basics/comment.md (70%) rename doc/{ => src/content}/docs/pt-br/doc/language-basics/literals.md (78%) rename doc/{ => src/content}/docs/pt-br/doc/language-basics/module.md (80%) rename doc/{ => src/content}/docs/pt-br/doc/language-basics/operator.md (79%) rename doc/{ => src/content}/docs/pt-br/doc/language-basics/whitespace.md (79%) rename doc/{ => src/content}/docs/pt-br/doc/objects/object-oriented-programming.md (81%) rename doc/{ => src/content}/docs/pt-br/doc/objects/with-statement.md (74%) create mode 100644 doc/src/content/docs/pt-br/index.md create mode 100644 doc/src/content/docs/pt-br/try/index.md create mode 100644 doc/src/content/docs/try/index.md rename doc/{ => src/content}/docs/zh/doc/advanced/do.md (64%) rename doc/{ => src/content}/docs/zh/doc/advanced/line-decorators.md (57%) rename doc/{ => src/content}/docs/zh/doc/advanced/macro.md (85%) rename doc/{ => src/content}/docs/zh/doc/advanced/the-yuescript-library.md (99%) rename doc/{ => src/content}/docs/zh/doc/advanced/try.md (82%) rename doc/{ => src/content}/docs/zh/doc/assignment/assignment.md (75%) rename doc/{ => src/content}/docs/zh/doc/assignment/destructuring-assignment.md (75%) rename doc/{ => src/content}/docs/zh/doc/assignment/if-assignment.md (73%) rename doc/{ => src/content}/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md (81%) rename doc/{ => src/content}/docs/zh/doc/assignment/varargs-assignment.md (71%) rename doc/{ => src/content}/docs/zh/doc/control-flow/conditionals.md (69%) rename doc/{ => src/content}/docs/zh/doc/control-flow/continue.md (66%) rename doc/{ => src/content}/docs/zh/doc/control-flow/for-loop.md (73%) rename doc/{ => src/content}/docs/zh/doc/control-flow/goto.md (75%) rename doc/{ => src/content}/docs/zh/doc/control-flow/switch.md (80%) rename doc/{ => src/content}/docs/zh/doc/control-flow/while-loop.md (66%) rename doc/{ => src/content}/docs/zh/doc/data-structures/comprehensions.md (72%) rename doc/{ => src/content}/docs/zh/doc/data-structures/table-literals.md (69%) rename doc/{ => src/content}/docs/zh/doc/extras/license-mit.md (94%) create mode 100644 doc/src/content/docs/zh/doc/extras/mascot.md rename doc/{ => src/content}/docs/zh/doc/functions/backcalls.md (68%) rename doc/{ => src/content}/docs/zh/doc/functions/function-literals.md (76%) rename doc/{ => src/content}/docs/zh/doc/functions/function-stubs.md (88%) rename doc/{ => src/content}/docs/zh/doc/getting-started/installation.md (95%) rename doc/{ => src/content}/docs/zh/doc/getting-started/introduction.md (92%) rename doc/{ => src/content}/docs/zh/doc/getting-started/usage.md (98%) rename doc/{ => src/content}/docs/zh/doc/index.md (59%) mode change 100755 => 100644 rename doc/{ => src/content}/docs/zh/doc/language-basics/attributes.md (64%) rename doc/{ => src/content}/docs/zh/doc/language-basics/comment.md (69%) rename doc/{ => src/content}/docs/zh/doc/language-basics/literals.md (76%) rename doc/{ => src/content}/docs/zh/doc/language-basics/module.md (80%) rename doc/{ => src/content}/docs/zh/doc/language-basics/operator.md (79%) rename doc/{ => src/content}/docs/zh/doc/language-basics/whitespace.md (77%) rename doc/{ => src/content}/docs/zh/doc/objects/object-oriented-programming.md (81%) rename doc/{ => src/content}/docs/zh/doc/objects/with-statement.md (73%) create mode 100644 doc/src/content/docs/zh/index.md create mode 100644 doc/src/content/docs/zh/try/index.md rename doc/{docs/.vitepress => src}/grammars/yuescript.tmLanguage.json (100%) create mode 100644 doc/src/locales.mjs create mode 100644 doc/src/pages/[...locale]/all-in-one.astro create mode 100644 doc/src/styles/custom.css delete mode 100644 doc/yue-de.md delete mode 100644 doc/yue-en.md delete mode 100644 doc/yue-id-id.md delete mode 100644 doc/yue-pt-br.md delete mode 100644 doc/yue-zh.md diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 9768ad69..7d01c477 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -65,7 +65,7 @@ jobs: - name: Upload artifact uses: actions/upload-pages-artifact@v4 with: - path: 'doc/docs/.vitepress/dist' + path: 'doc/dist' - name: Deploy to GitHub Pages id: deployment diff --git a/README.md b/README.md index 567caf41..1f5e803a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@
- YueScript logo
+ YueScript logo
A delightful language that compiles to Lua
@@ -18,7 +18,7 @@

- Xiaoyu, the YueScript mascot + Xiaoyu, the YueScript mascot

diff --git a/doc/.gitignore b/doc/.gitignore index 4dd6f633..980ebb49 100755 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -10,5 +10,9 @@ dist .basement config.local.js basement_dist -docs/.vitepress/public/js/yuescript.js -docs/.vitepress/public/js/yuescript.wasm +public/js/yuescript.js +public/js/yuescript.wasm +.astro/ +.agents/ +.fallow/ +skills-lock.json \ No newline at end of file diff --git a/doc/README.md b/doc/README.md index aeae4970..e32bf9fe 100755 --- a/doc/README.md +++ b/doc/README.md @@ -5,9 +5,24 @@ ## Development ```bash +pnpm install pnpm run dev +pnpm run check pnpm run build +pnpm run test:docs pnpm run preview ``` -For more details, please head to VitePress's [documentation](https://vitepress.dev/). +Documentation lives in `src/content/docs/`. Each Markdown or MDX file creates +its existing route. Each language has an aggregate page, at `/all-in-one/` for +English and `//all-in-one/` for translations. Each page renders that +language's collection, excluding splash home pages, in `sidebar.order` order, +with the entry ID as a tie-breaker. +Each section and heading has a unique anchor. + +The site uses [Starlight](https://starlight.astro.build/)'s default theme. +Navigation and locale settings are in `astro.config.mjs`. Set `DOCS_BASE` when +deploying beneath a subpath. Production files are written to `dist/`. + +Run `make wasm` from the repository root to build the browser compiler into +`public/js/`. Without those generated files, the compiler shows the build command. diff --git a/doc/astro.config.mjs b/doc/astro.config.mjs new file mode 100644 index 00000000..a8e33166 --- /dev/null +++ b/doc/astro.config.mjs @@ -0,0 +1,301 @@ +import { readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs"; +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; +import vue from "@astrojs/vue"; +import { locales, allInOneLabels } from "./src/locales.mjs"; + +const grammar = JSON.parse( + readFileSync( + new URL("./src/grammars/yuescript.tmLanguage.json", import.meta.url), + "utf8", + ), +); +// Keep links to VitePress's HTML files working after switching to clean routes. +const redirects = Object.fromEntries( + readdirSync(new URL("./src/content/docs/", import.meta.url), { + recursive: true, + }) + .filter((file) => /\.mdx?$/.test(file) && !/(^|\/)index\.mdx?$/.test(file)) + .map((file) => { + const slug = file.replace(/\.mdx?$/, ""); + return [`/${slug}.html`, `/${slug}/`]; + }), +); + +export default defineConfig({ + site: "https://yuescript.org", + base: process.env.DOCS_BASE ?? "/", + trailingSlash: "always", + redirects, + integrations: [ + { + name: "legacy-html-redirects", + hooks: { + "astro:build:done": ({ dir }) => { + // Astro's directory format puts redirect files in *.html/index.html. + // VitePress links need a file at the original *.html URL. + for (const route of Object.keys(redirects)) { + const output = new URL(route.slice(1), dir); + const html = readFileSync( + new URL(`${route.slice(1)}/index.html`, dir), + ); + rmSync(output, { recursive: true }); + writeFileSync(output, html); + } + }, + }, + }, + vue(), + starlight({ + title: "YueScript", + logo: { src: "./public/image/yuescript.svg", alt: "" }, + description: "A delightful language that compiles to Lua", + favicon: "/favicon.ico", + locales, + customCss: ["./src/styles/custom.css"], + social: [ + { + icon: "github", + label: "GitHub", + href: "https://github.com/IppClub/YueScript", + }, + { + icon: "discord", + label: "Discord", + href: "https://discord.gg/cRJ2VAm2NV", + }, + ], + sidebar: [ + { + slug: "doc", + }, + { + slug: "try", + }, + { + label: "Getting Started", + translations: { + "id-ID": "Memulai", + "de-DE": "Erste Schritte", + "pt-BR": "Primeiros passos", + "zh-CN": "起步", + }, + items: [ + { + slug: "doc/getting-started/introduction", + }, + { + slug: "doc/getting-started/installation", + }, + { + slug: "doc/getting-started/usage", + }, + ], + }, + { + label: "Language Basics", + translations: { + "id-ID": "Dasar-dasar Bahasa", + "de-DE": "Sprachgrundlagen", + "pt-BR": "Fundamentos da linguagem", + "zh-CN": "语言基础", + }, + collapsed: true, + items: [ + { + slug: "doc/language-basics/whitespace", + }, + { + slug: "doc/language-basics/comment", + }, + { + slug: "doc/language-basics/literals", + }, + { + slug: "doc/language-basics/operator", + }, + { + slug: "doc/language-basics/attributes", + }, + { + slug: "doc/language-basics/module", + }, + ], + }, + { + label: "Assignment", + translations: { + "id-ID": "Penugasan", + "de-DE": "Zuweisung", + "pt-BR": "Atribuição", + "zh-CN": "赋值", + }, + collapsed: true, + items: [ + { + slug: "doc/assignment/assignment", + }, + { + slug: "doc/assignment/destructuring-assignment", + }, + { + slug: "doc/assignment/if-assignment", + }, + { + slug: "doc/assignment/varargs-assignment", + }, + { + slug: "doc/assignment/the-using-clause-controlling-destructive-assignment", + }, + ], + }, + { + label: "Functions", + translations: { + "id-ID": "Fungsi", + "de-DE": "Funktionen", + "pt-BR": "Funções", + "zh-CN": "函数", + }, + collapsed: true, + items: [ + { + slug: "doc/functions/function-literals", + }, + { + slug: "doc/functions/backcalls", + }, + { + slug: "doc/functions/function-stubs", + }, + ], + }, + { + label: "Control Flow", + translations: { + "id-ID": "Alur Kontrol", + "de-DE": "Kontrollfluss", + "pt-BR": "Controle de fluxo", + "zh-CN": "控制流", + }, + collapsed: true, + items: [ + { + slug: "doc/control-flow/conditionals", + }, + { + slug: "doc/control-flow/for-loop", + }, + { + slug: "doc/control-flow/while-loop", + }, + { + slug: "doc/control-flow/continue", + }, + { + slug: "doc/control-flow/goto", + }, + { + slug: "doc/control-flow/switch", + }, + ], + }, + { + label: "Data Structures", + translations: { + "id-ID": "Struktur Data", + "de-DE": "Datenstrukturen", + "pt-BR": "Estruturas de dados", + "zh-CN": "数据结构", + }, + collapsed: true, + items: [ + { + slug: "doc/data-structures/table-literals", + }, + { + slug: "doc/data-structures/comprehensions", + }, + ], + }, + { + label: "Objects", + translations: { + "id-ID": "Objek", + "de-DE": "Objekte", + "pt-BR": "Objetos", + "zh-CN": "面向对象", + }, + collapsed: true, + items: [ + { + slug: "doc/objects/object-oriented-programming", + }, + { + slug: "doc/objects/with-statement", + }, + ], + }, + { + label: "Advanced Features", + translations: { + "id-ID": "Fitur Lanjutan", + "de-DE": "Erweiterte Funktionen", + "pt-BR": "Recursos avançados", + "zh-CN": "高级特性", + }, + collapsed: true, + items: [ + { + slug: "doc/advanced/macro", + }, + { + slug: "doc/advanced/line-decorators", + }, + { + slug: "doc/advanced/do", + }, + { + slug: "doc/advanced/try", + }, + { + slug: "doc/advanced/the-yuescript-library", + }, + ], + }, + { + label: "Extras", + translations: { + "id-ID": "Ekstra", + "de-DE": "Extras", + "pt-BR": "Extras", + "zh-CN": "其他", + }, + collapsed: true, + items: [ + { + slug: "doc/extras/mascot", + }, + { + slug: "doc/extras/license-mit", + }, + ], + }, + { + label: allInOneLabels["en-US"], + translations: allInOneLabels, + link: "/all-in-one/", + }, + ], + expressiveCode: { + shiki: { langs: [{ ...grammar, name: "yuescript", aliases: ["yue"] }] }, + }, + components: { + Head: "./src/components/Head.astro", + MarkdownContent: "./src/components/MarkdownContent.astro", + Footer: "./src/components/CompilerFooter.astro", + SocialIcons: "./src/components/HeaderLinks.astro", + }, + }), + ], +}); diff --git a/doc/docs/.vitepress/config.mts b/doc/docs/.vitepress/config.mts deleted file mode 100644 index 5dfb7411..00000000 --- a/doc/docs/.vitepress/config.mts +++ /dev/null @@ -1,627 +0,0 @@ -import { readFileSync } from "fs"; -import { dirname, resolve } from "path"; -import { fileURLToPath } from "url"; -import { defineConfig } from "vitepress"; - -import darkPlus from "@shikijs/themes/dark-plus"; -import lightPlus from "@shikijs/themes/light-plus"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const yuescriptGrammarPath = resolve( - __dirname, - "grammars/yuescript.tmLanguage.json", -); -const yuescriptGrammar = JSON.parse( - readFileSync(yuescriptGrammarPath, "utf-8"), -); -const yuescriptLanguage = { - ...yuescriptGrammar, - name: "yuescript", - scopeName: "source.yuescript", - aliases: ["yue"], -}; - -const docsBase = process.env.DOCS_BASE ?? "/"; - -function withBase(path: string) { - if (!path.startsWith("/") || docsBase === "/") { - return path; - } - return `${docsBase.replace(/\/$/, "")}${path}`; -} - -const sidebarText = { - de: { - introduction: "Einführung", - installation: "Installation", - usage: "Verwendung", - macro: "Makro", - operator: "Operatoren", - module: "Modul", - assignment: "Zuweisung", - destructuringAssignment: "Destrukturierende Zuweisung", - ifAssignment: "If-Zuweisung", - varargsAssignment: "Varargs-Zuweisung", - whitespace: "Leerraum", - comment: "Kommentare", - try: "Try/Catch", - attributes: "Attribute", - literals: "Literale", - functionLiterals: "Funktionsliterale", - backcalls: "Backcalls", - tableLiterals: "Tabellenliterale", - comprehensions: "Comprehensions", - forLoop: "For-Schleife", - whileLoop: "While-Schleife", - continueStatement: "Continue-Anweisung", - conditionals: "Bedingungen", - gotoStatement: "Goto und Labels", - lineDecorators: "Zeilen-Dekoratoren", - switch: "Switch", - objectOrientedProgramming: "Objektorientierte Programmierung", - withStatement: "With-Anweisung", - do: "Do", - functionStubs: "Funktions-Stubs", - usingClause: "Die Using-Klausel; Kontrolle destruktiver Zuweisung", - yuescriptLibrary: "Die YueScript-Bibliothek", - mascot: "Maskottchen – Xiaoyu", - licenseMit: "Lizenz: MIT", - }, - en: { - introduction: "Introduction", - installation: "Installation", - usage: "Usage", - macro: "Macro", - operator: "Operator", - module: "Module", - assignment: "Assignment", - destructuringAssignment: "Destructuring Assignment", - ifAssignment: "If Assignment", - varargsAssignment: "Varargs Assignment", - whitespace: "Whitespace", - comment: "Comment", - try: "Try", - attributes: "Attributes", - literals: "Literals", - functionLiterals: "Function Literals", - backcalls: "Backcalls", - tableLiterals: "Table Literals", - comprehensions: "Comprehensions", - forLoop: "For Loop", - whileLoop: "While Loop", - continueStatement: "Continue Statement", - conditionals: "Conditionals", - gotoStatement: "Goto and Labels", - lineDecorators: "Line Decorators", - switch: "Switch", - objectOrientedProgramming: "Object Oriented Programming", - withStatement: "With Statement", - do: "Do", - functionStubs: "Function Stubs", - usingClause: "The Using Clause; Controlling Destructive Assignment", - yuescriptLibrary: "The YueScript Library", - mascot: "Mascot - Xiaoyu", - licenseMit: "License: MIT", - }, - idId: { - introduction: "Pendahuluan", - installation: "Instalasi", - usage: "Penggunaan", - macro: "Makro", - operator: "Operator", - module: "Modul", - assignment: "Penugasan", - destructuringAssignment: "Penugasan Destrukturisasi", - ifAssignment: "Penugasan If", - varargsAssignment: "Penugasan Varargs", - whitespace: "Spasi Kosong", - comment: "Komentar", - try: "Coba", - attributes: "Atribut", - literals: "Literal", - functionLiterals: "Literal Fungsi", - backcalls: "Pemanggilan Mundur", - tableLiterals: "Literal Tabel", - comprehensions: "Kompresi", - forLoop: "Perulangan For", - whileLoop: "Perulangan While", - continueStatement: "Pernyataan Lanjutkan", - conditionals: "Percabangan", - gotoStatement: "Goto dan Label", - lineDecorators: "Dekorator Baris", - switch: "Switch", - objectOrientedProgramming: "Pemrograman Berorientasi Objek", - withStatement: "Pernyataan With", - do: "Do", - functionStubs: "Fungsi Sementara", - usingClause: "Klausa Using; Mengontrol Penugasan Destruktif", - yuescriptLibrary: "Pustaka YueScript", - mascot: "Maskot – Xiaoyu", - licenseMit: "Lisensi: MIT", - }, - ptBr: { - introduction: "Introdução", - installation: "Instalação", - usage: "Uso", - macro: "Macro", - operator: "Operadores", - module: "Módulo", - assignment: "Atribuição", - destructuringAssignment: "Atribuição com desestruturação", - ifAssignment: "Atribuição com if", - varargsAssignment: "Atribuição de varargs", - whitespace: "Espaços em branco", - comment: "Comentários", - try: "Try/Catch", - attributes: "Atributos", - literals: "Literais", - functionLiterals: "Literais de função", - backcalls: "Backcalls", - tableLiterals: "Literais de tabela", - comprehensions: "Compreensões", - forLoop: "Laço for", - whileLoop: "Laço while", - continueStatement: "Instrução continue", - conditionals: "Condicionais", - gotoStatement: "Goto e Rótulos", - lineDecorators: "Decoradores de linha", - switch: "Switch", - objectOrientedProgramming: "Programação orientada a objetos", - withStatement: "Instrução with", - do: "Do", - functionStubs: "Stubs de função", - usingClause: "Cláusula using; controlando atribuição destrutiva", - yuescriptLibrary: "A biblioteca do YueScript", - mascot: "Mascote – Xiaoyu", - licenseMit: "Licença: MIT", - }, - zh: { - introduction: "介绍", - installation: "安装", - usage: "使用方法", - macro: "宏", - operator: "操作符", - module: "模块", - assignment: "赋值", - destructuringAssignment: "解构赋值", - ifAssignment: "if 赋值", - varargsAssignment: "可变参数赋值", - whitespace: "空白", - comment: "注释", - try: "错误处理", - attributes: "属性", - literals: "字面量", - functionLiterals: "函数字面量", - backcalls: "反向回调", - tableLiterals: "表格字面量", - comprehensions: "推导式", - forLoop: "for 循环", - whileLoop: "while 循环", - continueStatement: "continue 语句", - conditionals: "条件语句", - gotoStatement: "goto 语句与标签", - lineDecorators: "代码行修饰符", - switch: "switch 语句", - objectOrientedProgramming: "面向对象编程", - withStatement: "with 语句", - do: "do 语句", - functionStubs: "函数存根", - usingClause: "使用 using 语句:防止破坏性赋值", - yuescriptLibrary: "月之脚本语言库", - mascot: "吉祥物 – 小玉", - licenseMit: "MIT 许可证", - }, -} as const; - -type SidebarLocale = keyof typeof sidebarText; - -type SidebarGroupText = { - gettingStarted: string; - languageBasics: string; - assignment: string; - functions: string; - controlFlow: string; - dataStructures: string; - objects: string; - advancedFeatures: string; - extras: string; -}; - -const sidebarGroups: Record = { - de: { - gettingStarted: "Erste Schritte", - languageBasics: "Sprachgrundlagen", - assignment: "Zuweisung", - functions: "Funktionen", - controlFlow: "Kontrollfluss", - dataStructures: "Datenstrukturen", - objects: "Objekte", - advancedFeatures: "Erweiterte Funktionen", - extras: "Extras", - }, - en: { - gettingStarted: "Getting Started", - languageBasics: "Language Basics", - assignment: "Assignment", - functions: "Functions", - controlFlow: "Control Flow", - dataStructures: "Data Structures", - objects: "Objects", - advancedFeatures: "Advanced Features", - extras: "Extras", - }, - idId: { - gettingStarted: "Memulai", - languageBasics: "Dasar-dasar Bahasa", - assignment: "Penugasan", - functions: "Fungsi", - controlFlow: "Alur Kontrol", - dataStructures: "Struktur Data", - objects: "Objek", - advancedFeatures: "Fitur Lanjutan", - extras: "Ekstra", - }, - ptBr: { - gettingStarted: "Primeiros passos", - languageBasics: "Fundamentos da linguagem", - assignment: "Atribuição", - functions: "Funções", - controlFlow: "Controle de fluxo", - dataStructures: "Estruturas de dados", - objects: "Objetos", - advancedFeatures: "Recursos avançados", - extras: "Extras", - }, - zh: { - gettingStarted: "起步", - languageBasics: "语言基础", - assignment: "赋值", - functions: "函数", - controlFlow: "控制流", - dataStructures: "数据结构", - objects: "面向对象", - advancedFeatures: "高级特性", - extras: "其他", - }, -}; - -function createSidebar(basePath: string, locale: SidebarLocale) { - const text = sidebarText[locale]; - const group = sidebarGroups[locale]; - return [ - { - text: group.gettingStarted, - items: [ - { - text: text.introduction, - link: `${basePath}/getting-started/introduction`, - }, - { - text: text.installation, - link: `${basePath}/getting-started/installation`, - }, - { text: text.usage, link: `${basePath}/getting-started/usage` }, - ], - }, - { - text: group.languageBasics, - collapsed: true, - items: [ - { - text: text.whitespace, - link: `${basePath}/language-basics/whitespace`, - }, - { text: text.comment, link: `${basePath}/language-basics/comment` }, - { text: text.literals, link: `${basePath}/language-basics/literals` }, - { text: text.operator, link: `${basePath}/language-basics/operator` }, - { - text: text.attributes, - link: `${basePath}/language-basics/attributes`, - }, - { text: text.module, link: `${basePath}/language-basics/module` }, - ], - }, - { - text: group.assignment, - collapsed: true, - items: [ - { text: text.assignment, link: `${basePath}/assignment/assignment` }, - { - text: text.destructuringAssignment, - link: `${basePath}/assignment/destructuring-assignment`, - }, - { - text: text.ifAssignment, - link: `${basePath}/assignment/if-assignment`, - }, - { - text: text.varargsAssignment, - link: `${basePath}/assignment/varargs-assignment`, - }, - { - text: text.usingClause, - link: `${basePath}/assignment/the-using-clause-controlling-destructive-assignment`, - }, - ], - }, - { - text: group.functions, - collapsed: true, - items: [ - { - text: text.functionLiterals, - link: `${basePath}/functions/function-literals`, - }, - { text: text.backcalls, link: `${basePath}/functions/backcalls` }, - { - text: text.functionStubs, - link: `${basePath}/functions/function-stubs`, - }, - ], - }, - { - text: group.controlFlow, - collapsed: true, - items: [ - { - text: text.conditionals, - link: `${basePath}/control-flow/conditionals`, - }, - { text: text.forLoop, link: `${basePath}/control-flow/for-loop` }, - { text: text.whileLoop, link: `${basePath}/control-flow/while-loop` }, - { - text: text.continueStatement, - link: `${basePath}/control-flow/continue`, - }, - { - text: text.gotoStatement, - link: `${basePath}/control-flow/goto`, - }, - { text: text.switch, link: `${basePath}/control-flow/switch` }, - ], - }, - { - text: group.dataStructures, - collapsed: true, - items: [ - { - text: text.tableLiterals, - link: `${basePath}/data-structures/table-literals`, - }, - { - text: text.comprehensions, - link: `${basePath}/data-structures/comprehensions`, - }, - ], - }, - { - text: group.objects, - collapsed: true, - items: [ - { - text: text.objectOrientedProgramming, - link: `${basePath}/objects/object-oriented-programming`, - }, - { - text: text.withStatement, - link: `${basePath}/objects/with-statement`, - }, - ], - }, - { - text: group.advancedFeatures, - collapsed: true, - items: [ - { text: text.macro, link: `${basePath}/advanced/macro` }, - { - text: text.lineDecorators, - link: `${basePath}/advanced/line-decorators`, - }, - { text: text.do, link: `${basePath}/advanced/do` }, - { text: text.try, link: `${basePath}/advanced/try` }, - { - text: text.yuescriptLibrary, - link: `${basePath}/advanced/the-yuescript-library`, - }, - ], - }, - { - text: group.extras, - collapsed: true, - items: [ - { text: text.mascot, link: `${basePath}/extras/mascot` }, - { text: text.licenseMit, link: `${basePath}/extras/license-mit` }, - ], - }, - ]; -} - -export default defineConfig({ - title: "YueScript", - description: "A delightful language that compiles to Lua", - base: docsBase, - head: [ - ["meta", { name: "theme-color", content: "#b4ac8f" }], - ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }], - [ - "meta", - { name: "apple-mobile-web-app-status-bar-style", content: "black" }, - ], - ["meta", { property: "og:title", content: "YueScript" }], - [ - "meta", - { - property: "og:description", - content: "A delightful language that compiles to Lua", - }, - ], - ["meta", { property: "og:type", content: "website" }], - [ - "meta", - { property: "og:image", content: withBase("/image/yuescript.png") }, - ], - [ - "meta", - { - property: "og:image:secure_url", - content: withBase("/image/yuescript.png"), - }, - ], - ["meta", { property: "og:image:type", content: "image/png" }], - ["meta", { property: "og:image:width", content: "1200" }], - ["meta", { property: "og:image:height", content: "1200" }], - [ - "link", - { - rel: "icon", - href: withBase("/image/favicon/favicon-16x16.png"), - sizes: "16x16", - type: "image/png", - }, - ], - [ - "link", - { - rel: "icon", - href: withBase("/image/favicon/favicon-32x32.png"), - sizes: "32x32", - type: "image/png", - }, - ], - [ - "link", - { - rel: "apple-touch-icon", - href: withBase("/image/favicon/apple-touch-icon.png"), - sizes: "180x180", - type: "image/png", - }, - ], - [ - "link", - { - rel: "android-chrome", - href: withBase("/image/favicon/android-chrome-192x192.png"), - sizes: "192x192", - type: "image/png", - }, - ], - [ - "link", - { - rel: "android-chrome", - href: withBase("/image/favicon/android-chrome-512x512.png"), - sizes: "512x512", - type: "image/png", - }, - ], - ["script", {}, "window.global = window;"], - [ - "script", - {}, - `var Module = { - onRuntimeInitialized: function() { - window.yue = Module; - window.dispatchEvent(new Event('yue:ready')); - } -}; -(function() { - function loadStub() { - window.yue = { - version: function() { return '(build with: make wasm)'; }, - tolua: function() { return ['', 'Build yuescript wasm with: make wasm']; }, - exec: function() { return ''; } - }; - window.dispatchEvent(new Event('yue:ready')); - } - var s = document.createElement('script'); - s.src = '${withBase("/js/yuescript.js")}'; - s.async = true; - s.onerror = loadStub; - document.head.appendChild(s); -})();`, - ], - ], - vite: { - publicDir: resolve(__dirname, "public"), - }, - markdown: { - languages: [yuescriptLanguage], - theme: { - light: lightPlus, - dark: darkPlus, - }, - }, - locales: { - root: { - label: "English", - lang: "en-US", - description: "A delightful language that compiles to Lua", - themeConfig: { - nav: [ - { text: "Documentation", link: "/doc/" }, - { text: "Try yue!", link: "/try/" }, - { text: "GitHub", link: "https://github.com/IppClub/Yuescript" }, - ], - sidebar: createSidebar("/doc", "en"), - }, - }, - "id-id": { - label: "Bahasa Indonesia", - lang: "id-ID", - description: "Bahasa menyenangkan yang dikompilasi ke Lua", - themeConfig: { - nav: [ - { text: "Dokumentasi", link: "/id-id/doc/" }, - { text: "Coba Yue!", link: "/id-id/try/" }, - { text: "GitHub", link: "https://github.com/IppClub/Yuescript" }, - ], - sidebar: createSidebar("/id-id/doc", "idId"), - }, - }, - de: { - label: "Deutsch", - lang: "de-DE", - description: "Eine wunderbare Sprache, die zu Lua kompiliert", - themeConfig: { - nav: [ - { text: "Dokumentation", link: "/de/doc/" }, - { text: "Yue ausprobieren!", link: "/de/try/" }, - { text: "GitHub", link: "https://github.com/IppClub/Yuescript" }, - ], - sidebar: createSidebar("/de/doc", "de"), - }, - }, - "pt-br": { - label: "Português (Brasil)", - lang: "pt-BR", - description: "Uma linguagem encantadora que compila para Lua", - themeConfig: { - nav: [ - { text: "Documentação", link: "/pt-br/doc/" }, - { text: "Experimente Yue!", link: "/pt-br/try/" }, - { text: "GitHub", link: "https://github.com/IppClub/Yuescript" }, - ], - sidebar: createSidebar("/pt-br/doc", "ptBr"), - }, - }, - zh: { - label: "简体中文", - lang: "zh-CN", - description: "一门令人愉悦且可编译为 Lua 的语言", - themeConfig: { - nav: [ - { text: "文档", link: "/zh/doc/" }, - { text: "试一试!", link: "/zh/try/" }, - { text: "GitHub", link: "https://github.com/IppClub/Yuescript" }, - ], - sidebar: createSidebar("/zh/doc", "zh"), - }, - }, - }, - themeConfig: { - search: { - provider: "local", - }, - }, -}); diff --git a/doc/docs/.vitepress/env.d.ts b/doc/docs/.vitepress/env.d.ts deleted file mode 100644 index f01ea51f..00000000 --- a/doc/docs/.vitepress/env.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -/// - -declare module "*.vue" { - import type { DefineComponent } from "vue"; - const component: DefineComponent<{}, {}, any>; - export default component; -} - -declare global { - interface Window { - yue?: { - version: () => string; - tolua: (code: string, ...args: unknown[]) => [string, string]; - exec: (code: string) => string; - }; - } -} - -export {}; diff --git a/doc/docs/.vitepress/theme/components/CompilerModal.vue b/doc/docs/.vitepress/theme/components/CompilerModal.vue deleted file mode 100755 index 62fcd955..00000000 --- a/doc/docs/.vitepress/theme/components/CompilerModal.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/doc/docs/.vitepress/theme/components/HomeFooter.vue b/doc/docs/.vitepress/theme/components/HomeFooter.vue deleted file mode 100644 index 640b4a7e..00000000 --- a/doc/docs/.vitepress/theme/components/HomeFooter.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/doc/docs/.vitepress/theme/components/YueDisplay.vue b/doc/docs/.vitepress/theme/components/YueDisplay.vue deleted file mode 100755 index 56e57deb..00000000 --- a/doc/docs/.vitepress/theme/components/YueDisplay.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/doc/docs/.vitepress/theme/components/prism-manual.js b/doc/docs/.vitepress/theme/components/prism-manual.js deleted file mode 100644 index 076dcf37..00000000 --- a/doc/docs/.vitepress/theme/components/prism-manual.js +++ /dev/null @@ -1,6 +0,0 @@ -if (typeof window !== "undefined") { - // Prevent Prism from auto-highlighting every code block on page load. - // We only want explicit highlight() calls inside YueCompiler. - window.Prism = window.Prism || {}; - window.Prism.manual = true; -} diff --git a/doc/docs/.vitepress/theme/custom.css b/doc/docs/.vitepress/theme/custom.css deleted file mode 100644 index 7e3a04b0..00000000 --- a/doc/docs/.vitepress/theme/custom.css +++ /dev/null @@ -1,244 +0,0 @@ -@import "@fontsource/merriweather/400.css"; -@import "@fontsource/merriweather/700.css"; -@import "@fontsource/merriweather/900.css"; -@import "@fontsource/merriweather/400-italic.css"; -@import "@fontsource/merriweather/700-italic.css"; -@import "@fontsource/merriweather/900-italic.css"; - -@import "@fontsource/noto-serif-sc/400.css"; -@import "@fontsource/noto-serif-sc/700.css"; -@import "@fontsource/noto-serif-sc/900.css"; - -:root { - /* --- TYPOGRAPHY --- */ - /* Keep standard sans-serif for body text for readability */ - --vp-font-family-base: system-ui, sans-serif; - --vp-font-family-mono: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", - "Courier New", monospace; - - /* --- BRAND COLORS (Original Moon Gold) --- */ - --vp-c-brand-1: #b4ac8f; - --vp-button-brand-bg: #b4ac8f; - --vp-button-brand-hover-bg: #b4ac8f; - --vp-button-brand-active-bg: #b4ac8f; - --vp-button-brand-border: #b4ac8f; - --vp-button-brand-hover-border: #b4ac8f; - --vp-button-brand-active-border: #b4ac8f; - --vp-button-brand-text: #fff; - - /* --- LIGHT MODE THEME --- */ - /* A warmer, "creamy" paper feel instead of harsh white */ - --vp-c-bg: #fdfbf7; - --vp-c-bg-soft: #f7f5f0; - - /* Slightly darker for sidebars */ - --vp-c-bg-alt: #f0ede5; - - /* Text Colors: Deep Navy instead of pure black for softer contrast */ - --vp-c-text-1: #1a202c; - --vp-c-text-2: #4a5568; -} - -/* Hero image - adjust container to fit mascot artwork without overflow */ -@media (min-width: 960px) { - .VPHero .image-container { - width: 420px !important; - } - - .VPHero .image-src { - margin-top: 2.7rem !important; - padding-bottom: 2.7rem !important; - } -} - -@media (max-width: 960px) { - .VPHero .image-src { - margin-top: 1rem !important; - padding-bottom: 3.2rem !important; - } -} - -@media (max-width: 639px) { - .VPHero .image-src { - margin-top: 3.2rem !important; - padding-bottom: 7.4rem !important; - } -} - -.VPHero .image-src { - max-width: 420px; - max-height: 360px; - object-fit: contain; -} - -/* --- DARK MODE THEME (Midnight Blue) --- */ -.dark { - /* Deep Midnight Blue background (replaces standard grey) */ - --vp-c-bg: #0b0e14; - --vp-c-bg-soft: #131722; - - /* Sidebar/Nav */ - --vp-c-bg-alt: #1a1f2e; - - /* Text Colors: Moonlight Silver */ - --vp-c-text-1: #e2e8f0; - --vp-c-text-2: #94a3b8; - - /* Adjust border colors to blend with blue, not grey */ - --vp-c-border: #1e293b; - --vp-c-divider: #1e293b; - --vp-c-gutter: #1e293b; -} - -/* --- HEADINGS: Apply the Serif Font --- */ -h1, -h2, -h3, -h4, -h5, -h6, -.VPFeature .title, -.VPHero .name, -.VPNavBarTitle .title { - font-family: "Merriweather", "Noto Serif SC", serif !important; - letter-spacing: -0.02em; - /* Tighter tracking looks more professional on serifs */ -} - -.VPNavBarTitle .title { - font-size: 1.1rem; -} - -/* Make the Hero Title (YueScript) feel more "Editorial" */ -.VPHero .name { - font-weight: 900 !important; - color: var(--vp-c-brand-1); - text-shadow: 0 0 20px rgba(180, 172, 143, 0.2); -} - -/* --- BUTTONS --- */ -/* Ensure the "Brand" buttons use our Gold color with white text for contrast */ -.VPButton.brand { - color: #fff !important; - background-color: var(--vp-c-brand-1) !important; - border-color: var(--vp-c-brand-1) !important; -} - -.VPButton.brand:hover { - background-color: var(--vp-c-brand-1) !important; -} - -/* Prism theme for YueCompiler output (shikijs/themes light-plus & dark-plus) */ -.code-output, -.code-output code { - background: #ffffff; - color: #000000; - font-size: 14px; -} - -.dark .code-output, -.dark .code-output code { - background: #1e1e1e; - color: #d4d4d4; -} - -/* light-plus */ -.code-output .token.comment { - color: #008000; -} - -.code-output .token.keyword { - color: #af00db; -} - -.code-output .token.operator, -.code-output .token.punctuation { - color: #000000; -} - -.code-output .token.string, -.code-output .token.char { - color: #a31515; -} - -.code-output .token.regex { - color: #811f3f; -} - -.code-output .token.variable, -.code-output .token.parameter { - color: #001080; -} - -.code-output .token.number, -.code-output .token.boolean, -.code-output .token.constant { - color: #098658; -} - -.code-output .token.function { - color: #795e26; -} - -.code-output .token.class-name, -.code-output .token.builtin { - color: #267f99; -} - -.code-output .token.invalid { - color: #cd3131; -} - -/* dark-plus */ -.dark .code-output .token.comment { - color: #6a9955; -} - -.dark .code-output .token.keyword { - color: #c586c0; -} - -.dark .code-output .token.operator, -.dark .code-output .token.punctuation { - color: #d4d4d4; -} - -.dark .code-output .token.string, -.dark .code-output .token.char { - color: #ce9178; -} - -.dark .code-output .token.regex { - color: #d16969; -} - -.dark .code-output .token.variable, -.dark .code-output .token.parameter { - color: #9cdcfe; -} - -.dark .code-output .token.number, -.dark .code-output .token.boolean, -.dark .code-output .token.constant { - color: #b5cea8; -} - -.dark .code-output .token.function { - color: #dcdcaa; -} - -.dark .code-output .token.class-name, -.dark .code-output .token.builtin { - color: #4ec9b0; -} - -.dark .code-output .token.invalid { - color: #f44747; -} - -/* --- CODE BLOCKS --- */ -/* Slight adjustment to code block background to fit the midnight theme */ -.dark .vp-code-group .tabs label { - background-color: #1a1f2e; -} diff --git a/doc/docs/.vitepress/theme/index.ts b/doc/docs/.vitepress/theme/index.ts deleted file mode 100644 index 5815f4f4..00000000 --- a/doc/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import DefaultTheme from "vitepress/theme"; -import type { Theme } from "vitepress"; -import { h } from "vue"; -import { useData, withBase } from "vitepress"; -import "./custom.css"; - -// @ts-ignore -import CompilerModal from "./components/CompilerModal.vue"; -// @ts-ignore -import HomeFooter from "./components/HomeFooter.vue"; -// @ts-ignore -import YueCompiler from "./components/YueCompiler.vue"; -// @ts-ignore -import YueDisplay from "./components/YueDisplay.vue"; - -const theme: Theme = { - extends: DefaultTheme, - Layout: () => { - const { frontmatter } = useData(); - - return h(DefaultTheme.Layout, null, { - "layout-bottom": () => [h(HomeFooter), h(CompilerModal)], - "home-hero-image": () => { - const fm = frontmatter.value; - if (fm?.hero?.image?.src) { - const img = h("img", { - src: withBase(fm.hero.image.src), - alt: fm.hero.image.alt || "", - class: "VPImage", - style: "max-width: 100%; max-height: 100%; object-fit: contain;", - }); - - if (fm.hero.image.link) { - return h( - "a", - { - href: withBase(fm.hero.image.link), - class: "image-src", - style: - "display: flex; justify-content: center; align-items: center;", - }, - [img], - ); - } - - return h( - "div", - { - class: "image-src", - style: - "display: flex; justify-content: center; align-items: center;", - }, - [img], - ); - } - return null; - }, - }); - }, - enhanceApp({ app }) { - app.component("CompilerModal", CompilerModal); - app.component("YueCompiler", YueCompiler); - app.component("YueDisplay", YueDisplay); - }, -}; - -export default theme; diff --git a/doc/docs/de/doc/extras/mascot.md b/doc/docs/de/doc/extras/mascot.md deleted file mode 100644 index ad0e982b..00000000 --- a/doc/docs/de/doc/extras/mascot.md +++ /dev/null @@ -1,39 +0,0 @@ -# Maskottchen – Xiaoyu - -## Über - -Xiaoyu das Cyber-Kaninchen - -Xiaoyu (小玉, „kleines Jade") ist ein Cyber-Kaninchen und das offizielle Maskottchen des YueScript-Projekts. Man findet sie meistens auf einer Mondsichel sitzend, an ihrem Laptop tüftelnd – natürlich YueScript schreibend. - -Ihr vollständiger Titel ist Xiaoyu das Cyber-Kaninchen (机兔小玉), und sie verkörpert alles, was YueScript sein möchte: elegant, ausdrucksstark und ein kleines bisschen verspielt. - -Xiaoyu wurde von **[Tyson Tan](https://tysontan.com)** entworfen und illustriert, der sie großzügigerweise kostenlos für das Projekt erstellt hat – wofür wir unglaublich dankbar sind. - -## Bilder - -Hochauflösende Kunstwerke stehen unten zum Download bereit. Klicken Sie auf ein Bild, um es in voller Größe zu öffnen. - -### Vollständiges Kunstwerk - - - Xiaoyu — vollständiges Kunstwerk mit Hintergrund - - -

Vollständiges PNG herunterladen

- -### Transparenter Hintergrund - - - Xiaoyu — transparenter Hintergrund - - -

Transparentes PNG herunterladen

- -### Gezippte .kra-Datei - -

Gezippte .kra-Datei herunterladen

- -## Lizenz - -Xiaoyu ist unter der [MIT-Lizenz](https://opensource.org/licenses/MIT) und der Creative-Commons-Lizenz [CC‑BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) doppelt lizenziert. diff --git a/doc/docs/de/index.md b/doc/docs/de/index.md deleted file mode 100644 index 203dd0e7..00000000 --- a/doc/docs/de/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: home -hero: - name: YueScript - tagline: Eine wunderbare Sprache, die zu Lua kompiliert - image: - src: /image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png - alt: YueScript - link: /de/doc/extras/mascot - actions: - - theme: brand - text: Schnellstart → - link: /de/doc/ -features: - - title: Vertrauter Lua-Workflow - details: Schreibe kompakte Syntax, die in gut lesbares Lua mit vorhersehbarer Ausgabe kompiliert wird. - - title: Moderne Sprachfeatures - details: Pipe, Pattern Matching, Slicing und Destructuring – ohne auf Lua-Interop zu verzichten. - - title: Schnelle Iteration - details: Jedes Feedback ist willkommen, um die Entwicklung und Weiterentwicklung der Sprache zu beschleunigen! -footer: - message: MIT-Lizenz. - copyright: Copyright © 2017-2026 Li Jin. Alle Rechte vorbehalten. ---- - ---- diff --git a/doc/docs/de/try/index.md b/doc/docs/de/try/index.md deleted file mode 100755 index 4c17c6cb..00000000 --- a/doc/docs/de/try/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# YueScript Online-Compiler - ---- - -Probiere YueScript im Browser mit WASM aus. - - diff --git a/doc/docs/doc/extras/mascot.md b/doc/docs/doc/extras/mascot.md deleted file mode 100644 index 028d17f6..00000000 --- a/doc/docs/doc/extras/mascot.md +++ /dev/null @@ -1,39 +0,0 @@ -# Mascot - Xiaoyu - -## About - -Xiaoyu the Cyber Rabbit - -Xiaoyu (小玉, "little jade") is a cyber rabbit and the official mascot of the YueScript project. She can usually be found perched atop a crescent moon, tinkering away on her laptop - writing YueScript, naturally. - -Her full title is Xiaoyu the Cyber Rabbit (机兔小玉), and she embodies everything YueScript strives to be: elegant, expressive, and a little bit playful. - -Xiaoyu was designed and illustrated by **[Tyson Tan](https://tysontan.com)**, who generously created her for the project free of charge - something we're incredibly grateful for. - -## Images - -Full‑resolution artwork is available for download below. Click any image to open it at full size. - -### Full Artwork - - - Xiaoyu — full artwork with background - - -

Download full-size PNG

- -### Transparent Background - - - Xiaoyu — transparent background - - -

Download transparent PNG

- -### Zipped .kra File - -

Download zipped .kra file

- -## License - -Xiaoyu is dual‑licensed under the [MIT License](https://opensource.org/licenses/MIT) and the Creative Commons [CC‑BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/id-id/doc/extras/mascot.md b/doc/docs/id-id/doc/extras/mascot.md deleted file mode 100644 index 1b167069..00000000 --- a/doc/docs/id-id/doc/extras/mascot.md +++ /dev/null @@ -1,39 +0,0 @@ -# Maskot – Xiaoyu - -## Tentang - -Xiaoyu si Kelinci Siber - -Xiaoyu (小玉, "giok kecil") adalah seekor kelinci siber dan maskot resmi proyek YueScript. Ia biasanya ditemukan bertengger di atas bulan sabit, mengutak-atik laptopnya – menulis YueScript, tentu saja. - -Gelar lengkapnya adalah Xiaoyu si Kelinci Siber (机兔小玉), dan ia mewujudkan segala hal yang dicita-citakan YueScript: elegan, ekspresif, dan sedikit menyenangkan. - -Xiaoyu dirancang dan diilustrasikan oleh **[Tyson Tan](https://tysontan.com)**, yang dengan murah hati menciptakannya untuk proyek ini secara gratis – sesuatu yang sangat kami syukuri. - -## Gambar - -Karya seni resolusi penuh tersedia untuk diunduh di bawah ini. Klik gambar mana saja untuk membukanya dalam ukuran penuh. - -### Karya Seni Lengkap - - - Xiaoyu — karya seni lengkap dengan latar belakang - - -

Unduh PNG ukuran penuh

- -### Latar Belakang Transparan - - - Xiaoyu — latar belakang transparan - - -

Unduh PNG transparan

- -### File .kra Terkompresi - -

Unduh file .kra terkompresi

- -## Lisensi - -Xiaoyu dilisensikan ganda di bawah [Lisensi MIT](https://opensource.org/licenses/MIT) dan Creative Commons [CC‑BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/id-id/index.md b/doc/docs/id-id/index.md deleted file mode 100644 index 95dc22b1..00000000 --- a/doc/docs/id-id/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: home -hero: - name: YueScript - tagline: Bahasa menyenangkan yang dikompilasi ke Lua - image: - src: /image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png - alt: YueScript - link: /id-id/doc/extras/mascot - actions: - - theme: brand - text: Mulai Cepat → - link: /doc/ -features: - - title: Alur kerja Lua yang familiar - details: Tulis sintaks ringkas yang dikompilasi ke Lua yang mudah dibaca, dengan output yang dapat diprediksi. - - title: Fitur bahasa modern - details: Pipe, pattern matching, slicing, dan destrukturisasi tanpa mengorbankan interoperabilitas Lua. - - title: Iterasi Cepat - details: Setiap masukan sangat diterima untuk membantu mempercepat pengembangan dan evolusi bahasa! -footer: - message: Lisensi MIT. - copyright: Hak cipta © 2017-2026 Li Jin. Semua hak dilindungi. ---- diff --git a/doc/docs/id-id/try/index.md b/doc/docs/id-id/try/index.md deleted file mode 100755 index c5127e2d..00000000 --- a/doc/docs/id-id/try/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -aside: false -prev: false -next: false ---- - -# Kompiler Online YueScript - ---- - -Coba YueScript di browser dengan WASM. - - diff --git a/doc/docs/index.md b/doc/docs/index.md deleted file mode 100644 index c16859e6..00000000 --- a/doc/docs/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: home -hero: - name: YueScript - tagline: A delightful language that compiles to Lua - image: - src: /image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png - alt: YueScript - link: /doc/extras/mascot - actions: - - theme: brand - text: Quick Start → - link: /doc/ -features: - - title: Familiar Lua workflows - details: Write concise syntax that compiles to readable Lua, with predictable output. - - title: Modern language features - details: Pipe, pattern matching, slicing, and destructuring without giving up Lua interop. - - title: Rapid Iteration - details: Any feedback is welcome to help accelerate the language development and evolution! -footer: - message: MIT License. - copyright: Copyright © 2017-2026 Li Jin. All rights reserved. ---- diff --git a/doc/docs/pt-br/doc/extras/mascot.md b/doc/docs/pt-br/doc/extras/mascot.md deleted file mode 100644 index e2ff9518..00000000 --- a/doc/docs/pt-br/doc/extras/mascot.md +++ /dev/null @@ -1,39 +0,0 @@ -# Mascote – Xiaoyu - -## Sobre - -Xiaoyu, a Coelha Cibernética - -Xiaoyu (小玉, "pequeno jade") é uma coelha cibernética e a mascote oficial do projeto YueScript. Ela geralmente pode ser encontrada empoleirada em uma lua crescente, mexendo em seu laptop – escrevendo YueScript, naturalmente. - -Seu título completo é Xiaoyu, a Coelha Cibernética (机兔小玉), e ela incorpora tudo o que o YueScript aspira ser: elegante, expressivo e um pouquinho divertido. - -Xiaoyu foi projetada e ilustrada por **[Tyson Tan](https://tysontan.com)**, que generosamente a criou para o projeto de forma gratuita – algo pelo qual somos incrivelmente gratos. - -## Imagens - -Artes em resolução completa estão disponíveis para download abaixo. Clique em qualquer imagem para abri-la em tamanho real. - -### Arte Completa - - - Xiaoyu — arte completa com fundo - - -

Baixar PNG em tamanho real

- -### Fundo Transparente - - - Xiaoyu — fundo transparente - - -

Baixar PNG transparente

- -### Arquivo .kra Compactado - -

Baixar arquivo .kra compactado

- -## Licença - -Xiaoyu é duplamente licenciada sob a [Licença MIT](https://opensource.org/licenses/MIT) e a Creative Commons [CC‑BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/pt-br/index.md b/doc/docs/pt-br/index.md deleted file mode 100644 index 1852b6ee..00000000 --- a/doc/docs/pt-br/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: home -hero: - name: YueScript - tagline: Uma linguagem encantadora que compila para Lua - image: - src: /image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png - alt: YueScript - link: /pt-br/doc/extras/mascot - actions: - - theme: brand - text: Início rápido → - link: /pt-br/doc/ -features: - - title: Fluxo de trabalho familiar do Lua - details: Escreva uma sintaxe concisa que compila para Lua legível, com saída previsível. - - title: Recursos modernos de linguagem - details: Pipe, pattern matching, slicing e destructuring sem abrir mão da interoperabilidade com Lua. - - title: Iteração rápida - details: Todo feedback é bem-vindo para ajudar a acelerar o desenvolvimento e a evolução da linguagem! -footer: - message: Licença MIT. - copyright: Copyright © 2017-2026 Li Jin. Todos os direitos reservados. ---- - ---- diff --git a/doc/docs/pt-br/try/index.md b/doc/docs/pt-br/try/index.md deleted file mode 100755 index 918162d9..00000000 --- a/doc/docs/pt-br/try/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Compilador online do YueScript - ---- - -Experimente YueScript no navegador com WASM. - - diff --git a/doc/docs/try/index.md b/doc/docs/try/index.md deleted file mode 100755 index 37d513d5..00000000 --- a/doc/docs/try/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -aside: false -prev: false -next: false ---- - -# YueScript Online Compiler - ---- - -Try YueScript in the browser with WASM. - - diff --git a/doc/docs/zh/doc/extras/mascot.md b/doc/docs/zh/doc/extras/mascot.md deleted file mode 100644 index cc6c80e2..00000000 --- a/doc/docs/zh/doc/extras/mascot.md +++ /dev/null @@ -1,39 +0,0 @@ -# 吉祥物 – 小玉 - -## 简介 - -机兔小玉 - -小玉(Xiaoyu,意为"小小的玉")是一只赛博兔,也是 YueScript 项目的官方吉祥物。她通常栖息在一弯新月之上,在笔记本电脑上忙碌着——当然是在写 YueScript。 - -她的全称是机兔小玉,体现了 YueScript 所追求的一切:优雅、富有表现力,还带着一点俏皮。 - -小玉由 **[Tyson Tan](https://tysontan.com)** 设计和绘制,他慷慨地免费为本项目创作了她——我们对此深表感激。 - -## 图片 - -以下提供全分辨率画作供下载。点击任意图片可查看原始尺寸。 - -### 完整画作 - - - 小玉 — 含背景的完整画作 - - -

下载完整 PNG

- -### 透明背景 - - - 小玉 — 透明背景 - - -

下载透明背景 PNG

- -### .kra 压缩文件 - -

下载 .kra 压缩文件

- -## 许可证 - -小玉采用 [MIT 许可证](https://opensource.org/licenses/MIT) 和知识共享 [CC‑BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 双重许可。 diff --git a/doc/docs/zh/index.md b/doc/docs/zh/index.md deleted file mode 100644 index 740fe264..00000000 --- a/doc/docs/zh/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: home -hero: - name: 月之脚本 - tagline: 一门令人愉悦且可编译为 Lua 的语言 - image: - src: /image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png - alt: 月之脚本 - link: /zh/doc/extras/mascot - actions: - - theme: brand - text: 快速上手 → - link: /zh/doc/ -features: - - title: 熟悉的 Lua 工作流 - details: 更精简的语法,编译为可读 Lua,输出可预测、易集成。 - - title: 现代语言特性 - details: 管道、模式匹配、切片与解构,同时保留 Lua 互操作性。 - - title: 快速迭代 - details: 虚心接受用户反馈,以帮助改进和加速语言的开发和演进! -footer: - message: MIT 许可证。 - copyright: Copyright © 2017-2026 Li Jin. 保留所有权利。 ---- diff --git a/doc/docs/zh/try/index.md b/doc/docs/zh/try/index.md deleted file mode 100755 index 7e198b05..00000000 --- a/doc/docs/zh/try/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -aside: false -prev: false -next: false ---- - -# 月之脚本的在线编译器 - ---- - -在这里试试 WASM 版的 YueScript 吧。 - - diff --git a/doc/package.json b/doc/package.json index f78bb66e..1397c105 100755 --- a/doc/package.json +++ b/doc/package.json @@ -9,26 +9,30 @@ }, "repository": "https://github.com/IppClub/YueScript/tree/main/doc", "scripts": { - "dev": "vitepress dev docs", - "build": "vitepress build docs", - "preview": "vitepress preview docs" + "dev": "astro dev", + "check": "astro check", + "build": "astro build", + "preview": "astro preview", + "test:docs": "node scripts/check-docs.mjs" }, "license": "MIT", "devDependencies": { - "@types/node": "^25.5.0", - "vitepress": "^1.6.4", - "vue": "^3.5.31" + "@astrojs/check": "^0.9.10", + "typescript": "^6.0.3" }, "dependencies": { + "@astrojs/starlight": "^0.42.5", + "@astrojs/vue": "^7.0.3", "@codemirror/commands": "^6.10.3", "@codemirror/language": "^6.12.3", - "@codemirror/legacy-modes": "^6.5.2", + "@codemirror/legacy-modes": "^6.5.4", "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.40.0", - "@fontsource/merriweather": "^5.2.11", - "@fontsource/noto-serif-sc": "^5.2.8", - "@lezer/highlight": "^1.2.3", - "@shikijs/themes": "^4.0.2", - "prismjs": "^1.30.0" - } + "@fontsource/merriweather": "^5.3.0", + "@fontsource/noto-serif-sc": "^5.3.0", + "@lezer/highlight": "^1.2.5", + "astro": "^7.3.5", + "vue": "^3.5.31" + }, + "type": "module" } diff --git a/doc/pnpm-lock.yaml b/doc/pnpm-lock.yaml index 7d1385f3..12ae3bde 100644 --- a/doc/pnpm-lock.yaml +++ b/doc/pnpm-lock.yaml @@ -8,1618 +8,4713 @@ importers: .: dependencies: + '@astrojs/starlight': + specifier: ^0.42.5 + version: 0.42.5(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(typescript@6.0.3) + '@astrojs/vue': + specifier: ^7.0.3 + version: 7.0.3(@types/node@24.19.1)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(esbuild@0.28.2)(vue@3.5.43(typescript@6.0.3))(yaml@2.9.1) '@codemirror/commands': specifier: ^6.10.3 - version: 6.10.3 + version: 6.11.1 '@codemirror/language': specifier: ^6.12.3 - version: 6.12.3 + version: 6.12.4 '@codemirror/legacy-modes': - specifier: ^6.5.2 - version: 6.5.2 + specifier: ^6.5.4 + version: 6.5.4 '@codemirror/state': specifier: ^6.6.0 - version: 6.6.0 + version: 6.7.6 '@codemirror/view': specifier: ^6.40.0 - version: 6.40.0 + version: 6.43.13 '@fontsource/merriweather': - specifier: ^5.2.11 - version: 5.2.11 + specifier: ^5.3.0 + version: 5.3.0 '@fontsource/noto-serif-sc': - specifier: ^5.2.8 - version: 5.2.8 + specifier: ^5.3.0 + version: 5.3.0 '@lezer/highlight': - specifier: ^1.2.3 - version: 1.2.3 - '@shikijs/themes': - specifier: ^4.0.2 - version: 4.0.2 - prismjs: - specifier: ^1.30.0 - version: 1.30.0 - devDependencies: - '@types/node': - specifier: ^25.5.0 - version: 25.5.0 - vitepress: - specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.49.1)(@types/node@25.5.0)(postcss@8.5.8)(search-insights@2.17.3) + specifier: ^1.2.5 + version: 1.2.5 + astro: + specifier: ^7.3.5 + version: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) vue: specifier: ^3.5.31 - version: 3.5.31 + version: 3.5.43(typescript@6.0.3) + devDependencies: + '@astrojs/check': + specifier: ^0.9.10 + version: 0.9.10(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 packages: - '@algolia/abtesting@1.15.1': - resolution: {integrity: sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw==} - engines: {node: '>= 14.0.0'} + '@astrojs/astro2tsx@0.1.2': + resolution: {integrity: sha512-Uj/M9zbrhu5cIZEvWAGTbQJRKSxXWJ/E59BZwt7F+chrKhbfttW+9rkS/l+1QxoJP1KU3UnpM62M7yszfAI0WA==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/check@0.9.10': + resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + + '@astrojs/compiler-binding-android-arm64@0.5.1': + resolution: {integrity: sha512-nMb2nMIJtcWLNH+fV75Enmi+jp4tIOYOfsv4XtpgdOWkqc9P4uSSdK5u1xb340AzrXo5V18SxLl/nc3vcqtamQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + resolution: {integrity: sha512-5k4+nZ/WRt+dcVow4z7rBuI7iv9A58h/uQ91YJe1PrTivbcCkq3u2Ynx/AZJwII4CsZawBCeGpojkFjutZBhBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@astrojs/compiler-binding-darwin-x64@0.5.1': + resolution: {integrity: sha512-0Buw+YST9Ff2EqQyhRMQujuFq/dijLw3zXWhsvI0dJ2pGrT38iVoxTEca2eBX/PfhlwkVWSRJEKO5gMqKHyeHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + resolution: {integrity: sha512-x5LRpyCoMKuu3INr18cn42YhwSOaRpp9b5Ny3eJJ/sWVeejC16Zeshu1JlvlSmEZACLeWxU5JM0RX6T6nI+YyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + resolution: {integrity: sha512-mL7tQEuDk3rGfaKmrO63nw6WBy1TPVioQGmVyjcAr+C+a/k3SVMYBytNSMqH9mZPT/Swj30JaZ2N842Z1NnOEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + resolution: {integrity: sha512-uLGc9jtxwiDe4cQyhNPQim4ECiB/YzbWlXssfLAv8r374kArfTwBHjwR2+j+XVyF71yCx5mF9YNRclRqdNBgeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + resolution: {integrity: sha512-G0cywinaQUc8v1MrytvYKUX7svTDMmYtOCZfxjwKPbJi59zIqM+Ll0rWgO0GQWLZH3XoPYo19ZwlP3Xt9ep9YA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + resolution: {integrity: sha512-yMhLL8asmLydoAdnEZxAw6eLfNDs3YJl6jqn0pjPt6zrb2U5qIDLnii4/twThpIFODKkQ6YDpBRTOz/vSfZCxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + resolution: {integrity: sha512-aClIG6poFt3Wf/bZykrEAX2nAnKvBHW6RXiKUa69QjBtWH0/FOlOAjnFcxRNlhej2AMWNYFx0o+LGjwMcH8P7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + resolution: {integrity: sha512-/E6uBCagY70YpWqssBC+/FuniNSloeQPRgj7l3LDWiqjxIyTLnIgX1sTt18FU7jrigetpSnC9cHAM6b6IxSgPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@astrojs/compiler-binding@0.5.1': + resolution: {integrity: sha512-oczyolLUl9mNrtuBuNjuvn5thpHrFLXAHAWGTRg0JDHQ8cGVsVeFekOu2uSoQGgainJIi+A3/9m0DyYwz3Nlnw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/compiler-rs@0.5.1': + resolution: {integrity: sha512-1k1acnX7DepIiea9U9/Y+d1hdAFfylu1ZQQkkYgRSwBOBAsXInolyZuh/2tax+83vu/A+hOYP6P3+265RvMTvw==} + engines: {node: '>=22.12.0'} + + '@astrojs/internal-helpers@0.11.0': + resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==} + + '@astrojs/language-server@2.17.1': + resolution: {integrity: sha512-gG7bvMVNIXgoSe1pM9dI1HsSDLU1EIc/dSAYQ0DuReLyLkOBjsiqvaRYgQltWaldLxh0bNEqjgreLfjd9OnUxQ==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + '@astrojs/markdown-satteri@0.4.2': + resolution: {integrity: sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==} - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + '@astrojs/mdx@8.0.2': + resolution: {integrity: sha512-WedIVP2Bu8fXSzxb3ZYZ8xDrWWjf2SRKCneh52Llhoa+O3lcpHPhoZVP3FerlivUaH/0LJz2yVaCNvMdg0u8Bw==} + engines: {node: '>=22.12.0'} peerDependencies: - search-insights: '>= 1 < 3' + '@astrojs/markdown-remark': ^7.3.0 + '@astrojs/markdown-satteri': ^0.4.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/sitemap@3.7.4': + resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + '@astrojs/starlight@0.42.5': + resolution: {integrity: sha512-S6hjUexk9rrKtjJF3WR8T9dM1woNR7X2XU8e3wj4OpRT4X15AXk/mzPjWe/Qd5+P8whHj2+ves+k06qirBzimg==} peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' + '@astrojs/markdown-remark': ^7.3.0 + astro: ^7.2.10 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + '@astrojs/telemetry@3.3.3': + resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/vue@7.0.3': + resolution: {integrity: sha512-g0qr+UxDAHDHQ2zc5+IY2SG4aLIiS6lWfekEYk61DGNVRb2h8PIxMi87aPR75lId7Wk+zUNZB1+VEVDBwAAzBw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' + astro: ^7.0.0 + vue: ^3.5.24 + + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} - '@algolia/client-abtesting@5.49.1': - resolution: {integrity: sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw==} - engines: {node: '>= 14.0.0'} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} - '@algolia/client-analytics@5.49.1': - resolution: {integrity: sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g==} - engines: {node: '>= 14.0.0'} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} - '@algolia/client-common@5.49.1': - resolution: {integrity: sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg==} - engines: {node: '>= 14.0.0'} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@algolia/client-insights@5.49.1': - resolution: {integrity: sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g==} - engines: {node: '>= 14.0.0'} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} - '@algolia/client-personalization@5.49.1': - resolution: {integrity: sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w==} - engines: {node: '>= 14.0.0'} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} - '@algolia/client-query-suggestions@5.49.1': - resolution: {integrity: sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg==} - engines: {node: '>= 14.0.0'} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} - '@algolia/client-search@5.49.1': - resolution: {integrity: sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA==} - engines: {node: '>= 14.0.0'} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@algolia/ingestion@1.49.1': - resolution: {integrity: sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ==} - engines: {node: '>= 14.0.0'} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} - '@algolia/monitoring@1.49.1': - resolution: {integrity: sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw==} - engines: {node: '>= 14.0.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} - '@algolia/recommend@5.49.1': - resolution: {integrity: sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw==} - engines: {node: '>= 14.0.0'} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@algolia/requester-browser-xhr@5.49.1': - resolution: {integrity: sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA==} - engines: {node: '>= 14.0.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} - '@algolia/requester-fetch@5.49.1': - resolution: {integrity: sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw==} - engines: {node: '>= 14.0.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} - '@algolia/requester-node-http@5.49.1': - resolution: {integrity: sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA==} - engines: {node: '>= 14.0.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/plugin-proposal-decorators@7.29.7': + resolution: {integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/commands@6.10.3': - resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + '@babel/plugin-syntax-decorators@7.29.7': + resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/language@6.12.3': - resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/legacy-modes@6.5.2': - resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/state@6.6.0': - resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/view@6.40.0': - resolution: {integrity: sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@docsearch/css@3.8.2': - resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + '@babel/plugin-transform-typescript@7.29.9': + resolution: {integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@docsearch/js@3.8.2': - resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} - '@docsearch/react@3.8.2': - resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@bruits/satteri-darwin-arm64@0.10.5': + resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + cpu: [arm64] + os: [darwin] + + '@bruits/satteri-darwin-x64@0.10.5': + resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + cpu: [x64] + os: [darwin] + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-arm64-musl@0.10.5': + resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@bruits/satteri-linux-x64-gnu@0.10.5': + resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-x64-musl@0.10.5': + resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@bruits/satteri-wasm32-wasi@0.10.5': + resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + cpu: [arm64] + os: [win32] + + '@bruits/satteri-win32-x64-msvc@0.10.5': + resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@4.0.1': + resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} + engines: {node: '>=18'} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} + + '@codemirror/commands@6.11.1': + resolution: {integrity: sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==} + + '@codemirror/language@6.12.4': + resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} + + '@codemirror/legacy-modes@6.5.4': + resolution: {integrity: sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==} + + '@codemirror/state@6.7.6': + resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==} + + '@codemirror/view@6.43.13': + resolution: {integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==} + + '@ctrl/tinycolor@4.2.1': + resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@fontsource/merriweather@5.2.11': - resolution: {integrity: sha512-ZiIMeUh5iT8d73o6xlSF8GKgjV5pgiFrufYc5jZTVAfExtWKqM2vQHnsqXSFMv4ELhAcjt6Vf+5T3oVGXhAizQ==} - - '@fontsource/noto-serif-sc@5.2.8': - resolution: {integrity: sha512-C7fAr+d1GjOAw1qIbntsnqbA3l5dkdzcmNNgeCXLC8QZ7VNubL7MTrX8UcYKHceX4mI//z8gGtXbOeeQrB6P7g==} - - '@iconify-json/simple-icons@1.2.71': - resolution: {integrity: sha512-rNoDFbq1fAYiEexBvrw613/xiUOPEu5MKVV/X8lI64AgdTzLQUUemr9f9fplxUMPoxCBP2rWzlhOEeTHk/Sf0Q==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@expressive-code/core@0.44.2': + resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==} - '@lezer/common@1.5.1': - resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} + '@expressive-code/plugin-frames@0.44.2': + resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==} - '@lezer/highlight@1.2.3': - resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + '@expressive-code/plugin-shiki@0.44.2': + resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==} - '@lezer/lr@1.4.8': - resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + '@expressive-code/plugin-text-markers@0.44.2': + resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==} - '@marijn/find-cluster-break@1.0.2': - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@fontsource/merriweather@5.3.0': + resolution: {integrity: sha512-9LpPsNTYzRALj468Uj1K9Usl5eXk991L/kKmcpdWbTF1na9NfMyAXMgUABlMReViU1MYBz9kJ8jEzEOtX9qGDg==} - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} - cpu: [arm] - os: [android] + '@fontsource/noto-serif-sc@5.3.0': + resolution: {integrity: sha512-0/zaEFkidiWldE62rTeD74x8ygUsQvejiSNtO0LQxQk3qpaHnlMZ3w4C7yH80B4KTIg8VKeFP4oSgwWMchY9+g==} - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} - cpu: [arm64] - os: [android] + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} - cpu: [arm64] + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} + engines: {node: '>=20.9.0'} os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} cpu: [x64] - os: [freebsd] + os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} - cpu: [arm] + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} + cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} cpu: [arm] os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} - cpu: [arm64] - os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} - cpu: [arm64] + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} + cpu: [ppc64] os: [linux] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} - cpu: [loong64] + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} + cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} - cpu: [loong64] + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} + cpu: [s390x] os: [linux] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} - cpu: [ppc64] + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} + cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} - cpu: [ppc64] + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} + cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} - cpu: [riscv64] + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} - cpu: [x64] + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} + engines: {node: '>=20.9.0'} cpu: [x64] - os: [openbsd] + os: [linux] + libc: [musl] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} - cpu: [arm64] - os: [openharmony] + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} + engines: {node: '>=20.9.0'} - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} - cpu: [x64] - os: [win32] + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@shikijs/core@2.5.0': - resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@shikijs/engine-javascript@2.5.0': - resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - '@shikijs/engine-oniguruma@2.5.0': - resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - '@shikijs/langs@2.5.0': - resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@shikijs/themes@2.5.0': - resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + '@lezer/common@1.5.1': + resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} - '@shikijs/themes@4.0.2': - resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} - engines: {node: '>=20'} + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} - '@shikijs/transformers@2.5.0': - resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + '@lezer/highlight@1.2.5': + resolution: {integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==} - '@shikijs/types@2.5.0': - resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + '@lezer/lr@1.4.8': + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} - '@shikijs/types@4.0.2': - resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} - engines: {node: '>=20'} + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@oxc-project/types@0.152.0': + resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@vue/compiler-core@3.5.31': - resolution: {integrity: sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==} + '@rolldown/binding-android-arm-eabi@1.2.12': + resolution: {integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@vue/compiler-dom@3.5.31': - resolution: {integrity: sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==} + '@rolldown/binding-android-arm64@1.2.12': + resolution: {integrity: sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@vue/compiler-sfc@3.5.31': - resolution: {integrity: sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==} + '@rolldown/binding-darwin-arm64@1.2.12': + resolution: {integrity: sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] - '@vue/compiler-ssr@3.5.31': - resolution: {integrity: sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==} + '@rolldown/binding-darwin-x64@1.2.12': + resolution: {integrity: sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] - '@vue/devtools-api@7.7.9': - resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + '@rolldown/binding-freebsd-x64@1.2.12': + resolution: {integrity: sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] - '@vue/devtools-kit@7.7.9': - resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': + resolution: {integrity: sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@vue/devtools-shared@7.7.9': - resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + '@rolldown/binding-linux-arm64-gnu@1.2.12': + resolution: {integrity: sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@vue/reactivity@3.5.31': - resolution: {integrity: sha512-DtKXxk9E/KuVvt8VxWu+6Luc9I9ETNcqR1T1oW1gf02nXaZ1kuAx58oVu7uX9XxJR0iJCro6fqBLw9oSBELo5g==} + '@rolldown/binding-linux-arm64-musl@1.2.12': + resolution: {integrity: sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] - '@vue/runtime-core@3.5.31': - resolution: {integrity: sha512-AZPmIHXEAyhpkmN7aWlqjSfYynmkWlluDNPHMCZKFHH+lLtxP/30UJmoVhXmbDoP1Ng0jG0fyY2zCj1PnSSA6Q==} + '@rolldown/binding-linux-ppc64-gnu@1.2.12': + resolution: {integrity: sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@vue/runtime-dom@3.5.31': - resolution: {integrity: sha512-xQJsNRmGPeDCJq/u813tyonNgWBFjzfVkBwDREdEWndBnGdHLHgkwNBQxLtg4zDrzKTEcnikUy1UUNecb3lJ6g==} + '@rolldown/binding-linux-s390x-gnu@1.2.12': + resolution: {integrity: sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@vue/server-renderer@3.5.31': - resolution: {integrity: sha512-GJuwRvMcdZX/CriUnyIIOGkx3rMV3H6sOu0JhdKbduaeCji6zb60iOGMY7tFoN24NfsUYoFBhshZtGxGpxO4iA==} - peerDependencies: - vue: 3.5.31 + '@rolldown/binding-linux-x64-gnu@1.2.12': + resolution: {integrity: sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] - '@vue/shared@3.5.29': - resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} + '@rolldown/binding-linux-x64-musl@1.2.12': + resolution: {integrity: sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] - '@vue/shared@3.5.31': - resolution: {integrity: sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==} + '@rolldown/binding-openharmony-arm64@1.2.12': + resolution: {integrity: sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - '@vueuse/core@12.8.2': - resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + '@rolldown/binding-win32-arm64-msvc@1.2.12': + resolution: {integrity: sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] - '@vueuse/integrations@12.8.2': - resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true + '@rolldown/binding-win32-x64-msvc@1.2.12': + resolution: {integrity: sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] - '@vueuse/metadata@12.8.2': - resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@vueuse/shared@12.8.2': - resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@shikijs/core@4.5.0': + resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} + engines: {node: '>=20'} - algoliasearch@5.49.1: - resolution: {integrity: sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ==} - engines: {node: '>= 14.0.0'} + '@shikijs/engine-javascript@4.5.0': + resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} + engines: {node: '>=20'} - birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + '@shikijs/engine-oniguruma@4.5.0': + resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} + engines: {node: '>=20'} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + '@shikijs/langs@4.5.0': + resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} + engines: {node: '>=20'} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + '@shikijs/primitive@4.5.0': + resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} + engines: {node: '>=20'} - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + '@shikijs/themes@4.5.0': + resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} + engines: {node: '>=20'} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + '@shikijs/types@4.5.0': + resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} + engines: {node: '>=20'} - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - focus-trap@7.8.0: - resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + '@types/node@24.19.1': + resolution: {integrity: sha512-aS3/DG0oM05K0RIXXP+hKjinGG5IgSSVGzswZxW3O0sS3pH4/fycXundUC9XsszgKCk4gHXylTEK6hyFxVxnoQ==} - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} + '@vitejs/plugin-vue-jsx@5.1.6': + resolution: {integrity: sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.0.0 - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + '@vitejs/plugin-vue@6.0.9': + resolution: {integrity: sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + peerDependencies: + typescript: '*' - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} - minisearch@7.2.0: - resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} - oniguruma-to-es@3.1.1: - resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} - engines: {node: ^10 || ^12 || >=14} + '@vue/compiler-core@3.5.43': + resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} - preact@10.28.4: - resolution: {integrity: sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==} + '@vue/compiler-dom@3.5.43': + resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} + '@vue/compiler-sfc@3.5.43': + resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + '@vue/compiler-ssr@3.5.43': + resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + '@vue/devtools-core@8.2.1': + resolution: {integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==} + peerDependencies: + vue: ^3.0.0 - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + '@vue/devtools-kit@8.2.1': + resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + '@vue/devtools-shared@8.2.1': + resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + '@vue/reactivity@3.5.43': + resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + '@vue/runtime-core@3.5.43': + resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + '@vue/runtime-dom@3.5.43': + resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} - shiki@2.5.0: - resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + '@vue/server-renderer@3.5.43': + resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + '@vue/shared@3.5.43': + resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} + ajv-i18n@4.2.0: + resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} + peerDependencies: + ajv: ^8.0.0-beta.0 - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - style-mod@4.1.3: - resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + am-i-vibing@0.4.0: + resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==} + hasBin: true - superjson@2.2.6: - resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} - engines: {node: '>=16'} + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} + engines: {node: '>=12'} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ansis@4.4.0: + resolution: {integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==} + engines: {node: '>=14'} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + astro-expressive-code@0.44.2: + resolution: {integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0 - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + astro@7.3.5: + resolution: {integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + baseline-browser-mapping@2.11.27: + resolution: {integrity: sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.1: + resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + birpc@4.2.0: + resolution: {integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + browserslist@4.29.3: + resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bundle-name@4.1.1: + resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} + engines: {node: '>=18'} + + caniuse-lite@1.0.30001814: + resolution: {integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + supports-color: '*' peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: + supports-color: optional: true - vitepress@1.6.4: - resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + electron-to-chromium@1.5.444: + resolution: {integrity: sha512-5ss/uJfoDYDHT0lfJzT6FbcskIzROIOPf0BbbFkGcvDzoJU7i//9GDrwwIHQVmIsrAGiF3ihpADBRIsrEFt1rQ==} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + expressive-code@0.44.2: + resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: - markdown-it-mathjax3: ^4 - postcss: ^8 + picomatch: ^3 || ^4 peerDependenciesMeta: - markdown-it-mathjax3: + picomatch: optional: true - postcss: + + find-proc@0.2.0: + resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} + engines: {node: ^20.19.0 || >=22.12.0} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + + i18next@26.4.2: + resolution: {integrity: sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==} + peerDependencies: + typescript: ^5 || ^6 || ^7 + peerDependenciesMeta: + typescript: optional: true - vue@3.5.31: - resolution: {integrity: sha512-iV/sU9SzOlmA/0tygSmjkEN6Jbs3nPoIPFhCMLD2STrjgOU8DX7ZtzMhg4ahVwf5Rp9KoFzcXeB1ZrVbLBp5/Q==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} + + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + + mdast-util-directive@3.1.1: + resolution: {integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==} + + mdast-util-from-markdown@2.1.0: + resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.2.0: + resolution: {integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + + node-releases@2.0.57: + resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} + engines: {node: '>=18'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + open@11.0.4: + resolution: {integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==} + engines: {node: '>=20'} + + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} + engines: {node: '>=20'} + + p-queue@9.3.3: + resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==} + engines: {node: '>=20'} + + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} + engines: {node: '>=4'} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.2.1: + resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} + engines: {node: '>=20'} + + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-ancestry@0.1.0: + resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} + engines: {node: '>=18.0.0'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-expressive-code@0.44.2: + resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==} + + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + rolldown@1.2.12: + resolution: {integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + satteri@0.10.5: + resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + shiki@4.5.0: + resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} + engines: {node: '>=20'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} + hasBin: true + + smol-toml@1.9.0: + resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + + svgo@4.1.0: + resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} + engines: {node: '>=16'} + hasBin: true + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyclip@1.0.3: + resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} + engines: {node: ^16.14.0 || >= 17.3.0} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + undici@8.11.2: + resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} + engines: {node: '>=22.19.0'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.5: + resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + url-extras@0.1.0: + resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==} + engines: {node: '>=20'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verkit@0.4.1: + resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==} + engines: {node: '>=18.12.0'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-dev-rpc@2.0.0: + resolution: {integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0 + + vite-hot-client@2.2.0: + resolution: {integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0 + + vite-plugin-inspect@11.4.1: + resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-devtools@8.2.1: + resolution: {integrity: sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: '*' + + vite-plugin-vue-inspector@6.0.0: + resolution: {integrity: sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + vite@8.3.2: + resolution: {integrity: sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.71: + resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.71: + resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.71: + resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.71: + resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.71: + resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==} + peerDependencies: + '@volar/language-service': ~2.4.0 + typescript: '*' + peerDependenciesMeta: + '@volar/language-service': + optional: true + typescript: + optional: true + + volar-service-typescript@0.0.71: + resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + typescript: '*' + peerDependenciesMeta: + '@volar/language-service': + optional: true + typescript: + optional: true + + volar-service-yaml@0.0.71: + resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-jsonrpc@9.0.3: + resolution: {integrity: sha512-qETYf9PCl1lVfwR+oBmMfc4vP2nqLNA35ABxorw3j06+xlKRgDVxbLgKm4Y/xPL0YWdeDjLoI4ImICIT3nB0zQ==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-protocol@3.18.4: + resolution: {integrity: sha512-CCXbyr99dafRJzJH/0Ryk7ly5T8XPmSR0//OuF2w4m+9JiOin7zcAT5iET8GRE7Z9taFBejb3GbM0a0mbjdbrg==} + + vscode-languageserver-textdocument@1.0.15: + resolution: {integrity: sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver-types@3.18.4: + resolution: {integrity: sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + + vue@3.5.43: + resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wsl-utils@1.0.1: + resolution: {integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==} + engines: {node: '>=20'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml-language-server@1.23.0: + resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} + hasBin: true + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/astro2tsx@0.1.2(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - '@emnapi/runtime' + + '@astrojs/check@0.9.10(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3)': + dependencies: + '@astrojs/language-server': 2.17.1(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 6.0.3 + yargs: 18.2.0 + transitivePeerDependencies: + - '@emnapi/runtime' + - prettier + - prettier-plugin-astro + + '@astrojs/compiler-binding-android-arm64@0.5.1': + optional: true + + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + optional: true + + '@astrojs/compiler-binding-darwin-x64@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + optional: true + + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + optional: true + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + optional: true + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + optional: true + + '@astrojs/compiler-binding@0.5.1': + optionalDependencies: + '@astrojs/compiler-binding-android-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-x64': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-musl': 0.5.1 + '@astrojs/compiler-binding-linux-x64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-x64-musl': 0.5.1 + '@astrojs/compiler-binding-wasm32-wasi': 0.5.1 + '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.1 + '@astrojs/compiler-binding-win32-x64-msvc': 0.5.1 + + '@astrojs/compiler-rs@0.5.1': + dependencies: + '@astrojs/compiler-binding': 0.5.1 + + '@astrojs/internal-helpers@0.11.0': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + js-yaml: 4.3.2 + picomatch: 4.0.7 + retext-smartypants: 6.2.0 + shiki: 4.5.0 + smol-toml: 1.9.0 + unified: 11.0.5 + + '@astrojs/language-server@2.17.1(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3)': + dependencies: + '@astrojs/astro2tsx': 0.1.2(@emnapi/runtime@1.11.3) + '@astrojs/yaml2ts': 0.2.4 + '@volar/kit': 2.4.28(typescript@6.0.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28(typescript@6.0.3) + '@volar/language-service': 2.4.28(typescript@6.0.3) + muggle-string: 0.4.1 + tinyglobby: 0.2.17 + volar-service-css: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-emmet: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-html: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-prettier: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(prettier@3.9.9) + volar-service-typescript: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3) + volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3) + volar-service-yaml: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)) + vscode-html-languageservice: 5.6.2 + vscode-uri: 3.2.0 + optionalDependencies: + prettier: 3.9.9 + transitivePeerDependencies: + - '@emnapi/runtime' + - typescript + + '@astrojs/markdown-satteri@0.4.2': + dependencies: + '@astrojs/internal-helpers': 0.11.0 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + satteri: 0.10.5 + + '@astrojs/mdx@8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))': + dependencies: + '@astrojs/internal-helpers': 0.11.0 + '@astrojs/markdown-satteri': 0.4.2 + astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) + es-module-lexer: 2.3.2 + + '@astrojs/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.7.4': + dependencies: + sitemap: 9.0.1 + zod: 4.6.5 + + '@astrojs/starlight@0.42.5(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(typescript@6.0.3)': + dependencies: + '@astrojs/markdown-satteri': 0.4.2 + '@astrojs/mdx': 8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)) + '@astrojs/sitemap': 3.7.4 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.5 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 + astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) + astro-expressive-code: 0.44.2(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)) + bcp-47: 2.1.1 + hast-util-format: 1.1.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 26.4.2(typescript@6.0.3) + js-yaml: 4.3.2 + klona: 2.0.6 + magic-string: 1.4.2 + mdast-util-directive: 3.1.1 + mdast-util-to-markdown: 2.2.0 + mdast-util-to-string: 4.0.0 + pagefind: 1.5.2 + remark-directive: 4.0.0 + satteri: 0.10.5 + ultrahtml: 1.7.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@astrojs/telemetry@3.3.3': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + package-manager-detector: 1.8.0 + + '@astrojs/vue@7.0.3(@types/node@24.19.1)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(esbuild@0.28.2)(vue@3.5.43(typescript@6.0.3))(yaml@2.9.1)': + dependencies: + '@vitejs/plugin-vue': 6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) + '@vue/compiler-sfc': 3.5.43 + astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vite-plugin-vue-devtools: 8.2.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) + vue: 3.5.43(typescript@6.0.3) + transitivePeerDependencies: + - '@nuxt/kit' + - '@types/node' + - '@vitejs/devtools' + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/yaml2ts@0.2.4': + dependencies: + yaml: 2.9.1 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.29.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bruits/satteri-darwin-arm64@0.10.5': + optional: true + + '@bruits/satteri-darwin-x64@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-musl@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-musl@0.10.5': + optional: true + + '@bruits/satteri-wasm32-wasi@0.10.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + optional: true + + '@bruits/satteri-win32-x64-msvc@0.10.5': + optional: true + + '@capsizecss/unpack@4.0.1': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.5.1': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.8.1': + dependencies: + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@codemirror/commands@6.11.1': + dependencies: + '@codemirror/language': 6.12.4 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@lezer/common': 1.5.1 + + '@codemirror/language@6.12.4': + dependencies: + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.13 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + style-mod: 4.1.3 + + '@codemirror/legacy-modes@6.5.4': + dependencies: + '@codemirror/language': 6.12.4 + + '@codemirror/state@6.7.6': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.43.13': + dependencies: + '@codemirror/state': 6.7.6 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + + '@ctrl/tinycolor@4.2.1': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@expressive-code/core@0.44.2': + dependencies: + '@ctrl/tinycolor': 4.2.1 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.28 + postcss-nested: 6.2.0(postcss@8.5.28) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-frames@0.44.2': + dependencies: + '@expressive-code/core': 0.44.2 + + '@expressive-code/plugin-shiki@0.44.2': + dependencies: + '@expressive-code/core': 0.44.2 + shiki: 4.5.0 + + '@expressive-code/plugin-text-markers@0.44.2': + dependencies: + '@expressive-code/core': 0.44.2 + + '@fontsource/merriweather@5.3.0': {} + + '@fontsource/noto-serif-sc@5.3.0': {} + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.4 + optional: true + + '@img/sharp-darwin-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.4 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + optional: true + + '@img/sharp-linux-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.4 + optional: true + + '@img/sharp-linux-arm@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.4 + optional: true + + '@img/sharp-linux-ppc64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.4 + optional: true + + '@img/sharp-linux-riscv64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.4 + optional: true + + '@img/sharp-linux-s390x@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.4 + optional: true + + '@img/sharp-linux-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + optional: true + + '@img/sharp-wasm32@0.35.5': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-win32-arm64@0.35.5': + optional: true + + '@img/sharp-win32-ia32@0.35.5': + optional: true + + '@img/sharp-win32-x64@0.35.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@lezer/common@1.5.1': {} + + '@lezer/highlight@1.2.3': + dependencies: + '@lezer/common': 1.5.1 + + '@lezer/highlight@1.2.5': + dependencies: + '@lezer/common': 1.5.1 + + '@lezer/lr@1.4.8': + dependencies: + '@lezer/common': 1.5.1 + + '@marijn/find-cluster-break@1.0.2': {} + + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 + + '@oslojs/encoding@1.1.0': {} + + '@oxc-project/types@0.152.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@rolldown/binding-android-arm-eabi@1.2.12': + optional: true + + '@rolldown/binding-android-arm64@1.2.12': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.12': + optional: true + + '@rolldown/binding-darwin-x64@1.2.12': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.12': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.12': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.12': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.12': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.12': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.12': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.12': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.12': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.12': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.12': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@shikijs/core@4.5.0': + dependencies: + '@shikijs/primitive': 4.5.0 + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + + '@shikijs/primitive@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.5.0': + dependencies: + '@shikijs/types': 4.5.0 + + '@shikijs/types@4.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@24.19.1': + dependencies: + undici-types: 7.24.6 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.19.1 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue-jsx@5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.1 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vue: 3.5.43(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vue: 3.5.43(typescript@6.0.3) + + '@volar/kit@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + '@volar/typescript': 2.4.28(typescript@6.0.3) + typesafe-path: 0.2.2 + typescript: 6.0.3 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/language-server@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) + '@volar/typescript': 2.4.28(typescript@6.0.3) + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.18.4 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 6.0.3 + + '@volar/language-service@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.18.4 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 6.0.3 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 6.0.3 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 + + '@vscode/l10n@0.0.18': {} + + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.7)': + dependencies: + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.7) + '@vue/shared': 3.5.43 + optionalDependencies: + '@babel/core': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)': + dependencies: + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.7) + '@vue/shared': 3.5.43 + optionalDependencies: + '@babel/core': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.7)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/parser': 7.29.9 + '@vue/compiler-sfc': 3.5.43 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/parser': 7.29.9 + '@vue/compiler-sfc': 3.5.43 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/shared': 3.5.43 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.43': + dependencies: + '@vue/compiler-core': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/compiler-sfc@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/compiler-core': 3.5.43 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-ssr': 3.5.43 + '@vue/shared': 3.5.43 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.28 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.43': + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/devtools-core@8.2.1(vue@3.5.43(typescript@6.0.3))': + dependencies: + '@vue/devtools-kit': 8.2.1 + '@vue/devtools-shared': 8.2.1 + vue: 3.5.43(typescript@6.0.3) + + '@vue/devtools-kit@8.2.1': + dependencies: + '@vue/devtools-shared': 8.2.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.2.1': {} + + '@vue/reactivity@3.5.43': + dependencies: + '@vue/shared': 3.5.43 + + '@vue/runtime-core@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/runtime-dom@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/runtime-core': 3.5.43 + '@vue/shared': 3.5.43 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.43': + dependencies: + '@vue/compiler-ssr': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/shared@3.5.43': {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-i18n@4.2.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + am-i-vibing@0.4.0: + dependencies: + process-ancestry: 0.1.0 + + ansi-regex@6.4.0: {} + + ansi-styles@6.2.3: {} + + ansis@4.4.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + astro-expressive-code@0.44.2(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)): + dependencies: + astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) + rehype-expressive-code: 0.44.2 + url-extras: 0.1.0 + + astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1): + dependencies: + '@astrojs/compiler-rs': 0.5.1 + '@astrojs/internal-helpers': 0.11.0 + '@astrojs/markdown-satteri': 0.4.2 + '@astrojs/telemetry': 3.3.3 + '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.8.1 + '@oslojs/encoding': 1.1.0 + am-i-vibing: 0.4.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 2.0.1 + devalue: 5.9.4 + diff: 9.0.0 + dset: 3.1.4 + es-module-lexer: 2.3.2 + esbuild: 0.28.2 + find-proc: 0.2.0 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.3.0 + js-yaml: 4.3.2 + jsonc-parser: 3.3.1 + magic-string: 1.4.2 + magicast: 0.5.5 + mrmime: 2.0.1 + neotraverse: 1.0.1 + obug: 3.0.0 + p-limit: 7.3.3 + p-queue: 9.3.3 + package-manager-detector: 1.8.0 + piccolore: 0.1.3 + picomatch: 4.0.7 + shiki: 4.5.0 + smol-toml: 1.9.0 + svgo: 4.1.0 + tinyclip: 1.0.3 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + ultrahtml: 1.7.0 + unifont: 0.7.5 + unstorage: 1.17.5 + verkit: 0.4.1 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.6.5 + optionalDependencies: + sharp: 0.35.5(@types/node@24.19.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - uploadthing + - yaml + + axobject-query@4.1.0: {} - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + bail@2.0.2: {} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + baseline-browser-mapping@2.11.27: {} -snapshots: + bcp-47-match@2.0.3: {} - '@algolia/abtesting@1.15.1': + bcp-47@2.1.1: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights + birpc@2.9.0: {} - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch + birpc@4.2.0: {} - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)': + boolbase@1.0.0: {} + + browserslist@4.29.3: dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) - '@algolia/client-search': 5.49.1 - algoliasearch: 5.49.1 + baseline-browser-mapping: 2.11.27 + caniuse-lite: 1.0.30001814 + electron-to-chromium: 1.5.444 + node-releases: 2.0.57 + update-browserslist-db: 1.3.3(browserslist@4.29.3) - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)': + bundle-name@4.1.1: dependencies: - '@algolia/client-search': 5.49.1 - algoliasearch: 5.49.1 + run-applescript: 7.1.0 + + caniuse-lite@1.0.30001814: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} - '@algolia/client-abtesting@5.49.1': + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.3: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + readdirp: 4.1.2 - '@algolia/client-analytics@5.49.1': + chokidar@5.0.0: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + readdirp: 5.1.1 - '@algolia/client-common@5.49.1': {} + ci-info@4.4.0: {} - '@algolia/client-insights@5.49.1': + cliui@9.0.1: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - '@algolia/client-personalization@5.49.1': - dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + common-ancestor-path@2.0.0: {} + + convert-source-map@2.0.0: {} - '@algolia/client-query-suggestions@5.49.1': + cookie-es@1.2.3: {} + + cookie@2.0.1: {} + + crelt@1.0.6: {} + + crossws@0.3.5: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + uncrypto: 0.1.3 - '@algolia/client-search@5.49.1': + css-select@6.0.0: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 - '@algolia/ingestion@1.49.1': + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + mdn-data: 2.0.28 + source-map-js: 1.2.1 - '@algolia/monitoring@1.49.1': + css-tree@3.2.1: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@7.0.0: {} - '@algolia/recommend@5.49.1': + cssesc@3.0.0: {} + + csso@5.0.5: dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + css-tree: 2.2.1 + + csstype@3.2.3: {} - '@algolia/requester-browser-xhr@5.49.1': + debug@4.4.3: dependencies: - '@algolia/client-common': 5.49.1 + ms: 2.1.3 - '@algolia/requester-fetch@5.49.1': + decode-named-character-reference@1.3.0: dependencies: - '@algolia/client-common': 5.49.1 + character-entities: 2.0.2 + + default-browser-id@5.0.1: {} - '@algolia/requester-node-http@5.49.1': + default-browser@5.5.1: dependencies: - '@algolia/client-common': 5.49.1 + bundle-name: 4.1.1 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.7: {} + + dequal@2.0.3: {} - '@babel/helper-string-parser@7.27.1': {} + destr@2.0.5: {} - '@babel/helper-validator-identifier@7.28.5': {} + detect-libc@2.1.2: {} - '@babel/parser@7.29.2': + devalue@5.9.4: {} + + devlop@1.1.0: dependencies: - '@babel/types': 7.29.0 + dequal: 2.0.3 + + diff@9.0.0: {} - '@babel/types@7.29.0': + direction@2.0.1: {} + + dom-serializer@2.0.0: dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} - '@codemirror/commands@6.10.3': + domhandler@5.0.3: dependencies: - '@codemirror/language': 6.12.3 - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.40.0 - '@lezer/common': 1.5.1 + domelementtype: 2.3.0 - '@codemirror/language@6.12.3': + domutils@3.2.2: dependencies: - '@codemirror/state': 6.6.0 - '@codemirror/view': 6.40.0 - '@lezer/common': 1.5.1 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 - style-mod: 4.1.3 + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} - '@codemirror/legacy-modes@6.5.2': + electron-to-chromium@1.5.444: {} + + emmet@2.4.11: dependencies: - '@codemirror/language': 6.12.3 + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@10.6.0: {} + + entities@4.5.0: {} + + entities@7.0.1: {} + + error-stack-parser-es@1.0.5: {} + + es-module-lexer@2.3.2: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + estree-walker@2.0.2: {} + + eventemitter3@5.0.4: {} - '@codemirror/state@6.6.0': + expressive-code@0.44.2: dependencies: - '@marijn/find-cluster-break': 1.0.2 + '@expressive-code/core': 0.44.2 + '@expressive-code/plugin-frames': 0.44.2 + '@expressive-code/plugin-shiki': 0.44.2 + '@expressive-code/plugin-text-markers': 0.44.2 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-string-truncated-width@3.0.3: {} - '@codemirror/view@6.40.0': + fast-string-width@3.0.2: dependencies: - '@codemirror/state': 6.6.0 - crelt: 1.0.6 - style-mod: 4.1.3 - w3c-keyname: 2.2.8 + fast-string-truncated-width: 3.0.3 - '@docsearch/css@3.8.2': {} + fast-uri@3.1.8: {} - '@docsearch/js@3.8.2(@algolia/client-search@5.49.1)(search-insights@2.17.3)': + fast-wrap-ansi@0.2.2: dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.49.1)(search-insights@2.17.3) - preact: 10.28.4 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.2(@algolia/client-search@5.49.1)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) - '@docsearch/css': 3.8.2 - algoliasearch: 5.49.1 + fast-string-width: 3.0.2 + + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' + picomatch: 4.0.7 - '@esbuild/aix-ppc64@0.21.5': - optional: true + find-proc@0.2.0: {} - '@esbuild/android-arm64@0.21.5': - optional: true + flattie@1.1.1: {} - '@esbuild/android-arm@0.21.5': - optional: true + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 - '@esbuild/android-x64@0.21.5': - optional: true + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 - '@esbuild/darwin-arm64@0.21.5': + fsevents@2.3.3: optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true + gensync@1.0.0-beta.2: {} - '@esbuild/freebsd-arm64@0.21.5': - optional: true + get-caller-file@2.0.5: {} - '@esbuild/freebsd-x64@0.21.5': - optional: true + get-east-asian-width@1.7.0: {} - '@esbuild/linux-arm64@0.21.5': - optional: true + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 - '@esbuild/linux-arm@0.21.5': - optional: true + github-slugger@2.0.0: {} - '@esbuild/linux-ia32@0.21.5': - optional: true + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-is-element: 3.0.0 - '@esbuild/linux-loong64@0.21.5': - optional: true + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 - '@esbuild/linux-mips64el@0.21.5': - optional: true + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.5 - '@esbuild/linux-ppc64@0.21.5': - optional: true + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.5 - '@esbuild/linux-riscv64@0.21.5': - optional: true + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.5 - '@esbuild/linux-s390x@0.21.5': - optional: true + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 - '@esbuild/linux-x64@0.21.5': - optional: true + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 - '@esbuild/netbsd-x64@0.21.5': - optional: true + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 - '@esbuild/openbsd-x64@0.21.5': - optional: true + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 - '@esbuild/sunos-x64@0.21.5': - optional: true + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 - '@esbuild/win32-arm64@0.21.5': - optional: true + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.5 - '@esbuild/win32-ia32@0.21.5': - optional: true + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 - '@esbuild/win32-x64@0.21.5': - optional: true + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 - '@fontsource/merriweather@5.2.11': {} + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 - '@fontsource/noto-serif-sc@5.2.8': {} + hookable@5.5.3: {} - '@iconify-json/simple-icons@1.2.71': - dependencies: - '@iconify/types': 2.0.0 + html-escaper@3.0.3: {} - '@iconify/types@2.0.0': {} + html-void-elements@3.0.0: {} - '@jridgewell/sourcemap-codec@1.5.5': {} + html-whitespace-sensitive-tag-names@3.0.1: {} - '@lezer/common@1.5.1': {} + http-cache-semantics@4.3.0: {} - '@lezer/highlight@1.2.3': - dependencies: - '@lezer/common': 1.5.1 + i18next@26.4.2(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 - '@lezer/lr@1.4.8': + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: dependencies: - '@lezer/common': 1.5.1 + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 - '@marijn/find-cluster-break@1.0.2': {} + is-decimal@2.0.1: {} - '@rollup/rollup-android-arm-eabi@4.59.0': - optional: true + is-docker@3.0.0: {} - '@rollup/rollup-android-arm64@4.59.0': - optional: true + is-docker@4.0.0: {} - '@rollup/rollup-darwin-arm64@4.59.0': - optional: true + is-hexadecimal@2.0.1: {} - '@rollup/rollup-darwin-x64@4.59.0': - optional: true + is-in-ssh@1.0.0: {} - '@rollup/rollup-freebsd-arm64@4.59.0': - optional: true + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 - '@rollup/rollup-freebsd-x64@4.59.0': - optional: true + is-plain-obj@4.1.0: {} - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - optional: true + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - optional: true + js-tokens@4.0.0: {} - '@rollup/rollup-linux-arm64-gnu@4.59.0': - optional: true + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 - '@rollup/rollup-linux-arm64-musl@4.59.0': - optional: true + jsesc@3.1.0: {} - '@rollup/rollup-linux-loong64-gnu@4.59.0': - optional: true + json-schema-traverse@1.0.0: {} - '@rollup/rollup-linux-loong64-musl@4.59.0': - optional: true + json5@2.2.3: {} - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - optional: true + jsonc-parser@2.3.1: {} - '@rollup/rollup-linux-ppc64-musl@4.59.0': - optional: true + jsonc-parser@3.3.1: {} + + kleur@4.1.5: {} + + klona@2.0.6: {} + + kolorist@1.8.0: {} - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + lightningcss-android-arm64@1.33.0: optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + lightningcss-darwin-arm64@1.33.0: optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + lightningcss-darwin-x64@1.33.0: optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + lightningcss-freebsd-x64@1.33.0: optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + lightningcss-linux-arm64-gnu@1.33.0: optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + lightningcss-linux-arm64-musl@1.33.0: optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + lightningcss-linux-x64-gnu@1.33.0: optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + lightningcss-linux-x64-musl@1.33.0: optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + lightningcss-win32-arm64-msvc@1.33.0: optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + lightningcss-win32-x64-msvc@1.33.0: optional: true - '@shikijs/core@2.5.0': + lightningcss@1.33.0: dependencies: - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@2.5.0': + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + longest-streak@3.1.0: {} + + lru-cache@11.5.3: {} + + lru-cache@5.1.1: dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 3.1.1 + yallist: 3.1.1 - '@shikijs/engine-oniguruma@2.5.0': + magic-string@0.30.21: dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 + '@jridgewell/sourcemap-codec': 1.6.0 - '@shikijs/langs@2.5.0': + magic-string@1.4.2: dependencies: - '@shikijs/types': 2.5.0 + '@jridgewell/sourcemap-codec': 1.6.0 - '@shikijs/themes@2.5.0': + magicast@0.5.5: dependencies: - '@shikijs/types': 2.5.0 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - '@shikijs/themes@4.0.2': + mdast-util-directive@3.1.1: dependencies: - '@shikijs/types': 4.0.2 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + micromark-util-character: 2.1.1 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color - '@shikijs/transformers@2.5.0': + mdast-util-from-markdown@2.1.0: dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/types': 2.5.0 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.3 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color - '@shikijs/types@2.5.0': + mdast-util-phrasing@4.1.0: dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 - '@shikijs/types@4.0.2': + mdast-util-to-hast@13.2.1: dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - - '@types/estree@1.0.8': {} + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 - '@types/hast@3.0.4': + mdast-util-to-markdown@2.2.0: dependencies: + '@types/mdast': 4.0.4 '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': + mdast-util-to-string@4.0.0: dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 + '@types/mdast': 4.0.4 - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 + mdn-data@2.0.28: {} - '@types/mdurl@2.0.0': {} + mdn-data@2.27.1: {} - '@types/node@25.5.0': + micromark-core-commonmark@2.0.4: dependencies: - undici-types: 7.18.2 - - '@types/unist@3.0.3': {} - - '@types/web-bluetooth@0.0.21': {} + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@ungap/structured-clone@1.3.0': {} + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + parse-entities: 4.0.2 - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@25.5.0))(vue@3.5.31)': + micromark-factory-destination@2.0.1: dependencies: - vite: 5.4.21(@types/node@25.5.0) - vue: 3.5.31 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/compiler-core@3.5.31': + micromark-factory-label@2.0.1: dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.31 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/compiler-dom@3.5.31': + micromark-factory-space@2.1.0: dependencies: - '@vue/compiler-core': 3.5.31 - '@vue/shared': 3.5.31 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.3 - '@vue/compiler-sfc@3.5.31': + micromark-factory-title@2.0.1: dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.31 - '@vue/compiler-dom': 3.5.31 - '@vue/compiler-ssr': 3.5.31 - '@vue/shared': 3.5.31 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.8 - source-map-js: 1.2.1 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/compiler-ssr@3.5.31': + micromark-factory-whitespace@2.0.1: dependencies: - '@vue/compiler-dom': 3.5.31 - '@vue/shared': 3.5.31 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/devtools-api@7.7.9': + micromark-util-character@2.1.1: dependencies: - '@vue/devtools-kit': 7.7.9 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/devtools-kit@7.7.9': + micromark-util-chunked@2.0.1: dependencies: - '@vue/devtools-shared': 7.7.9 - birpc: 2.9.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.6 + micromark-util-symbol: 2.0.1 - '@vue/devtools-shared@7.7.9': + micromark-util-classify-character@2.0.1: dependencies: - rfdc: 1.4.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/reactivity@3.5.31': + micromark-util-combine-extensions@2.0.1: dependencies: - '@vue/shared': 3.5.31 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.3 - '@vue/runtime-core@3.5.31': + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - '@vue/reactivity': 3.5.31 - '@vue/shared': 3.5.31 + micromark-util-symbol: 2.0.1 - '@vue/runtime-dom@3.5.31': + micromark-util-decode-string@2.0.1: dependencies: - '@vue/reactivity': 3.5.31 - '@vue/runtime-core': 3.5.31 - '@vue/shared': 3.5.31 - csstype: 3.2.3 + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - '@vue/server-renderer@3.5.31(vue@3.5.31)': + micromark-util-edit-map@1.0.0: dependencies: - '@vue/compiler-ssr': 3.5.31 - '@vue/shared': 3.5.31 - vue: 3.5.31 + micromark-util-types: 2.0.3 - '@vue/shared@3.5.29': {} + micromark-util-encode@2.0.1: {} - '@vue/shared@3.5.31': {} + micromark-util-html-tag-name@2.0.1: {} - '@vueuse/core@12.8.2': + micromark-util-normalize-identifier@2.0.1: dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.31 - transitivePeerDependencies: - - typescript + micromark-util-symbol: 2.0.1 - '@vueuse/integrations@12.8.2(focus-trap@7.8.0)': + micromark-util-resolve-all@2.0.1: dependencies: - '@vueuse/core': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.31 - optionalDependencies: - focus-trap: 7.8.0 - transitivePeerDependencies: - - typescript - - '@vueuse/metadata@12.8.2': {} + micromark-util-types: 2.0.3 - '@vueuse/shared@12.8.2': + micromark-util-sanitize-uri@2.0.1: dependencies: - vue: 3.5.31 - transitivePeerDependencies: - - typescript - - algoliasearch@5.49.1: - dependencies: - '@algolia/abtesting': 1.15.1 - '@algolia/client-abtesting': 5.49.1 - '@algolia/client-analytics': 5.49.1 - '@algolia/client-common': 5.49.1 - '@algolia/client-insights': 5.49.1 - '@algolia/client-personalization': 5.49.1 - '@algolia/client-query-suggestions': 5.49.1 - '@algolia/client-search': 5.49.1 - '@algolia/ingestion': 1.49.1 - '@algolia/monitoring': 1.49.1 - '@algolia/recommend': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - birpc@2.9.0: {} + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - ccount@2.0.1: {} + micromark-util-symbol@2.0.1: {} - character-entities-html4@2.1.0: {} + micromark-util-types@2.0.3: {} - character-entities-legacy@3.0.0: {} + micromark@4.0.3: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + transitivePeerDependencies: + - supports-color - comma-separated-tokens@2.0.3: {} + mrmime@2.0.1: {} - copy-anything@4.0.5: - dependencies: - is-what: 5.5.0 + ms@2.1.3: {} - crelt@1.0.6: {} + muggle-string@0.4.1: {} - csstype@3.2.3: {} + nanoid@3.3.19: {} - dequal@2.0.3: {} + neotraverse@1.0.1: {} - devlop@1.1.0: + nlcst-to-string@4.0.0: dependencies: - dequal: 2.0.3 + '@types/nlcst': 2.0.3 - emoji-regex-xs@1.0.0: {} + node-fetch-native@1.6.7: {} - entities@7.0.1: {} + node-mock-http@1.0.5: {} - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + node-releases@2.0.57: {} - estree-walker@2.0.2: {} + normalize-path@3.0.0: {} - focus-trap@7.8.0: + nth-check@2.1.1: dependencies: - tabbable: 6.4.0 + boolbase: 1.0.0 - fsevents@2.3.3: - optional: true + obug@2.2.1: {} - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 + obug@3.0.0: {} - hast-util-whitespace@3.0.0: + ofetch@1.5.1: dependencies: - '@types/hast': 3.0.4 - - hookable@5.5.3: {} + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 - html-void-elements@3.0.0: {} + ohash@2.0.12: {} - is-what@5.5.0: {} + oniguruma-parser@0.12.2: {} - magic-string@0.30.21: + oniguruma-to-es@4.3.6: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - mark.js@8.11.1: {} + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 - mdast-util-to-hast@13.2.1: + open@11.0.4: dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.2.1 + wsl-utils: 1.0.1 + + p-limit@7.3.3: + dependencies: + yocto-queue: 1.2.2 - micromark-util-character@2.1.1: + p-queue@9.3.3: dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + eventemitter3: 5.0.4 + p-timeout: 7.0.2 - micromark-util-encode@2.0.1: {} + p-timeout@7.0.2: {} - micromark-util-sanitize-uri@2.0.1: + package-manager-detector@1.8.0: {} + + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + + parse-entities@4.0.2: dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 - micromark-util-symbol@2.0.1: {} + path-browserify@1.0.1: {} - micromark-util-types@2.0.2: {} + pathe@2.0.3: {} - minisearch@7.2.0: {} + perfect-debounce@2.1.0: {} - mitt@3.0.1: {} + piccolore@0.1.3: {} - nanoid@3.3.11: {} + picocolors@1.1.1: {} - oniguruma-to-es@3.1.1: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 6.1.0 - regex-recursion: 6.0.2 + picomatch@2.3.2: {} - perfect-debounce@1.0.0: {} + picomatch@4.0.7: {} - picocolors@1.1.1: {} + postcss-nested@6.2.0(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + postcss-selector-parser: 6.1.4 - postcss@8.5.6: + postcss-selector-parser@6.1.4: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + cssesc: 3.0.0 + util-deprecate: 1.0.2 - postcss@8.5.8: + postcss@8.5.28: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.19 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.28.4: {} + powershell-utils@0.2.1: {} + + prettier@3.9.9: {} prismjs@1.30.0: {} + process-ancestry@0.1.0: {} + property-information@7.1.0: {} + radix3@1.1.2: {} + + readdirp@4.1.2: {} + + readdirp@5.1.1: {} + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -1630,74 +4725,234 @@ snapshots: dependencies: regex-utilities: 2.3.0 - rfdc@1.4.1: {} + rehype-expressive-code@0.44.2: + dependencies: + expressive-code: 0.44.2 - rollup@4.59.0: + remark-directive@4.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.1 + micromark-extension-directive: 4.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-from-string@2.0.2: {} + + resolve-pkg-maps@1.0.0: {} + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + rolldown@1.2.12: + dependencies: + '@oxc-project/types': 0.152.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 - fsevents: 2.3.3 + '@rolldown/binding-android-arm-eabi': 1.2.12 + '@rolldown/binding-android-arm64': 1.2.12 + '@rolldown/binding-darwin-arm64': 1.2.12 + '@rolldown/binding-darwin-x64': 1.2.12 + '@rolldown/binding-freebsd-x64': 1.2.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.12 + '@rolldown/binding-linux-arm64-gnu': 1.2.12 + '@rolldown/binding-linux-arm64-musl': 1.2.12 + '@rolldown/binding-linux-ppc64-gnu': 1.2.12 + '@rolldown/binding-linux-s390x-gnu': 1.2.12 + '@rolldown/binding-linux-x64-gnu': 1.2.12 + '@rolldown/binding-linux-x64-musl': 1.2.12 + '@rolldown/binding-openharmony-arm64': 1.2.12 + '@rolldown/binding-win32-arm64-msvc': 1.2.12 + '@rolldown/binding-win32-x64-msvc': 1.2.12 + + run-applescript@7.1.0: {} + + satteri@0.10.5: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + optionalDependencies: + '@bruits/satteri-darwin-arm64': 0.10.5 + '@bruits/satteri-darwin-x64': 0.10.5 + '@bruits/satteri-linux-arm64-gnu': 0.10.5 + '@bruits/satteri-linux-arm64-musl': 0.10.5 + '@bruits/satteri-linux-x64-gnu': 0.10.5 + '@bruits/satteri-linux-x64-musl': 0.10.5 + '@bruits/satteri-wasm32-wasi': 0.10.5 + '@bruits/satteri-win32-arm64-msvc': 0.10.5 + '@bruits/satteri-win32-x64-msvc': 0.10.5 - search-insights@2.17.3: {} + sax@1.6.1: {} - shiki@2.5.0: + semver@6.3.1: {} + + semver@7.8.5: {} + + sharp@0.35.5(@types/node@24.19.1): + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 24.19.1 + optional: true + + shiki@4.5.0: dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/langs': 2.5.0 - '@shikijs/themes': 2.5.0 - '@shikijs/types': 2.5.0 + '@shikijs/core': 4.5.0 + '@shikijs/engine-javascript': 4.5.0 + '@shikijs/engine-oniguruma': 4.5.0 + '@shikijs/langs': 4.5.0 + '@shikijs/themes': 4.5.0 + '@shikijs/types': 4.5.0 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + sitemap@9.0.1: + dependencies: + '@types/node': 24.19.1 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.6.1 + + smol-toml@1.9.0: {} source-map-js@1.2.1: {} space-separated-tokens@2.0.2: {} - speakingurl@14.0.1: {} + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + string-width@8.3.0: + dependencies: + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.4.0 + style-mod@4.1.3: {} - superjson@2.2.6: + svgo@4.1.0: + dependencies: + commander: 11.1.0 + css-select: 6.0.0 + css-tree: 3.2.1 + css-what: 7.0.0 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.1 + + tiny-inflate@1.0.3: {} + + tinyclip@1.0.3: {} + + tinyexec@1.3.1: {} + + tinyglobby@0.2.17: dependencies: - copy-anything: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - tabbable@6.4.0: {} + totalist@3.0.1: {} trim-lines@3.0.1: {} - undici-types@7.18.2: {} + trough@2.2.0: {} + + tslib@2.8.1: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.8.5 + + typescript@6.0.3: {} + + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + + uncrypto@0.1.3: {} + + undici-types@7.24.6: {} + + undici@8.11.2: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.5: + dependencies: + css-tree: 3.2.1 + ohash: 2.0.12 + undici: 8.11.2 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 unist-util-is@6.0.1: dependencies: @@ -1722,6 +4977,34 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.7 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.3 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + update-browserslist-db@1.3.3(browserslist@4.29.3): + dependencies: + browserslist: 4.29.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + url-extras@0.1.0: {} + + util-deprecate@1.0.2: {} + + verkit@0.4.1: {} + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -1732,72 +5015,244 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@5.4.21(@types/node@25.5.0): + vite-dev-rpc@2.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): + dependencies: + birpc: 4.2.0 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vite-hot-client: 2.2.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) + + vite-hot-client@2.2.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): + dependencies: + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + + vite-plugin-inspect@11.4.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): + dependencies: + ansis: 4.4.0 + error-stack-parser-es: 1.0.5 + obug: 2.2.1 + ohash: 2.0.12 + open: 11.0.4 + perfect-debounce: 2.1.0 + sirv: 3.0.2 + unplugin-utils: 0.3.2 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vite-dev-rpc: 2.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) + + vite-plugin-vue-devtools@8.2.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)): + dependencies: + '@vue/devtools-core': 8.2.1(vue@3.5.43(typescript@6.0.3)) + '@vue/devtools-kit': 8.2.1 + '@vue/devtools-shared': 8.2.1 + sirv: 3.0.2 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + vite-plugin-inspect: 11.4.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) + vite-plugin-vue-inspector: 6.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) + vue: 3.5.43(typescript@6.0.3) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + + vite-plugin-vue-inspector@6.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.7) + '@vue/compiler-dom': 3.5.43 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + transitivePeerDependencies: + - supports-color + + vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1): dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.59.0 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.12 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 24.19.1 + esbuild: 0.28.2 fsevents: 2.3.3 + yaml: 2.9.1 - vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@25.5.0)(postcss@8.5.8)(search-insights@2.17.3): - dependencies: - '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.49.1)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.71 - '@shikijs/core': 2.5.0 - '@shikijs/transformers': 2.5.0 - '@shikijs/types': 2.5.0 - '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@25.5.0))(vue@3.5.31) - '@vue/devtools-api': 7.7.9 - '@vue/shared': 3.5.29 - '@vueuse/core': 12.8.2 - '@vueuse/integrations': 12.8.2(focus-trap@7.8.0) - focus-trap: 7.8.0 - mark.js: 8.11.1 - minisearch: 7.2.0 - shiki: 2.5.0 - vite: 5.4.21(@types/node@25.5.0) - vue: 3.5.31 + vitefu@1.1.3(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): optionalDependencies: - postcss: 8.5.8 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jwt-decode - - less - - lightningcss - - nprogress - - qrcode - - react - - react-dom - - sass - - sass-embedded - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - typescript - - universal-cookie + vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) + + volar-service-css@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): + dependencies: + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + + volar-service-emmet@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + + volar-service-html@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): + dependencies: + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + + volar-service-prettier@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(prettier@3.9.9): + dependencies: + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + prettier: 3.9.9 + + volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): + dependencies: + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + typescript: 6.0.3 + + volar-service-typescript@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): + dependencies: + path-browserify: 1.0.1 + semver: 7.8.5 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.15 + vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) + typescript: 6.0.3 + + volar-service-yaml@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): + dependencies: + vscode-uri: 3.2.0 + yaml-language-server: 1.23.0 + optionalDependencies: + '@volar/language-service': 2.4.28(typescript@6.0.3) - vue@3.5.31: + vscode-css-languageservice@6.3.10: dependencies: - '@vue/compiler-dom': 3.5.31 - '@vue/compiler-sfc': 3.5.31 - '@vue/runtime-dom': 3.5.31 - '@vue/server-renderer': 3.5.31(vue@3.5.31) - '@vue/shared': 3.5.31 + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.2.0 + + vscode-html-languageservice@5.6.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-jsonrpc@9.0.3: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-protocol@3.18.4: + dependencies: + vscode-jsonrpc: 9.0.3 + vscode-languageserver-types: 3.18.4 + + vscode-languageserver-textdocument@1.0.15: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver-types@3.18.4: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.2.0: {} + + vue@3.5.43(typescript@6.0.3): + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/server-renderer': 3.5.43 + '@vue/shared': 3.5.43 + optionalDependencies: + typescript: 6.0.3 w3c-keyname@2.2.8: {} + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wsl-utils@1.0.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.2.1 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml-language-server@1.23.0: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-i18n: 4.2.0(ajv@8.20.0) + prettier: 3.9.9 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 + yaml: 2.8.3 + + yaml@2.8.3: {} + + yaml@2.9.1: {} + + yargs-parser@22.0.0: {} + + yargs@18.2.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.3.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yocto-queue@1.2.2: {} + + zod@4.6.5: {} + zwitch@2.0.4: {} diff --git a/doc/pnpm-workspace.yaml b/doc/pnpm-workspace.yaml index efc037aa..5ed0b5af 100644 --- a/doc/pnpm-workspace.yaml +++ b/doc/pnpm-workspace.yaml @@ -1,2 +1,2 @@ -onlyBuiltDependencies: - - esbuild +allowBuilds: + esbuild: true diff --git a/doc/docs/.vitepress/public/favicon.ico b/doc/public/favicon.ico similarity index 100% rename from doc/docs/.vitepress/public/favicon.ico rename to doc/public/favicon.ico diff --git a/doc/docs/.vitepress/public/image/favicon/android-chrome-192x192.png b/doc/public/image/favicon/android-chrome-192x192.png similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/android-chrome-192x192.png rename to doc/public/image/favicon/android-chrome-192x192.png diff --git a/doc/docs/.vitepress/public/image/favicon/android-chrome-512x512.png b/doc/public/image/favicon/android-chrome-512x512.png similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/android-chrome-512x512.png rename to doc/public/image/favicon/android-chrome-512x512.png diff --git a/doc/docs/.vitepress/public/image/favicon/apple-touch-icon.png b/doc/public/image/favicon/apple-touch-icon.png similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/apple-touch-icon.png rename to doc/public/image/favicon/apple-touch-icon.png diff --git a/doc/docs/.vitepress/public/image/favicon/favicon-16x16.png b/doc/public/image/favicon/favicon-16x16.png similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/favicon-16x16.png rename to doc/public/image/favicon/favicon-16x16.png diff --git a/doc/docs/.vitepress/public/image/favicon/favicon-32x32.png b/doc/public/image/favicon/favicon-32x32.png similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/favicon-32x32.png rename to doc/public/image/favicon/favicon-32x32.png diff --git a/doc/docs/.vitepress/public/image/favicon/favicon.ico b/doc/public/image/favicon/favicon.ico similarity index 100% rename from doc/docs/.vitepress/public/image/favicon/favicon.ico rename to doc/public/image/favicon/favicon.ico diff --git a/doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png b/doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png similarity index 100% rename from doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png rename to doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.png diff --git a/doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.zip b/doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.zip similarity index 100% rename from doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.zip rename to doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu.zip diff --git a/doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_full.png b/doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_full.png similarity index 100% rename from doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_full.png rename to doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_full.png diff --git a/doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_trans.png b/doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_trans.png similarity index 100% rename from doc/docs/.vitepress/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_trans.png rename to doc/public/image/mascot/electrichearts_20260211A_yuescript_xiaoyu_trans.png diff --git a/doc/docs/.vitepress/public/image/yuescript.png b/doc/public/image/yuescript.png similarity index 100% rename from doc/docs/.vitepress/public/image/yuescript.png rename to doc/public/image/yuescript.png diff --git a/doc/docs/.vitepress/public/image/yuescript.svg b/doc/public/image/yuescript.svg similarity index 100% rename from doc/docs/.vitepress/public/image/yuescript.svg rename to doc/public/image/yuescript.svg diff --git a/doc/docs/.vitepress/public/js/.gitkeep b/doc/public/js/.gitkeep similarity index 100% rename from doc/docs/.vitepress/public/js/.gitkeep rename to doc/public/js/.gitkeep diff --git a/doc/scripts/check-docs.mjs b/doc/scripts/check-docs.mjs new file mode 100644 index 00000000..3bedce2b --- /dev/null +++ b/doc/scripts/check-docs.mjs @@ -0,0 +1,140 @@ +import assert from "node:assert/strict"; +import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; +import { locales } from "../src/locales.mjs"; + +const decodeHtml = (text) => + text.replace(/&(#x[\da-f]+|#\d+|amp|quot|lt|gt|apos);/gi, (_, entity) => { + if (entity[0] === "#") + return String.fromCodePoint( + entity[1].toLowerCase() === "x" + ? parseInt(entity.slice(2), 16) + : Number(entity.slice(1)), + ); + return { amp: "&", quot: '"', lt: "<", gt: ">", apos: "'" }[entity]; + }); + +const files = readdirSync("src/content/docs", { recursive: true }).filter( + (file) => /\.mdx?$/.test(file), +); +const docs = files + .map((file) => { + const source = readFileSync(`src/content/docs/${file}`, "utf8"); + const frontmatter = source.match(/^---\n([\s\S]*?)\n---/)?.[1] ?? ""; + const slug = file.replace(/\.mdx?$/, "").replace(/\/index$/, ""); + return { + file, + source, + slug, + splash: /^template:\s*splash$/m.test(frontmatter), + order: Number(frontmatter.match(/^ order: (-?\d+)/m)?.[1] ?? Infinity), + }; + }) + .sort((a, b) => a.order - b.order || a.slug.localeCompare(b.slug)); + +const localeFor = (file) => + Object.keys(locales).find((locale) => file.startsWith(`${locale}/`)) ?? "root"; + +function checkInterface(html, route) { + for (const [image] of html.matchAll(/]*>/g)) { + assert.match(image, /\salt(?:="[^"]*"|(?=\s|>))/, `Image needs alternative text: ${route}`); + assert.match(image, /\bwidth="\d+"/, `Image needs a numeric width: ${route}`); + assert.match(image, /\bheight="\d+"/, `Image needs a numeric height: ${route}`); + } + assert.match(html, /class="[^"]*sl-skip-link/, `Missing skip link: ${route}`); + assert.match(html, /name="theme-color"/, `Missing theme color: ${route}`); + assert.match(html, /rel="preload"[^>]*as="font"/, `Missing heading font preload: ${route}`); + for (const [code] of html.matchAll(/<(?:pre|code)\b[^>]*>/g)) { + assert.match(code, /\btranslate="no"/, `Code must not be auto-translated: ${route}`); + } +} + +for (const [locale, { lang }] of Object.entries(locales)) { + const route = locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; + const aggregate = readFileSync(`dist${route}index.html`, "utf8"); + checkInterface(aggregate, route); + const localeDocs = docs.filter(({ file, splash }) => !splash && localeFor(file) === locale); + const sections = [...aggregate.matchAll(/
match[1], + ); + assert.deepEqual( + sections, + localeDocs.map(({ slug }) => slug), + `${route} must include only its language's docs, excluding splash pages, once in sidebar order`, + ); + assert.ok(aggregate.includes(`lang="${lang}"`), `Wrong page language: ${route}`); + const ids = [...aggregate.matchAll(/\sid="([^"]+)"/g)].map((match) => match[1]); + const anchors = new Set(ids); + assert.equal(ids.length, anchors.size, `Duplicate aggregate IDs: ${route}`); + for (const [, hash] of aggregate.matchAll(/\shref="#([^"]+)"/g)) { + assert.ok(anchors.has(decodeURIComponent(hash)), `Missing anchor: ${route}#${hash}`); + } + assert.ok(!aggregate.includes("|\s)/g) ?? []).length, + localeDocs.reduce((count, { source }) => + count + (source.match(/data-yue-compile(?:>|\s)/g) ?? []).length, 0), + `Missing aggregate compiler controls: ${route}`, + ); +} + +let controls = 0; +for (const { file, source, slug, splash } of docs) { + const output = `dist/${slug === "index" ? "" : `${slug}/`}index.html`; + assert.ok(existsSync(output), `Missing documentation route: ${output}`); + if (!/(^|\/)index\.mdx?$/.test(file)) { + const redirect = `dist/${slug}.html`; + assert.ok( + statSync(redirect).isFile(), + `Legacy HTML route must be a file: ${redirect}`, + ); + assert.ok( + readFileSync(redirect, "utf8").includes(`/${slug}/`), + `Wrong legacy redirect: ${redirect}`, + ); + } + const html = readFileSync(output, "utf8"); + checkInterface(html, `/${slug}/`); + const locale = localeFor(file); + const aggregateRoute = locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; + // Splash pages have no sidebar; all documentation pages link to their own language. + if (!splash) { + assert.ok(html.includes(`href="${aggregateRoute}"`), `Missing locale aggregate link: ${file}`); + } + const expectedControls = (source.match(/data-yue-compile(?:>|\s)/g) ?? []) + .length; + assert.equal( + (html.match(/data-yue-compile(?:>|\s)/g) ?? []).length, + expectedControls, + `Missing compiler controls: ${file}`, + ); + controls += expectedControls; + const snippets = [ + ...source.matchAll( + /
[\s\S]*?```(?:yue|yuescript)\n([\s\S]*?)\n```/g, + ), + ].map((match) => match[1]); + const payloads = [ + ...html.matchAll(/
[\s\S]*?\sdata-code="([^"]*)"/g), + ].map((match) => decodeHtml(match[1]).replaceAll("\u007f", "\n")); + assert.deepEqual( + payloads, + snippets, + `Compiler payload must preserve every code line: ${file}`, + ); + for (const [, pathname] of html.matchAll( + /(?:href|src)="(\/(?!\/)[^"#?]*)[^\"]*"/g, + )) { + const path = decodeURIComponent(pathname); + assert.ok( + existsSync(`dist${path}`) || existsSync(`dist${path}/index.html`), + `Broken local link in ${file}: ${path}`, + ); + } +} +assert.ok( + !readdirSync(".").some((file) => /^yue-.*\.md$/.test(file)), + "Standalone yue-*.md manuals must be removed", +); +console.log( + `Verified ${docs.length} routes, legacy HTML redirects, ${Object.keys(locales).length} language aggregates, ordering and anchors, and ${controls} compiler controls.`, +); diff --git a/doc/src/components/AggregateContent.astro b/doc/src/components/AggregateContent.astro new file mode 100644 index 00000000..3fedffac --- /dev/null +++ b/doc/src/components/AggregateContent.astro @@ -0,0 +1,15 @@ +--- +interface Props { + prefix: string; +} + +const { prefix } = Astro.props; +// Each Markdown page can reuse heading IDs. Namespace them in the combined page. +const html = (await Astro.slots.render('default')) + .replace(/\bid="([^"]+)"/g, `id="${prefix}--$1"`) + .replace(/\bhref="#([^"]+)"/g, `href="#${prefix}--$1"`) + .replace(/(<\/?h)([1-5])\b/g, (_, tag, level) => `${tag}${Number(level) + 1}`) + .replace(/]*\sloading\s*=)/g, ' diff --git a/doc/src/components/CompilerFooter.astro b/doc/src/components/CompilerFooter.astro new file mode 100644 index 00000000..ad31d95d --- /dev/null +++ b/doc/src/components/CompilerFooter.astro @@ -0,0 +1,195 @@ +--- +import Footer from '@astrojs/starlight/components/Footer.astro'; +import { Icon } from '@astrojs/starlight/components'; +--- + +
+ +
+

YueScript Compiler

+ +
+
Loading compiler…
+
+ + + + diff --git a/doc/src/components/Head.astro b/doc/src/components/Head.astro new file mode 100644 index 00000000..eaf910e2 --- /dev/null +++ b/doc/src/components/Head.astro @@ -0,0 +1,24 @@ +--- +import Head from '@astrojs/starlight/components/Head.astro'; +import headingFont from '@fontsource/merriweather/files/merriweather-latin-700-normal.woff2?url'; +import heroFont from '@fontsource/merriweather/files/merriweather-latin-900-normal.woff2?url'; +--- + + + +{Astro.locals.starlightRoute.entry.data.template === 'splash' && ( + +)} + + + diff --git a/doc/src/components/HeaderLinks.astro b/doc/src/components/HeaderLinks.astro new file mode 100644 index 00000000..2ff4e88b --- /dev/null +++ b/doc/src/components/HeaderLinks.astro @@ -0,0 +1,23 @@ +--- +import SocialIcons from '@astrojs/starlight/components/SocialIcons.astro'; + +const tryHref = `${Astro.locals.starlightRoute.siteTitleHref}try/`; +--- + +Try yue! + + + diff --git a/doc/src/components/MarkdownContent.astro b/doc/src/components/MarkdownContent.astro new file mode 100644 index 00000000..6d66d809 --- /dev/null +++ b/doc/src/components/MarkdownContent.astro @@ -0,0 +1,9 @@ +--- +import MarkdownContent from '@astrojs/starlight/components/MarkdownContent.astro'; + +const html = (await Astro.slots.render('default')).replace( + /<(pre|code)\b(?![^>]*\stranslate\s*=)/g, '<$1 translate="no"', +); +--- + + diff --git a/doc/docs/.vitepress/theme/components/YueCompiler.vue b/doc/src/components/YueCompiler.vue old mode 100755 new mode 100644 similarity index 81% rename from doc/docs/.vitepress/theme/components/YueCompiler.vue rename to doc/src/components/YueCompiler.vue index e72088de..8d66b8d1 --- a/doc/docs/.vitepress/theme/components/YueCompiler.vue +++ b/doc/src/components/YueCompiler.vue @@ -1,45 +1,51 @@ diff --git a/doc/src/content.config.ts b/doc/src/content.config.ts new file mode 100644 index 00000000..7fbcf2c3 --- /dev/null +++ b/doc/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content"; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from "@astrojs/starlight/schema"; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/doc/docs/de/doc/advanced/do.md b/doc/src/content/docs/de/doc/advanced/do.md similarity index 65% rename from doc/docs/de/doc/advanced/do.md rename to doc/src/content/docs/de/doc/advanced/do.md index b0a442a1..44718924 100644 --- a/doc/docs/de/doc/advanced/do.md +++ b/doc/src/content/docs/de/doc/advanced/do.md @@ -1,4 +1,8 @@ -# Do +--- +title: Do +sidebar: + order: 30 +--- Als Statement verhält sich `do` wie in Lua. @@ -9,7 +13,9 @@ do print var -- nil hier ``` - +
+ + +
YueScripts **do** kann auch als Ausdruck verwendet werden. So kannst du mehrere Zeilen in einem Ausdruck kombinieren. Das Ergebnis des `do`-Ausdrucks ist die letzte Anweisung im Block. @@ -33,7 +40,9 @@ print counter! print counter! ``` - +
+ + +
```yuescript tbl = { @@ -56,7 +66,9 @@ tbl = { } ``` - +
+ + +
`do`-Ausdrücke unterstützen die Verwendung von `break`, um den Kontrollfluss zu unterbrechen und mehrere Rückgabewerte vorzeitig zurückzugeben. @@ -78,7 +91,9 @@ status, value = do break "small", n ``` - +
+ + +
diff --git a/doc/docs/de/doc/advanced/line-decorators.md b/doc/src/content/docs/de/doc/advanced/line-decorators.md similarity index 56% rename from doc/docs/de/doc/advanced/line-decorators.md rename to doc/src/content/docs/de/doc/advanced/line-decorators.md index dbeaeb5f..1383753b 100644 --- a/doc/docs/de/doc/advanced/line-decorators.md +++ b/doc/src/content/docs/de/doc/advanced/line-decorators.md @@ -1,4 +1,8 @@ -# Line-Decorators +--- +title: Line-Decorators +sidebar: + order: 29 +--- Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anweisungen am Zeilenende angewendet werden: @@ -6,13 +10,16 @@ Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anwe print "Hallo Welt" if name == "Rob" ``` - +
+ + +
Und mit einfachen Schleifen: @@ -20,13 +27,16 @@ Und mit einfachen Schleifen: print "Element: ", item for item in *items ``` - +
+ + +
Und mit `while`-Schleifen: @@ -36,7 +46,9 @@ game\update! while game\isRunning! reader\parse_line! until reader\eof! ``` - +
+ + +
diff --git a/doc/docs/de/doc/advanced/macro.md b/doc/src/content/docs/de/doc/advanced/macro.md similarity index 85% rename from doc/docs/de/doc/advanced/macro.md rename to doc/src/content/docs/de/doc/advanced/macro.md index 4287b2f6..da048bba 100644 --- a/doc/docs/de/doc/advanced/macro.md +++ b/doc/src/content/docs/de/doc/advanced/macro.md @@ -1,4 +1,8 @@ -# Makros +--- +title: Makros +sidebar: + order: 28 +--- ## Häufige Verwendung @@ -33,7 +37,9 @@ if $and f1!, f2!, f3! print "OK" ``` - +
+ + +
## Rohcode einfügen @@ -96,7 +103,9 @@ end ]==] ``` - +
+ + +
## Makros exportieren @@ -145,7 +155,9 @@ import "utils" as { [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ ``` - +
+ + +
## Eingebaute Makros @@ -176,14 +189,17 @@ print $FILE -- String des aktuellen Modulnamens print $LINE -- gibt 2 aus ``` - +
+ + +
## Makros mit Makros erzeugen @@ -207,7 +223,9 @@ print "Gültiger Enum-Typ:", $BodyType Static -- print "Kompilierungsfehler bei Enum-Typ:", $BodyType Unknown ``` - +
+ + +
## Mehrzeiligen Code erzeugen @@ -246,7 +265,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
```yuescript macro default_conf = (conf) -> | @@ -271,7 +293,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
## Argument-Validierung @@ -299,7 +324,9 @@ macro printNumAndStr = (num `Num, str `String) -> | $printNumAndStr 123, "hallo" ``` - +
+ + +
Wenn du flexiblere Argumentprüfungen brauchst, kannst du das eingebaute Makro `$is_ast` verwenden, um manuell an der passenden Stelle zu prüfen. @@ -324,7 +352,9 @@ macro printNumAndStr = (num, str) -> $printNumAndStr 123, "hallo" ``` - +
+ + +
Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. @@ -355,7 +386,9 @@ myFunc = -> return ``` - +
+ + +
Wenn das Annotationsmakro eine Konfigurationstabelle zurückgibt, steuert das optionale Feld `before`, ob das Ergebnis vor oder nach der annotierten Anweisung eingefügt wird. @@ -388,7 +422,9 @@ tableB = {} return ``` - +
+ + +
Da die folgende Anweisung als zusätzliches Makroargument übergeben wird, lassen sich mit Annotationen auch direkt Registrierungszeilen aus Klassendeklarationen erzeugen. Du kannst dabei dieselben AST-Argumentprüfungen wie bei normalen Makros verwenden. @@ -426,7 +463,9 @@ class Worker return ``` - +
+ + +
Annotationen können auch Wrapper-Code um Funktionen herum einfügen: @@ -461,7 +501,9 @@ $[ValidateNumberArgs] add = (a, b) -> a + b ``` - +
+ + +
Auf eine Annotation muss immer eine Anweisung folgen, und sie kann nicht auf eine `return`-Anweisung angewendet werden. Wenn die annotierte Anweisung am Ende eines Blocks steht und du die rohe AST-Form der Anweisung brauchst, füge ein explizites `return` danach ein, damit sie nicht in einen implizit zurückgegebenen Ausdruck eingebettet wird. diff --git a/doc/docs/de/doc/advanced/the-yuescript-library.md b/doc/src/content/docs/de/doc/advanced/the-yuescript-library.md similarity index 99% rename from doc/docs/de/doc/advanced/the-yuescript-library.md rename to doc/src/content/docs/de/doc/advanced/the-yuescript-library.md index 0c371bfa..4790b484 100644 --- a/doc/docs/de/doc/advanced/the-yuescript-library.md +++ b/doc/src/content/docs/de/doc/advanced/the-yuescript-library.md @@ -1,4 +1,8 @@ -# Die YueScript-Bibliothek +--- +title: Die YueScript-Bibliothek +sidebar: + order: 32 +--- Zugriff in Lua über `local yue = require("yue")`. diff --git a/doc/docs/de/doc/advanced/try.md b/doc/src/content/docs/de/doc/advanced/try.md similarity index 83% rename from doc/docs/de/doc/advanced/try.md rename to doc/src/content/docs/de/doc/advanced/try.md index 25059671..271a136c 100644 --- a/doc/docs/de/doc/advanced/try.md +++ b/doc/src/content/docs/de/doc/advanced/try.md @@ -1,4 +1,8 @@ -# Try +--- +title: Try +sidebar: + order: 31 +--- Die Syntax für Fehlerbehandlung in Lua in einer gängigen Form. @@ -30,7 +34,9 @@ catch err print result ``` - +
+ + +
## Try? @@ -84,7 +91,9 @@ catch e e ``` - +
+ + +
diff --git a/doc/docs/de/doc/assignment/assignment.md b/doc/src/content/docs/de/doc/assignment/assignment.md similarity index 74% rename from doc/docs/de/doc/assignment/assignment.md rename to doc/src/content/docs/de/doc/assignment/assignment.md index ed56e463..a3e5342e 100644 --- a/doc/docs/de/doc/assignment/assignment.md +++ b/doc/src/content/docs/de/doc/assignment/assignment.md @@ -1,4 +1,8 @@ -# Zuweisung +--- +title: Zuweisung +sidebar: + order: 10 +--- Variablen sind dynamisch typisiert und standardmäßig `local`. Du kannst den Geltungsbereich mit den Statements **local** und **global** ändern. @@ -8,7 +12,9 @@ a, b, c = 1, 2, 3 hello = 123 -- nutzt die bestehende Variable ``` - +
+ + +
## Update-Zuweisung @@ -33,7 +40,9 @@ s ..= "world" -- legt eine neue lokale Variable an, wenn sie nicht existiert arg or= "default value" ``` - +
+ + +
## Verkettete Zuweisung @@ -57,14 +67,17 @@ a = b = c = d = e = 0 x = y = z = f! ``` - +
+ + +
## Explizite Locals @@ -85,7 +98,9 @@ do B = 2 ``` - +
+ + +
## Explizite Globals @@ -125,7 +141,9 @@ do local Temp = "a local value" ``` - +
+ + +
diff --git a/doc/docs/de/doc/assignment/destructuring-assignment.md b/doc/src/content/docs/de/doc/assignment/destructuring-assignment.md similarity index 76% rename from doc/docs/de/doc/assignment/destructuring-assignment.md rename to doc/src/content/docs/de/doc/assignment/destructuring-assignment.md index 5582468c..2dfbff87 100644 --- a/doc/docs/de/doc/assignment/destructuring-assignment.md +++ b/doc/src/content/docs/de/doc/assignment/destructuring-assignment.md @@ -1,4 +1,8 @@ -# Destructuring-Zuweisung +--- +title: Destructuring-Zuweisung +sidebar: + order: 11 +--- Destructuring-Zuweisung ist eine Möglichkeit, schnell Werte aus einer Tabelle nach Name oder Position in array-basierten Tabellen zu extrahieren. @@ -13,7 +17,9 @@ thing = [1, 2] print a, b ``` - +
+ + +
Im Destructuring-Tabellenliteral repräsentiert der Schlüssel den zu lesenden Schlüssel der rechten Seite, und der Wert ist der Name, dem der gelesene Wert zugewiesen wird. @@ -39,7 +46,9 @@ print hello, the_day :day = obj -- einfache Destructuring-Zuweisung ohne Klammern ist ok ``` - +
+ + +
Das funktioniert auch mit verschachtelten Datenstrukturen: @@ -71,7 +81,9 @@ obj2 = { print first, second, color ``` - +
+ + +
Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrere Zeilen verteilen. Ein etwas komplexeres Beispiel: @@ -99,7 +112,9 @@ Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrer } = obj2 ``` - +
+ + +
Es ist üblich, Werte aus einer Tabelle zu extrahieren und ihnen lokale Variablen mit demselben Namen wie der Schlüssel zuzuweisen. Um Wiederholungen zu vermeiden, kannst du den Präfix-Operator **:** verwenden: @@ -118,13 +134,16 @@ Es ist üblich, Werte aus einer Tabelle zu extrahieren und ihnen lokale Variable {:concat, :insert} = table ``` - +
+ + +
Das ist effektiv dasselbe wie `import`, aber du kannst Felder umbenennen, indem du die Syntax mischst: @@ -132,13 +151,16 @@ Das ist effektiv dasselbe wie `import`, aber du kannst Felder umbenennen, indem {:mix, :max, random: rand} = math ``` - +
+ + +
Du kannst Standardwerte beim Destructuring angeben, z. B.: @@ -146,13 +168,16 @@ Du kannst Standardwerte beim Destructuring angeben, z. B.: {:name = "namenlos", :job = "arbeitlos"} = person ``` - +
+ + +
Du kannst `_` als Platzhalter verwenden, wenn du eine Listen-Destructuring-Zuweisung machst: @@ -160,13 +185,16 @@ Du kannst `_` als Platzhalter verwenden, wenn du eine Listen-Destructuring-Zuwei [_, two, _, four] = items ``` - +
+ + +
## Bereichs-Destructuring @@ -180,7 +208,9 @@ print bulk -- gibt aus: {"zweiter", "dritter", "vierter"} print last -- gibt aus: letzter ``` - +
+ + +
Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um unterschiedliche Bereiche zu erfassen, und du kannst `_` als Platzhalter für Werte verwenden, die du nicht erfassen willst: @@ -205,7 +236,9 @@ Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um un [first, ..._, last] = orders ``` - +
+ + +
## Destructuring an anderen Stellen @@ -234,7 +268,9 @@ for [left, right] in *tuples print left, right ``` - +
+ + +
Wir wissen, dass jedes Element der Array-Tabelle ein 2er-Tupel ist, daher können wir es direkt in der Namensliste der `for`-Anweisung mittels Destructuring entpacken. diff --git a/doc/docs/de/doc/assignment/if-assignment.md b/doc/src/content/docs/de/doc/assignment/if-assignment.md similarity index 73% rename from doc/docs/de/doc/assignment/if-assignment.md rename to doc/src/content/docs/de/doc/assignment/if-assignment.md index 21bc8be8..11df43f4 100644 --- a/doc/docs/de/doc/assignment/if-assignment.md +++ b/doc/src/content/docs/de/doc/assignment/if-assignment.md @@ -1,4 +1,8 @@ -# If-Zuweisung +--- +title: If-Zuweisung +sidebar: + order: 12 +--- `if`- und `elseif`-Blöcke können eine Zuweisung anstelle eines Bedingungsausdrucks enthalten. Beim Auswerten der Bedingung findet die Zuweisung statt, und der zugewiesene Wert wird als Bedingung verwendet. Die zugewiesene Variable ist nur im Geltungsbereich des Bedingungsblocks verfügbar, d. h. sie ist nicht verfügbar, wenn der Wert nicht truthy ist. Für die Zuweisung musst du den "Walrus-Operator" `:=` statt `=` verwenden. @@ -7,14 +11,17 @@ if user := database.find_user "moon" print user.name ``` - +
+ + +
```yuescript if hello := os.getenv "hello" @@ -25,7 +32,9 @@ else print "nichts :(" ``` - +
+ + +
If-Zuweisung mit mehreren Rückgabewerten. Nur der erste Wert wird geprüft, andere Werte bleiben im Scope. @@ -46,7 +56,9 @@ if success, result := pcall -> "Ergebnis ohne Probleme erhalten" print "OK" ``` - +
+ + +
## While-Zuweisung @@ -66,7 +79,9 @@ while byte := stream\read_one! print byte ``` - +
+ + +
diff --git a/doc/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md b/doc/src/content/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md similarity index 80% rename from doc/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md rename to doc/src/content/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md index ce8a45ca..80c975f6 100644 --- a/doc/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md +++ b/doc/src/content/docs/de/doc/assignment/the-using-clause-controlling-destructive-assignment.md @@ -1,4 +1,8 @@ -# Die Using-Klausel: Destruktive Zuweisung kontrollieren +--- +title: "Die Using-Klausel: Destruktive Zuweisung kontrollieren" +sidebar: + order: 14 +--- Lexikalisches Scoping kann die Komplexität des Codes stark reduzieren, aber mit wachsendem Codeumfang kann es unübersichtlich werden. Betrachte folgendes Beispiel: @@ -18,7 +22,9 @@ my_func! print i -- wird 0 ausgeben ``` - +
+ + +
In `my_func` haben wir den Wert von `i` versehentlich überschrieben. In diesem Beispiel ist es offensichtlich, aber in einer großen oder fremden Codebasis ist oft nicht klar, welche Namen bereits deklariert wurden. @@ -54,7 +61,9 @@ my_func! print i -- gibt 100 aus, i bleibt unverändert ``` - +
+ + +
Mehrere Namen können durch Kommas getrennt werden. Closure-Werte können weiterhin gelesen, aber nicht verändert werden: @@ -83,7 +93,9 @@ my_func(22) print i, k -- diese wurden aktualisiert ``` - +
+ + +
diff --git a/doc/docs/de/doc/assignment/varargs-assignment.md b/doc/src/content/docs/de/doc/assignment/varargs-assignment.md similarity index 70% rename from doc/docs/de/doc/assignment/varargs-assignment.md rename to doc/src/content/docs/de/doc/assignment/varargs-assignment.md index 96927fa8..ac9e8ff8 100644 --- a/doc/docs/de/doc/assignment/varargs-assignment.md +++ b/doc/src/content/docs/de/doc/assignment/varargs-assignment.md @@ -1,4 +1,8 @@ -# Varargs-Zuweisung +--- +title: Varargs-Zuweisung +sidebar: + order: 13 +--- Du kannst Rückgabewerte einer Funktion dem Varargs-Symbol `...` zuweisen und dann den Inhalt auf die Lua-Weise auslesen. @@ -11,7 +15,9 @@ first = select 1, ... print ok, count, first ``` - +
+ + +
diff --git a/doc/docs/de/doc/control-flow/conditionals.md b/doc/src/content/docs/de/doc/control-flow/conditionals.md similarity index 70% rename from doc/docs/de/doc/control-flow/conditionals.md rename to doc/src/content/docs/de/doc/control-flow/conditionals.md index 0d2574d5..9a3af3af 100644 --- a/doc/docs/de/doc/control-flow/conditionals.md +++ b/doc/src/content/docs/de/doc/control-flow/conditionals.md @@ -1,4 +1,8 @@ -# Bedingungen +--- +title: Bedingungen +sidebar: + order: 18 +--- ```yuescript have_coins = false @@ -8,7 +12,9 @@ else print "Keine Münzen" ``` - +
+ + +
Eine Kurzsyntax für einzelne Anweisungen kann ebenfalls verwendet werden: @@ -27,14 +34,17 @@ have_coins = false if have_coins then print "Münzen erhalten" else print "Keine Münzen" ``` - +
+ + +
Da `if`-Anweisungen als Ausdrücke verwendet werden können, kann man das auch so schreiben: @@ -43,14 +53,17 @@ have_coins = false print if have_coins then "Münzen erhalten" else "Keine Münzen" ``` - +
+ + +
Bedingungen können auch in `return`-Anweisungen und Zuweisungen verwendet werden: @@ -69,7 +82,9 @@ else print message -- gibt aus: Ich bin sehr groß ``` - +
+ + +
Das Gegenteil von `if` ist `unless`: @@ -95,26 +111,32 @@ unless os.date("%A") == "Monday" print "Es ist nicht Montag!" ``` - +
+ + +
```yuescript print "You're lucky!" unless math.random! > 0.1 ``` - +
+ + +
## In-Ausdruck @@ -130,7 +152,9 @@ if a in list print "Prüfen, ob `a` in einer Liste ist" ``` - +
+ + +
Der `in`-Operator kann auch mit Tabellen verwendet werden und unterstützt die Variante `not in` für Verneinungen: @@ -157,7 +182,9 @@ not_exist = item not in list check = -> value not in table ``` - +
+ + +
Eine Ein-Element-Liste oder Tabelle prüft auf Gleichheit mit diesem Element: @@ -186,7 +214,9 @@ with tb c = a in [1] ``` - +
+ + +
diff --git a/doc/docs/de/doc/control-flow/continue.md b/doc/src/content/docs/de/doc/control-flow/continue.md similarity index 67% rename from doc/docs/de/doc/control-flow/continue.md rename to doc/src/content/docs/de/doc/control-flow/continue.md index 4b5ccdcc..ffafbc85 100644 --- a/doc/docs/de/doc/control-flow/continue.md +++ b/doc/src/content/docs/de/doc/control-flow/continue.md @@ -1,4 +1,8 @@ -# Continue +--- +title: Continue +sidebar: + order: 21 +--- Eine `continue`-Anweisung überspringt die aktuelle Iteration einer Schleife. @@ -10,7 +14,9 @@ while i < 10 print i ``` - +
+ + +
`continue` kann auch mit Schleifenausdrücken verwendet werden, um zu verhindern, dass diese Iteration in das Ergebnis akkumuliert wird. Dieses Beispiel filtert die Array-Tabelle auf gerade Zahlen: @@ -31,7 +38,9 @@ odds = for x in *my_numbers x ``` - +
+ + +
diff --git a/doc/docs/de/doc/control-flow/for-loop.md b/doc/src/content/docs/de/doc/control-flow/for-loop.md similarity index 74% rename from doc/docs/de/doc/control-flow/for-loop.md rename to doc/src/content/docs/de/doc/control-flow/for-loop.md index 16b54188..3ad28951 100644 --- a/doc/docs/de/doc/control-flow/for-loop.md +++ b/doc/src/content/docs/de/doc/control-flow/for-loop.md @@ -1,4 +1,8 @@ -# For-Schleife +--- +title: For-Schleife +sidebar: + order: 19 +--- Es gibt zwei Formen der `for`-Schleife, genau wie in Lua: eine numerische und eine generische. @@ -13,7 +17,9 @@ for key, value in pairs object print key, value ``` - +
+ + +
Die Slicing- und **\***-Operatoren können verwendet werden, genau wie bei Comprehensions: @@ -35,14 +42,17 @@ for item in *items[2, 4] print item ``` - +
+ + +
Eine kürzere Syntax ist für alle Varianten verfügbar, wenn der Rumpf nur eine Zeile hat: @@ -52,7 +62,9 @@ for item in *items do print item for j = 1, 10, 3 do print j ``` - +
+ + +
Eine `for`-Schleife kann auch als Ausdruck verwendet werden. Die letzte Anweisung im Schleifenrumpf wird in einen Ausdruck umgewandelt und an eine wachsende Array-Tabelle angehängt. @@ -74,7 +87,9 @@ doubled_evens = for i = 1, 20 i ``` - +
+ + +
Zusätzlich unterstützen `for`-Schleifen `break` mit Rückgabewerten, sodass die Schleife selbst als Ausdruck verwendet werden kann, der früh mit einem sinnvollen Ergebnis endet. `for`-Ausdrücke unterstützen mehrere `break`-Werte. @@ -95,14 +111,17 @@ first_large = for n in *numbers break n if n > 10 ``` - +
+ + +
Diese `break`-mit-Wert-Syntax ermöglicht knappe und ausdrucksstarke Such- bzw. Early-Exit-Muster direkt in Schleifenausdrücken. @@ -111,14 +130,17 @@ key, score = for k, v in pairs data break k, v * 10 if k == "target" ``` - +
+ + +
Du kannst Werte auch filtern, indem du den `for`-Ausdruck mit `continue` kombinierst. @@ -132,7 +154,9 @@ print func_a! -- gibt nil aus print func_b! -- gibt Tabellenobjekt aus ``` - +
+ + +
Das verhindert die unnötige Erstellung von Tabellen in Funktionen, die die Ergebnisse der Schleife nicht zurückgeben müssen. diff --git a/doc/docs/de/doc/control-flow/goto.md b/doc/src/content/docs/de/doc/control-flow/goto.md similarity index 78% rename from doc/docs/de/doc/control-flow/goto.md rename to doc/src/content/docs/de/doc/control-flow/goto.md index 0e2a415c..ac38bce9 100644 --- a/doc/docs/de/doc/control-flow/goto.md +++ b/doc/src/content/docs/de/doc/control-flow/goto.md @@ -1,4 +1,8 @@ -# Goto +--- +title: Goto +sidebar: + order: 22 +--- YueScript unterstützt die goto-Anweisung und die Label-Syntax zur Steuerung des Programmflusses, wobei die gleichen Regeln wie bei Luas goto-Anweisung gelten. **Hinweis:** Die goto-Anweisung erfordert Lua 5.2 oder höher. Beim Kompilieren zu Lua 5.1 führt die Verwendung der goto-Syntax zu einem Kompilierfehler. @@ -10,7 +14,9 @@ Ein Label wird mit doppelten Doppelpunkten definiert: ::mein_label:: ``` - +
+ + +
Die goto-Anweisung springt zu einem angegebenen Label: @@ -32,7 +39,9 @@ goto start print "a ist jetzt 5" ``` - +
+ + +
Die goto-Anweisung ist nützlich, um aus tief verschachtelten Schleifen zu springen: @@ -57,7 +67,9 @@ for z = 1, 10 ::ok:: ``` - +
+ + +
Sie können auch Labels verwenden, um zu einer bestimmten Schleifenebene zu springen: @@ -83,7 +96,9 @@ for z = 1, 10 ::zcontinue:: ``` - +
+ + +
## Hinweise diff --git a/doc/docs/de/doc/control-flow/switch.md b/doc/src/content/docs/de/doc/control-flow/switch.md similarity index 80% rename from doc/docs/de/doc/control-flow/switch.md rename to doc/src/content/docs/de/doc/control-flow/switch.md index 5e5107bd..f300f6e2 100644 --- a/doc/docs/de/doc/control-flow/switch.md +++ b/doc/src/content/docs/de/doc/control-flow/switch.md @@ -1,4 +1,8 @@ -# Switch +--- +title: Switch +sidebar: + order: 23 +--- Die `switch`-Anweisung ist eine Kurzform für eine Reihe von `if`-Anweisungen, die gegen denselben Wert prüfen. Der Wert wird nur einmal ausgewertet. Wie bei `if` kann `switch` einen `else`-Block haben, wenn keine Übereinstimmung gefunden wird. Verglichen wird mit dem Operator `==`. In einer `switch`-Anweisung kannst du auch eine Zuweisung verwenden, um den temporären Wert zu speichern. @@ -12,7 +16,9 @@ switch name := "Dan" print "Ich kenne dich nicht mit dem Namen #{name}" ``` - +
+ + +
Eine `when`-Klausel kann mehrere Werte prüfen, indem sie kommasepariert aufgelistet werden. @@ -41,7 +48,9 @@ next_number = switch b error "so hoch kann ich nicht zählen!" ``` - +
+ + +
Du kannst das Schlüsselwort `then` verwenden, um einen `when`-Block in einer Zeile zu schreiben. Für den `else`-Block braucht es kein zusätzliches Schlüsselwort. @@ -65,7 +75,9 @@ msg = switch math.random(1, 5) else "nicht so viel Glück" ``` - +
+ + +
Wenn du eine Einrückung weniger möchtest, kannst du die erste `when`-Klausel in die Startzeile der Anweisung setzen und alle weiteren Klauseln mit einer Einrückung weniger schreiben. @@ -91,7 +104,9 @@ else print "nicht so viel Glück" ``` - +
+ + +
Beachte die Reihenfolge des Case-Vergleichsausdrucks. Der Case-Ausdruck steht auf der linken Seite. Das kann nützlich sein, wenn der Case-Ausdruck die Vergleichslogik über eine `__eq`-Metamethod selbst definiert. @@ -129,7 +145,9 @@ for item in *items print "Größe #{width}, #{height}" ``` - +
+ + +
Du kannst Standardwerte verwenden, um bestimmte Felder optional zu destrukturieren. @@ -160,7 +179,9 @@ switch item print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdem ``` - +
+ + +
Du kannst auch gegen Array-Elemente, Tabellenfelder und sogar verschachtelte Strukturen mit Array- oder Tabellenliteralen matchen. @@ -188,7 +210,9 @@ switch tb print "1, 2, #{b}" ``` - +
+ + +
Matchen gegen Tabellenfelder mit Destructuring. @@ -214,7 +239,9 @@ switch tb print "ungültig" ``` - +
+ + +
Matchen gegen verschachtelte Tabellenstrukturen. @@ -240,7 +268,9 @@ switch tb print "ungültig" ``` - +
+ + +
Matchen gegen Array von Tabellen. @@ -267,7 +298,9 @@ switch tb print "getroffen", fourth ``` - +
+ + +
Matchen gegen eine Liste und einen Bereich von Elementen erfassen. @@ -293,7 +327,9 @@ switch segments print "Aktion:", action -- gibt aus: "view" ``` - +
+ + +
diff --git a/doc/docs/de/doc/control-flow/while-loop.md b/doc/src/content/docs/de/doc/control-flow/while-loop.md similarity index 66% rename from doc/docs/de/doc/control-flow/while-loop.md rename to doc/src/content/docs/de/doc/control-flow/while-loop.md index 98776ec3..3049e9b4 100644 --- a/doc/docs/de/doc/control-flow/while-loop.md +++ b/doc/src/content/docs/de/doc/control-flow/while-loop.md @@ -1,4 +1,8 @@ -# While-Schleife +--- +title: While-Schleife +sidebar: + order: 20 +--- Die `while`-Schleife gibt es ebenfalls in vier Variationen: @@ -11,7 +15,9 @@ while i > 0 while running == true do my_function! ``` - +
+ + +
```yuescript i = 10 @@ -33,7 +40,9 @@ until i == 0 until running == false do my_function! ``` - +
+ + +
Wie bei `for`-Schleifen kann die `while`-Schleife auch als Ausdruck verwendet werden. `while`- und `until`-Ausdrücke unterstützen `break` mit mehreren Rückgabewerten. @@ -53,7 +63,9 @@ value, doubled = while true break n, n * 2 if n > 10 ``` - +
+ + +
Damit eine Funktion den akkumulierten Wert einer `while`-Schleife zurückgibt, muss die Anweisung explizit mit `return` zurückgegeben werden. @@ -77,7 +90,9 @@ repeat until i == 0 ``` - +
+ + +
`repeat`-Ausdrücke unterstützen ebenfalls `break` mit mehreren Rückgabewerten: @@ -99,7 +115,9 @@ value, scaled = repeat until false ``` - +
+ + +
diff --git a/doc/docs/de/doc/data-structures/comprehensions.md b/doc/src/content/docs/de/doc/data-structures/comprehensions.md similarity index 73% rename from doc/docs/de/doc/data-structures/comprehensions.md rename to doc/src/content/docs/de/doc/data-structures/comprehensions.md index 4d74e061..91e748e0 100644 --- a/doc/docs/de/doc/data-structures/comprehensions.md +++ b/doc/src/content/docs/de/doc/data-structures/comprehensions.md @@ -1,4 +1,8 @@ -# Comprehensions +--- +title: Comprehensions +sidebar: + order: 25 +--- Comprehensions bieten eine bequeme Syntax, um eine neue Tabelle zu erzeugen, indem man über ein bestehendes Objekt iteriert und einen Ausdruck auf seine Werte anwendet. Es gibt zwei Arten: Listen-Comprehensions und Tabellen-Comprehensions. Beide erzeugen Lua-Tabellen; Listen-Comprehensions sammeln Werte in einer array-ähnlichen Tabelle, und Tabellen-Comprehensions erlauben es, Schlüssel und Wert pro Iteration zu setzen. @@ -11,14 +15,17 @@ items = [ 1, 2, 3, 4 ] doubled = [item * 2 for i, item in ipairs items] ``` - +
+ + +
Die Elemente in der neuen Tabelle können mit einer `when`-Klausel eingeschränkt werden: @@ -26,13 +33,16 @@ Die Elemente in der neuen Tabelle können mit einer `when`-Klausel eingeschränk slice = [item for i, item in ipairs items when i > 1 and i < 3] ``` - +
+ + +
Da es üblich ist, über die Werte einer numerisch indizierten Tabelle zu iterieren, gibt es den **\***-Operator. Das Verdopplungsbeispiel kann so umgeschrieben werden: @@ -40,13 +50,16 @@ Da es üblich ist, über die Werte einer numerisch indizierten Tabelle zu iterie doubled = [item * 2 for item in *items] ``` - +
+ + +
In Listen-Comprehensions kannst du außerdem den Spread-Operator `...` verwenden, um verschachtelte Listen zu flatten und einen Flat-Map-Effekt zu erzielen: @@ -59,7 +72,9 @@ flat = [...v for k,v in pairs data] -- flat ist jetzt [1, 2, 3, 4, 5, 6] ``` - +
+ + +
Die `for`- und `when`-Klauseln können beliebig oft verkettet werden. Die einzige Anforderung ist, dass eine Comprehension mindestens eine `for`-Klausel enthält. @@ -84,7 +100,9 @@ points = [ [x, y] for x in *x_coords \ for y in *y_coords] ``` - +
+ + +
Numerische `for`-Schleifen können ebenfalls in Comprehensions verwendet werden: @@ -102,13 +121,16 @@ Numerische `for`-Schleifen können ebenfalls in Comprehensions verwendet werden: evens = [i for i = 1, 100 when i % 2 == 0] ``` - +
+ + +
## Tabellen-Comprehensions @@ -126,7 +148,9 @@ thing = { thing_copy = {k, v for k, v in pairs thing} ``` - +
+ + +
```yuescript no_color = {k, v for k, v in pairs thing when k != "color"} ``` - +
+ + +
Der **\***-Operator wird ebenfalls unterstützt. Hier erstellen wir eine Nachschlagetabelle für Quadratwurzeln einiger Zahlen. @@ -159,14 +187,17 @@ numbers = [1, 2, 3, 4] sqrts = {i, math.sqrt i for i in *numbers} ``` - +
+ + +
Das Schlüssel-Wert-Tupel in einer Tabellen-Comprehension kann auch aus einem einzelnen Ausdruck stammen; der Ausdruck muss dann zwei Werte zurückgeben. Der erste wird als Schlüssel und der zweite als Wert verwendet: @@ -177,14 +208,17 @@ tuples = [ ["hallo", "Welt"], ["foo", "bar"]] tbl = {unpack tuple for tuple in *tuples} ``` - +
+ + +
## Slicing @@ -196,13 +230,16 @@ Hier setzen wir die minimalen und maximalen Grenzen und nehmen alle Elemente mit slice = [item for item in *items[1, 5]] ``` - +
+ + +
Jedes der Slice-Argumente kann weggelassen werden, um einen sinnvollen Standard zu verwenden. Wenn der maximale Index weggelassen wird, entspricht er der Länge der Tabelle. Dieses Beispiel nimmt alles außer dem ersten Element: @@ -210,13 +247,16 @@ Jedes der Slice-Argumente kann weggelassen werden, um einen sinnvollen Standard slice = [item for item in *items[2,]] ``` - +
+ + +
Wenn die Mindestgrenze weggelassen wird, ist sie standardmäßig 1. Hier geben wir nur die Schrittweite an und lassen die anderen Grenzen leer. Das nimmt alle ungerad indizierten Elemente (1, 3, 5, …): @@ -224,13 +264,16 @@ Wenn die Mindestgrenze weggelassen wird, ist sie standardmäßig 1. Hier geben w slice = [item for item in *items[,,2]] ``` - +
+ + +
Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden die Grenzen vom Ende der Tabelle gezählt. @@ -239,14 +282,17 @@ Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden slice = [item for item in *items[-4,-1]] ``` - +
+ + +
Die Schrittweite kann ebenfalls negativ sein, wodurch die Elemente in umgekehrter Reihenfolge genommen werden. @@ -254,13 +300,16 @@ Die Schrittweite kann ebenfalls negativ sein, wodurch die Elemente in umgekehrte reverse_slice = [item for item in *items[-1,1,-1]] ``` - +
+ + +
### Slicing-Ausdruck @@ -274,7 +323,9 @@ sub_list = items[2, 4] last_four_items = items[-4, -1] ``` - +
+ + +
diff --git a/doc/docs/de/doc/data-structures/table-literals.md b/doc/src/content/docs/de/doc/data-structures/table-literals.md similarity index 70% rename from doc/docs/de/doc/data-structures/table-literals.md rename to doc/src/content/docs/de/doc/data-structures/table-literals.md index dea062af..c3980a1b 100644 --- a/doc/docs/de/doc/data-structures/table-literals.md +++ b/doc/src/content/docs/de/doc/data-structures/table-literals.md @@ -1,4 +1,8 @@ -# Tabellenliterale +--- +title: Tabellenliterale +sidebar: + order: 24 +--- Wie in Lua werden Tabellen mit geschweiften Klammern definiert. @@ -6,13 +10,16 @@ Wie in Lua werden Tabellen mit geschweiften Klammern definiert. some_values = {1, 2, 3, 4} ``` - +
+ + +
Anders als in Lua weist man einem Schlüssel in einer Tabelle mit **:** (statt **=**) einen Wert zu. @@ -24,7 +31,9 @@ some_values = { } ``` - +
+ + +
Die geschweiften Klammern können weggelassen werden, wenn eine einzelne Tabelle aus Schlüssel-Wert-Paaren zugewiesen wird. @@ -45,7 +55,9 @@ profile = favorite_foods: ["Eis", "Donuts"] ``` - +
+ + +
Zeilenumbrüche können Werte statt eines Kommas trennen (oder zusätzlich): @@ -67,7 +80,9 @@ values = { } ``` - +
+ + +
Beim Erstellen eines einzeiligen Tabellenliterals können die geschweiften Klammern ebenfalls weggelassen werden: @@ -88,7 +104,9 @@ my_function dance: "Tango", partner: "keiner" y = type: "Hund", legs: 4, tails: 1 ``` - +
+ + +
Die Schlüssel eines Tabellenliterals können Sprach-Schlüsselwörter sein, ohne sie zu escapen: @@ -107,7 +126,9 @@ tbl = { } ``` - +
+ + +
Wenn du eine Tabelle aus Variablen konstruierst und die Schlüssel den Variablennamen entsprechen sollen, kannst du den Präfix-Operator **:** verwenden: @@ -128,7 +150,9 @@ person = { :hair, :height, shoe_size: 40 } print_table :hair, :height ``` - +
+ + +
Wenn der Schlüssel eines Feldes das Ergebnis eines Ausdrucks sein soll, kannst du ihn wie in Lua in **[ ]** setzen. Du kannst auch ein String-Literal direkt als Schlüssel verwenden und die eckigen Klammern weglassen. Das ist nützlich, wenn dein Schlüssel Sonderzeichen enthält. @@ -149,7 +174,9 @@ t = { } ``` - +
+ + +
Lua-Tabellen haben sowohl einen Array-Teil als auch einen Hash-Teil, aber manchmal ist es nützlich, hier eine semantische Unterscheidung zu treffen. Du kannst **[ ]** anstelle von **{ }** verwenden, um eine Tabelle explizit als Array zu deklarieren; dadurch wird verhindert, dass Schlüssel-Wert-Paare hineingeschrieben werden. @@ -167,11 +195,14 @@ some_values = [1, 2, 3, 4] list_with_one_element = [1, ] ``` - +
+ + +
diff --git a/doc/docs/de/doc/extras/license-mit.md b/doc/src/content/docs/de/doc/extras/license-mit.md similarity index 96% rename from doc/docs/de/doc/extras/license-mit.md rename to doc/src/content/docs/de/doc/extras/license-mit.md index a5e9f709..74350797 100644 --- a/doc/docs/de/doc/extras/license-mit.md +++ b/doc/src/content/docs/de/doc/extras/license-mit.md @@ -1,4 +1,8 @@ -# Lizenz: MIT +--- +title: "Lizenz: MIT" +sidebar: + order: 34 +--- Hinweis: Die MIT-Lizenz ist unten im englischen Originaltext wiedergegeben. diff --git a/doc/src/content/docs/de/doc/extras/mascot.md b/doc/src/content/docs/de/doc/extras/mascot.md new file mode 100644 index 00000000..cee276e2 --- /dev/null +++ b/doc/src/content/docs/de/doc/extras/mascot.md @@ -0,0 +1,43 @@ +--- +title: Maskottchen, Xiaoyu +sidebar: + order: 33 +--- + +## Über + +Xiaoyu das Cyber-Kaninchen + +Xiaoyu (小玉, "kleines Jade") ist ein Cyber-Kaninchen und das offizielle Maskottchen des YueScript-Projekts. Sie sitzt auf einer Mondsichel und schreibt YueScript auf ihrem Laptop. + +Ihr vollständiger Titel ist Xiaoyu das Cyber-Kaninchen (机兔小玉). Sie spiegelt wider, was YueScript anstrebt: klar, ausdrucksstark und verspielt. + +**[Tyson Tan](https://tysontan.com)** hat Xiaoyu kostenlos für das Projekt entworfen und illustriert. Wir sind dankbar für seinen Beitrag. + +## Bilder + +Klicken Sie auf ein Bild, um es in voller Größe zu öffnen. + +### Vollständiges Kunstwerk + + + Xiaoyu, vollständiges Kunstwerk mit Hintergrund + + +

Vollständiges PNG herunterladen

+ +### Transparenter Hintergrund + + + Xiaoyu, transparenter Hintergrund + + +

Transparentes PNG herunterladen

+ +### Gezippte .kra-Datei + +

Gezippte .kra-Datei herunterladen

+ +## Lizenz + +Xiaoyu ist unter der [MIT-Lizenz](https://opensource.org/licenses/MIT) und der Creative-Commons-Lizenz [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) doppelt lizenziert. diff --git a/doc/docs/de/doc/functions/backcalls.md b/doc/src/content/docs/de/doc/functions/backcalls.md similarity index 68% rename from doc/docs/de/doc/functions/backcalls.md rename to doc/src/content/docs/de/doc/functions/backcalls.md index 08b012d6..50d8e7e3 100644 --- a/doc/docs/de/doc/functions/backcalls.md +++ b/doc/src/content/docs/de/doc/functions/backcalls.md @@ -1,4 +1,8 @@ -# Backcalls +--- +title: Backcalls +sidebar: + order: 16 +--- Backcalls werden verwendet, um Callbacks zu entkoppeln (unnesting). Sie werden mit Pfeilen nach links definiert und füllen standardmäßig als letzter Parameter einen Funktionsaufruf. Die Syntax ist weitgehend wie bei normalen Pfeilfunktionen, nur dass der Pfeil in die andere Richtung zeigt und der Funktionskörper keine Einrückung benötigt. @@ -7,14 +11,17 @@ x <- f print "hallo" .. x ``` - +
+ + +
Fat-Arrow-Funktionen sind ebenfalls verfügbar. @@ -23,14 +30,17 @@ Fat-Arrow-Funktionen sind ebenfalls verfügbar. print @value ``` - +
+ + +
Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als Parameter eingesetzt werden soll. @@ -39,14 +49,17 @@ Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als x * 2 ``` - +
+ + +
Wenn du nach deinen Backcalls weiteren Code haben willst, kannst du sie mit einem `do`-Statement absetzen. Bei Nicht-Fat-Arrow-Funktionen können die Klammern weggelassen werden. @@ -59,7 +72,9 @@ result, msg = do print result, msg ``` - +
+ + +
diff --git a/doc/docs/de/doc/functions/function-literals.md b/doc/src/content/docs/de/doc/functions/function-literals.md similarity index 77% rename from doc/docs/de/doc/functions/function-literals.md rename to doc/src/content/docs/de/doc/functions/function-literals.md index 1c9b00fd..69cb3d2b 100644 --- a/doc/docs/de/doc/functions/function-literals.md +++ b/doc/src/content/docs/de/doc/functions/function-literals.md @@ -1,4 +1,8 @@ -# Funktionsliterale +--- +title: Funktionsliterale +sidebar: + order: 15 +--- Alle Funktionen werden mit einem Funktionsausdruck erstellt. Eine einfache Funktion wird mit dem Pfeil **->** notiert. @@ -7,14 +11,17 @@ my_function = -> my_function() -- leere Funktion aufrufen ``` - +
+ + +
Der Funktionskörper kann entweder eine einzelne Anweisung direkt nach dem Pfeil sein oder aus mehreren Anweisungen bestehen, die in den folgenden Zeilen eingerückt werden: @@ -26,7 +33,9 @@ func_b = -> print "Der Wert:", value ``` - +
+ + +
Wenn eine Funktion keine Argumente hat, kann sie mit dem `!`-Operator statt leerer Klammern aufgerufen werden. Der `!`-Aufruf ist die bevorzugte Art, Funktionen ohne Argumente aufzurufen. @@ -45,14 +55,17 @@ func_a! func_b() ``` - +
+ + +
Funktionen mit Argumenten werden erstellt, indem der Pfeil von einer Argumentliste in Klammern eingeleitet wird: @@ -60,13 +73,16 @@ Funktionen mit Argumenten werden erstellt, indem der Pfeil von einer Argumentlis sum = (x, y) -> print "Summe", x + y ``` - +
+ + +
Funktionen können aufgerufen werden, indem die Argumente hinter dem Namen eines Ausdrucks stehen, der zu einer Funktion evaluiert. Beim Verketten mehrerer Funktionsaufrufe werden die Argumente der nächstliegenden Funktion links zugeordnet. @@ -77,7 +93,9 @@ print sum 10, 20 a b c "a", "b", "c" ``` - +
+ + +
Um Mehrdeutigkeiten beim Aufruf zu vermeiden, können die Argumente auch in Klammern gesetzt werden. Das ist hier nötig, damit die richtigen Argumente an die richtigen Funktionen gehen. @@ -94,13 +113,16 @@ Um Mehrdeutigkeiten beim Aufruf zu vermeiden, können die Argumente auch in Klam print "x:", sum(10, 20), "y:", sum(30, 40) ``` - +
+ + +
Zwischen öffnender Klammer und Funktionsname darf kein Leerzeichen stehen. @@ -111,14 +133,17 @@ sum = (x, y) -> x + y print "Die Summe ist ", sum 10, 20 ``` - +
+ + +
Wenn du explizit zurückgeben willst, verwende `return`: @@ -126,13 +151,16 @@ Wenn du explizit zurückgeben willst, verwende `return`: sum = (x, y) -> return x + y ``` - +
+ + +
Wie in Lua können Funktionen mehrere Werte zurückgeben. Die letzte Anweisung muss eine Liste von Werten sein, getrennt durch Kommas: @@ -141,14 +169,17 @@ mystery = (x, y) -> x + y, x - y a, b = mystery 10, 20 ``` - +
+ + +
## Fat Arrows @@ -158,13 +189,16 @@ Da es in Lua üblich ist, beim Methodenaufruf ein Objekt als erstes Argument zu func = (num) => @value + num ``` - +
+ + +
## Standardwerte für Argumente @@ -176,7 +210,9 @@ my_function = (name = "etwas", height = 100) -> print "Meine Größe ist", height ``` - +
+ + +
Der Ausdruck für den Standardwert wird im Funktionskörper in der Reihenfolge der Argumentdeklarationen ausgewertet. Daher können Standardwerte auf zuvor deklarierte Argumente zugreifen. @@ -193,14 +230,17 @@ some_args = (x = 100, y = x + 1000) -> print x + y ``` - +
+ + +
## Hinweise @@ -215,7 +255,9 @@ c = x -y d = x- z ``` - +
+ + +
Die Präzedenz des ersten Arguments eines Funktionsaufrufs kann mit Leerraum gesteuert werden, wenn das Argument ein String-Literal ist. In Lua lässt man bei Aufrufen mit einem einzelnen String- oder Tabellenliteral häufig die Klammern weg. @@ -237,14 +280,17 @@ x = func"hallo" + 100 y = func "hallo" + 100 ``` - +
+ + +
## Mehrzeilige Argumente @@ -262,7 +308,9 @@ cool_func 1, 2, 7, 8 ``` - +
+ + +
Diese Art des Aufrufs kann verschachtelt werden. Die Einrückungsebene bestimmt, zu welcher Funktion die Argumente gehören. @@ -285,7 +334,9 @@ my_func 5, 6, 7, 5, 4 ``` - +
+ + +
Da Tabellen ebenfalls das Komma als Trennzeichen verwenden, hilft diese Einrückungssyntax dabei, Werte zur Argumentliste gehören zu lassen, statt zur Tabelle. @@ -306,7 +358,9 @@ x = [ ] ``` - +
+ + +
Obwohl es selten ist: Du kannst Funktionsargumente tiefer einrücken, wenn du weißt, dass du später eine geringere Einrückungsebene verwenden wirst. @@ -327,7 +382,9 @@ y = [ my_func 1, 2, 3, ] ``` - +
+ + +
Dasselbe lässt sich mit anderen Block-Statements wie Bedingungen machen. Wir können die Einrückungsebene verwenden, um zu bestimmen, zu welcher Anweisung ein Wert gehört: @@ -354,7 +412,9 @@ if func 1, 2, 3, print "Ich bin innerhalb der if-Bedingung" ``` - +
+ + +
## Parameter-Destructuring @@ -392,7 +453,9 @@ arg1 = {a: 0} f2 arg1, arg2 ``` - +
+ + +
## Präfixiertes Return-Expression @@ -422,7 +486,9 @@ findFirstEven = (list): nil -> return sub ``` - +
+ + +
Das ist äquivalent zu: @@ -447,7 +514,9 @@ findFirstEven = (list) -> nil ``` - +
+ + +
Der einzige Unterschied ist, dass du den finalen Rückgabeausdruck vor das `->`- oder `=>`-Token ziehen kannst, um den impliziten Rückgabewert der Funktion als letzte Anweisung zu kennzeichnen. So musst du selbst bei Funktionen mit mehreren verschachtelten Schleifen oder bedingten Zweigen kein abschließendes `return` am Ende des Funktionskörpers mehr schreiben, was die Logikstruktur klarer und leichter nachvollziehbar macht. @@ -489,7 +559,9 @@ process = (...args) -> process 1, nil, 3, nil, 5 ``` - +
+ + +
diff --git a/doc/docs/de/doc/functions/function-stubs.md b/doc/src/content/docs/de/doc/functions/function-stubs.md similarity index 88% rename from doc/docs/de/doc/functions/function-stubs.md rename to doc/src/content/docs/de/doc/functions/function-stubs.md index cd4382a1..a5170c11 100644 --- a/doc/docs/de/doc/functions/function-stubs.md +++ b/doc/src/content/docs/de/doc/functions/function-stubs.md @@ -1,4 +1,8 @@ -# Funktions-Stubs +--- +title: Funktions-Stubs +sidebar: + order: 17 +--- Es ist üblich, eine Funktion eines Objekts als Wert weiterzureichen, z. B. eine Instanzmethode als Callback. Wenn die Funktion das Objekt, auf dem sie arbeitet, als erstes Argument erwartet, musst du dieses Objekt irgendwie mit der Funktion bündeln, damit sie korrekt aufgerufen werden kann. @@ -25,7 +29,9 @@ run_callback my_object.write run_callback my_object\write ``` - +
+ + +
diff --git a/doc/docs/de/doc/getting-started/installation.md b/doc/src/content/docs/de/doc/getting-started/installation.md similarity index 95% rename from doc/docs/de/doc/getting-started/installation.md rename to doc/src/content/docs/de/doc/getting-started/installation.md index 78187c73..ed42e954 100644 --- a/doc/docs/de/doc/getting-started/installation.md +++ b/doc/src/content/docs/de/doc/getting-started/installation.md @@ -1,4 +1,8 @@ -# Installation +--- +title: Installation +sidebar: + order: 2 +--- ## Lua-Modul diff --git a/doc/docs/de/doc/getting-started/introduction.md b/doc/src/content/docs/de/doc/getting-started/introduction.md similarity index 93% rename from doc/docs/de/doc/getting-started/introduction.md rename to doc/src/content/docs/de/doc/getting-started/introduction.md index f377bab6..cabb4783 100644 --- a/doc/docs/de/doc/getting-started/introduction.md +++ b/doc/src/content/docs/de/doc/getting-started/introduction.md @@ -1,4 +1,8 @@ -# Einführung +--- +title: Einführung +sidebar: + order: 1 +--- YueScript ist eine dynamische Sprache, die zu Lua kompiliert. Sie ist ein Dialekt von [MoonScript](https://github.com/leafo/moonscript). Code, der in YueScript geschrieben wird, ist ausdrucksstark und sehr kompakt. YueScript eignet sich zum Schreiben von veränderlicher Anwendungslogik mit besser wartbarem Code und läuft in eingebetteten Lua-Umgebungen wie Spielen oder Webservern. @@ -51,7 +55,9 @@ with apple export 🌛 = "Skript des Mondes" ``` - +
+ + +
## Über Dora SSR diff --git a/doc/docs/de/doc/getting-started/usage.md b/doc/src/content/docs/de/doc/getting-started/usage.md similarity index 98% rename from doc/docs/de/doc/getting-started/usage.md rename to doc/src/content/docs/de/doc/getting-started/usage.md index 2a1864af..6229013b 100644 --- a/doc/docs/de/doc/getting-started/usage.md +++ b/doc/src/content/docs/de/doc/getting-started/usage.md @@ -1,4 +1,8 @@ -# Verwendung +--- +title: Verwendung +sidebar: + order: 3 +--- ## Lua-Modul diff --git a/doc/docs/de/doc/index.md b/doc/src/content/docs/de/doc/index.md old mode 100755 new mode 100644 similarity index 59% rename from doc/docs/de/doc/index.md rename to doc/src/content/docs/de/doc/index.md index 3c4857f4..0e8023de --- a/doc/docs/de/doc/index.md +++ b/doc/src/content/docs/de/doc/index.md @@ -1,10 +1,11 @@ --- title: Referenz +sidebar: + order: 0 +tableOfContents: false --- -# YueScript-Dokumentation - -logo +YueScript logo Willkommen in der offiziellen YueScript-Dokumentation!
Hier findest du Sprachfeatures, Nutzung, Referenzbeispiele und Ressourcen.
diff --git a/doc/docs/de/doc/language-basics/attributes.md b/doc/src/content/docs/de/doc/language-basics/attributes.md similarity index 63% rename from doc/docs/de/doc/language-basics/attributes.md rename to doc/src/content/docs/de/doc/language-basics/attributes.md index 8c37d82e..866c3ac2 100644 --- a/doc/docs/de/doc/language-basics/attributes.md +++ b/doc/src/content/docs/de/doc/language-basics/attributes.md @@ -1,4 +1,8 @@ -# Attribute +--- +title: Attribute +sidebar: + order: 8 +--- Syntax-Unterstützung für Lua-5.4-Attribute. Du kannst weiterhin die Deklarationen `const` und `close` verwenden und erhältst Konstantenprüfung sowie Scoped-Callbacks, wenn du auf Lua-Versionen unter 5.4 zielst. @@ -7,14 +11,17 @@ const a = 123 close _ = : -> print "Außerhalb des Gültigkeitsbereichs." ``` - +
+ + +
Du kannst Destructuring mit als konstant markierten Variablen verwenden. @@ -23,14 +30,17 @@ const {:a, :b, c, d} = tb -- a = 1 ``` - +
+ + +
Du kannst auch eine globale Variable als `const` deklarieren. @@ -39,11 +49,14 @@ global const Constant = 123 -- Constant = 1 ``` - +
+ + +
diff --git a/doc/docs/de/doc/language-basics/comment.md b/doc/src/content/docs/de/doc/language-basics/comment.md similarity index 70% rename from doc/docs/de/doc/language-basics/comment.md rename to doc/src/content/docs/de/doc/language-basics/comment.md index 02161622..6e690b67 100644 --- a/doc/docs/de/doc/language-basics/comment.md +++ b/doc/src/content/docs/de/doc/language-basics/comment.md @@ -1,4 +1,8 @@ -# Kommentare +--- +title: Kommentare +sidebar: + order: 5 +--- ```yuescript -- Ich bin ein Kommentar @@ -13,7 +17,9 @@ Alles okay. func --[[Port]] 3000, --[[IP]] "192.168.1.1" ``` - +
+ + +
diff --git a/doc/docs/de/doc/language-basics/literals.md b/doc/src/content/docs/de/doc/language-basics/literals.md similarity index 78% rename from doc/docs/de/doc/language-basics/literals.md rename to doc/src/content/docs/de/doc/language-basics/literals.md index 23e85828..8ce65465 100644 --- a/doc/docs/de/doc/language-basics/literals.md +++ b/doc/src/content/docs/de/doc/language-basics/literals.md @@ -1,4 +1,8 @@ -# Literale +--- +title: Literale +sidebar: + order: 6 +--- Alle primitiven Literale in Lua können verwendet werden. Das gilt für Zahlen, Strings, Booleans und **nil**. @@ -13,7 +17,9 @@ some_string = "Hier ist ein String print "Ich bin mir zu #{math.random! * 100}% sicher." ``` - +
+ + +
## Zahlenliterale @@ -36,7 +43,9 @@ hex = 0xEF_BB_BF binary = 0B10011 ``` - +
+ + +
## YAML-Mehrzeilen-String @@ -58,7 +68,9 @@ str = | - #{expr} ``` - +
+ + +
Damit lässt sich strukturierter, mehrzeiliger Text bequem schreiben. Alle Zeilenumbrüche und Einrückungen bleiben relativ zur ersten nicht-leeren Zeile erhalten, und Ausdrücke innerhalb von `#{...}` werden automatisch als `tostring(expr)` interpoliert. @@ -82,7 +95,9 @@ fn = -> return str ``` - +
+ + +
Die interne Einrückung bleibt relativ zum entfernten gemeinsamen Präfix erhalten, wodurch saubere, verschachtelte Strukturen möglich sind. @@ -104,7 +120,9 @@ str = | note: 'He said: "#{Hello}!"' ``` - +
+ + +
diff --git a/doc/docs/de/doc/language-basics/module.md b/doc/src/content/docs/de/doc/language-basics/module.md similarity index 80% rename from doc/docs/de/doc/language-basics/module.md rename to doc/src/content/docs/de/doc/language-basics/module.md index f20deecb..0e3224d3 100644 --- a/doc/docs/de/doc/language-basics/module.md +++ b/doc/src/content/docs/de/doc/language-basics/module.md @@ -1,4 +1,8 @@ -# Module +--- +title: Module +sidebar: + order: 9 +--- ## Import @@ -29,7 +33,9 @@ do import "export" as {one, two, Something:{umm:{ch}}} ``` - +
+ + +
## Import von Globals @@ -69,7 +76,9 @@ do print concat ["a", tostring 1] ``` - +
+ + +
### Automatischer Global-Import @@ -101,7 +111,9 @@ do FLAG = 123 ``` - +
+ + +
## Export @@ -144,7 +157,9 @@ export class Something umm: "cool" ``` - +
+ + +
Benannter Export mit Destructuring. @@ -171,14 +187,17 @@ export :loadstring, to_lua: tolua = yue export {itemA: {:fieldA = 'default'}} = tb ``` - +
+ + +
Benannte Elemente aus dem Modul exportieren, ohne lokale Variablen zu erstellen. @@ -188,7 +207,9 @@ export. = items export["a-b-c"] = 123 ``` - +
+ + +
### Unbenannter Export @@ -215,7 +237,9 @@ export with tmp j = 2000 ``` - +
+ + +
### Default-Export @@ -242,7 +267,9 @@ export default -> 123 ``` - +
+ + +
diff --git a/doc/docs/de/doc/language-basics/operator.md b/doc/src/content/docs/de/doc/language-basics/operator.md similarity index 80% rename from doc/docs/de/doc/language-basics/operator.md rename to doc/src/content/docs/de/doc/language-basics/operator.md index 5deec6a9..e5227a9f 100644 --- a/doc/docs/de/doc/language-basics/operator.md +++ b/doc/src/content/docs/de/doc/language-basics/operator.md @@ -1,4 +1,8 @@ -# Operatoren +--- +title: Operatoren +sidebar: + order: 7 +--- Alle binären und unären Operatoren von Lua sind verfügbar. Zusätzlich ist **!=** ein Alias für **~=**, und entweder **\*\* oder **::\*\* kann für verkettete Funktionsaufrufe wie `tb\func!` oder `tb::func!` verwendet werden. Außerdem bietet YueScript einige spezielle Operatoren für ausdrucksstärkeren Code. @@ -7,14 +11,17 @@ tb\func! if tb ~= nil tb::func! if tb != nil ``` - +
+ + +
## Verkettete Vergleiche @@ -29,7 +36,9 @@ print 1 <= a <= 10 -- Ausgabe: true ``` - +
+ + +
Beachte das Auswertungsverhalten verketteter Vergleiche: @@ -67,7 +77,9 @@ print v(1) > v(2) <= v(3) ]] ``` - +
+ + +
Der mittlere Ausdruck wird nur einmal ausgewertet, nicht zweimal wie bei `v(1) < v(2) and v(2) <= v(3)`. Die Auswertungsreihenfolge in verketteten Vergleichen ist jedoch undefiniert. Es wird dringend empfohlen, in verketteten Vergleichen keine Ausdrücke mit Seiteneffekten (z. B. `print`) zu verwenden. Wenn Seiteneffekte nötig sind, sollte der Short-Circuit-Operator `and` explizit verwendet werden. @@ -105,14 +118,17 @@ tab = [] tab[] = "Wert" ``` - +
+ + +
Du kannst auch den Spread-Operator `...` verwenden, um alle Elemente einer Liste an eine andere anzuhängen: @@ -123,7 +139,9 @@ tbA[] = ...tbB -- tbA ist jetzt [1, 2, 3, 4, 5, 6] ``` - +
+ + +
## Tabellen-Spread @@ -157,7 +176,9 @@ b = {4, 5, y: 1} merge = {...a, ...b} ``` - +
+ + +
### List-Tabellen-Spread @@ -190,7 +212,9 @@ listCopy = [...source,] -- listCopy => [1, 2, 3] ``` - +
+ + +
## Umgekehrter Tabellenindex @@ -212,7 +237,9 @@ second_last = data.items[#-1] data.items[#] = 1 ``` - +
+ + +
## Metatable @@ -246,7 +274,9 @@ print d.value close _ = : -> print "Außerhalb des Gültigkeitsbereichs" ``` - +
+ + +
### Metatable-Zugriff @@ -280,7 +311,9 @@ tb.<> = __index: {item: "hallo"} print tb.item ``` - +
+ + +
### Metatable-Destrukturierung @@ -302,14 +336,17 @@ Destrukturiere Metatable mit Metamethoden-Schlüssel, der von **<>** umschlossen print item, new, close, getter ``` - +
+ + +
## Existenz @@ -330,7 +367,9 @@ with? io.open "test.txt", "w" \close! ``` - +
+ + +
## Piping @@ -367,7 +407,9 @@ readFile "example.txt" |> print ``` - +
+ + +
## Nil-Coalescing @@ -397,7 +440,9 @@ func a ?? {} a ??= false ``` - +
+ + +
## Implizites Objekt @@ -455,7 +501,9 @@ tb = ``` - +
+ + +
diff --git a/doc/docs/de/doc/language-basics/whitespace.md b/doc/src/content/docs/de/doc/language-basics/whitespace.md similarity index 79% rename from doc/docs/de/doc/language-basics/whitespace.md rename to doc/src/content/docs/de/doc/language-basics/whitespace.md index 0915692b..7a66da26 100644 --- a/doc/docs/de/doc/language-basics/whitespace.md +++ b/doc/src/content/docs/de/doc/language-basics/whitespace.md @@ -1,4 +1,8 @@ -# Leerraum +--- +title: Leerraum +sidebar: + order: 4 +--- YueScript ist eine whitespace-sensible Sprache. Du musst bestimmte Code-Blöcke mit derselben Einrückung (Leerzeichen **' '** oder Tab **'\t'**) schreiben, z. B. Funktionskörper, Wertelisten und Kontrollblöcke. Ausdrücke mit unterschiedlichem Leerraum können unterschiedliche Bedeutungen haben. Ein Tab wird wie 4 Leerzeichen behandelt, aber es ist besser, Leerzeichen und Tabs nicht zu mischen. @@ -10,13 +14,16 @@ Eine Anweisung endet normalerweise an einem Zeilenumbruch. Du kannst auch ein Se a = 1; b = 2; print a + b ``` - +
+ + +
## Mehrzeiliges Chaining @@ -31,7 +38,9 @@ Rx.Observable \subscribe print ``` - +
+ + +
diff --git a/doc/docs/de/doc/objects/object-oriented-programming.md b/doc/src/content/docs/de/doc/objects/object-oriented-programming.md similarity index 81% rename from doc/docs/de/doc/objects/object-oriented-programming.md rename to doc/src/content/docs/de/doc/objects/object-oriented-programming.md index 705fc08f..2dbb154b 100644 --- a/doc/docs/de/doc/objects/object-oriented-programming.md +++ b/doc/src/content/docs/de/doc/objects/object-oriented-programming.md @@ -1,4 +1,8 @@ -# Objektorientierte Programmierung +--- +title: Objektorientierte Programmierung +sidebar: + order: 26 +--- In diesen Beispielen kann der generierte Lua-Code überwältigend wirken. Am besten konzentrierst du dich zunächst auf die Bedeutung des YueScript-Codes und schaust dir den Lua-Code nur an, wenn du die Implementierungsdetails wissen möchtest. @@ -16,7 +20,9 @@ class Inventory @items[name] = 1 ``` - +
+ + +
Eine Klasse wird mit einem `class`-Statement deklariert, gefolgt von einer tabellenähnlichen Deklaration mit allen Methoden und Eigenschaften. @@ -50,7 +57,9 @@ class User print tostring User "Yue" ``` - +
+ + +
Eine Instanz der Klasse wird erstellt, indem man den Klassennamen wie eine Funktion aufruft. @@ -70,7 +80,9 @@ inv\add_item "T-Shirt" inv\add_item "Hose" ``` - +
+ + +
Da die Instanz bei Methodenaufrufen an die Methoden übergeben werden muss, wird der `\`-Operator verwendet. @@ -102,7 +115,9 @@ b\give_item "Hemd" print item for item in *a.clothes ``` - +
+ + +
Der richtige Weg, das zu vermeiden, ist, den veränderlichen Zustand im Konstruktor zu erstellen: @@ -130,7 +146,9 @@ class Person @clothes = [] ``` - +
+ + +
## Vererbung @@ -152,7 +171,9 @@ class BackPack extends Inventory super name ``` - +
+ + +
Hier erweitern wir unsere `Inventory`-Klasse und begrenzen die Anzahl der Elemente. @@ -179,7 +201,9 @@ class Shelf class Cupboard extends Shelf ``` - +
+ + +
## Super @@ -218,7 +243,9 @@ class MyClass extends ParentClass assert super == ParentClass ``` - +
+ + +
**super** kann auch links einer Funktions-Stub verwendet werden. Der einzige große Unterschied ist, dass die resultierende Funktion statt an `super` an `self` gebunden wird. @@ -247,7 +275,9 @@ assert b.__class == BackPack print BackPack.size -- gibt 10 aus ``` - +
+ + +
## Klassenobjekte @@ -278,13 +309,16 @@ Der Name der Klasse, wie sie deklariert wurde, wird im Feld `__name` gespeichert print BackPack.__name -- gibt Backpack aus ``` - +
+ + +
Die Basistabelle ist in `__base` gespeichert. Du kannst diese Tabelle ändern, um Instanzen Funktionalität hinzuzufügen, die bereits existieren oder noch erstellt werden. @@ -304,7 +338,9 @@ Things\some_func! assert Things().some_func == nil ``` - +
+ + +
In Ausdrücken können wir `@@` verwenden, um auf einen Wert zuzugreifen, der in `self.__class` gespeichert ist. `@@hello` ist also eine Kurzform für `self.__class.hello`. @@ -333,7 +370,9 @@ Counter! print Counter.count -- gibt 2 aus ``` - +
+ + +
Die Aufrufsemantik von `@@` ist ähnlich wie bei `@`. Wenn du einen `@@`-Namen aufrufst, wird die Klasse als erstes Argument übergeben (Lua-`:`-Syntax). @@ -356,13 +396,16 @@ Die Aufrufsemantik von `@@` ist ähnlich wie bei `@`. Wenn du einen `@@`-Namen a @@hello 1,2,3,4 ``` - +
+ + +
## Klassendeklarations-Statements @@ -375,14 +418,17 @@ class Things @class_var = "Hallo Welt" ``` - +
+ + +
Diese Ausdrücke werden ausgeführt, nachdem alle Eigenschaften zur Basis hinzugefügt wurden. @@ -397,7 +443,9 @@ class MoreThings log "Hallo Welt: " .. secret ``` - +
+ + +
## @- und @@-Werte @@ -421,14 +470,17 @@ assert @ == self assert @@ == self.__class ``` - +
+ + +
Zum Beispiel kannst du mit `@@` in einer Instanzmethode schnell eine neue Instanz derselben Klasse erzeugen: @@ -436,13 +488,16 @@ Zum Beispiel kannst du mit `@@` in einer Instanzmethode schnell eine neue Instan some_instance_method = (...) => @@ ... ``` - +
+ + +
## Konstruktor-Property-Promotion @@ -462,7 +517,9 @@ class Something @@baz = baz ``` - +
+ + +
Du kannst diese Syntax auch für eine gemeinsame Funktion verwenden, um Objektfelder zu initialisieren. @@ -488,7 +546,9 @@ obj = new {}, 123, "abc" print obj ``` - +
+ + +
## Klassenausdrücke @@ -508,7 +569,9 @@ x = class Bucket add_drop: => @drops += 1 ``` - +
+ + +
## Anonyme Klassen @@ -529,7 +593,9 @@ BigBucket = class extends Bucket assert Bucket.__name == "BigBucket" ``` - +
+ + +
Du kannst sogar den Körper weglassen und eine leere anonyme Klasse schreiben: @@ -546,13 +613,16 @@ Du kannst sogar den Körper weglassen und eine leere anonyme Klasse schreiben: x = class ``` - +
+ + +
## Class Mixing @@ -576,7 +646,9 @@ y\func! assert y.__class.__parent ~= X -- X ist nicht die Elternklasse von Y ``` - +
+ + +
diff --git a/doc/docs/de/doc/objects/with-statement.md b/doc/src/content/docs/de/doc/objects/with-statement.md similarity index 74% rename from doc/docs/de/doc/objects/with-statement.md rename to doc/src/content/docs/de/doc/objects/with-statement.md index 2eb6039b..10c3f347 100644 --- a/doc/docs/de/doc/objects/with-statement.md +++ b/doc/src/content/docs/de/doc/objects/with-statement.md @@ -1,4 +1,8 @@ -# With-Statement +--- +title: With-Statement +sidebar: + order: 27 +--- Ein häufiges Muster bei der Erstellung eines Objekts ist, unmittelbar danach eine Reihe von Funktionen aufzurufen und Eigenschaften zu setzen. @@ -16,7 +20,9 @@ with Person! print .name ``` - +
+ + +
Das `with`-Statement kann auch als Ausdruck verwendet werden und gibt den Wert zurück, auf den es Zugriff gewährt. @@ -35,14 +42,17 @@ file = with File "Lieblingsessen.txt" \set_encoding "utf8" ``` - +
+ + +
`with`-Ausdrücke unterstützen `break` mit genau einem Wert: @@ -51,14 +61,17 @@ result = with obj break .value ``` - +
+ + +
Sobald `break value` in `with` verwendet wird, gibt der `with`-Ausdruck nicht mehr sein Zielobjekt zurück, sondern den von `break` gelieferten Wert. @@ -72,7 +85,9 @@ b = with obj -- b ist .x, nicht obj ``` - +
+ + +
Im Unterschied zu `for` / `while` / `repeat` / `do` unterstützt `with` nur einen `break`-Wert. @@ -99,7 +115,9 @@ create_person = (name, relatives) -> me = create_person "Leaf", [dad, mother, sister] ``` - +
+ + +
In dieser Verwendung kann `with` als spezielle Form des K-Kombinators gesehen werden. @@ -122,7 +141,9 @@ with str := "Hallo" print "Großbuchstaben:", \upper! ``` - +
+ + +
Du kannst in einem `with`-Statement über `[]` auf spezielle Schlüssel zugreifen. @@ -144,7 +166,9 @@ with tb [] = "abc" -- an "tb" anhängen ``` - +
+ + +
`with?` ist eine erweiterte Version der `with`-Syntax, die einen Existenz-Check einführt, um Objekte, die `nil` sein könnten, sicher zuzugreifen, ohne explizite Nullprüfungen. @@ -165,11 +190,14 @@ with? obj print .name ``` - +
+ + +
diff --git a/doc/src/content/docs/de/index.md b/doc/src/content/docs/de/index.md new file mode 100644 index 00000000..08b3410d --- /dev/null +++ b/doc/src/content/docs/de/index.md @@ -0,0 +1,41 @@ +--- +hero: + tagline: Eine wunderbare Sprache, die zu Lua kompiliert + image: + alt: YueScript + html: YueScript + actions: + - text: Schnellstart → + link: /de/doc/ + variant: primary + - text: Auf GitHub ansehen + link: https://github.com/IppClub/YueScript + variant: minimal + icon: external +title: YueScript +sidebar: + order: -1 +template: splash +description: Eine wunderbare Sprache, die zu Lua kompiliert +--- + +
+
+

Vertrauter Lua-Workflow

+

Schreibe kompakte Syntax, die in gut lesbares Lua mit vorhersehbarer Ausgabe kompiliert wird.

+
+
+

Moderne Sprachfeatures

+

Pipe, Pattern Matching, Slicing und Destructuring – ohne auf Lua-Interop zu verzichten.

+
+
+

Schnelle Iteration

+

Jedes Feedback ist willkommen, um die Entwicklung und Weiterentwicklung der Sprache zu beschleunigen!

+
+
+ + diff --git a/doc/src/content/docs/de/try/index.md b/doc/src/content/docs/de/try/index.md new file mode 100644 index 00000000..4727401f --- /dev/null +++ b/doc/src/content/docs/de/try/index.md @@ -0,0 +1,9 @@ +--- +title: YueScript Online-Compiler +sidebar: + order: 100 +--- + +Probiere YueScript im Browser mit WASM aus. + +
diff --git a/doc/docs/doc/advanced/do.md b/doc/src/content/docs/doc/advanced/do.md similarity index 63% rename from doc/docs/doc/advanced/do.md rename to doc/src/content/docs/doc/advanced/do.md index 4bfcc171..3badae76 100644 --- a/doc/docs/doc/advanced/do.md +++ b/doc/src/content/docs/doc/advanced/do.md @@ -1,4 +1,8 @@ -# Do +--- +title: Do +sidebar: + order: 30 +--- When used as a statement, do works just like it does in Lua. @@ -9,7 +13,9 @@ do print var -- nil here ``` - +
+ + +
YueScript's **do** can also be used an expression. Allowing you to combine multiple lines into one. The result of the do expression is the last statement in its body. @@ -33,7 +40,9 @@ print counter! print counter! ``` - +
+ + +
```yuescript tbl = { @@ -56,7 +66,9 @@ tbl = { } ``` - +
+ + +
`do` expressions also support using `break` to interrupt control flow and return multiple values early: @@ -78,7 +91,9 @@ status, value = do break "small", n ``` - +
+ + +
diff --git a/doc/docs/doc/advanced/line-decorators.md b/doc/src/content/docs/doc/advanced/line-decorators.md similarity index 55% rename from doc/docs/doc/advanced/line-decorators.md rename to doc/src/content/docs/doc/advanced/line-decorators.md index 16b447c3..fffb576d 100644 --- a/doc/docs/doc/advanced/line-decorators.md +++ b/doc/src/content/docs/doc/advanced/line-decorators.md @@ -1,4 +1,8 @@ -# Line Decorators +--- +title: Line Decorators +sidebar: + order: 29 +--- For convenience, the for loop and if statement can be applied to single statements at the end of the line: @@ -6,13 +10,16 @@ For convenience, the for loop and if statement can be applied to single statemen print "hello world" if name == "Rob" ``` - +
+ + +
And with basic loops: @@ -20,13 +27,16 @@ And with basic loops: print "item: ", item for item in *items ``` - +
+ + +
And with while loops: @@ -36,7 +46,9 @@ game\update! while game\isRunning! reader\parse_line! until reader\eof! ``` - +
+ + +
diff --git a/doc/docs/doc/advanced/macro.md b/doc/src/content/docs/doc/advanced/macro.md similarity index 86% rename from doc/docs/doc/advanced/macro.md rename to doc/src/content/docs/doc/advanced/macro.md index bc7b56c5..0d32f7e8 100644 --- a/doc/docs/doc/advanced/macro.md +++ b/doc/src/content/docs/doc/advanced/macro.md @@ -1,4 +1,8 @@ -# Macro +--- +title: Macro +sidebar: + order: 28 +--- ## Common Usage @@ -33,7 +37,9 @@ if $and f1!, f2!, f3! print "OK" ``` - +
+ + +
## Insert Raw Codes @@ -96,7 +103,9 @@ end ]==] ``` - +
+ + +
The returned table can be used to control how the generated code gets inserted. @@ -154,7 +164,9 @@ import "utils" as { [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ ``` - +
+ + +
## Builtin Macro @@ -185,14 +198,17 @@ print $FILE -- get string of current module name print $LINE -- get number 2 ``` - +
+ + +
## Generating Macros with Macros @@ -216,7 +232,9 @@ print "Valid enum type:", $BodyType Static -- print "Compilation error with enum type:", $BodyType Unknown ``` - +
+ + +
## Generating Multi-line Code @@ -255,7 +274,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
```yuescript macro default_conf = (conf) -> | @@ -280,7 +302,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
## Argument Validation @@ -308,7 +333,9 @@ macro printNumAndStr = (num `Num, str `String) -> | $printNumAndStr 123, "hello" ``` - +
+ + +
If you need more flexible argument checking, you can use the built-in `$is_ast` macro function to manually check at the appropriate place. @@ -333,7 +361,9 @@ macro printNumAndStr = (num, str) -> $printNumAndStr 123, "hello" ``` - +
+ + +
For more details about available AST nodes, please refer to the uppercased definitions in [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). @@ -364,7 +395,9 @@ myFunc = -> return ``` - +
+ + +
When the annotation macro returns a config table, the optional `before` field controls whether the generated result is emitted before or after the annotated statement. @@ -397,7 +431,9 @@ tableB = {} return ``` - +
+ + +
Because the followed statement is passed in as an extra macro argument, annotations can also be used to generate registration code from class declarations. Because the followed statement is passed in as an extra macro argument, you can use the same AST argument checks as normal macros: @@ -435,7 +472,9 @@ class Worker return ``` - +
+ + +
Annotations can also inject wrapper code around functions: @@ -470,7 +510,9 @@ $[ValidateNumberArgs] add = (a, b) -> a + b ``` - +
+ + +
An annotation must always be followed by a statement, and it can not be applied to a `return` statement. If the annotated statement appears at the end of a block, add an explicit trailing `return` when you need the raw statement AST shape instead of an implicitly returned expression. diff --git a/doc/docs/doc/advanced/the-yuescript-library.md b/doc/src/content/docs/doc/advanced/the-yuescript-library.md similarity index 99% rename from doc/docs/doc/advanced/the-yuescript-library.md rename to doc/src/content/docs/doc/advanced/the-yuescript-library.md index 817bfab4..36e2b544 100644 --- a/doc/docs/doc/advanced/the-yuescript-library.md +++ b/doc/src/content/docs/doc/advanced/the-yuescript-library.md @@ -1,4 +1,8 @@ -# The YueScript Library +--- +title: The YueScript Library +sidebar: + order: 32 +--- Access it by `local yue = require("yue")` in Lua. diff --git a/doc/docs/doc/advanced/try.md b/doc/src/content/docs/doc/advanced/try.md similarity index 83% rename from doc/docs/doc/advanced/try.md rename to doc/src/content/docs/doc/advanced/try.md index c890f095..7b259852 100644 --- a/doc/docs/doc/advanced/try.md +++ b/doc/src/content/docs/doc/advanced/try.md @@ -1,4 +1,8 @@ -# Try +--- +title: Try +sidebar: + order: 31 +--- The syntax for Lua error handling in a common form. @@ -30,7 +34,9 @@ catch err print result ``` - +
+ + +
## Try? @@ -84,7 +91,9 @@ catch e e ``` - +
+ + +
diff --git a/doc/docs/doc/assignment/assignment.md b/doc/src/content/docs/doc/assignment/assignment.md similarity index 74% rename from doc/docs/doc/assignment/assignment.md rename to doc/src/content/docs/doc/assignment/assignment.md index cabbc45b..5d012be1 100644 --- a/doc/docs/doc/assignment/assignment.md +++ b/doc/src/content/docs/doc/assignment/assignment.md @@ -1,4 +1,8 @@ -# Assignment +--- +title: Assignment +sidebar: + order: 10 +--- The variable is dynamic typed and is defined as local by default. But you can change the scope of declaration by **local** and **global** statement. @@ -8,7 +12,9 @@ a, b, c = 1, 2, 3 hello = 123 -- uses the existing variable ``` - +
+ + +
## Perform Update @@ -33,7 +40,9 @@ s ..= "world" -- will add a new local if local variable is not exist arg or= "default value" ``` - +
+ + +
## Chaining Assignment @@ -57,14 +67,17 @@ a = b = c = d = e = 0 x = y = z = f! ``` - +
+ + +
## Explicit Locals @@ -85,7 +98,9 @@ do B = 2 ``` - +
+ + +
## Explicit Globals @@ -125,7 +141,9 @@ do local Temp = "a local value" ``` - +
+ + +
diff --git a/doc/docs/doc/assignment/destructuring-assignment.md b/doc/src/content/docs/doc/assignment/destructuring-assignment.md similarity index 75% rename from doc/docs/doc/assignment/destructuring-assignment.md rename to doc/src/content/docs/doc/assignment/destructuring-assignment.md index 750f09ed..bd256847 100644 --- a/doc/docs/doc/assignment/destructuring-assignment.md +++ b/doc/src/content/docs/doc/assignment/destructuring-assignment.md @@ -1,4 +1,8 @@ -# Destructuring Assignment +--- +title: Destructuring Assignment +sidebar: + order: 11 +--- Destructuring assignment is a way to quickly extract values from a table by their name or position in array based tables. @@ -13,7 +17,9 @@ thing = [1, 2] print a, b ``` - +
+ + +
In the destructuring table literal, the key represents the key to read from the right hand side, and the value represents the name the read value will be assigned to. @@ -39,7 +46,9 @@ print hello, the_day :day = obj -- OK to do simple destructuring without braces ``` - +
+ + +
This also works with nested data structures as well: @@ -71,7 +81,9 @@ obj2 = { print first, second, color ``` - +
+ + +
If the destructuring statement is complicated, feel free to spread it out over a few lines. A slightly more complicated example: @@ -99,7 +112,9 @@ If the destructuring statement is complicated, feel free to spread it out over a } = obj2 ``` - +
+ + +
It's common to extract values from at table and assign them the local variables that have the same name as the key. In order to avoid repetition we can use the **:** prefix operator: @@ -118,13 +134,16 @@ It's common to extract values from at table and assign them the local variables {:concat, :insert} = table ``` - +
+ + +
This is effectively the same as import, but we can rename fields we want to extract by mixing the syntax: @@ -132,13 +151,16 @@ This is effectively the same as import, but we can rename fields we want to extr {:mix, :max, random: rand} = math ``` - +
+ + +
You can write default values while doing destructuring like: @@ -146,13 +168,16 @@ You can write default values while doing destructuring like: {:name = "nameless", :job = "jobless"} = person ``` - +
+ + +
You can use `_` as placeholder when doing a list destructuring: @@ -160,13 +185,16 @@ You can use `_` as placeholder when doing a list destructuring: [_, two, _, four] = items ``` - +
+ + +
## Range Destructuring @@ -180,7 +208,9 @@ print bulk -- prints: {"second", "third", "fourth"} print last -- prints: last ``` - +
+ + +
The spread operator can be used in different positions to capture different ranges, and you can use `_` as a placeholder for the values you don't want to capture: @@ -205,7 +236,9 @@ The spread operator can be used in different positions to capture different rang [first, ..._, last] = orders ``` - +
+ + +
## Destructuring In Other Places @@ -234,7 +268,9 @@ for [left, right] in *tuples print left, right ``` - +
+ + +
We know each element in the array table is a two item tuple, so we can unpack it directly in the names clause of the for statement using a destructure. diff --git a/doc/docs/doc/assignment/if-assignment.md b/doc/src/content/docs/doc/assignment/if-assignment.md similarity index 73% rename from doc/docs/doc/assignment/if-assignment.md rename to doc/src/content/docs/doc/assignment/if-assignment.md index 99f94b43..30f71e7f 100644 --- a/doc/docs/doc/assignment/if-assignment.md +++ b/doc/src/content/docs/doc/assignment/if-assignment.md @@ -1,4 +1,8 @@ -# If Assignment +--- +title: If Assignment +sidebar: + order: 12 +--- `if` and `elseif` blocks can take an assignment in place of a conditional expression. Upon evaluating the conditional, the assignment will take place and the value that was assigned to will be used as the conditional expression. The assigned variable is only in scope for the body of the conditional, meaning it is never available if the value is not truthy. And you have to use "the walrus operator" `:=` instead of `=` to do assignment. @@ -7,14 +11,17 @@ if user := database.find_user "moon" print user.name ``` - +
+ + +
```yuescript if hello := os.getenv "hello" @@ -25,7 +32,9 @@ else print "nothing :(" ``` - +
+ + +
If assignment with multiple return values. Only the first value is getting checked, other values are scoped. @@ -46,7 +56,9 @@ if success, result := pcall -> "get result without problems" print "OK" ``` - +
+ + +
## While Assignment @@ -66,7 +79,9 @@ while byte := stream\read_one! print byte ``` - +
+ + +
diff --git a/doc/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md b/doc/src/content/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md similarity index 79% rename from doc/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md rename to doc/src/content/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md index 20ba2367..455422a9 100644 --- a/doc/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md +++ b/doc/src/content/docs/doc/assignment/the-using-clause-controlling-destructive-assignment.md @@ -1,4 +1,8 @@ -# The Using Clause; Controlling Destructive Assignment +--- +title: The Using Clause; Controlling Destructive Assignment +sidebar: + order: 14 +--- While lexical scoping can be a great help in reducing the complexity of the code we write, things can get unwieldy as the code size increases. Consider the following snippet: @@ -18,7 +22,9 @@ my_func! print i -- will print 0 ``` - +
+ + +
In my_func, we've overwritten the value of i mistakenly. In this example it is quite obvious, but consider a large, or foreign code base where it isn't clear what names have already been declared. @@ -54,7 +61,9 @@ my_func! print i -- prints 100, i is unaffected ``` - +
+ + +
Multiple names can be separated by commas. Closure values can still be accessed, they just cant be modified: @@ -83,7 +93,9 @@ my_func(22) print i, k -- these have been updated ``` - +
+ + +
diff --git a/doc/docs/doc/assignment/varargs-assignment.md b/doc/src/content/docs/doc/assignment/varargs-assignment.md similarity index 70% rename from doc/docs/doc/assignment/varargs-assignment.md rename to doc/src/content/docs/doc/assignment/varargs-assignment.md index 145274c2..f0c3d2fb 100644 --- a/doc/docs/doc/assignment/varargs-assignment.md +++ b/doc/src/content/docs/doc/assignment/varargs-assignment.md @@ -1,4 +1,8 @@ -# Varargs Assignment +--- +title: Varargs Assignment +sidebar: + order: 13 +--- You can assign the results returned from a function to a varargs symbol `...`. And then access its content using the Lua way. @@ -11,7 +15,9 @@ first = select 1, ... print ok, count, first ``` - +
+ + +
diff --git a/doc/docs/doc/control-flow/conditionals.md b/doc/src/content/docs/doc/control-flow/conditionals.md similarity index 68% rename from doc/docs/doc/control-flow/conditionals.md rename to doc/src/content/docs/doc/control-flow/conditionals.md index ca29fda1..51115bcb 100644 --- a/doc/docs/doc/control-flow/conditionals.md +++ b/doc/src/content/docs/doc/control-flow/conditionals.md @@ -1,4 +1,8 @@ -# Conditionals +--- +title: Conditionals +sidebar: + order: 18 +--- ```yuescript have_coins = false @@ -8,7 +12,9 @@ else print "No coins" ``` - +
+ + +
A short syntax for single statements can also be used: @@ -27,14 +34,17 @@ have_coins = false if have_coins then print "Got coins" else print "No coins" ``` - +
+ + +
Because if statements can be used as expressions, this can also be written as: @@ -43,14 +53,17 @@ have_coins = false print if have_coins then "Got coins" else "No coins" ``` - +
+ + +
Conditionals can also be used in return statements and assignments: @@ -69,7 +82,9 @@ else print message -- prints: I am very tall ``` - +
+ + +
The opposite of if is unless: @@ -95,26 +111,32 @@ unless os.date("%A") == "Monday" print "it is not Monday!" ``` - +
+ + +
```yuescript print "You're lucky!" unless math.random! > 0.1 ``` - +
+ + +
## In Expression @@ -130,7 +152,9 @@ if a in list print "checking if `a` is in a list" ``` - +
+ + +
The `in` operator can also be used with tables and supports the `not in` variant for negation: @@ -157,7 +182,9 @@ not_exist = item not in list check = -> value not in table ``` - +
+ + +
A single-element list or table checks for equality with that element: @@ -186,7 +214,9 @@ with tb c = a in [1] ``` - +
+ + +
diff --git a/doc/docs/doc/control-flow/continue.md b/doc/src/content/docs/doc/control-flow/continue.md similarity index 66% rename from doc/docs/doc/control-flow/continue.md rename to doc/src/content/docs/doc/control-flow/continue.md index 8708b5a8..13d49e05 100644 --- a/doc/docs/doc/control-flow/continue.md +++ b/doc/src/content/docs/doc/control-flow/continue.md @@ -1,4 +1,8 @@ -# Continue +--- +title: Continue +sidebar: + order: 21 +--- A continue statement can be used to skip the current iteration in a loop. @@ -10,7 +14,9 @@ while i < 10 print i ``` - +
+ + +
continue can also be used with loop expressions to prevent that iteration from accumulating into the result. This examples filters the array table into just even numbers: @@ -31,7 +38,9 @@ odds = for x in *my_numbers x ``` - +
+ + +
diff --git a/doc/docs/doc/control-flow/for-loop.md b/doc/src/content/docs/doc/control-flow/for-loop.md similarity index 73% rename from doc/docs/doc/control-flow/for-loop.md rename to doc/src/content/docs/doc/control-flow/for-loop.md index 763e6a7c..5357271c 100644 --- a/doc/docs/doc/control-flow/for-loop.md +++ b/doc/src/content/docs/doc/control-flow/for-loop.md @@ -1,4 +1,8 @@ -# For Loop +--- +title: For Loop +sidebar: + order: 19 +--- There are two for loop forms, just like in Lua. A numeric one and a generic one: @@ -13,7 +17,9 @@ for key, value in pairs object print key, value ``` - +
+ + +
The slicing and **\*** operators can be used, just like with comprehensions: @@ -35,14 +42,17 @@ for item in *items[2, 4] print item ``` - +
+ + +
A shorter syntax is also available for all variations when the body is only a single line: @@ -52,7 +62,9 @@ for item in *items do print item for j = 1, 10, 3 do print j ``` - +
+ + +
A for loop can also be used as an expression. The last statement in the body of the for loop is coerced into an expression and appended to an accumulating array table. @@ -74,7 +87,9 @@ doubled_evens = for i = 1, 20 i ``` - +
+ + +
In addition, for loops support break with return values, allowing the loop itself to be used as an expression that exits early with meaningful results. @@ -95,14 +111,17 @@ first_large = for n in *numbers break n if n > 10 ``` - +
+ + +
This break-with-value syntax enables concise and expressive search or early-exit patterns directly within loop expressions. @@ -113,14 +132,17 @@ key, score = for k, v in pairs data break k, v * 10 if k == "target" ``` - +
+ + +
You can also filter values by combining the for loop expression with the continue statement. @@ -134,7 +156,9 @@ print func_a! -- prints nil print func_b! -- prints table object ``` - +
+ + +
This is done to avoid the needless creation of tables for functions that don't need to return the results of the loop. diff --git a/doc/docs/doc/control-flow/goto.md b/doc/src/content/docs/doc/control-flow/goto.md similarity index 76% rename from doc/docs/doc/control-flow/goto.md rename to doc/src/content/docs/doc/control-flow/goto.md index 00227bad..79ab9d27 100644 --- a/doc/docs/doc/control-flow/goto.md +++ b/doc/src/content/docs/doc/control-flow/goto.md @@ -1,4 +1,8 @@ -# Goto +--- +title: Goto +sidebar: + order: 22 +--- YueScript supports goto statement and label syntax for controlling program flow, following the same rules as Lua's goto statement. **Note:** The goto statement requires Lua 5.2 or higher. When compiling to Lua 5.1, using goto syntax will result in a compilation error. @@ -10,7 +14,9 @@ A label is defined using double colons: ::my_label:: ``` - +
+ + +
The goto statement jumps to a specified label: @@ -32,7 +39,9 @@ goto start print "a is now 5" ``` - +
+ + +
The goto statement is useful for breaking out of deeply nested loops: @@ -57,7 +67,9 @@ for z = 1, 10 ::ok:: ``` - +
+ + +
You can also use labels to jump to a specific loop level: @@ -83,7 +96,9 @@ for z = 1, 10 ::zcontinue:: ``` - +
+ + +
## Notes diff --git a/doc/docs/doc/control-flow/switch.md b/doc/src/content/docs/doc/control-flow/switch.md similarity index 79% rename from doc/docs/doc/control-flow/switch.md rename to doc/src/content/docs/doc/control-flow/switch.md index 7787b64b..42c7cc58 100644 --- a/doc/docs/doc/control-flow/switch.md +++ b/doc/src/content/docs/doc/control-flow/switch.md @@ -1,4 +1,8 @@ -# Switch +--- +title: Switch +sidebar: + order: 23 +--- The switch statement is shorthand for writing a series of if statements that check against the same value. Note that the value is only evaluated once. Like if statements, switches can have an else block to handle no matches. Comparison is done with the == operator. In switch statement, you can also use assignment expression to store temporary variable value. @@ -12,7 +16,9 @@ switch name := "Dan" print "I don't know about you with name #{name}" ``` - +
+ + +
A switch when clause can match against multiple values by listing them out comma separated. @@ -41,7 +48,9 @@ next_number = switch b error "can't count that high!" ``` - +
+ + +
We can use the then keyword to write a switch's when block on a single line. No extra keyword is needed to write the else block on a single line. @@ -65,7 +75,9 @@ msg = switch math.random(1, 5) else "not so lucky" ``` - +
+ + +
If you want to write code with one less indent when writing a switch statement, you can put the first when clause on the statement start line, and then all other clauses can be written with one less indent. @@ -91,7 +104,9 @@ else print "not so lucky" ``` - +
+ + +
It is worth noting the order of the case comparison expression. The case's expression is on the left hand side. This can be useful if the case's expression wants to overwrite how the comparison is done by defining an eq metamethod. @@ -129,7 +145,9 @@ for item in *items print "size #{width}, #{height}" ``` - +
+ + +
You can use default values to optionally destructure the table for some fields. @@ -160,7 +179,9 @@ switch item print "Vec2 #{x}, #{y}" -- table destructuring will still pass ``` - +
+ + +
You can also match against array elements, table fields, and even nested structures with array or table literals. @@ -188,7 +210,9 @@ switch tb print "1, 2, #{b}" ``` - +
+ + +
Match against table fields with destructuring. @@ -214,7 +239,9 @@ switch tb print "invalid" ``` - +
+ + +
Match against nested table structures. @@ -240,7 +268,9 @@ switch tb print "invalid" ``` - +
+ + +
Match against array of tables. @@ -267,7 +298,9 @@ switch tb print "matched", fourth ``` - +
+ + +
Match against a list and capture a range of elements. @@ -293,7 +327,9 @@ switch segments print "Action:", action -- prints: "view" ``` - +
+ + +
diff --git a/doc/docs/doc/control-flow/while-loop.md b/doc/src/content/docs/doc/control-flow/while-loop.md similarity index 65% rename from doc/docs/doc/control-flow/while-loop.md rename to doc/src/content/docs/doc/control-flow/while-loop.md index 0dff342b..e1947dc3 100644 --- a/doc/docs/doc/control-flow/while-loop.md +++ b/doc/src/content/docs/doc/control-flow/while-loop.md @@ -1,4 +1,8 @@ -# While Loop +--- +title: While Loop +sidebar: + order: 20 +--- The while loop also comes in four variations: @@ -11,7 +15,9 @@ while i > 0 while running == true do my_function! ``` - +
+ + +
```yuescript i = 10 @@ -33,7 +40,9 @@ until i == 0 until running == false do my_function! ``` - +
+ + +
Like for loops, the while loop can also be used as an expression. While and until loop expressions support `break` with multiple return values. @@ -53,7 +63,9 @@ value, doubled = while true break n, n * 2 if n > 10 ``` - +
+ + +
Additionally, for a function to return the accumulated value of a while loop, the statement must be explicitly returned. @@ -77,7 +90,9 @@ repeat until i == 0 ``` - +
+ + +
Repeat loop expressions also support `break` with multiple return values: @@ -99,7 +115,9 @@ value, scaled = repeat until false ``` - +
+ + +
diff --git a/doc/docs/doc/data-structures/comprehensions.md b/doc/src/content/docs/doc/data-structures/comprehensions.md similarity index 72% rename from doc/docs/doc/data-structures/comprehensions.md rename to doc/src/content/docs/doc/data-structures/comprehensions.md index 94fbf38f..1dee5ea6 100644 --- a/doc/docs/doc/data-structures/comprehensions.md +++ b/doc/src/content/docs/doc/data-structures/comprehensions.md @@ -1,4 +1,8 @@ -# Comprehensions +--- +title: Comprehensions +sidebar: + order: 25 +--- Comprehensions provide a convenient syntax for constructing a new table by iterating over some existing object and applying an expression to its values. There are two kinds of comprehensions: list comprehensions and table comprehensions. They both produce Lua tables; list comprehensions accumulate values into an array-like table, and table comprehensions let you set both the key and the value on each iteration. @@ -11,14 +15,17 @@ items = [ 1, 2, 3, 4 ] doubled = [item * 2 for i, item in ipairs items] ``` - +
+ + +
The items included in the new table can be restricted with a when clause: @@ -26,13 +33,16 @@ The items included in the new table can be restricted with a when clause: slice = [item for i, item in ipairs items when i > 1 and i < 3] ``` - +
+ + +
Because it is common to iterate over the values of a numerically indexed table, an **\*** operator is introduced. The doubled example can be rewritten as: @@ -40,13 +50,16 @@ Because it is common to iterate over the values of a numerically indexed table, doubled = [item * 2 for item in *items] ``` - +
+ + +
In list comprehensions, you can also use the spread operator `...` to flatten nested lists, achieving a flat map effect: @@ -59,7 +72,9 @@ flat = [...v for k,v in pairs data] -- flat is now [1, 2, 3, 4, 5, 6] ``` - +
+ + +
The for and when clauses can be chained as much as desired. The only requirement is that a comprehension has at least one for clause. @@ -84,7 +100,9 @@ points = [ [x, y] for x in *x_coords \ for y in *y_coords] ``` - +
+ + +
Numeric for loops can also be used in comprehensions: @@ -102,13 +121,16 @@ Numeric for loops can also be used in comprehensions: evens = [i for i = 1, 100 when i % 2 == 0] ``` - +
+ + +
## Table Comprehensions @@ -126,7 +148,9 @@ thing = { thing_copy = {k, v for k, v in pairs thing} ``` - +
+ + +
```yuescript no_color = {k, v for k, v in pairs thing when k != "color"} ``` - +
+ + +
The **\*** operator is also supported. Here we create a square root look up table for a few numbers. @@ -159,14 +187,17 @@ numbers = [1, 2, 3, 4] sqrts = {i, math.sqrt i for i in *numbers} ``` - +
+ + +
The key-value tuple in a table comprehension can also come from a single expression, in which case the expression should return two values. The first is used as the key and the second is used as the value: @@ -177,14 +208,17 @@ tuples = [ ["hello", "world"], ["foo", "bar"]] tbl = {unpack tuple for tuple in *tuples} ``` - +
+ + +
## Slicing @@ -196,13 +230,16 @@ Here we can set the minimum and maximum bounds, taking all items with indexes be slice = [item for item in *items[1, 5]] ``` - +
+ + +
Any of the slice arguments can be left off to use a sensible default. In this example, if the max index is left off it defaults to the length of the table. This will take everything but the first element: @@ -210,13 +247,16 @@ Any of the slice arguments can be left off to use a sensible default. In this ex slice = [item for item in *items[2,]] ``` - +
+ + +
If the minimum bound is left out, it defaults to 1. Here we only provide a step size and leave the other bounds blank. This takes all odd indexed items: (1, 3, 5, …) @@ -224,13 +264,16 @@ If the minimum bound is left out, it defaults to 1. Here we only provide a step slice = [item for item in *items[,,2]] ``` - +
+ + +
Both the minimum and maximum bounds can be negative, which means that the bounds are counted from the end of the table. @@ -239,14 +282,17 @@ Both the minimum and maximum bounds can be negative, which means that the bounds slice = [item for item in *items[-4,-1]] ``` - +
+ + +
The step size can also be negative, which means that the items are taken in reverse order. @@ -254,13 +300,16 @@ The step size can also be negative, which means that the items are taken in reve reverse_slice = [item for item in *items[-1,1,-1]] ``` - +
+ + +
### Slicing Expression @@ -274,7 +323,9 @@ sub_list = items[2, 4] last_four_items = items[-4, -1] ``` - +
+ + +
diff --git a/doc/docs/doc/data-structures/table-literals.md b/doc/src/content/docs/doc/data-structures/table-literals.md similarity index 68% rename from doc/docs/doc/data-structures/table-literals.md rename to doc/src/content/docs/doc/data-structures/table-literals.md index e3d2c19e..220e8c90 100644 --- a/doc/docs/doc/data-structures/table-literals.md +++ b/doc/src/content/docs/doc/data-structures/table-literals.md @@ -1,4 +1,8 @@ -# Table Literals +--- +title: Table Literals +sidebar: + order: 24 +--- Like in Lua, tables are delimited in curly braces. @@ -6,13 +10,16 @@ Like in Lua, tables are delimited in curly braces. some_values = {1, 2, 3, 4} ``` - +
+ + +
Unlike Lua, assigning a value to a key in a table is done with **:** (instead of **=**). @@ -24,7 +31,9 @@ some_values = { } ``` - +
+ + +
The curly braces can be left off if a single table of key value pairs is being assigned. @@ -45,7 +55,9 @@ profile = favorite_foods: ["ice cream", "donuts"] ``` - +
+ + +
Newlines can be used to delimit values instead of a comma (or both): @@ -67,7 +80,9 @@ values = { } ``` - +
+ + +
When creating a single line table literal, the curly braces can also be left off: @@ -88,7 +104,9 @@ my_function dance: "Tango", partner: "none" y = type: "dog", legs: 4, tails: 1 ``` - +
+ + +
The keys of a table literal can be language keywords without being escaped: @@ -107,7 +126,9 @@ tbl = { } ``` - +
+ + +
If you are constructing a table out of variables and wish the keys to be the same as the variable names, then the **:** prefix operator can be used: @@ -128,7 +150,9 @@ person = { :hair, :height, shoe_size: 40 } print_table :hair, :height ``` - +
+ + +
If you want the key of a field in the table to to be result of an expression, then you can wrap it in **[ ]**, just like in Lua. You can also use a string literal directly as a key, leaving out the square brackets. This is useful if your key has any special characters. @@ -149,7 +174,9 @@ t = { } ``` - +
+ + +
Lua tables have both an array part and a hash part, but sometimes it's useful to make a semantic distinction between the two. You can use **[ ]** instead of **{ }** to explicitly declare a table as an array, doing so will prevent any key-value pairs from being written inside it. @@ -167,11 +195,14 @@ some_values = [1, 2, 3, 4] list_with_one_element = [1, ] ``` - +
+ + +
diff --git a/doc/docs/doc/extras/license-mit.md b/doc/src/content/docs/doc/extras/license-mit.md similarity index 95% rename from doc/docs/doc/extras/license-mit.md rename to doc/src/content/docs/doc/extras/license-mit.md index 49eae7e6..7ea128ce 100644 --- a/doc/docs/doc/extras/license-mit.md +++ b/doc/src/content/docs/doc/extras/license-mit.md @@ -1,4 +1,8 @@ -# License: MIT +--- +title: "License: MIT" +sidebar: + order: 34 +--- Copyright (c) 2017-2026 Li Jin \ diff --git a/doc/src/content/docs/doc/extras/mascot.md b/doc/src/content/docs/doc/extras/mascot.md new file mode 100644 index 00000000..1ec22079 --- /dev/null +++ b/doc/src/content/docs/doc/extras/mascot.md @@ -0,0 +1,43 @@ +--- +title: Mascot, Xiaoyu +sidebar: + order: 33 +--- + +## About + +Xiaoyu the Cyber Rabbit + +Xiaoyu (小玉, "little jade") is a cyber rabbit and the official mascot of the YueScript project. She sits on a crescent moon, writing YueScript on her laptop. + +Her full title is Xiaoyu the Cyber Rabbit (机兔小玉). She reflects what YueScript aims for: clean, expressive, and playful. + +**[Tyson Tan](https://tysontan.com)** designed and illustrated Xiaoyu for the project free of charge. We are grateful for his contribution. + +## Images + +Click any image to open it at full size. + +### Full artwork + + + Xiaoyu, full artwork with background + + +

Download full-size PNG

+ +### Transparent background + + + Xiaoyu, transparent background + + +

Download transparent PNG

+ +### Zipped .kra file + +

Download zipped .kra file

+ +## License + +Xiaoyu is dual-licensed under the [MIT License](https://opensource.org/licenses/MIT) and the Creative Commons [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/doc/functions/backcalls.md b/doc/src/content/docs/doc/functions/backcalls.md similarity index 66% rename from doc/docs/doc/functions/backcalls.md rename to doc/src/content/docs/doc/functions/backcalls.md index a1d9f398..db8a3bec 100644 --- a/doc/docs/doc/functions/backcalls.md +++ b/doc/src/content/docs/doc/functions/backcalls.md @@ -1,4 +1,8 @@ -# Backcalls +--- +title: Backcalls +sidebar: + order: 16 +--- Backcalls are used for unnesting callbacks. They are defined using arrows pointed to the left as the last parameter by default filling in a function call. All the syntax is mostly the same as regular arrow functions except that it is just pointing the other way and the function body does not require indent. @@ -7,14 +11,17 @@ x <- f print "hello" .. x ``` - +
+ + +
Fat arrow functions are also available. @@ -23,14 +30,17 @@ Fat arrow functions are also available. print @value ``` - +
+ + +
You can specify a placeholder for where you want the backcall function to go as a parameter. @@ -39,14 +49,17 @@ You can specify a placeholder for where you want the backcall function to go as x * 2 ``` - +
+ + +
If you wish to have further code after your backcalls, you can set them aside with a do statement. And the parentheses can be omitted with non-fat arrow functions. @@ -59,7 +72,9 @@ result, msg = do print result, msg ``` - +
+ + +
diff --git a/doc/docs/doc/functions/function-literals.md b/doc/src/content/docs/doc/functions/function-literals.md similarity index 77% rename from doc/docs/doc/functions/function-literals.md rename to doc/src/content/docs/doc/functions/function-literals.md index ed37e522..3119156a 100644 --- a/doc/docs/doc/functions/function-literals.md +++ b/doc/src/content/docs/doc/functions/function-literals.md @@ -1,4 +1,8 @@ -# Function Literals +--- +title: Function Literals +sidebar: + order: 15 +--- All functions are created using a function expression. A simple function is denoted using the arrow: **->**. @@ -7,14 +11,17 @@ my_function = -> my_function() -- call the empty function ``` - +
+ + +
The body of the function can either be one statement placed directly after the arrow, or it can be a series of statements indented on the following lines: @@ -26,7 +33,9 @@ func_b = -> print "The value:", value ``` - +
+ + +
If a function has no arguments, it can be called using the ! operator, instead of empty parentheses. The ! invocation is the preferred way to call functions with no arguments. @@ -45,14 +55,17 @@ func_a! func_b() ``` - +
+ + +
Functions with arguments can be created by preceding the arrow with a list of argument names in parentheses: @@ -60,13 +73,16 @@ Functions with arguments can be created by preceding the arrow with a list of ar sum = (x, y) -> print "sum", x + y ``` - +
+ + +
Functions can be called by listing the arguments after the name of an expression that evaluates to a function. When chaining together function calls, the arguments are applied to the closest function to the left. @@ -77,7 +93,9 @@ print sum 10, 20 a b c "a", "b", "c" ``` - +
+ + +
In order to avoid ambiguity in when calling functions, parentheses can also be used to surround the arguments. This is required here in order to make sure the right arguments get sent to the right functions. @@ -94,13 +113,16 @@ In order to avoid ambiguity in when calling functions, parentheses can also be u print "x:", sum(10, 20), "y:", sum(30, 40) ``` - +
+ + +
There must not be any space between the opening parenthesis and the function. @@ -111,14 +133,17 @@ sum = (x, y) -> x + y print "The sum is ", sum 10, 20 ``` - +
+ + +
And if you need to explicitly return, you can use the return keyword: @@ -126,13 +151,16 @@ And if you need to explicitly return, you can use the return keyword: sum = (x, y) -> return x + y ``` - +
+ + +
Just like in Lua, functions can return multiple values. The last statement must be a list of values separated by commas: @@ -141,14 +169,17 @@ mystery = (x, y) -> x + y, x - y a, b = mystery 10, 20 ``` - +
+ + +
## Fat Arrows @@ -158,13 +189,16 @@ Because it is an idiom in Lua to send an object as the first argument when calli func = (num) => @value + num ``` - +
+ + +
## Argument Defaults @@ -176,7 +210,9 @@ my_function = (name = "something", height = 100) -> print "My height is", height ``` - +
+ + +
An argument default value expression is evaluated in the body of the function in the order of the argument declarations. For this reason default values have access to previously declared arguments. @@ -193,14 +230,17 @@ some_args = (x = 100, y = x + 1000) -> print x + y ``` - +
+ + +
## Considerations @@ -215,7 +255,9 @@ c = x -y d = x- z ``` - +
+ + +
The precedence of the first argument of a function call can be controlled using whitespace if the argument is a literal string. In Lua, it is common to leave off parentheses when calling a function with a single string or table literal. @@ -237,14 +280,17 @@ x = func"hello" + 100 y = func "hello" + 100 ``` - +
+ + +
## Multi-line arguments @@ -262,7 +308,9 @@ cool_func 1, 2, 7, 8 ``` - +
+ + +
This type of invocation can be nested. The level of indentation is used to determine to which function the arguments belong to. @@ -285,7 +334,9 @@ my_func 5, 6, 7, 5, 4 ``` - +
+ + +
Because tables also use the comma as a delimiter, this indentation syntax is helpful for letting values be part of the argument list instead of being part of the table. @@ -306,7 +358,9 @@ x = [ ] ``` - +
+ + +
Although uncommon, notice how we can give a deeper indentation for function arguments if we know we will be using a lower indentation further on. @@ -327,7 +382,9 @@ y = [ my_func 1, 2, 3, ] ``` - +
+ + +
The same thing can be done with other block level statements like conditionals. We can use indentation level to determine what statement a value belongs to: @@ -354,7 +412,9 @@ if func 1, 2, 3, print "I am inside if" ``` - +
+ + +
## Parameter Destructuring @@ -393,7 +454,9 @@ arg1 = {a: 0} f2 arg1, arg2 ``` - +
+ + +
## Prefixed Return Expression @@ -423,7 +487,9 @@ findFirstEven = (list): nil -> return sub ``` - +
+ + +
This is equivalent to: @@ -448,7 +515,9 @@ findFirstEven = (list) -> nil ``` - +
+ + +
The only difference is that you can move the final return expression before the `->` or `=>` token to indicate the function’s implicit return value as the last statement. This way, even in functions with multiple nested loops or conditional branches, you no longer need to write a trailing return expression at the end of the function body, making the logic structure more straightforward and easier to follow. @@ -490,7 +560,9 @@ process = (...args) -> process 1, nil, 3, nil, 5 ``` - +
+ + +
diff --git a/doc/docs/doc/functions/function-stubs.md b/doc/src/content/docs/doc/functions/function-stubs.md similarity index 87% rename from doc/docs/doc/functions/function-stubs.md rename to doc/src/content/docs/doc/functions/function-stubs.md index 59ce00ca..85657f65 100644 --- a/doc/docs/doc/functions/function-stubs.md +++ b/doc/src/content/docs/doc/functions/function-stubs.md @@ -1,4 +1,8 @@ -# Function Stubs +--- +title: Function Stubs +sidebar: + order: 17 +--- It is common to pass a function from an object around as a value, for example, passing an instance method into a function as a callback. If the function expects the object it is operating on as the first argument then you must somehow bundle that object with the function so it can be called properly. @@ -25,7 +29,9 @@ run_callback my_object.write run_callback my_object\write ``` - +
+ + +
diff --git a/doc/docs/doc/getting-started/installation.md b/doc/src/content/docs/doc/getting-started/installation.md similarity index 94% rename from doc/docs/doc/getting-started/installation.md rename to doc/src/content/docs/doc/getting-started/installation.md index a93ddfd0..ea930048 100644 --- a/doc/docs/doc/getting-started/installation.md +++ b/doc/src/content/docs/doc/getting-started/installation.md @@ -1,4 +1,8 @@ -# Installation +--- +title: Installation +sidebar: + order: 2 +--- ## Lua Module diff --git a/doc/docs/doc/getting-started/introduction.md b/doc/src/content/docs/doc/getting-started/introduction.md similarity index 92% rename from doc/docs/doc/getting-started/introduction.md rename to doc/src/content/docs/doc/getting-started/introduction.md index 5bcae9f8..288ec45a 100644 --- a/doc/docs/doc/getting-started/introduction.md +++ b/doc/src/content/docs/doc/getting-started/introduction.md @@ -1,4 +1,8 @@ -# Introduction +--- +title: Introduction +sidebar: + order: 1 +--- YueScript is a dynamic language that compiles to Lua. And it's a [MoonScript](https://github.com/leafo/moonscript) dialect. The codes written in YueScript are expressive and extremely concise. And it is suitable for writing some changing application logic with more maintainable codes and runs in a Lua embeded environment such as games or website servers. @@ -51,7 +55,9 @@ with apple export 🌛 = "Script of Moon" ``` - +
+ + +
## About Dora SSR diff --git a/doc/docs/doc/getting-started/usage.md b/doc/src/content/docs/doc/getting-started/usage.md similarity index 98% rename from doc/docs/doc/getting-started/usage.md rename to doc/src/content/docs/doc/getting-started/usage.md index c02e8c0a..4c30e7c9 100644 --- a/doc/docs/doc/getting-started/usage.md +++ b/doc/src/content/docs/doc/getting-started/usage.md @@ -1,4 +1,8 @@ -# Usage +--- +title: Usage +sidebar: + order: 3 +--- ## Lua Module diff --git a/doc/docs/doc/index.md b/doc/src/content/docs/doc/index.md old mode 100755 new mode 100644 similarity index 59% rename from doc/docs/doc/index.md rename to doc/src/content/docs/doc/index.md index b7f609b1..91f13170 --- a/doc/docs/doc/index.md +++ b/doc/src/content/docs/doc/index.md @@ -1,10 +1,11 @@ --- title: Reference +sidebar: + order: 0 +tableOfContents: false --- -# YueScript Documentation - -logo +YueScript logo Welcome to the YueScript official documentation!
Here you can find the language features, usage, reference examples and resources.
diff --git a/doc/docs/doc/language-basics/attributes.md b/doc/src/content/docs/doc/language-basics/attributes.md similarity index 61% rename from doc/docs/doc/language-basics/attributes.md rename to doc/src/content/docs/doc/language-basics/attributes.md index 068a56ae..72e88da4 100644 --- a/doc/docs/doc/language-basics/attributes.md +++ b/doc/src/content/docs/doc/language-basics/attributes.md @@ -1,4 +1,8 @@ -# Attributes +--- +title: Attributes +sidebar: + order: 8 +--- Syntax support for Lua 5.4 attributes. And you can still use both the `const` and `close` declaration and get constant check and scoped callback working when targeting Lua versions below 5.4. @@ -7,14 +11,17 @@ const a = 123 close _ = : -> print "Out of scope." ``` - +
+ + +
You can do desctructuring with variables attributed as constant. @@ -23,14 +30,17 @@ const {:a, :b, c, d} = tb -- a = 1 ``` - +
+ + +
You can also declare a global variable to be `const`. @@ -39,11 +49,14 @@ global const Constant = 123 -- Constant = 1 ``` - +
+ + +
diff --git a/doc/docs/doc/language-basics/comment.md b/doc/src/content/docs/doc/language-basics/comment.md similarity index 68% rename from doc/docs/doc/language-basics/comment.md rename to doc/src/content/docs/doc/language-basics/comment.md index ee637dd6..529a3165 100644 --- a/doc/docs/doc/language-basics/comment.md +++ b/doc/src/content/docs/doc/language-basics/comment.md @@ -1,4 +1,8 @@ -# Comment +--- +title: Comment +sidebar: + order: 5 +--- ```yuescript -- I am a comment @@ -13,7 +17,9 @@ It's OK. func --[[port]] 3000, --[[ip]] "192.168.1.1" ``` - +
+ + +
diff --git a/doc/docs/doc/language-basics/literals.md b/doc/src/content/docs/doc/language-basics/literals.md similarity index 76% rename from doc/docs/doc/language-basics/literals.md rename to doc/src/content/docs/doc/language-basics/literals.md index 17b823f6..d560bafc 100644 --- a/doc/docs/doc/language-basics/literals.md +++ b/doc/src/content/docs/doc/language-basics/literals.md @@ -1,4 +1,8 @@ -# Literals +--- +title: Literals +sidebar: + order: 6 +--- All of the primitive literals in Lua can be used. This applies to numbers, strings, booleans, and **nil**. @@ -13,7 +17,9 @@ some_string = "Here is a string print "I am #{math.random! * 100}% sure." ``` - +
+ + +
## Number Literals @@ -36,7 +43,9 @@ hex = 0xEF_BB_BF binary = 0B10011 ``` - +
+ + +
## YAML Multiline String @@ -58,7 +68,9 @@ str = | - #{expr} ``` - +
+ + +
This allows writing structured multiline text conveniently. All line breaks and indentation are preserved relative to the first non-empty line, and expressions inside `#{...}` are interpolated automatically as `tostring(expr)`. @@ -82,7 +95,9 @@ fn = -> return str ``` - +
+ + +
Internal indentation is preserved relative to the removed common prefix, allowing clean nested structures. @@ -104,7 +120,9 @@ str = | note: 'He said: "#{Hello}!"' ``` - +
+ + +
diff --git a/doc/docs/doc/language-basics/module.md b/doc/src/content/docs/doc/language-basics/module.md similarity index 79% rename from doc/docs/doc/language-basics/module.md rename to doc/src/content/docs/doc/language-basics/module.md index 0ba2d909..0011c0be 100644 --- a/doc/docs/doc/language-basics/module.md +++ b/doc/src/content/docs/doc/language-basics/module.md @@ -1,4 +1,8 @@ -# Module +--- +title: Module +sidebar: + order: 9 +--- ## Import @@ -29,7 +33,9 @@ do import "export" as {one, two, Something:{umm:{ch}}} ``` - +
+ + +
## Import Global @@ -69,7 +76,9 @@ do print concat ["a", tostring 1] ``` - +
+ + +
### Automatic Global Variable Import @@ -101,7 +111,9 @@ do FLAG = 123 ``` - +
+ + +
## Export @@ -144,7 +157,9 @@ export class Something umm: "cool" ``` - +
+ + +
Doing named export with destructuring. @@ -171,14 +187,17 @@ export :loadstring, to_lua: tolua = yue export {itemA: {:fieldA = 'default'}} = tb ``` - +
+ + +
Export named items from module without creating local variables. @@ -188,7 +207,9 @@ export. = items export["a-b-c"] = 123 ``` - +
+ + +
### Unnamed Export @@ -215,7 +237,9 @@ export with tmp j = 2000 ``` - +
+ + +
### Default Export @@ -242,7 +267,9 @@ export default -> 123 ``` - +
+ + +
diff --git a/doc/docs/doc/language-basics/operator.md b/doc/src/content/docs/doc/language-basics/operator.md similarity index 79% rename from doc/docs/doc/language-basics/operator.md rename to doc/src/content/docs/doc/language-basics/operator.md index 067aa668..543773b2 100644 --- a/doc/docs/doc/language-basics/operator.md +++ b/doc/src/content/docs/doc/language-basics/operator.md @@ -1,4 +1,8 @@ -# Operator +--- +title: Operator +sidebar: + order: 7 +--- All of Lua's binary and unary operators are available. Additionally **!=** is as an alias for **~=**, and either **\\** or **::** can be used to write a chaining function call like `tb\func!` or `tb::func!`. And Yuescipt offers some other special operators to write more expressive codes. @@ -7,14 +11,17 @@ tb\func! if tb ~= nil tb::func! if tb != nil ``` - +
+ + +
## Chaining Comparisons @@ -29,7 +36,9 @@ print 1 <= a <= 10 -- output: true ``` - +
+ + +
Note the evaluation behavior of chained comparisons: @@ -67,7 +77,9 @@ print v(1) > v(2) <= v(3) ]] ``` - +
+ + +
The middle expression is only evaluated once, rather than twice as it would be if the expression were written as `v(1) < v(2) and v(2) <= v(3)`. However, the order of evaluations in a chained comparison is undefined. It is strongly recommended not to use expressions with side effects (such as printing) in chained comparisons. If side effects are required, the short-circuit `and` operator should be used explicitly. @@ -105,14 +118,17 @@ tab = [] tab[] = "Value" ``` - +
+ + +
You can also use the spread operator `...` to append all elements from one list to another: @@ -123,7 +139,9 @@ tbA[] = ...tbB -- tbA is now [1, 2, 3, 4, 5, 6] ``` - +
+ + +
## Table Spreading @@ -157,7 +176,9 @@ b = {4, 5, y: 1} merge = {...a, ...b} ``` - +
+ + +
### List Table Spreading @@ -190,7 +212,9 @@ listCopy = [...source,] -- listCopy => [1, 2, 3] ``` - +
+ + +
## Table Reversed Indexing @@ -212,7 +237,9 @@ second_last = data.items[#-1] data.items[#] = 1 ``` - +
+ + +
## Metatable @@ -246,7 +274,9 @@ print d.value close _ = : -> print "out of scope" ``` - +
+ + +
### Metatable Accessing @@ -280,7 +311,9 @@ tb.<> = __index: {item: "hello"} print tb.item ``` - +
+ + +
### Metatable Destructure @@ -302,14 +336,17 @@ Destruct metatable with metamethod key surrounded by **<>**. print item, new, close, getter ``` - +
+ + +
## Existence @@ -330,7 +367,9 @@ with? io.open "test.txt", "w" \close! ``` - +
+ + +
## Piping @@ -367,7 +407,9 @@ readFile "example.txt" |> print ``` - +
+ + +
## Nil Coalescing @@ -397,7 +440,9 @@ func a ?? {} a ??= false ``` - +
+ + +
## Implicit Object @@ -455,7 +501,9 @@ tb = ``` - +
+ + +
diff --git a/doc/docs/doc/language-basics/whitespace.md b/doc/src/content/docs/doc/language-basics/whitespace.md similarity index 77% rename from doc/docs/doc/language-basics/whitespace.md rename to doc/src/content/docs/doc/language-basics/whitespace.md index 3b67e48e..220d3d69 100644 --- a/doc/docs/doc/language-basics/whitespace.md +++ b/doc/src/content/docs/doc/language-basics/whitespace.md @@ -1,4 +1,8 @@ -# Whitespace +--- +title: Whitespace +sidebar: + order: 4 +--- YueScript is a whitespace significant language. You have to write some code block in the same indent with space **' '** or tab **'\t'** like function body, value list and some control blocks. And expressions containing different whitespaces might mean different things. Tab is treated like 4 space, but it's better not mix the use of spaces and tabs. @@ -10,13 +14,16 @@ A statement normally ends at a line break. You can also use a semicolon `;` to e a = 1; b = 2; print a + b ``` - +
+ + +
## Multiline Chaining @@ -31,7 +38,9 @@ Rx.Observable \subscribe print ``` - +
+ + +
diff --git a/doc/docs/doc/objects/object-oriented-programming.md b/doc/src/content/docs/doc/objects/object-oriented-programming.md similarity index 80% rename from doc/docs/doc/objects/object-oriented-programming.md rename to doc/src/content/docs/doc/objects/object-oriented-programming.md index b3325fa7..35eb0d81 100644 --- a/doc/docs/doc/objects/object-oriented-programming.md +++ b/doc/src/content/docs/doc/objects/object-oriented-programming.md @@ -1,4 +1,8 @@ -# Object Oriented Programming +--- +title: Object Oriented Programming +sidebar: + order: 26 +--- In these examples, the generated Lua code may appear overwhelming. It is best to focus on the meaning of the YueScript code at first, then look into the Lua code if you wish to know the implementation details. @@ -16,7 +20,9 @@ class Inventory @items[name] = 1 ``` - +
+ + +
A class is declared with a class statement followed by a table-like declaration where all of the methods and properties are listed. @@ -50,7 +57,9 @@ class User print tostring User "Yue" ``` - +
+ + +
Creating an instance of the class is done by calling the name of the class as a function. @@ -70,7 +80,9 @@ inv\add_item "t-shirt" inv\add_item "pants" ``` - +
+ + +
Because the instance of the class needs to be sent to the methods when they are called, the \ operator is used. @@ -102,7 +115,9 @@ b\give_item "shirt" print item for item in *a.clothes ``` - +
+ + +
The proper way to avoid this problem is to create the mutable state of the object in the constructor: @@ -130,7 +146,9 @@ class Person @clothes = [] ``` - +
+ + +
## Inheritance @@ -152,7 +171,9 @@ class BackPack extends Inventory super name ``` - +
+ + +
Here we extend our Inventory class, and limit the amount of items it can carry. @@ -179,7 +201,9 @@ class Shelf class Cupboard extends Shelf ``` - +
+ + +
## Super @@ -218,7 +243,9 @@ class MyClass extends ParentClass assert super == ParentClass ``` - +
+ + +
**super** can also be used on left side of a Function Stub. The only major difference is that instead of the resulting function being bound to the value of super, it is bound to self. @@ -247,7 +275,9 @@ assert b.__class == BackPack print BackPack.size -- prints 10 ``` - +
+ + +
## Class Objects @@ -278,13 +309,16 @@ The name of the class as when it was declared is stored as a string in the \_\_n print BackPack.__name -- prints Backpack ``` - +
+ + +
The base object is stored in \_\_base. We can modify this table to add functionality to instances that have already been created and ones that are yet to be created. @@ -304,7 +338,9 @@ Things\some_func! assert Things().some_func == nil ``` - +
+ + +
In expressions, we can use @@ to access a value that is stored in the **class of self. Thus, @@hello is shorthand for self.**class.hello. @@ -333,7 +370,9 @@ Counter! print Counter.count -- prints 2 ``` - +
+ + +
The calling semantics of @@ are similar to @. Calling a @@ name will pass the class in as the first argument using Lua's colon syntax. @@ -356,13 +396,16 @@ The calling semantics of @@ are similar to @. Calling a @@ name will pass the cl @@hello 1,2,3,4 ``` - +
+ + +
## Class Declaration Statements @@ -375,14 +418,17 @@ class Things @class_var = "hello world" ``` - +
+ + +
These expressions are executed after all the properties have been added to the base. @@ -397,7 +443,9 @@ class MoreThings log "hello world: " .. secret ``` - +
+ + +
## @ and @@ Values @@ -421,14 +470,17 @@ assert @ == self assert @@ == self.__class ``` - +
+ + +
For example, a quick way to create a new instance of the same class from an instance method using @@: @@ -436,13 +488,16 @@ For example, a quick way to create a new instance of the same class from an inst some_instance_method = (...) => @@ ... ``` - +
+ + +
## Constructor Property Promotion @@ -462,7 +517,9 @@ class Something @@baz = baz ``` - +
+ + +
You can also use this syntax for a common function to initialize a object's fields. @@ -488,7 +546,9 @@ obj = new {}, 123, "abc" print obj ``` - +
+ + +
## Class Expressions @@ -508,7 +569,9 @@ x = class Bucket add_drop: => @drops += 1 ``` - +
+ + +
## Anonymous classes @@ -529,7 +593,9 @@ BigBucket = class extends Bucket assert Bucket.__name == "BigBucket" ``` - +
+ + +
You can even leave off the body, meaning you can write a blank anonymous class like this: @@ -546,13 +613,16 @@ You can even leave off the body, meaning you can write a blank anonymous class l x = class ``` - +
+ + +
## Class Mixing @@ -576,7 +646,9 @@ y\func! assert y.__class.__parent ~= X -- X is not parent of Y ``` - +
+ + +
diff --git a/doc/docs/doc/objects/with-statement.md b/doc/src/content/docs/doc/objects/with-statement.md similarity index 73% rename from doc/docs/doc/objects/with-statement.md rename to doc/src/content/docs/doc/objects/with-statement.md index f6a5ae28..cdfc1ad6 100644 --- a/doc/docs/doc/objects/with-statement.md +++ b/doc/src/content/docs/doc/objects/with-statement.md @@ -1,4 +1,8 @@ -# With Statement +--- +title: With Statement +sidebar: + order: 27 +--- A common pattern involving the creation of an object is calling a series of functions and setting a series of properties immediately after creating it. @@ -16,7 +20,9 @@ with Person! print .name ``` - +
+ + +
The with statement can also be used as an expression which returns the value it has been giving access to. @@ -35,14 +42,17 @@ file = with File "favorite_foods.txt" \set_encoding "utf8" ``` - +
+ + +
`with` expressions support `break` with one value: @@ -51,14 +61,17 @@ result = with obj break .value ``` - +
+ + +
After `break value` is used inside `with`, the `with` expression no longer returns its target object. Instead, it returns the value from `break`. @@ -72,7 +85,9 @@ b = with obj -- b is .x, not obj ``` - +
+ + +
Unlike `for` / `while` / `repeat` / `do`, `with` only supports one break value. @@ -99,7 +115,9 @@ create_person = (name, relatives) -> me = create_person "Leaf", [dad, mother, sister] ``` - +
+ + +
In this usage, with can be seen as a special form of the K combinator. @@ -122,7 +141,9 @@ with str := "Hello" print "upper:", \upper! ``` - +
+ + +
You can access special keys with `[]` in a `with` statement. @@ -144,7 +166,9 @@ with tb [] = "abc" -- appending to "tb" ``` - +
+ + +
`with?` is an enhanced version of `with` syntax, which introduces an existential check to safely access objects that may be nil without explicit null checks. @@ -165,11 +190,14 @@ with? obj print .name ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/advanced/do.md b/doc/src/content/docs/id-id/doc/advanced/do.md similarity index 64% rename from doc/docs/id-id/doc/advanced/do.md rename to doc/src/content/docs/id-id/doc/advanced/do.md index 3c439d3f..9fb91541 100644 --- a/doc/docs/id-id/doc/advanced/do.md +++ b/doc/src/content/docs/id-id/doc/advanced/do.md @@ -1,4 +1,8 @@ -# Do +--- +title: Do +sidebar: + order: 30 +--- Saat digunakan sebagai pernyataan, `do` bekerja seperti di Lua. @@ -9,7 +13,9 @@ do print var -- nil di sini ``` - +
+ + +
`do` di YueScript juga bisa digunakan sebagai ekspresi, memungkinkan Anda menggabungkan beberapa baris menjadi satu. Hasil ekspresi `do` adalah pernyataan terakhir di badannya. @@ -33,7 +40,9 @@ print counter! print counter! ``` - +
+ + +
```yuescript tbl = { @@ -56,7 +66,9 @@ tbl = { } ``` - +
+ + +
Ekspresi `do` mendukung penggunaan `break` untuk memutus alur eksekusi dan mengembalikan banyak nilai lebih awal. @@ -78,7 +91,9 @@ status, value = do break "small", n ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/advanced/line-decorators.md b/doc/src/content/docs/id-id/doc/advanced/line-decorators.md similarity index 55% rename from doc/docs/id-id/doc/advanced/line-decorators.md rename to doc/src/content/docs/id-id/doc/advanced/line-decorators.md index d968b1f2..ac82f46b 100644 --- a/doc/docs/id-id/doc/advanced/line-decorators.md +++ b/doc/src/content/docs/id-id/doc/advanced/line-decorators.md @@ -1,4 +1,8 @@ -# Dekorator Baris +--- +title: Dekorator Baris +sidebar: + order: 29 +--- Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tunggal di akhir baris: @@ -6,13 +10,16 @@ Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tun print "hello world" if name == "Rob" ``` - +
+ + +
Dan dengan loop dasar: @@ -20,13 +27,16 @@ Dan dengan loop dasar: print "item: ", item for item in *items ``` - +
+ + +
Dan dengan loop while: @@ -36,7 +46,9 @@ game\update! while game\isRunning! reader\parse_line! until reader\eof! ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/advanced/macro.md b/doc/src/content/docs/id-id/doc/advanced/macro.md similarity index 85% rename from doc/docs/id-id/doc/advanced/macro.md rename to doc/src/content/docs/id-id/doc/advanced/macro.md index 96e1785e..485bcc4b 100644 --- a/doc/docs/id-id/doc/advanced/macro.md +++ b/doc/src/content/docs/id-id/doc/advanced/macro.md @@ -1,4 +1,8 @@ -# Makro +--- +title: Makro +sidebar: + order: 28 +--- ## Penggunaan Umum @@ -33,7 +37,9 @@ if $and f1!, f2!, f3! print "OK" ``` - +
+ + +
## Menyisipkan Kode Mentah @@ -96,7 +103,9 @@ end ]==] ``` - +
+ + +
## Export Macro @@ -145,7 +155,9 @@ import "utils" as { [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ ``` - +
+ + +
## Macro Bawaan @@ -176,14 +189,17 @@ print $FILE -- mendapatkan string nama modul saat ini print $LINE -- mendapatkan angka 2 ``` - +
+ + +
## Menghasilkan Macro dengan Macro @@ -207,7 +223,9 @@ print "Valid enum type:", $BodyType Static -- print "Compilation error with enum type:", $BodyType Unknown ``` - +
+ + +
## Menghasilkan kode multi-baris @@ -246,7 +265,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
```yuescript macro default_conf = (conf) -> | @@ -271,7 +293,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
## Validasi Argumen @@ -299,7 +324,9 @@ macro printNumAndStr = (num `Num, str `String) -> | $printNumAndStr 123, "hello" ``` - +
+ + +
Jika Anda membutuhkan pengecekan argumen yang lebih fleksibel, Anda dapat menggunakan fungsi macro bawaan `$is_ast` untuk memeriksa secara manual pada tempat yang tepat. @@ -324,7 +352,9 @@ macro printNumAndStr = (num, str) -> $printNumAndStr 123, "hello" ``` - +
+ + +
Untuk detail lebih lanjut tentang node AST yang tersedia, silakan lihat definisi huruf besar di [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). @@ -355,7 +386,9 @@ myFunc = -> return ``` - +
+ + +
Saat macro anotasi mengembalikan tabel konfigurasi, field opsional `before` mengatur apakah hasil yang dihasilkan akan diletakkan sebelum atau sesudah pernyataan yang dianotasi. @@ -388,7 +422,9 @@ tableB = {} return ``` - +
+ + +
Karena pernyataan berikutnya diteruskan sebagai argumen macro tambahan, anotasi juga bisa digunakan untuk menghasilkan kode registrasi langsung dari deklarasi class. Anda juga dapat menggunakan pemeriksaan argumen AST yang sama seperti pada macro biasa. @@ -426,7 +463,9 @@ class Worker return ``` - +
+ + +
Anotasi juga bisa menyisipkan kode pembungkus di sekitar fungsi: @@ -461,7 +501,9 @@ $[ValidateNumberArgs] add = (a, b) -> a + b ``` - +
+ + +
Sebuah anotasi harus selalu diikuti oleh sebuah pernyataan, dan tidak bisa diterapkan ke pernyataan `return`. Jika pernyataan yang dianotasi berada di akhir sebuah blok dan Anda membutuhkan bentuk AST mentah dari pernyataan itu, tambahkan `return` eksplisit setelahnya agar ia tidak dibungkus menjadi ekspresi yang dikembalikan secara implisit. diff --git a/doc/docs/id-id/doc/advanced/the-yuescript-library.md b/doc/src/content/docs/id-id/doc/advanced/the-yuescript-library.md similarity index 99% rename from doc/docs/id-id/doc/advanced/the-yuescript-library.md rename to doc/src/content/docs/id-id/doc/advanced/the-yuescript-library.md index 3adfe631..62fd8919 100644 --- a/doc/docs/id-id/doc/advanced/the-yuescript-library.md +++ b/doc/src/content/docs/id-id/doc/advanced/the-yuescript-library.md @@ -1,4 +1,8 @@ -# Pustaka YueScript +--- +title: Pustaka YueScript +sidebar: + order: 32 +--- Akses dengan `local yue = require("yue")` di Lua. diff --git a/doc/docs/id-id/doc/advanced/try.md b/doc/src/content/docs/id-id/doc/advanced/try.md similarity index 83% rename from doc/docs/id-id/doc/advanced/try.md rename to doc/src/content/docs/id-id/doc/advanced/try.md index 4e630045..f7ff20e4 100644 --- a/doc/docs/id-id/doc/advanced/try.md +++ b/doc/src/content/docs/id-id/doc/advanced/try.md @@ -1,4 +1,8 @@ -# Try +--- +title: Try +sidebar: + order: 31 +--- Sintaks untuk penanganan error Lua dalam bentuk umum. @@ -30,7 +34,9 @@ catch err print result ``` - +
+ + +
## Try? @@ -84,7 +91,9 @@ catch e e ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/assignment/assignment.md b/doc/src/content/docs/id-id/doc/assignment/assignment.md similarity index 75% rename from doc/docs/id-id/doc/assignment/assignment.md rename to doc/src/content/docs/id-id/doc/assignment/assignment.md index 34e18fd2..8ae0fdbf 100644 --- a/doc/docs/id-id/doc/assignment/assignment.md +++ b/doc/src/content/docs/id-id/doc/assignment/assignment.md @@ -1,4 +1,8 @@ -# Penugasan +--- +title: Penugasan +sidebar: + order: 10 +--- Variabel bersifat bertipe dinamis dan secara default dideklarasikan sebagai local. Namun Anda dapat mengubah cakupan deklarasi dengan pernyataan **local** dan **global**. @@ -8,7 +12,9 @@ a, b, c = 1, 2, 3 hello = 123 -- menggunakan variabel yang sudah ada ``` - +
+ + +
## Pembaruan Nilai @@ -33,7 +40,9 @@ s ..= "world" -- akan menambah local baru jika variabel local belum ada arg or= "default value" ``` - +
+ + +
## Assignment Berantai @@ -57,14 +67,17 @@ a = b = c = d = e = 0 x = y = z = f! ``` - +
+ + +
## Local Eksplisit @@ -85,7 +98,9 @@ do B = 2 ``` - +
+ + +
## Global Eksplisit @@ -125,7 +141,9 @@ do local Temp = "a local value" ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/assignment/destructuring-assignment.md b/doc/src/content/docs/id-id/doc/assignment/destructuring-assignment.md similarity index 75% rename from doc/docs/id-id/doc/assignment/destructuring-assignment.md rename to doc/src/content/docs/id-id/doc/assignment/destructuring-assignment.md index b9956a88..db7c94e8 100644 --- a/doc/docs/id-id/doc/assignment/destructuring-assignment.md +++ b/doc/src/content/docs/id-id/doc/assignment/destructuring-assignment.md @@ -1,4 +1,8 @@ -# Penugasan Destrukturisasi +--- +title: Penugasan Destrukturisasi +sidebar: + order: 11 +--- Assignment destrukturisasi adalah cara cepat untuk mengekstrak nilai dari sebuah tabel berdasarkan nama kunci atau posisinya pada tabel berbasis array. @@ -13,7 +17,9 @@ thing = [1, 2] print a, b ``` - +
+ + +
Di literal tabel destrukturisasi, kunci mewakili kunci yang dibaca dari sisi kanan, dan nilai mewakili nama yang akan menerima nilai tersebut. @@ -39,7 +46,9 @@ print hello, the_day :day = obj -- OK untuk destrukturisasi sederhana tanpa kurung ``` - +
+ + +
Ini juga bekerja pada struktur data bertingkat: @@ -71,7 +81,9 @@ obj2 = { print first, second, color ``` - +
+ + +
Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris. Contoh yang sedikit lebih rumit: @@ -99,7 +112,9 @@ Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris } = obj2 ``` - +
+ + +
Umumnya mengekstrak nilai dari tabel lalu menugaskannya ke variabel local dengan nama yang sama dengan kuncinya. Untuk menghindari pengulangan, kita bisa menggunakan operator prefiks **:**: @@ -118,13 +134,16 @@ Umumnya mengekstrak nilai dari tabel lalu menugaskannya ke variabel local dengan {:concat, :insert} = table ``` - +
+ + +
Ini secara efektif sama seperti import, tetapi kita dapat mengganti nama field yang ingin diekstrak dengan menggabungkan sintaks: @@ -132,13 +151,16 @@ Ini secara efektif sama seperti import, tetapi kita dapat mengganti nama field y {:mix, :max, random: rand} = math ``` - +
+ + +
Anda bisa menulis nilai default saat destrukturisasi seperti: @@ -146,13 +168,16 @@ Anda bisa menulis nilai default saat destrukturisasi seperti: {:name = "nameless", :job = "jobless"} = person ``` - +
+ + +
Anda dapat menggunakan `_` sebagai placeholder saat destrukturisasi list: @@ -160,13 +185,16 @@ Anda dapat menggunakan `_` sebagai placeholder saat destrukturisasi list: [_, two, _, four] = items ``` - +
+ + +
## Destrukturisasi Rentang @@ -180,7 +208,9 @@ print bulk -- prints: {"second", "third", "fourth"} print last -- prints: last ``` - +
+ + +
Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang berbeda, dan Anda bisa memakai `_` sebagai placeholder untuk nilai yang tidak ingin ditangkap: @@ -205,7 +236,9 @@ Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang [first, ..._, last] = orders ``` - +
+ + +
## Destrukturisasi di Tempat Lain @@ -234,7 +268,9 @@ for [left, right] in *tuples print left, right ``` - +
+ + +
Kita tahu setiap elemen pada tabel array adalah tuple dua item, sehingga kita dapat membongkarnya langsung di klausa nama pada pernyataan for menggunakan destrukturisasi. diff --git a/doc/docs/id-id/doc/assignment/if-assignment.md b/doc/src/content/docs/id-id/doc/assignment/if-assignment.md similarity index 73% rename from doc/docs/id-id/doc/assignment/if-assignment.md rename to doc/src/content/docs/id-id/doc/assignment/if-assignment.md index e2128594..04a93abf 100644 --- a/doc/docs/id-id/doc/assignment/if-assignment.md +++ b/doc/src/content/docs/id-id/doc/assignment/if-assignment.md @@ -1,4 +1,8 @@ -# Penugasan pada If +--- +title: Penugasan pada If +sidebar: + order: 12 +--- Blok `if` dan `elseif` dapat menerima assignment sebagai ganti ekspresi kondisional. Saat kondisi dievaluasi, assignment akan dilakukan dan nilai yang di-assign akan digunakan sebagai ekspresi kondisional. Variabel yang di-assign hanya berada dalam scope badan kondisional, artinya tidak pernah tersedia jika nilai tidak truthy. Dan Anda harus menggunakan "walrus operator" `:=` sebagai ganti `=` untuk melakukan assignment. @@ -7,14 +11,17 @@ if user := database.find_user "moon" print user.name ``` - +
+ + +
```yuescript if hello := os.getenv "hello" @@ -25,7 +32,9 @@ else print "nothing :(" ``` - +
+ + +
Assignment if dengan beberapa nilai return. Hanya nilai pertama yang dicek, nilai lainnya tetap berada dalam scope. @@ -46,7 +56,9 @@ if success, result := pcall -> "get result without problems" print "OK" ``` - +
+ + +
## Assignment pada While @@ -66,7 +79,9 @@ while byte := stream\read_one! print byte ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md b/doc/src/content/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md similarity index 79% rename from doc/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md rename to doc/src/content/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md index 6e47f0c8..aae0f0a5 100644 --- a/doc/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md +++ b/doc/src/content/docs/id-id/doc/assignment/the-using-clause-controlling-destructive-assignment.md @@ -1,4 +1,8 @@ -# Klausa Using; Mengendalikan Penugasan Destruktif +--- +title: Klausa Using; Mengendalikan Penugasan Destruktif +sidebar: + order: 14 +--- Meskipun scope leksikal sangat membantu mengurangi kompleksitas kode yang kita tulis, hal ini bisa menjadi sulit ketika ukuran kode membesar. Pertimbangkan cuplikan berikut: @@ -18,7 +22,9 @@ my_func! print i -- akan mencetak 0 ``` - +
+ + +
Di `my_func`, kita tanpa sengaja menimpa nilai `i`. Dalam contoh ini halnya cukup jelas, tetapi bayangkan kode besar atau basis kode asing di mana tidak jelas nama apa saja yang sudah dideklarasikan. @@ -54,7 +61,9 @@ my_func! print i -- mencetak 100, i tidak terpengaruh ``` - +
+ + +
Beberapa nama dapat dipisahkan dengan koma. Nilai closure tetap bisa diakses, hanya saja tidak dapat dimodifikasi: @@ -83,7 +93,9 @@ my_func(22) print i, k -- ini telah diperbarui ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/assignment/varargs-assignment.md b/doc/src/content/docs/id-id/doc/assignment/varargs-assignment.md similarity index 71% rename from doc/docs/id-id/doc/assignment/varargs-assignment.md rename to doc/src/content/docs/id-id/doc/assignment/varargs-assignment.md index 9c5c8a3a..97e161bd 100644 --- a/doc/docs/id-id/doc/assignment/varargs-assignment.md +++ b/doc/src/content/docs/id-id/doc/assignment/varargs-assignment.md @@ -1,4 +1,8 @@ -# Penugasan Varargs +--- +title: Penugasan Varargs +sidebar: + order: 13 +--- Anda dapat meng-assign hasil yang dikembalikan dari sebuah fungsi ke simbol varargs `...`. Lalu akses isinya menggunakan cara Lua. @@ -11,7 +15,9 @@ first = select 1, ... print ok, count, first ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/control-flow/conditionals.md b/doc/src/content/docs/id-id/doc/control-flow/conditionals.md similarity index 70% rename from doc/docs/id-id/doc/control-flow/conditionals.md rename to doc/src/content/docs/id-id/doc/control-flow/conditionals.md index db67a790..fb83ee70 100644 --- a/doc/docs/id-id/doc/control-flow/conditionals.md +++ b/doc/src/content/docs/id-id/doc/control-flow/conditionals.md @@ -1,4 +1,8 @@ -# Kondisional +--- +title: Kondisional +sidebar: + order: 18 +--- ```yuescript have_coins = false @@ -8,7 +12,9 @@ else print "Tidak ada koin" ``` - +
+ + +
Sintaks pendek untuk pernyataan tunggal juga bisa digunakan: @@ -27,14 +34,17 @@ have_coins = false if have_coins then print "Dapat koin" else print "Tidak ada koin" ``` - +
+ + +
Karena pernyataan if dapat digunakan sebagai ekspresi, ini juga bisa ditulis sebagai: @@ -43,14 +53,17 @@ have_coins = false print if have_coins then "Dapat koin" else "Tidak ada koin" ``` - +
+ + +
Kondisional juga bisa digunakan di pernyataan return dan assignment: @@ -69,7 +82,9 @@ else print message -- prints: Saya sangat tinggi ``` - +
+ + +
Kebalikan dari if adalah unless: @@ -95,26 +111,32 @@ unless os.date("%A") == "Monday" print "hari ini bukan Senin!" ``` - +
+ + +
```yuescript print "Kamu beruntung!" unless math.random! > 0.1 ``` - +
+ + +
## Ekspresi In @@ -130,7 +152,9 @@ if a in list print "memeriksa apakah `a` ada di dalam daftar" ``` - +
+ + +
Operator `in` juga dapat digunakan dengan tabel dan mendukung varian `not in` untuk negasi: @@ -157,7 +182,9 @@ not_exist = item not in list check = -> value not in table ``` - +
+ + +
Daftar atau tabel dengan satu elemen memeriksa kesamaan dengan elemen tersebut: @@ -186,7 +214,9 @@ with tb c = a in [1] ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/control-flow/continue.md b/doc/src/content/docs/id-id/doc/control-flow/continue.md similarity index 66% rename from doc/docs/id-id/doc/control-flow/continue.md rename to doc/src/content/docs/id-id/doc/control-flow/continue.md index 798a44b8..649f0359 100644 --- a/doc/docs/id-id/doc/control-flow/continue.md +++ b/doc/src/content/docs/id-id/doc/control-flow/continue.md @@ -1,4 +1,8 @@ -# Pernyataan Continue +--- +title: Pernyataan Continue +sidebar: + order: 21 +--- Pernyataan continue dapat digunakan untuk melewati iterasi saat ini di dalam loop. @@ -10,7 +14,9 @@ while i < 10 print i ``` - +
+ + +
continue juga bisa digunakan bersama ekspresi loop untuk mencegah iterasi tersebut diakumulasikan ke hasil. Contoh ini memfilter tabel array menjadi hanya angka genap: @@ -31,7 +38,9 @@ odds = for x in *my_numbers x ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/control-flow/for-loop.md b/doc/src/content/docs/id-id/doc/control-flow/for-loop.md similarity index 72% rename from doc/docs/id-id/doc/control-flow/for-loop.md rename to doc/src/content/docs/id-id/doc/control-flow/for-loop.md index 3835cce0..f8bcb739 100644 --- a/doc/docs/id-id/doc/control-flow/for-loop.md +++ b/doc/src/content/docs/id-id/doc/control-flow/for-loop.md @@ -1,4 +1,8 @@ -# Perulangan For +--- +title: Perulangan For +sidebar: + order: 19 +--- Ada dua bentuk perulangan for, seperti di Lua. Satu numerik dan satu generik: @@ -13,7 +17,9 @@ for key, value in pairs object print key, value ``` - +
+ + +
Operator slicing dan **\*** dapat digunakan, seperti pada comprehension: @@ -35,14 +42,17 @@ for item in *items[2, 4] print item ``` - +
+ + +
Sintaks yang lebih singkat juga tersedia untuk semua variasi ketika badan hanya satu baris: @@ -52,7 +62,9 @@ for item in *items do print item for j = 1, 10, 3 do print j ``` - +
+ + +
Perulangan for juga bisa digunakan sebagai ekspresi. Pernyataan terakhir di badan for dipaksa menjadi ekspresi dan ditambahkan ke tabel array yang terakumulasi. @@ -74,7 +87,9 @@ doubled_evens = for i = 1, 20 i ``` - +
+ + +
Selain itu, loop for mendukung break dengan nilai kembalian, sehingga loop itu sendiri bisa dipakai sebagai ekspresi yang keluar lebih awal dengan hasil bermakna. Ekspresi `for` mendukung `break` dengan banyak nilai. @@ -95,14 +111,17 @@ first_large = for n in *numbers break n if n > 10 ``` - +
+ + +
Sintaks break-dengan-nilai ini memungkinkan pola pencarian atau keluar-lebih-awal yang ringkas langsung di dalam ekspresi loop. @@ -111,14 +130,17 @@ key, score = for k, v in pairs data break k, v * 10 if k == "target" ``` - +
+ + +
Anda juga bisa memfilter nilai dengan menggabungkan ekspresi for dengan pernyataan continue. @@ -132,7 +154,9 @@ print func_a! -- prints nil print func_b! -- prints table object ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/control-flow/goto.md b/doc/src/content/docs/id-id/doc/control-flow/goto.md similarity index 77% rename from doc/docs/id-id/doc/control-flow/goto.md rename to doc/src/content/docs/id-id/doc/control-flow/goto.md index f387f0dc..083f9872 100644 --- a/doc/docs/id-id/doc/control-flow/goto.md +++ b/doc/src/content/docs/id-id/doc/control-flow/goto.md @@ -1,4 +1,8 @@ -# Goto +--- +title: Goto +sidebar: + order: 22 +--- YueScript mendukung pernyataan goto dan sintaks label untuk mengontrol alur program, mengikuti aturan yang sama dengan pernyataan goto Lua. **Catatan:** Pernyataan goto memerlukan Lua 5.2 atau lebih tinggi. Saat mengompilasi ke Lua 5.1, penggunaan sintaks goto akan menyebabkan galat kompilasi. @@ -10,7 +14,9 @@ Label didefinisikan menggunakan dua titik dua: ::label_saya:: ``` - +
+ + +
Pernyataan goto melompat ke label yang ditentukan: @@ -32,7 +39,9 @@ goto mulai print "a sekarang 5" ``` - +
+ + +
Pernyataan goto berguna untuk keluar dari loop yang bersarang dalam: @@ -57,7 +67,9 @@ for z = 1, 10 ::ok:: ``` - +
+ + +
Anda juga dapat menggunakan label untuk melompat ke tingkat loop tertentu: @@ -83,7 +96,9 @@ for z = 1, 10 ::zcontinue:: ``` - +
+ + +
## Catatan diff --git a/doc/docs/id-id/doc/control-flow/switch.md b/doc/src/content/docs/id-id/doc/control-flow/switch.md similarity index 79% rename from doc/docs/id-id/doc/control-flow/switch.md rename to doc/src/content/docs/id-id/doc/control-flow/switch.md index 1b7b86ea..93dd2505 100644 --- a/doc/docs/id-id/doc/control-flow/switch.md +++ b/doc/src/content/docs/id-id/doc/control-flow/switch.md @@ -1,4 +1,8 @@ -# Pernyataan Switch +--- +title: Pernyataan Switch +sidebar: + order: 23 +--- Pernyataan switch adalah bentuk singkat untuk menulis serangkaian if yang membandingkan nilai yang sama. Perhatikan bahwa nilainya hanya dievaluasi sekali. Seperti if, switch bisa memiliki blok else untuk menangani tidak ada yang cocok. Perbandingan dilakukan dengan operator `==`. Di dalam switch, Anda juga bisa memakai ekspresi assignment untuk menyimpan nilai variabel sementara. @@ -12,7 +16,9 @@ switch name := "Dan" print "I don't know about you with name #{name}" ``` - +
+ + +
Klausa when pada switch bisa mencocokkan beberapa nilai dengan menuliskannya dipisah koma. @@ -41,7 +48,9 @@ next_number = switch b error "can't count that high!" ``` - +
+ + +
Kita bisa memakai kata kunci `then` untuk menulis blok when switch pada satu baris. Tidak ada kata kunci tambahan yang dibutuhkan untuk menulis blok else pada satu baris. @@ -65,7 +75,9 @@ msg = switch math.random(1, 5) else "not so lucky" ``` - +
+ + +
Jika Anda ingin menulis kode dengan satu indentasi lebih sedikit saat menulis switch, Anda bisa menaruh klausa when pertama pada baris awal pernyataan, lalu semua klausa lain dapat ditulis dengan satu indentasi lebih sedikit. @@ -91,7 +104,9 @@ else print "not so lucky" ``` - +
+ + +
Perlu dicatat urutan ekspresi perbandingan kasus. Ekspresi kasus berada di sisi kiri. Ini bisa berguna jika ekspresi kasus ingin mengganti cara perbandingan dengan mendefinisikan metamethod `eq`. @@ -129,7 +145,9 @@ for item in *items print "size #{width}, #{height}" ``` - +
+ + +
Anda dapat menggunakan nilai default untuk mendestrukturisasi tabel secara opsional pada beberapa field. @@ -160,7 +179,9 @@ switch item print "Vec2 #{x}, #{y}" -- table destructuring will still pass ``` - +
+ + +
Anda juga bisa mencocokkan elemen array, field tabel, dan bahkan struktur bertingkat dengan literal array atau tabel. @@ -188,7 +210,9 @@ switch tb print "1, 2, #{b}" ``` - +
+ + +
Cocokkan terhadap field tabel dengan destrukturisasi. @@ -214,7 +239,9 @@ switch tb print "invalid" ``` - +
+ + +
Cocokkan terhadap struktur tabel bertingkat. @@ -240,7 +268,9 @@ switch tb print "invalid" ``` - +
+ + +
Cocokkan terhadap array dari tabel. @@ -267,7 +298,9 @@ switch tb print "matched", fourth ``` - +
+ + +
Cocokkan terhadap daftar dan tangkap rentang elemen. @@ -293,7 +327,9 @@ switch segments print "Action:", action -- prints: "view" ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/control-flow/while-loop.md b/doc/src/content/docs/id-id/doc/control-flow/while-loop.md similarity index 64% rename from doc/docs/id-id/doc/control-flow/while-loop.md rename to doc/src/content/docs/id-id/doc/control-flow/while-loop.md index 0c3a28dd..9830cd43 100644 --- a/doc/docs/id-id/doc/control-flow/while-loop.md +++ b/doc/src/content/docs/id-id/doc/control-flow/while-loop.md @@ -1,4 +1,8 @@ -# Perulangan While +--- +title: Perulangan While +sidebar: + order: 20 +--- Perulangan while juga memiliki empat variasi: @@ -11,7 +15,9 @@ while i > 0 while running == true do my_function! ``` - +
+ + +
```yuescript i = 10 @@ -33,7 +40,9 @@ until i == 0 until running == false do my_function! ``` - +
+ + +
Seperti loop for, loop while juga bisa digunakan sebagai ekspresi. Ekspresi `while` dan `until` mendukung `break` dengan banyak nilai. @@ -53,7 +63,9 @@ value, doubled = while true break n, n * 2 if n > 10 ``` - +
+ + +
Selain itu, agar sebuah fungsi mengembalikan nilai akumulasi dari loop while, pernyataannya harus di-return secara eksplisit. @@ -77,7 +90,9 @@ repeat until i == 0 ``` - +
+ + +
Ekspresi `repeat` juga mendukung `break` dengan banyak nilai: @@ -99,7 +115,9 @@ value, scaled = repeat until false ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/data-structures/comprehensions.md b/doc/src/content/docs/id-id/doc/data-structures/comprehensions.md similarity index 72% rename from doc/docs/id-id/doc/data-structures/comprehensions.md rename to doc/src/content/docs/id-id/doc/data-structures/comprehensions.md index c5a8f7b2..50ff53c6 100644 --- a/doc/docs/id-id/doc/data-structures/comprehensions.md +++ b/doc/src/content/docs/id-id/doc/data-structures/comprehensions.md @@ -1,4 +1,8 @@ -# Komprehensi +--- +title: Komprehensi +sidebar: + order: 25 +--- Komprehensi menyediakan sintaks yang nyaman untuk membangun tabel baru dengan mengiterasi objek yang ada dan menerapkan ekspresi pada nilainya. Ada dua jenis komprehensi: komprehensi list dan komprehensi tabel. Keduanya menghasilkan tabel Lua; komprehensi list mengakumulasi nilai ke tabel mirip array, dan komprehensi tabel memungkinkan Anda menetapkan kunci dan nilai pada setiap iterasi. @@ -11,14 +15,17 @@ items = [ 1, 2, 3, 4 ] doubled = [item * 2 for i, item in ipairs items] ``` - +
+ + +
Item yang disertakan dalam tabel baru bisa dibatasi dengan klausa `when`: @@ -26,13 +33,16 @@ Item yang disertakan dalam tabel baru bisa dibatasi dengan klausa `when`: slice = [item for i, item in ipairs items when i > 1 and i < 3] ``` - +
+ + +
Karena umum untuk mengiterasi nilai dari tabel berindeks numerik, operator **\*** diperkenalkan. Contoh `doubled` bisa ditulis ulang sebagai: @@ -40,13 +50,16 @@ Karena umum untuk mengiterasi nilai dari tabel berindeks numerik, operator **\** doubled = [item * 2 for item in *items] ``` - +
+ + +
Dalam komprehensi list, Anda juga bisa menggunakan operator spread `...` untuk meratakan list bertingkat, menghasilkan efek flat map: @@ -59,7 +72,9 @@ flat = [...v for k,v in pairs data] -- flat sekarang [1, 2, 3, 4, 5, 6] ``` - +
+ + +
Klausa `for` dan `when` dapat dirantai sebanyak yang diinginkan. Satu-satunya syarat adalah komprehensi memiliki setidaknya satu klausa `for`. @@ -84,7 +100,9 @@ points = [ [x, y] for x in *x_coords \ for y in *y_coords] ``` - +
+ + +
Perulangan for numerik juga bisa digunakan dalam komprehensi: @@ -102,13 +121,16 @@ Perulangan for numerik juga bisa digunakan dalam komprehensi: evens = [i for i = 1, 100 when i % 2 == 0] ``` - +
+ + +
## Komprehensi Tabel @@ -126,7 +148,9 @@ thing = { thing_copy = {k, v for k, v in pairs thing} ``` - +
+ + +
```yuescript no_color = {k, v for k, v in pairs thing when k != "color"} ``` - +
+ + +
Operator **\*** juga didukung. Di sini kita membuat tabel lookup akar kuadrat untuk beberapa angka. @@ -159,14 +187,17 @@ numbers = [1, 2, 3, 4] sqrts = {i, math.sqrt i for i in *numbers} ``` - +
+ + +
Tuple key-value dalam komprehensi tabel juga bisa berasal dari satu ekspresi, yang berarti ekspresi tersebut harus mengembalikan dua nilai. Nilai pertama digunakan sebagai kunci dan nilai kedua digunakan sebagai nilai: @@ -177,14 +208,17 @@ tuples = [ ["hello", "world"], ["foo", "bar"]] tbl = {unpack tuple for tuple in *tuples} ``` - +
+ + +
## Slicing @@ -196,13 +230,16 @@ Di sini kita bisa menetapkan batas minimum dan maksimum, mengambil semua item de slice = [item for item in *items[1, 5]] ``` - +
+ + +
Salah satu argumen slice boleh dikosongkan untuk menggunakan default yang masuk akal. Pada contoh ini, jika indeks maksimum dikosongkan, defaultnya adalah panjang tabel. Ini akan mengambil semua item kecuali elemen pertama: @@ -210,13 +247,16 @@ Salah satu argumen slice boleh dikosongkan untuk menggunakan default yang masuk slice = [item for item in *items[2,]] ``` - +
+ + +
Jika batas minimum dikosongkan, defaultnya adalah 1. Di sini kita hanya memberikan ukuran langkah dan membiarkan batas lainnya kosong. Ini akan mengambil semua item berindeks ganjil: (1, 3, 5, …) @@ -224,13 +264,16 @@ Jika batas minimum dikosongkan, defaultnya adalah 1. Di sini kita hanya memberik slice = [item for item in *items[,,2]] ``` - +
+ + +
Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung dari akhir tabel. @@ -239,14 +282,17 @@ Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung da slice = [item for item in *items[-4,-1]] ``` - +
+ + +
Ukuran langkah juga bisa negatif, yang berarti item diambil dalam urutan terbalik. @@ -254,13 +300,16 @@ Ukuran langkah juga bisa negatif, yang berarti item diambil dalam urutan terbali reverse_slice = [item for item in *items[-1,1,-1]] ``` - +
+ + +
### Ekspresi Slicing @@ -274,7 +323,9 @@ sub_list = items[2, 4] last_four_items = items[-4, -1] ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/data-structures/table-literals.md b/doc/src/content/docs/id-id/doc/data-structures/table-literals.md similarity index 68% rename from doc/docs/id-id/doc/data-structures/table-literals.md rename to doc/src/content/docs/id-id/doc/data-structures/table-literals.md index 522334da..b55f041f 100644 --- a/doc/docs/id-id/doc/data-structures/table-literals.md +++ b/doc/src/content/docs/id-id/doc/data-structures/table-literals.md @@ -1,4 +1,8 @@ -# Literal Tabel +--- +title: Literal Tabel +sidebar: + order: 24 +--- Seperti di Lua, tabel dibatasi dengan kurung kurawal. @@ -6,13 +10,16 @@ Seperti di Lua, tabel dibatasi dengan kurung kurawal. some_values = {1, 2, 3, 4} ``` - +
+ + +
Berbeda dengan Lua, assignment nilai ke sebuah kunci di tabel dilakukan dengan **:** (bukan **=**). @@ -24,7 +31,9 @@ some_values = { } ``` - +
+ + +
Kurung kurawal dapat dihilangkan jika hanya satu tabel pasangan key-value yang di-assign. @@ -45,7 +55,9 @@ profile = favorite_foods: ["ice cream", "donuts"] ``` - +
+ + +
Baris baru dapat digunakan untuk memisahkan nilai sebagai ganti koma (atau keduanya): @@ -67,7 +80,9 @@ values = { } ``` - +
+ + +
Saat membuat literal tabel satu baris, kurung kurawal juga bisa dihilangkan: @@ -88,7 +104,9 @@ my_function dance: "Tango", partner: "none" y = type: "dog", legs: 4, tails: 1 ``` - +
+ + +
Kunci literal tabel dapat berupa kata kunci bahasa tanpa perlu di-escape: @@ -107,7 +126,9 @@ tbl = { } ``` - +
+ + +
Jika Anda membangun tabel dari variabel dan ingin kunci sama dengan nama variabel, maka operator prefiks **:** dapat digunakan: @@ -128,7 +150,9 @@ person = { :hair, :height, shoe_size: 40 } print_table :hair, :height ``` - +
+ + +
Jika Anda ingin kunci field dalam tabel menjadi hasil suatu ekspresi, Anda dapat membungkusnya dengan **[ ]**, seperti di Lua. Anda juga bisa menggunakan literal string langsung sebagai kunci tanpa tanda kurung siku. Ini berguna jika kunci memiliki karakter khusus. @@ -149,7 +174,9 @@ t = { } ``` - +
+ + +
Tabel Lua memiliki bagian array dan bagian hash, tetapi kadang-kadang berguna untuk membuat perbedaan semantik di antara keduanya. Anda dapat menggunakan **[ ]** sebagai ganti **{ }** untuk mendeklarasikan tabel secara eksplisit sebagai array, dengan begitu akan mencegah pasangan key-value dituliskan di dalamnya. @@ -167,11 +195,14 @@ some_values = [1, 2, 3, 4] list_with_one_element = [1, ] ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/extras/license-mit.md b/doc/src/content/docs/id-id/doc/extras/license-mit.md similarity index 96% rename from doc/docs/id-id/doc/extras/license-mit.md rename to doc/src/content/docs/id-id/doc/extras/license-mit.md index 5289f50b..2c61cf88 100644 --- a/doc/docs/id-id/doc/extras/license-mit.md +++ b/doc/src/content/docs/id-id/doc/extras/license-mit.md @@ -1,4 +1,8 @@ -# Lisensi: MIT +--- +title: "Lisensi: MIT" +sidebar: + order: 34 +--- Copyright (c) 2017-2026 Li Jin diff --git a/doc/src/content/docs/id-id/doc/extras/mascot.md b/doc/src/content/docs/id-id/doc/extras/mascot.md new file mode 100644 index 00000000..7127ec6d --- /dev/null +++ b/doc/src/content/docs/id-id/doc/extras/mascot.md @@ -0,0 +1,43 @@ +--- +title: Maskot, Xiaoyu +sidebar: + order: 33 +--- + +## Tentang + +Xiaoyu si Kelinci Siber + +Xiaoyu (小玉, "giok kecil") adalah seekor kelinci siber dan maskot resmi proyek YueScript. Ia duduk di atas bulan sabit, menulis YueScript di laptopnya. + +Gelar lengkapnya adalah Xiaoyu si Kelinci Siber (机兔小玉). Ia mencerminkan apa yang dituju YueScript: bersih, ekspresif, dan sedikit menyenangkan. + +**[Tyson Tan](https://tysontan.com)** merancang dan mengilustrasikan Xiaoyu untuk proyek ini secara gratis. Kami berterima kasih atas kontribusinya. + +## Gambar + +Klik gambar mana saja untuk membukanya dalam ukuran penuh. + +### Karya seni lengkap + + + Xiaoyu, karya seni lengkap dengan latar belakang + + +

Unduh PNG ukuran penuh

+ +### Latar belakang transparan + + + Xiaoyu, latar belakang transparan + + +

Unduh PNG transparan

+ +### File .kra terkompresi + +

Unduh file .kra terkompresi

+ +## Lisensi + +Xiaoyu dilisensikan ganda di bawah [Lisensi MIT](https://opensource.org/licenses/MIT) dan Creative Commons [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/id-id/doc/functions/backcalls.md b/doc/src/content/docs/id-id/doc/functions/backcalls.md similarity index 66% rename from doc/docs/id-id/doc/functions/backcalls.md rename to doc/src/content/docs/id-id/doc/functions/backcalls.md index 9de64c3a..e8d00ef0 100644 --- a/doc/docs/id-id/doc/functions/backcalls.md +++ b/doc/src/content/docs/id-id/doc/functions/backcalls.md @@ -1,4 +1,8 @@ -# Backcall +--- +title: Backcall +sidebar: + order: 16 +--- Backcall digunakan untuk meratakan callback yang bersarang. Backcall didefinisikan menggunakan panah yang mengarah ke kiri sebagai parameter terakhir secara default yang akan mengisi pemanggilan fungsi. Semua sintaks pada dasarnya sama seperti fungsi panah biasa, kecuali arahnya berlawanan dan badan fungsi tidak memerlukan indentasi. @@ -7,14 +11,17 @@ x <- f print "hello" .. x ``` - +
+ + +
Fungsi panah tebal juga tersedia. @@ -23,14 +30,17 @@ Fungsi panah tebal juga tersedia. print @value ``` - +
+ + +
Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter. @@ -39,14 +49,17 @@ Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter x * 2 ``` - +
+ + +
Jika Anda ingin menulis kode lanjutan setelah backcall, Anda dapat memisahkannya dengan pernyataan `do`. Tanda kurung dapat dihilangkan untuk fungsi panah non-tebal. @@ -59,7 +72,9 @@ result, msg = do print result, msg ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/functions/function-literals.md b/doc/src/content/docs/id-id/doc/functions/function-literals.md similarity index 76% rename from doc/docs/id-id/doc/functions/function-literals.md rename to doc/src/content/docs/id-id/doc/functions/function-literals.md index 67ae1583..24afbfa5 100644 --- a/doc/docs/id-id/doc/functions/function-literals.md +++ b/doc/src/content/docs/id-id/doc/functions/function-literals.md @@ -1,4 +1,8 @@ -# Literal Fungsi +--- +title: Literal Fungsi +sidebar: + order: 15 +--- Semua fungsi dibuat menggunakan ekspresi fungsi. Fungsi sederhana ditandai dengan panah: **->**. @@ -7,14 +11,17 @@ my_function = -> my_function() -- memanggil fungsi kosong ``` - +
+ + +
Badan fungsi bisa berupa satu pernyataan yang ditulis langsung setelah panah, atau berupa serangkaian pernyataan yang diindentasi di baris berikutnya: @@ -26,7 +33,9 @@ func_b = -> print "The value:", value ``` - +
+ + +
Jika fungsi tidak memiliki argumen, ia dapat dipanggil menggunakan operator `!`, sebagai ganti tanda kurung kosong. Pemanggilan `!` adalah cara yang disarankan untuk memanggil fungsi tanpa argumen. @@ -45,14 +55,17 @@ func_a! func_b() ``` - +
+ + +
Fungsi dengan argumen dapat dibuat dengan menaruh daftar nama argumen dalam tanda kurung sebelum panah: @@ -60,13 +73,16 @@ Fungsi dengan argumen dapat dibuat dengan menaruh daftar nama argumen dalam tand sum = (x, y) -> print "sum", x + y ``` - +
+ + +
Fungsi dapat dipanggil dengan menuliskan argumen setelah nama ekspresi yang mengevaluasi ke fungsi. Saat merangkai pemanggilan fungsi, argumen diterapkan ke fungsi terdekat di sebelah kiri. @@ -77,7 +93,9 @@ print sum 10, 20 a b c "a", "b", "c" ``` - +
+ + +
Untuk menghindari ambiguitas saat memanggil fungsi, tanda kurung juga bisa digunakan untuk mengelilingi argumen. Ini diperlukan di sini agar argumen yang tepat dikirim ke fungsi yang tepat. @@ -94,13 +113,16 @@ Untuk menghindari ambiguitas saat memanggil fungsi, tanda kurung juga bisa digun print "x:", sum(10, 20), "y:", sum(30, 40) ``` - +
+ + +
Tidak boleh ada spasi antara tanda kurung buka dan nama fungsi. @@ -111,14 +133,17 @@ sum = (x, y) -> x + y print "The sum is ", sum 10, 20 ``` - +
+ + +
Dan jika Anda perlu return secara eksplisit, Anda bisa menggunakan kata kunci `return`: @@ -126,13 +151,16 @@ Dan jika Anda perlu return secara eksplisit, Anda bisa menggunakan kata kunci `r sum = (x, y) -> return x + y ``` - +
+ + +
Seperti di Lua, fungsi dapat mengembalikan beberapa nilai. Pernyataan terakhir harus berupa daftar nilai yang dipisahkan koma: @@ -141,14 +169,17 @@ mystery = (x, y) -> x + y, x - y a, b = mystery 10, 20 ``` - +
+ + +
## Panah Tebal @@ -158,13 +189,16 @@ Karena sudah menjadi idiom di Lua untuk mengirim objek sebagai argumen pertama s func = (num) => @value + num ``` - +
+ + +
## Nilai Default Argumen @@ -176,7 +210,9 @@ my_function = (name = "something", height = 100) -> print "My height is", height ``` - +
+ + +
Ekspresi nilai default argumen dievaluasi di dalam badan fungsi sesuai urutan deklarasi argumen. Karena itu, nilai default dapat mengakses argumen yang dideklarasikan sebelumnya. @@ -193,14 +230,17 @@ some_args = (x = 100, y = x + 1000) -> print x + y ``` - +
+ + +
## Pertimbangan @@ -215,7 +255,9 @@ c = x -y d = x- z ``` - +
+ + +
Prioritas argumen pertama pada pemanggilan fungsi dapat dikendalikan menggunakan spasi jika argumennya adalah literal string. Di Lua, sudah umum untuk menghilangkan tanda kurung saat memanggil fungsi dengan satu literal string atau tabel. @@ -237,14 +280,17 @@ x = func"hello" + 100 y = func "hello" + 100 ``` - +
+ + +
## Argumen Multi-baris @@ -262,7 +308,9 @@ cool_func 1, 2, 7, 8 ``` - +
+ + +
Jenis pemanggilan ini dapat dinest. Tingkat indentasi digunakan untuk menentukan argumen milik fungsi yang mana. @@ -285,7 +334,9 @@ my_func 5, 6, 7, 5, 4 ``` - +
+ + +
Karena tabel juga menggunakan koma sebagai pemisah, sintaks indentasi ini membantu agar nilai menjadi bagian dari daftar argumen, bukan bagian dari tabel. @@ -306,7 +358,9 @@ x = [ ] ``` - +
+ + +
Meskipun jarang, perhatikan bahwa kita bisa memberikan indentasi yang lebih dalam untuk argumen fungsi jika kita tahu akan menggunakan indentasi yang lebih dangkal di bagian selanjutnya. @@ -327,7 +382,9 @@ y = [ my_func 1, 2, 3, ] ``` - +
+ + +
Hal yang sama juga dapat dilakukan pada pernyataan tingkat blok lainnya seperti kondisional. Kita bisa menggunakan tingkat indentasi untuk menentukan nilai milik pernyataan apa: @@ -354,7 +412,9 @@ if func 1, 2, 3, print "I am inside if" ``` - +
+ + +
## Destrukturisasi Parameter @@ -393,7 +454,9 @@ arg1 = {a: 0} f2 arg1, arg2 ``` - +
+ + +
## Ekspresi Return Berawalan @@ -423,7 +487,9 @@ findFirstEven = (list): nil -> return sub ``` - +
+ + +
Ini setara dengan: @@ -448,7 +515,9 @@ findFirstEven = (list) -> nil ``` - +
+ + +
Satu-satunya perbedaan adalah Anda dapat memindahkan ekspresi return terakhir sebelum token `->` atau `=>` untuk menunjukkan nilai return implisit fungsi sebagai pernyataan terakhir. Dengan cara ini, bahkan pada fungsi dengan banyak loop bertingkat atau cabang kondisional, Anda tidak lagi perlu menulis ekspresi return di akhir badan fungsi, sehingga struktur logika menjadi lebih lurus dan mudah diikuti. @@ -490,7 +560,9 @@ process = (...args) -> process 1, nil, 3, nil, 5 ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/functions/function-stubs.md b/doc/src/content/docs/id-id/doc/functions/function-stubs.md similarity index 88% rename from doc/docs/id-id/doc/functions/function-stubs.md rename to doc/src/content/docs/id-id/doc/functions/function-stubs.md index 87dfd73b..ac53b2fa 100644 --- a/doc/docs/id-id/doc/functions/function-stubs.md +++ b/doc/src/content/docs/id-id/doc/functions/function-stubs.md @@ -1,4 +1,8 @@ -# Stub Fungsi +--- +title: Stub Fungsi +sidebar: + order: 17 +--- Sering kali fungsi dari sebuah objek diteruskan sebagai nilai, misalnya meneruskan method instance ke fungsi lain sebagai callback. Jika fungsi mengharapkan objek yang dioperasikan sebagai argumen pertama, maka Anda harus menggabungkan objek tersebut dengan fungsi agar dapat dipanggil dengan benar. @@ -25,7 +29,9 @@ run_callback my_object.write run_callback my_object\write ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/getting-started/installation.md b/doc/src/content/docs/id-id/doc/getting-started/installation.md similarity index 95% rename from doc/docs/id-id/doc/getting-started/installation.md rename to doc/src/content/docs/id-id/doc/getting-started/installation.md index 2809cca8..dcfe364c 100644 --- a/doc/docs/id-id/doc/getting-started/installation.md +++ b/doc/src/content/docs/id-id/doc/getting-started/installation.md @@ -1,4 +1,8 @@ -# Instalasi +--- +title: Instalasi +sidebar: + order: 2 +--- ## Modul Lua diff --git a/doc/docs/id-id/doc/getting-started/introduction.md b/doc/src/content/docs/id-id/doc/getting-started/introduction.md similarity index 92% rename from doc/docs/id-id/doc/getting-started/introduction.md rename to doc/src/content/docs/id-id/doc/getting-started/introduction.md index 7a5dbd23..fd805722 100644 --- a/doc/docs/id-id/doc/getting-started/introduction.md +++ b/doc/src/content/docs/id-id/doc/getting-started/introduction.md @@ -1,4 +1,8 @@ -# Pendahuluan +--- +title: Pendahuluan +sidebar: + order: 1 +--- YueScript adalah bahasa dinamis yang dikompilasi ke Lua, dan merupakan dialek [MoonScript](https://github.com/leafo/moonscript). Kode yang ditulis dengan YueScript ekspresif dan sangat ringkas. YueScript cocok untuk menulis logika aplikasi yang sering berubah dengan kode yang lebih mudah dipelihara, serta berjalan di lingkungan embed Lua seperti game atau server situs web. @@ -51,7 +55,9 @@ with apple export 🌛 = "Skrip Bulan" ``` - +
+ + +
## Tentang Dora SSR diff --git a/doc/docs/id-id/doc/getting-started/usage.md b/doc/src/content/docs/id-id/doc/getting-started/usage.md similarity index 98% rename from doc/docs/id-id/doc/getting-started/usage.md rename to doc/src/content/docs/id-id/doc/getting-started/usage.md index a0921633..3a638b92 100644 --- a/doc/docs/id-id/doc/getting-started/usage.md +++ b/doc/src/content/docs/id-id/doc/getting-started/usage.md @@ -1,4 +1,8 @@ -# Penggunaan +--- +title: Penggunaan +sidebar: + order: 3 +--- ## Modul Lua diff --git a/doc/docs/id-id/doc/index.md b/doc/src/content/docs/id-id/doc/index.md old mode 100755 new mode 100644 similarity index 59% rename from doc/docs/id-id/doc/index.md rename to doc/src/content/docs/id-id/doc/index.md index 5df2cc3d..52e153ef --- a/doc/docs/id-id/doc/index.md +++ b/doc/src/content/docs/id-id/doc/index.md @@ -1,10 +1,11 @@ --- title: Referensi +sidebar: + order: 0 +tableOfContents: false --- -# Dokumentasi YueScript - -logo +YueScript logo Selamat datang di dokumentasi resmi YueScript!
Di sini Anda dapat menemukan fitur bahasa, penggunaan, contoh referensi, dan sumber daya.
diff --git a/doc/docs/id-id/doc/language-basics/attributes.md b/doc/src/content/docs/id-id/doc/language-basics/attributes.md similarity index 63% rename from doc/docs/id-id/doc/language-basics/attributes.md rename to doc/src/content/docs/id-id/doc/language-basics/attributes.md index 20b7c9c3..386a64b1 100644 --- a/doc/docs/id-id/doc/language-basics/attributes.md +++ b/doc/src/content/docs/id-id/doc/language-basics/attributes.md @@ -1,4 +1,8 @@ -# Atribut +--- +title: Atribut +sidebar: + order: 8 +--- Dukungan sintaks untuk atribut Lua 5.4. Anda juga masih bisa menggunakan deklarasi `const` dan `close` dan mendapatkan pemeriksaan konstanta serta callback berbatas-scope ketika menargetkan versi Lua di bawah 5.4. @@ -7,14 +11,17 @@ const a = 123 close _ = : -> print "Out of scope." ``` - +
+ + +
Anda dapat melakukan destrukturisasi dengan variabel yang diberi atribut sebagai konstanta. @@ -23,14 +30,17 @@ const {:a, :b, c, d} = tb -- a = 1 ``` - +
+ + +
Anda juga bisa mendeklarasikan variabel global sebagai `const`. @@ -39,11 +49,14 @@ global const Constant = 123 -- Constant = 1 ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/language-basics/comment.md b/doc/src/content/docs/id-id/doc/language-basics/comment.md similarity index 69% rename from doc/docs/id-id/doc/language-basics/comment.md rename to doc/src/content/docs/id-id/doc/language-basics/comment.md index 058c66b0..3e7ac1d9 100644 --- a/doc/docs/id-id/doc/language-basics/comment.md +++ b/doc/src/content/docs/id-id/doc/language-basics/comment.md @@ -1,4 +1,8 @@ -# Komentar +--- +title: Komentar +sidebar: + order: 5 +--- ```yuescript -- Saya adalah komentar @@ -13,7 +17,9 @@ Tidak masalah. func --[[port]] 3000, --[[ip]] "192.168.1.1" ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/language-basics/literals.md b/doc/src/content/docs/id-id/doc/language-basics/literals.md similarity index 77% rename from doc/docs/id-id/doc/language-basics/literals.md rename to doc/src/content/docs/id-id/doc/language-basics/literals.md index 93a547b3..66a5604e 100644 --- a/doc/docs/id-id/doc/language-basics/literals.md +++ b/doc/src/content/docs/id-id/doc/language-basics/literals.md @@ -1,4 +1,8 @@ -# Literal +--- +title: Literal +sidebar: + order: 6 +--- Semua literal primitif di Lua dapat digunakan. Ini berlaku untuk angka, string, boolean, dan **nil**. @@ -13,7 +17,9 @@ some_string = "Here is a string print "I am #{math.random! * 100}% sure." ``` - +
+ + +
## Literal Angka @@ -36,7 +43,9 @@ hex = 0xEF_BB_BF binary = 0B10011 ``` - +
+ + +
## String Multibaris YAML @@ -58,7 +68,9 @@ str = | - #{expr} ``` - +
+ + +
Ini memungkinkan penulisan teks multibaris terstruktur dengan mudah. Semua pemisah baris dan indentasi dipertahankan relatif terhadap baris non-kosong pertama, dan ekspresi di dalam `#{...}` diinterpolasi otomatis sebagai `tostring(expr)`. @@ -82,7 +95,9 @@ fn = -> return str ``` - +
+ + +
Indentasi internal dipertahankan relatif terhadap prefiks umum yang dihapus, sehingga struktur bertingkat tetap rapi. @@ -104,7 +120,9 @@ str = | note: 'He said: "#{Hello}!"' ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/language-basics/module.md b/doc/src/content/docs/id-id/doc/language-basics/module.md similarity index 79% rename from doc/docs/id-id/doc/language-basics/module.md rename to doc/src/content/docs/id-id/doc/language-basics/module.md index 103e3f6a..e05e2f44 100644 --- a/doc/docs/id-id/doc/language-basics/module.md +++ b/doc/src/content/docs/id-id/doc/language-basics/module.md @@ -1,4 +1,8 @@ -# Modul +--- +title: Modul +sidebar: + order: 9 +--- ## Import @@ -29,7 +33,9 @@ do import "export" as {one, two, Something:{umm:{ch}}} ``` - +
+ + +
## Import Global @@ -69,7 +76,9 @@ do print concat ["a", tostring 1] ``` - +
+ + +
### Import Variabel Global Otomatis @@ -101,7 +111,9 @@ do FLAG = 123 ``` - +
+ + +
## Export @@ -144,7 +157,9 @@ export class Something umm: "cool" ``` - +
+ + +
Melakukan export bernama dengan destrukturisasi. @@ -171,14 +187,17 @@ export :loadstring, to_lua: tolua = yue export {itemA: {:fieldA = 'default'}} = tb ``` - +
+ + +
Export item bernama dari modul tanpa membuat variabel local. @@ -188,7 +207,9 @@ export. = items export["a-b-c"] = 123 ``` - +
+ + +
### Export Tanpa Nama @@ -215,7 +237,9 @@ export with tmp j = 2000 ``` - +
+ + +
### Export Default @@ -242,7 +267,9 @@ export default -> 123 ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/language-basics/operator.md b/doc/src/content/docs/id-id/doc/language-basics/operator.md similarity index 79% rename from doc/docs/id-id/doc/language-basics/operator.md rename to doc/src/content/docs/id-id/doc/language-basics/operator.md index 68c96e6f..42914e33 100644 --- a/doc/docs/id-id/doc/language-basics/operator.md +++ b/doc/src/content/docs/id-id/doc/language-basics/operator.md @@ -1,4 +1,8 @@ -# Operator +--- +title: Operator +sidebar: + order: 7 +--- Semua operator biner dan unari Lua tersedia. Selain itu **!=** adalah alias untuk **~=**, dan **\\** atau **::** bisa digunakan untuk menulis pemanggilan fungsi berantai seperti `tb\func!` atau `tb::func!`. YueScript juga menawarkan beberapa operator khusus lain untuk menulis kode yang lebih ekspresif. @@ -7,14 +11,17 @@ tb\func! if tb ~= nil tb::func! if tb != nil ``` - +
+ + +
## Perbandingan Berantai @@ -29,7 +36,9 @@ print 1 <= a <= 10 -- output: true ``` - +
+ + +
Perhatikan perilaku evaluasi perbandingan berantai: @@ -67,7 +77,9 @@ print v(1) > v(2) <= v(3) ]] ``` - +
+ + +
Ekspresi tengah hanya dievaluasi sekali, bukan dua kali seperti jika ekspresi ditulis sebagai `v(1) < v(2) and v(2) <= v(3)`. Namun, urutan evaluasi pada perbandingan berantai tidak didefinisikan. Sangat disarankan untuk tidak menggunakan ekspresi dengan efek samping (seperti `print`) di perbandingan berantai. Jika efek samping diperlukan, operator short-circuit `and` sebaiknya digunakan secara eksplisit. @@ -105,14 +118,17 @@ tab = [] tab[] = "Value" ``` - +
+ + +
Anda juga bisa memakai operator spread `...` untuk menambahkan semua elemen dari satu list ke list lain: @@ -123,7 +139,9 @@ tbA[] = ...tbB -- tbA sekarang [1, 2, 3, 4, 5, 6] ``` - +
+ + +
## Penyebaran Tabel @@ -157,7 +176,9 @@ b = {4, 5, y: 1} merge = {...a, ...b} ``` - +
+ + +
### Penyebaran Tabel List @@ -190,7 +212,9 @@ listCopy = [...source,] -- listCopy => [1, 2, 3] ``` - +
+ + +
## Indeks Balik Tabel @@ -212,7 +237,9 @@ second_last = data.items[#-1] data.items[#] = 1 ``` - +
+ + +
## Metatable @@ -246,7 +274,9 @@ print d.value close _ = : -> print "out of scope" ``` - +
+ + +
### Mengakses Metatable @@ -280,7 +311,9 @@ tb.<> = __index: {item: "hello"} print tb.item ``` - +
+ + +
### Destrukturisasi Metatable @@ -302,14 +336,17 @@ Destrukturisasi metatable dengan kunci metamethod yang dikelilingi **<>**. print item, new, close, getter ``` - +
+ + +
## Keberadaan @@ -330,7 +367,9 @@ with? io.open "test.txt", "w" \close! ``` - +
+ + +
## Piping @@ -367,7 +407,9 @@ readFile "example.txt" |> print ``` - +
+ + +
## Nil Coalescing @@ -397,7 +440,9 @@ func a ?? {} a ??= false ``` - +
+ + +
## Objek Implisit @@ -455,7 +501,9 @@ tb = ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/language-basics/whitespace.md b/doc/src/content/docs/id-id/doc/language-basics/whitespace.md similarity index 78% rename from doc/docs/id-id/doc/language-basics/whitespace.md rename to doc/src/content/docs/id-id/doc/language-basics/whitespace.md index 486bcaae..1c975287 100644 --- a/doc/docs/id-id/doc/language-basics/whitespace.md +++ b/doc/src/content/docs/id-id/doc/language-basics/whitespace.md @@ -1,4 +1,8 @@ -# Spasi Kosong +--- +title: Spasi Kosong +sidebar: + order: 4 +--- YueScript adalah bahasa yang peka terhadap spasi. Anda harus menulis beberapa blok kode dengan indentasi yang sama menggunakan spasi **' '** atau tab **'\t'** seperti badan fungsi, daftar nilai, dan beberapa blok kontrol. Ekspresi yang mengandung spasi berbeda dapat bermakna berbeda. Tab diperlakukan seperti 4 spasi, tetapi sebaiknya jangan mencampur penggunaan spasi dan tab. @@ -10,13 +14,16 @@ Sebuah pernyataan biasanya berakhir pada pergantian baris. Anda juga bisa memaka a = 1; b = 2; print a + b ``` - +
+ + +
## Rantai Multibaris @@ -31,7 +38,9 @@ Rx.Observable \subscribe print ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/objects/object-oriented-programming.md b/doc/src/content/docs/id-id/doc/objects/object-oriented-programming.md similarity index 80% rename from doc/docs/id-id/doc/objects/object-oriented-programming.md rename to doc/src/content/docs/id-id/doc/objects/object-oriented-programming.md index cc746905..3b3a223b 100644 --- a/doc/docs/id-id/doc/objects/object-oriented-programming.md +++ b/doc/src/content/docs/id-id/doc/objects/object-oriented-programming.md @@ -1,4 +1,8 @@ -# Pemrograman Berorientasi Objek +--- +title: Pemrograman Berorientasi Objek +sidebar: + order: 26 +--- Dalam contoh-contoh ini, kode Lua yang dihasilkan mungkin tampak berat. Sebaiknya fokus dulu pada makna kode YueScript, lalu lihat kode Lua jika Anda ingin mengetahui detail implementasinya. @@ -16,7 +20,9 @@ class Inventory @items[name] = 1 ``` - +
+ + +
Kelas dideklarasikan dengan pernyataan `class` diikuti deklarasi mirip tabel di mana semua method dan properti dicantumkan. @@ -50,7 +57,9 @@ class User print tostring User "Yue" ``` - +
+ + +
Membuat instance kelas dilakukan dengan memanggil nama kelas sebagai fungsi. @@ -70,7 +80,9 @@ inv\add_item "t-shirt" inv\add_item "pants" ``` - +
+ + +
Karena instance kelas perlu dikirim ke method saat dipanggil, operator `\` digunakan. @@ -102,7 +115,9 @@ b\give_item "shirt" print item for item in *a.clothes ``` - +
+ + +
Cara yang benar untuk menghindari masalah ini adalah membuat state yang dapat berubah di konstruktor: @@ -130,7 +146,9 @@ class Person @clothes = [] ``` - +
+ + +
## Pewarisan @@ -152,7 +171,9 @@ class BackPack extends Inventory super name ``` - +
+ + +
Di sini kita memperluas kelas Inventory, dan membatasi jumlah item yang bisa dibawa. @@ -179,7 +201,9 @@ class Shelf class Cupboard extends Shelf ``` - +
+ + +
## Super @@ -218,7 +243,9 @@ class MyClass extends ParentClass assert super == ParentClass ``` - +
+ + +
**super** juga dapat digunakan di sisi kiri Function Stub. Perbedaan utamanya adalah, alih-alih fungsi hasil terikat pada nilai `super`, fungsi terikat pada `self`. @@ -247,7 +275,9 @@ assert b.__class == BackPack print BackPack.size -- mencetak 10 ``` - +
+ + +
## Objek Kelas @@ -278,13 +309,16 @@ Nama kelas saat dideklarasikan disimpan sebagai string di field `__name` pada ob print BackPack.__name -- mencetak Backpack ``` - +
+ + +
Objek base disimpan di `__base`. Kita dapat memodifikasi tabel ini untuk menambahkan fungsionalitas ke instance yang sudah dibuat maupun yang akan dibuat. @@ -304,7 +338,9 @@ Things\some_func! assert Things().some_func == nil ``` - +
+ + +
Dalam ekspresi, kita dapat menggunakan `@@` untuk mengakses nilai yang disimpan di `__class` milik `self`. Jadi, `@@hello` adalah singkatan dari `self.__class.hello`. @@ -333,7 +370,9 @@ Counter! print Counter.count -- mencetak 2 ``` - +
+ + +
Semantik pemanggilan `@@` mirip dengan `@`. Memanggil nama `@@` akan meneruskan kelas sebagai argumen pertama menggunakan sintaks kolon Lua. @@ -356,13 +396,16 @@ Semantik pemanggilan `@@` mirip dengan `@`. Memanggil nama `@@` akan meneruskan @@hello 1,2,3,4 ``` - +
+ + +
## Pernyataan Deklarasi Kelas @@ -375,14 +418,17 @@ class Things @class_var = "hello world" ``` - +
+ + +
Ekspresi ini dieksekusi setelah semua properti ditambahkan ke base. @@ -397,7 +443,9 @@ class MoreThings log "hello world: " .. secret ``` - +
+ + +
## Nilai @ dan @@ @@ -421,14 +470,17 @@ assert @ == self assert @@ == self.__class ``` - +
+ + +
Contohnya, cara cepat untuk membuat instance baru dari kelas yang sama dari method instance menggunakan `@@`: @@ -436,13 +488,16 @@ Contohnya, cara cepat untuk membuat instance baru dari kelas yang sama dari meth some_instance_method = (...) => @@ ... ``` - +
+ + +
## Promosi Properti Konstruktor @@ -462,7 +517,9 @@ class Something @@baz = baz ``` - +
+ + +
Anda juga bisa menggunakan sintaks ini untuk fungsi umum guna menginisialisasi field objek. @@ -488,7 +546,9 @@ obj = new {}, 123, "abc" print obj ``` - +
+ + +
## Ekspresi Kelas @@ -508,7 +569,9 @@ x = class Bucket add_drop: => @drops += 1 ``` - +
+ + +
## Kelas Anonim @@ -529,7 +593,9 @@ BigBucket = class extends Bucket assert Bucket.__name == "BigBucket" ``` - +
+ + +
Anda bahkan bisa menghilangkan badan kelas, artinya Anda bisa menulis kelas anonim kosong seperti ini: @@ -546,13 +613,16 @@ Anda bahkan bisa menghilangkan badan kelas, artinya Anda bisa menulis kelas anon x = class ``` - +
+ + +
## Pencampuran Kelas @@ -576,7 +646,9 @@ y\func! assert y.__class.__parent ~= X -- X bukan parent dari Y ``` - +
+ + +
diff --git a/doc/docs/id-id/doc/objects/with-statement.md b/doc/src/content/docs/id-id/doc/objects/with-statement.md similarity index 74% rename from doc/docs/id-id/doc/objects/with-statement.md rename to doc/src/content/docs/id-id/doc/objects/with-statement.md index e41060a4..12408bbf 100644 --- a/doc/docs/id-id/doc/objects/with-statement.md +++ b/doc/src/content/docs/id-id/doc/objects/with-statement.md @@ -1,4 +1,8 @@ -# Pernyataan With +--- +title: Pernyataan With +sidebar: + order: 27 +--- Pola umum saat membuat objek adalah memanggil serangkaian fungsi dan mengatur serangkaian properti segera setelah objek dibuat. @@ -16,7 +20,9 @@ with Person! print .name ``` - +
+ + +
Pernyataan `with` juga bisa digunakan sebagai ekspresi yang mengembalikan nilai yang diberi akses. @@ -35,14 +42,17 @@ file = with File "favorite_foods.txt" \set_encoding "utf8" ``` - +
+ + +
Ekspresi `with` mendukung `break` dengan satu nilai: @@ -51,14 +61,17 @@ result = with obj break .value ``` - +
+ + +
Setelah `break value` digunakan di dalam `with`, ekspresi `with` tidak lagi mengembalikan objek targetnya, melainkan mengembalikan nilai dari `break`. @@ -72,7 +85,9 @@ b = with obj -- b adalah .x, bukan obj ``` - +
+ + +
Berbeda dari `for` / `while` / `repeat` / `do`, `with` hanya mendukung satu nilai `break`. @@ -99,7 +115,9 @@ create_person = (name, relatives) -> me = create_person "Leaf", [dad, mother, sister] ``` - +
+ + +
Dalam penggunaan ini, `with` dapat dilihat sebagai bentuk khusus dari kombinator K. @@ -122,7 +141,9 @@ with str := "Hello" print "upper:", \upper! ``` - +
+ + +
Anda bisa mengakses kunci khusus dengan `[]` di dalam pernyataan `with`. @@ -144,7 +166,9 @@ with tb [] = "abc" -- menambahkan ke "tb" ``` - +
+ + +
`with?` adalah versi yang ditingkatkan dari sintaks `with`, yang memperkenalkan pengecekan keberadaan untuk mengakses objek yang mungkin nil secara aman tanpa pemeriksaan null eksplisit. @@ -165,11 +190,14 @@ with? obj print .name ``` - +
+ + +
diff --git a/doc/src/content/docs/id-id/index.md b/doc/src/content/docs/id-id/index.md new file mode 100644 index 00000000..720d78d0 --- /dev/null +++ b/doc/src/content/docs/id-id/index.md @@ -0,0 +1,41 @@ +--- +hero: + tagline: Bahasa menyenangkan yang dikompilasi ke Lua + image: + alt: YueScript + html: YueScript + actions: + - text: Mulai Cepat → + link: /id-id/doc/ + variant: primary + - text: Lihat di GitHub + link: https://github.com/IppClub/YueScript + variant: minimal + icon: external +title: YueScript +sidebar: + order: -1 +template: splash +description: Bahasa menyenangkan yang dikompilasi ke Lua +--- + +
+
+

Alur kerja Lua yang familiar

+

Tulis sintaks ringkas yang dikompilasi ke Lua yang mudah dibaca, dengan output yang dapat diprediksi.

+
+
+

Fitur bahasa modern

+

Pipe, pattern matching, slicing, dan destrukturisasi tanpa mengorbankan interoperabilitas Lua.

+
+
+

Iterasi Cepat

+

Setiap masukan sangat diterima untuk membantu mempercepat pengembangan dan evolusi bahasa!

+
+
+ + diff --git a/doc/src/content/docs/id-id/try/index.md b/doc/src/content/docs/id-id/try/index.md new file mode 100644 index 00000000..6eadb65b --- /dev/null +++ b/doc/src/content/docs/id-id/try/index.md @@ -0,0 +1,12 @@ +--- +prev: false +next: false +title: Kompiler Online YueScript +sidebar: + order: 100 +tableOfContents: false +--- + +Coba YueScript di browser dengan WASM. + +
diff --git a/doc/src/content/docs/index.md b/doc/src/content/docs/index.md new file mode 100644 index 00000000..5ab6b2db --- /dev/null +++ b/doc/src/content/docs/index.md @@ -0,0 +1,43 @@ +--- +hero: + tagline: A delightful language that compiles to Lua + image: + alt: YueScript + html: + YueScript + actions: + - text: Documentation + link: /doc/ + variant: primary + icon: open-book + - text: View on GitHub + link: https://github.com/IppClub/YueScript + variant: minimal + icon: external +title: YueScript +sidebar: + order: -1 +template: splash +description: A delightful language that compiles to Lua +--- + +
+
+

Familiar Lua workflows

+

Write concise syntax that compiles to readable Lua, with predictable output.

+
+
+

Modern language features

+

Pipe, pattern matching, slicing, and destructuring without giving up Lua interop.

+
+
+

Rapid Iteration

+

Any feedback is welcome to help accelerate the language development and evolution!

+
+
+ + diff --git a/doc/docs/pt-br/doc/advanced/do.md b/doc/src/content/docs/pt-br/doc/advanced/do.md similarity index 64% rename from doc/docs/pt-br/doc/advanced/do.md rename to doc/src/content/docs/pt-br/doc/advanced/do.md index aaa9b0c7..61145c9f 100644 --- a/doc/docs/pt-br/doc/advanced/do.md +++ b/doc/src/content/docs/pt-br/doc/advanced/do.md @@ -1,4 +1,8 @@ -# Do +--- +title: Do +sidebar: + order: 30 +--- Quando usado como instrução, do funciona exatamente como no Lua. @@ -9,7 +13,9 @@ do print var -- nil aqui ``` - +
+ + +
O **do** do YueScript também pode ser usado como expressão. Permitindo combinar múltiplas linhas em uma. O resultado da expressão do é a última instrução em seu corpo. @@ -33,7 +40,9 @@ print counter! print counter! ``` - +
+ + +
```yuescript tbl = { @@ -56,7 +66,9 @@ tbl = { } ``` - +
+ + +
Expressões `do` suportam usar `break` para interromper o fluxo de execução e retornar múltiplos valores antecipadamente. @@ -78,7 +91,9 @@ status, value = do break "small", n ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/advanced/line-decorators.md b/doc/src/content/docs/pt-br/doc/advanced/line-decorators.md similarity index 55% rename from doc/docs/pt-br/doc/advanced/line-decorators.md rename to doc/src/content/docs/pt-br/doc/advanced/line-decorators.md index aaf34ea6..6faf3bcc 100644 --- a/doc/docs/pt-br/doc/advanced/line-decorators.md +++ b/doc/src/content/docs/pt-br/doc/advanced/line-decorators.md @@ -1,4 +1,8 @@ -# Decoradores de linha +--- +title: Decoradores de linha +sidebar: + order: 29 +--- Por conveniência, o loop for e a instrução if podem ser aplicados a instruções únicas no final da linha: @@ -6,13 +10,16 @@ Por conveniência, o loop for e a instrução if podem ser aplicados a instruç print "hello world" if name == "Rob" ``` - +
+ + +
E com loops básicos: @@ -20,13 +27,16 @@ E com loops básicos: print "item: ", item for item in *items ``` - +
+ + +
E com loops while: @@ -36,7 +46,9 @@ game\update! while game\isRunning! reader\parse_line! until reader\eof! ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/advanced/macro.md b/doc/src/content/docs/pt-br/doc/advanced/macro.md similarity index 85% rename from doc/docs/pt-br/doc/advanced/macro.md rename to doc/src/content/docs/pt-br/doc/advanced/macro.md index 6fa04bee..6cea48bf 100644 --- a/doc/docs/pt-br/doc/advanced/macro.md +++ b/doc/src/content/docs/pt-br/doc/advanced/macro.md @@ -1,4 +1,8 @@ -# Macro +--- +title: Macro +sidebar: + order: 28 +--- ## Uso comum @@ -33,7 +37,9 @@ if $and f1!, f2!, f3! print "OK" ``` - +
+ + +
## Inserir códigos brutos @@ -96,7 +103,9 @@ end ]==] ``` - +
+ + +
## Exportar macro @@ -145,7 +155,9 @@ import "utils" as { [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ ``` - +
+ + +
## Macro embutida @@ -175,14 +188,17 @@ print $FILE -- obtém string do nome do módulo atual print $LINE -- obtém número 2 ``` - +
+ + +
## Gerando macros com macros @@ -206,7 +222,9 @@ print "Valid enum type:", $BodyType Static -- print "Compilation error with enum type:", $BodyType Unknown ``` - +
+ + +
## Gerando código em múltiplas linhas @@ -245,7 +264,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
```yuescript macro default_conf = (conf) -> | @@ -270,7 +292,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
## Validação de argumentos @@ -298,7 +323,9 @@ macro printNumAndStr = (num `Num, str `String) -> | $printNumAndStr 123, "hello" ``` - +
+ + +
Se você precisar de verificação de argumentos mais flexível, pode usar a função macro embutida `$is_ast` para verificar manualmente no lugar apropriado. @@ -323,7 +351,9 @@ macro printNumAndStr = (num, str) -> $printNumAndStr 123, "hello" ``` - +
+ + +
Para mais detalhes sobre os nós AST disponíveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). @@ -354,7 +385,9 @@ myFunc = -> return ``` - +
+ + +
Quando a macro de anotação retorna uma tabela de configuração, o campo opcional `before` controla se o resultado gerado será emitido antes ou depois da instrução anotada. @@ -387,7 +421,9 @@ tableB = {} return ``` - +
+ + +
Como a instrução seguinte é passada como um argumento extra para a macro, anotações também podem ser usadas para gerar código de registro a partir de declarações de classe. Você também pode usar as mesmas checagens de AST nos argumentos que macros normais oferecem. @@ -425,7 +462,9 @@ class Worker return ``` - +
+ + +
Anotações também podem injetar código de empacotamento em volta de funções: @@ -460,7 +500,9 @@ $[ValidateNumberArgs] add = (a, b) -> a + b ``` - +
+ + +
Uma anotação sempre precisa ser seguida por uma instrução, e ela não pode ser aplicada a uma instrução `return`. Se a instrução anotada aparecer no fim de um bloco e você precisar da forma AST bruta dessa instrução, adicione um `return` explícito em seguida para evitar que ela seja envolvida por uma expressão com retorno implícito. diff --git a/doc/docs/pt-br/doc/advanced/the-yuescript-library.md b/doc/src/content/docs/pt-br/doc/advanced/the-yuescript-library.md similarity index 99% rename from doc/docs/pt-br/doc/advanced/the-yuescript-library.md rename to doc/src/content/docs/pt-br/doc/advanced/the-yuescript-library.md index 7775cd53..f5b0f8e5 100644 --- a/doc/docs/pt-br/doc/advanced/the-yuescript-library.md +++ b/doc/src/content/docs/pt-br/doc/advanced/the-yuescript-library.md @@ -1,4 +1,8 @@ -# A biblioteca YueScript +--- +title: A biblioteca YueScript +sidebar: + order: 32 +--- Acesse com `local yue = require("yue")` no Lua. diff --git a/doc/docs/pt-br/doc/advanced/try.md b/doc/src/content/docs/pt-br/doc/advanced/try.md similarity index 83% rename from doc/docs/pt-br/doc/advanced/try.md rename to doc/src/content/docs/pt-br/doc/advanced/try.md index 0223feb8..3b3d04d5 100644 --- a/doc/docs/pt-br/doc/advanced/try.md +++ b/doc/src/content/docs/pt-br/doc/advanced/try.md @@ -1,4 +1,8 @@ -# Try +--- +title: Try +sidebar: + order: 31 +--- A sintaxe para tratamento de erros do Lua em uma forma comum. @@ -30,7 +34,9 @@ catch err print result ``` - +
+ + +
## Try? @@ -84,7 +91,9 @@ catch e e ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/assignment/assignment.md b/doc/src/content/docs/pt-br/doc/assignment/assignment.md similarity index 75% rename from doc/docs/pt-br/doc/assignment/assignment.md rename to doc/src/content/docs/pt-br/doc/assignment/assignment.md index ac3838f8..87564b7f 100644 --- a/doc/docs/pt-br/doc/assignment/assignment.md +++ b/doc/src/content/docs/pt-br/doc/assignment/assignment.md @@ -1,4 +1,8 @@ -# Atribuição +--- +title: Atribuição +sidebar: + order: 10 +--- A variável é tipada dinamicamente e é definida como local por padrão. Mas você pode alterar o escopo da declaração pelas instruções **local** e **global**. @@ -8,7 +12,9 @@ a, b, c = 1, 2, 3 hello = 123 -- usa a variável existente ``` - +
+ + +
## Atualização @@ -33,7 +40,9 @@ s ..= "world" -- adiciona um novo local se a variável local não existir arg or= "valor padrão" ``` - +
+ + +
## Atribuição encadeada @@ -57,14 +67,17 @@ a = b = c = d = e = 0 x = y = z = f! ``` - +
+ + +
## Locais explícitos @@ -85,7 +98,9 @@ do B = 2 ``` - +
+ + +
## Globais explícitos @@ -125,7 +141,9 @@ do local Temp = "um valor local" ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/assignment/destructuring-assignment.md b/doc/src/content/docs/pt-br/doc/assignment/destructuring-assignment.md similarity index 75% rename from doc/docs/pt-br/doc/assignment/destructuring-assignment.md rename to doc/src/content/docs/pt-br/doc/assignment/destructuring-assignment.md index 0c96d4a5..3f12b78b 100644 --- a/doc/docs/pt-br/doc/assignment/destructuring-assignment.md +++ b/doc/src/content/docs/pt-br/doc/assignment/destructuring-assignment.md @@ -1,4 +1,8 @@ -# Atribuição por desestruturação +--- +title: Atribuição por desestruturação +sidebar: + order: 11 +--- A atribuição por desestruturação é uma forma de extrair rapidamente valores de uma tabela por seu nome ou posição em tabelas baseadas em array. @@ -13,7 +17,9 @@ thing = [1, 2] print a, b ``` - +
+ + +
No literal de tabela de desestruturação, a chave representa a chave para ler do lado direito, e o valor representa o nome ao qual o valor lido será atribuído. @@ -39,7 +46,9 @@ print hello, the_day :day = obj -- OK fazer desestruturação simples sem chaves ``` - +
+ + +
Isso também funciona com estruturas de dados aninhadas: @@ -71,7 +81,9 @@ obj2 = { print first, second, color ``` - +
+ + +
Se a instrução de desestruturação for complicada, sinta-se à vontade para espalhá-la em várias linhas. Um exemplo um pouco mais complicado: @@ -99,7 +112,9 @@ Se a instrução de desestruturação for complicada, sinta-se à vontade para e } = obj2 ``` - +
+ + +
É comum extrair valores de uma tabela e atribuí-los a variáveis locais que têm o mesmo nome da chave. Para evitar repetição, podemos usar o operador de prefixo **:**: @@ -118,13 +134,16 @@ Se a instrução de desestruturação for complicada, sinta-se à vontade para e {:concat, :insert} = table ``` - +
+ + +
Isso é efetivamente o mesmo que import, mas podemos renomear campos que queremos extrair misturando a sintaxe: @@ -132,13 +151,16 @@ Isso é efetivamente o mesmo que import, mas podemos renomear campos que queremo {:mix, :max, random: rand} = math ``` - +
+ + +
Você pode escrever valores padrão ao fazer desestruturação: @@ -146,13 +168,16 @@ Você pode escrever valores padrão ao fazer desestruturação: {:name = "sem nome", :job = "sem emprego"} = person ``` - +
+ + +
Você pode usar `_` como placeholder ao fazer desestruturação de lista: @@ -160,13 +185,16 @@ Você pode usar `_` como placeholder ao fazer desestruturação de lista: [_, two, _, four] = items ``` - +
+ + +
## Desestruturação por intervalo @@ -180,7 +208,9 @@ print bulk -- imprime: {"second", "third", "fourth"} print last -- imprime: last ``` - +
+ + +
O operador spread pode ser usado em diferentes posições para capturar diferentes intervalos, e você pode usar `_` como placeholder para os valores que não quer capturar: @@ -205,7 +236,9 @@ O operador spread pode ser usado em diferentes posições para capturar diferent [first, ..._, last] = orders ``` - +
+ + +
## Desestruturação em outros lugares @@ -234,7 +268,9 @@ for [left, right] in *tuples print left, right ``` - +
+ + +
Sabemos que cada elemento na tabela array é uma tupla de dois itens, então podemos desempacotá-lo diretamente na cláusula de nomes da instrução for usando desestruturação. diff --git a/doc/docs/pt-br/doc/assignment/if-assignment.md b/doc/src/content/docs/pt-br/doc/assignment/if-assignment.md similarity index 74% rename from doc/docs/pt-br/doc/assignment/if-assignment.md rename to doc/src/content/docs/pt-br/doc/assignment/if-assignment.md index 7b1a8525..c9f5687c 100644 --- a/doc/docs/pt-br/doc/assignment/if-assignment.md +++ b/doc/src/content/docs/pt-br/doc/assignment/if-assignment.md @@ -1,4 +1,8 @@ -# Atribuição em if +--- +title: Atribuição em if +sidebar: + order: 12 +--- Os blocos `if` e `elseif` podem receber uma atribuição no lugar de uma expressão condicional. Ao avaliar o condicional, a atribuição será realizada e o valor que foi atribuído será usado como expressão condicional. A variável atribuída está no escopo apenas para o corpo do condicional, ou seja, nunca está disponível se o valor não for truthy. E você precisa usar o "operador walrus" `:=` em vez de `=` para fazer a atribuição. @@ -7,14 +11,17 @@ if user := database.find_user "moon" print user.name ``` - +
+ + +
```yuescript if hello := os.getenv "hello" @@ -25,7 +32,9 @@ else print "nada :(" ``` - +
+ + +
Atribuição em if com múltiplos valores de retorno. Apenas o primeiro valor é verificado, os outros valores estão no escopo. @@ -46,7 +56,9 @@ if success, result := pcall -> "obter resultado sem problemas" print "OK" ``` - +
+ + +
## Atribuição em while @@ -66,7 +79,9 @@ while byte := stream\read_one! print byte ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md b/doc/src/content/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md similarity index 80% rename from doc/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md rename to doc/src/content/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md index c49aa151..cd4655b5 100644 --- a/doc/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md +++ b/doc/src/content/docs/pt-br/doc/assignment/the-using-clause-controlling-destructive-assignment.md @@ -1,4 +1,8 @@ -# A cláusula Using; controlando atribuição destrutiva +--- +title: A cláusula Using; controlando atribuição destrutiva +sidebar: + order: 14 +--- Embora o escopo léxico possa ser uma grande ajuda na redução da complexidade do código que escrevemos, as coisas podem ficar difíceis de gerenciar conforme o tamanho do código aumenta. Considere o seguinte trecho: @@ -18,7 +22,9 @@ my_func! print i -- vai imprimir 0 ``` - +
+ + +
Em my_func, sobrescrevemos o valor de i por engano. Neste exemplo é bem óbvio, mas considere uma base de código grande ou estrangeira onde não está claro quais nomes já foram declarados. @@ -54,7 +61,9 @@ my_func! print i -- imprime 100, i não é afetado ``` - +
+ + +
Múltiplos nomes podem ser separados por vírgulas. Os valores do closure ainda podem ser acessados, apenas não podem ser modificados: @@ -83,7 +93,9 @@ my_func(22) print i, k -- estes foram atualizados ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/assignment/varargs-assignment.md b/doc/src/content/docs/pt-br/doc/assignment/varargs-assignment.md similarity index 70% rename from doc/docs/pt-br/doc/assignment/varargs-assignment.md rename to doc/src/content/docs/pt-br/doc/assignment/varargs-assignment.md index 6ac67e06..90621ebc 100644 --- a/doc/docs/pt-br/doc/assignment/varargs-assignment.md +++ b/doc/src/content/docs/pt-br/doc/assignment/varargs-assignment.md @@ -1,4 +1,8 @@ -# Atribuição de varargs +--- +title: Atribuição de varargs +sidebar: + order: 13 +--- Você pode atribuir os resultados retornados de uma função a um símbolo varargs `...`. E então acessar seu conteúdo da forma Lua. @@ -11,7 +15,9 @@ first = select 1, ... print ok, count, first ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/control-flow/conditionals.md b/doc/src/content/docs/pt-br/doc/control-flow/conditionals.md similarity index 69% rename from doc/docs/pt-br/doc/control-flow/conditionals.md rename to doc/src/content/docs/pt-br/doc/control-flow/conditionals.md index ce32d89a..b6f4a395 100644 --- a/doc/docs/pt-br/doc/control-flow/conditionals.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/conditionals.md @@ -1,4 +1,8 @@ -# Condicionais +--- +title: Condicionais +sidebar: + order: 18 +--- ```yuescript have_coins = false @@ -8,7 +12,9 @@ else print "Sem moedas" ``` - +
+ + +
Uma sintaxe curta para instruções únicas também pode ser usada: @@ -27,14 +34,17 @@ have_coins = false if have_coins then print "Tem moedas" else print "Sem moedas" ``` - +
+ + +
Como instruções if podem ser usadas como expressões, isso também pode ser escrito como: @@ -43,14 +53,17 @@ have_coins = false print if have_coins then "Tem moedas" else "Sem moedas" ``` - +
+ + +
Condicionais também podem ser usados em instruções de retorno e atribuições: @@ -69,7 +82,9 @@ else print message -- imprime: Sou muito alto ``` - +
+ + +
O oposto de if é unless: @@ -95,26 +111,32 @@ unless os.date("%A") == "Monday" print "não é segunda-feira!" ``` - +
+ + +
```yuescript print "Você tem sorte!" unless math.random! > 0.1 ``` - +
+ + +
## Em expressão @@ -130,7 +152,9 @@ if a in list print "verificando se `a` está na lista" ``` - +
+ + +
O operador `in` também pode ser usado com tabelas e suporta a variante `not in` para negação: @@ -157,7 +182,9 @@ not_exist = item not in list check = -> value not in table ``` - +
+ + +
Uma lista ou tabela de único elemento verifica igualdade com esse elemento: @@ -186,7 +214,9 @@ with tb c = a in [1] ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/control-flow/continue.md b/doc/src/content/docs/pt-br/doc/control-flow/continue.md similarity index 67% rename from doc/docs/pt-br/doc/control-flow/continue.md rename to doc/src/content/docs/pt-br/doc/control-flow/continue.md index 645bcb43..37893e6e 100644 --- a/doc/docs/pt-br/doc/control-flow/continue.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/continue.md @@ -1,4 +1,8 @@ -# Continue +--- +title: Continue +sidebar: + order: 21 +--- Uma instrução continue pode ser usada para pular a iteração atual em um loop. @@ -10,7 +14,9 @@ while i < 10 print i ``` - +
+ + +
continue também pode ser usado com expressões de loop para impedir que essa iteração seja acumulada no resultado. Este exemplo filtra a tabela array para apenas números pares: @@ -31,7 +38,9 @@ odds = for x in *my_numbers x ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/control-flow/for-loop.md b/doc/src/content/docs/pt-br/doc/control-flow/for-loop.md similarity index 74% rename from doc/docs/pt-br/doc/control-flow/for-loop.md rename to doc/src/content/docs/pt-br/doc/control-flow/for-loop.md index de5f9c2b..50ebf76d 100644 --- a/doc/docs/pt-br/doc/control-flow/for-loop.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/for-loop.md @@ -1,4 +1,8 @@ -# Loop For +--- +title: Loop For +sidebar: + order: 19 +--- Existem duas formas de loop for, assim como no Lua. Uma numérica e uma genérica: @@ -13,7 +17,9 @@ for key, value in pairs object print key, value ``` - +
+ + +
Os operadores de slicing e **\*** podem ser usados, assim como com compreensões: @@ -35,14 +42,17 @@ for item in *items[2, 4] print item ``` - +
+ + +
Uma sintaxe mais curta também está disponível para todas as variações quando o corpo é apenas uma linha: @@ -52,7 +62,9 @@ for item in *items do print item for j = 1, 10, 3 do print j ``` - +
+ + +
Um loop for também pode ser usado como expressão. A última instrução no corpo do loop for é convertida em expressão e anexada a uma tabela array acumuladora. @@ -74,7 +87,9 @@ doubled_evens = for i = 1, 20 i ``` - +
+ + +
Além disso, os loops for suportam break com valores de retorno, permitindo que o próprio loop seja usado como expressão que sai antecipadamente com um resultado significativo. Expressões `for` suportam `break` com múltiplos valores. @@ -95,14 +111,17 @@ first_large = for n in *numbers break n if n > 10 ``` - +
+ + +
Esta sintaxe de break-com-valor permite padrões concisos e expressivos de busca ou saída antecipada diretamente em expressões de loop. @@ -111,14 +130,17 @@ key, score = for k, v in pairs data break k, v * 10 if k == "target" ``` - +
+ + +
Você também pode filtrar valores combinando a expressão do loop for com a instrução continue. @@ -132,7 +154,9 @@ print func_a! -- imprime nil print func_b! -- imprime objeto table ``` - +
+ + +
Isso é feito para evitar a criação desnecessária de tabelas para funções que não precisam retornar os resultados do loop. diff --git a/doc/docs/pt-br/doc/control-flow/goto.md b/doc/src/content/docs/pt-br/doc/control-flow/goto.md similarity index 77% rename from doc/docs/pt-br/doc/control-flow/goto.md rename to doc/src/content/docs/pt-br/doc/control-flow/goto.md index f4c85f43..3f7d32b2 100644 --- a/doc/docs/pt-br/doc/control-flow/goto.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/goto.md @@ -1,4 +1,8 @@ -# Goto +--- +title: Goto +sidebar: + order: 22 +--- YueScript suporta a instrução goto e a sintaxe de rótulos para controlar o fluxo do programa, seguindo as mesmas regras da instrução goto do Lua. **Nota:** A instrução goto requer Lua 5.2 ou superior. Ao compilar para Lua 5.1, o uso da sintaxe goto resultará em um erro de compilação. @@ -10,7 +14,9 @@ Um rótulo é definido usando dois pontos duplos: ::meu_rotulo:: ``` - +
+ + +
A instrução goto salta para um rótulo especificado: @@ -32,7 +39,9 @@ goto inicio print "a agora é 5" ``` - +
+ + +
A instrução goto é útil para sair de laços profundamente aninhados: @@ -57,7 +67,9 @@ for z = 1, 10 ::ok:: ``` - +
+ + +
Você também pode usar rótulos para pular para um nível específico de laço: @@ -83,7 +96,9 @@ for z = 1, 10 ::zcontinue:: ``` - +
+ + +
## Notas diff --git a/doc/docs/pt-br/doc/control-flow/switch.md b/doc/src/content/docs/pt-br/doc/control-flow/switch.md similarity index 80% rename from doc/docs/pt-br/doc/control-flow/switch.md rename to doc/src/content/docs/pt-br/doc/control-flow/switch.md index bc41badc..6c82d91e 100644 --- a/doc/docs/pt-br/doc/control-flow/switch.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/switch.md @@ -1,4 +1,8 @@ -# Switch +--- +title: Switch +sidebar: + order: 23 +--- A instrução switch é uma forma abreviada de escrever uma série de instruções if que verificam o mesmo valor. Observe que o valor é avaliado apenas uma vez. Como as instruções if, os switches podem ter um bloco else para tratar ausência de correspondências. A comparação é feita com o operador ==. Na instrução switch, você também pode usar expressão de atribuição para armazenar valor de variável temporária. @@ -12,7 +16,9 @@ switch name := "Dan" print "Não sei quem você é com o nome #{name}" ``` - +
+ + +
Uma cláusula when de um switch pode corresponder a múltiplos valores listando-os separados por vírgula. @@ -41,7 +48,9 @@ next_number = switch b error "não consigo contar tão alto!" ``` - +
+ + +
Podemos usar a palavra-chave then para escrever o bloco when de um switch em uma única linha. Nenhuma palavra-chave extra é necessária para escrever o bloco else em uma única linha. @@ -65,7 +75,9 @@ msg = switch math.random(1, 5) else "não tão sortudo" ``` - +
+ + +
Se você quiser escrever código com uma indentação a menos ao escrever uma instrução switch, pode colocar a primeira cláusula when na linha de início da instrução, e então todas as outras cláusulas podem ser escritas com uma indentação a menos. @@ -91,7 +104,9 @@ else print "não tão sortudo" ``` - +
+ + +
Vale notar a ordem da expressão de comparação do case. A expressão do case está no lado esquerdo. Isso pode ser útil se a expressão do case quiser sobrescrever como a comparação é feita definindo um metamétodo eq. @@ -129,7 +145,9 @@ for item in *items print "tamanho #{width}, #{height}" ``` - +
+ + +
Você pode usar valores padrão para opcionalmente desestruturar a tabela para alguns campos. @@ -160,7 +179,9 @@ switch item print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passará ``` - +
+ + +
Você também pode corresponder contra elementos de array, campos de tabela, e até estruturas aninhadas com literais de array ou tabela. @@ -188,7 +210,9 @@ switch tb print "1, 2, #{b}" ``` - +
+ + +
Corresponder contra campos de tabela com desestruturação. @@ -214,7 +239,9 @@ switch tb print "inválido" ``` - +
+ + +
Corresponder contra estruturas de tabela aninhadas. @@ -240,7 +268,9 @@ switch tb print "inválido" ``` - +
+ + +
Corresponder contra array de tabelas. @@ -267,7 +298,9 @@ switch tb print "correspondido", fourth ``` - +
+ + +
Corresponder contra uma lista e capturar um intervalo de elementos. @@ -293,7 +327,9 @@ switch segments print "Ação:", action -- imprime: "view" ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/control-flow/while-loop.md b/doc/src/content/docs/pt-br/doc/control-flow/while-loop.md similarity index 64% rename from doc/docs/pt-br/doc/control-flow/while-loop.md rename to doc/src/content/docs/pt-br/doc/control-flow/while-loop.md index 38df05a3..75600138 100644 --- a/doc/docs/pt-br/doc/control-flow/while-loop.md +++ b/doc/src/content/docs/pt-br/doc/control-flow/while-loop.md @@ -1,4 +1,8 @@ -# Loop While +--- +title: Loop While +sidebar: + order: 20 +--- O loop while também vem em quatro variações: @@ -11,7 +15,9 @@ while i > 0 while running == true do my_function! ``` - +
+ + +
```yuescript i = 10 @@ -33,7 +40,9 @@ until i == 0 until running == false do my_function! ``` - +
+ + +
Como os loops for, o loop while também pode ser usado como expressão. Expressões `while` e `until` suportam `break` com múltiplos valores. @@ -53,7 +63,9 @@ value, doubled = while true break n, n * 2 if n > 10 ``` - +
+ + +
Além disso, para uma função retornar o valor acumulado de um loop while, a instrução deve ser explicitamente retornada. @@ -77,7 +90,9 @@ repeat until i == 0 ``` - +
+ + +
Expressões `repeat` também suportam `break` com múltiplos valores: @@ -99,7 +115,9 @@ value, scaled = repeat until false ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/data-structures/comprehensions.md b/doc/src/content/docs/pt-br/doc/data-structures/comprehensions.md similarity index 72% rename from doc/docs/pt-br/doc/data-structures/comprehensions.md rename to doc/src/content/docs/pt-br/doc/data-structures/comprehensions.md index 96513526..b06127d7 100644 --- a/doc/docs/pt-br/doc/data-structures/comprehensions.md +++ b/doc/src/content/docs/pt-br/doc/data-structures/comprehensions.md @@ -1,4 +1,8 @@ -# Compreensões +--- +title: Compreensões +sidebar: + order: 25 +--- As compreensões fornecem uma sintaxe conveniente para construir uma nova tabela iterando sobre algum objeto existente e aplicando uma expressão a seus valores. Existem dois tipos de compreensões: compreensões de lista e compreensões de tabela. Ambas produzem tabelas Lua; as compreensões de lista acumulam valores em uma tabela semelhante a array, e as compreensões de tabela permitem definir tanto a chave quanto o valor em cada iteração. @@ -11,14 +15,17 @@ items = [ 1, 2, 3, 4 ] doubled = [item * 2 for i, item in ipairs items] ``` - +
+ + +
Os itens incluídos na nova tabela podem ser restringidos com uma cláusula when: @@ -26,13 +33,16 @@ Os itens incluídos na nova tabela podem ser restringidos com uma cláusula when slice = [item for i, item in ipairs items when i > 1 and i < 3] ``` - +
+ + +
Como é comum iterar sobre os valores de uma tabela indexada numericamente, um operador **\*** é introduzido. O exemplo doubled pode ser reescrito como: @@ -40,13 +50,16 @@ Como é comum iterar sobre os valores de uma tabela indexada numericamente, um o doubled = [item * 2 for item in *items] ``` - +
+ + +
Nas compreensões de lista, você também pode usar o operador spread `...` para achatar listas aninhadas, alcançando um efeito de flat map: @@ -59,7 +72,9 @@ flat = [...v for k,v in pairs data] -- flat agora é [1, 2, 3, 4, 5, 6] ``` - +
+ + +
As cláusulas for e when podem ser encadeadas tanto quanto desejado. O único requisito é que uma compreensão tenha pelo menos uma cláusula for. @@ -84,7 +100,9 @@ points = [ [x, y] for x in *x_coords \ for y in *y_coords] ``` - +
+ + +
Loops for numéricos também podem ser usados em compreensões: @@ -102,13 +121,16 @@ Loops for numéricos também podem ser usados em compreensões: evens = [i for i = 1, 100 when i % 2 == 0] ``` - +
+ + +
## Compreensões de tabela @@ -126,7 +148,9 @@ thing = { thing_copy = {k, v for k, v in pairs thing} ``` - +
+ + +
```yuescript no_color = {k, v for k, v in pairs thing when k != "color"} ``` - +
+ + +
O operador **\*** também é suportado. Aqui criamos uma tabela de consulta de raiz quadrada para alguns números. @@ -159,14 +187,17 @@ numbers = [1, 2, 3, 4] sqrts = {i, math.sqrt i for i in *numbers} ``` - +
+ + +
A tupla chave-valor em uma compreensão de tabela também pode vir de uma única expressão, caso em que a expressão deve retornar dois valores. O primeiro é usado como chave e o segundo é usado como valor: @@ -177,14 +208,17 @@ tuples = [ ["hello", "world"], ["foo", "bar"]] tbl = {unpack tuple for tuple in *tuples} ``` - +
+ + +
## Slicing @@ -196,13 +230,16 @@ Aqui podemos definir os limites mínimo e máximo, pegando todos os itens com í slice = [item for item in *items[1, 5]] ``` - +
+ + +
Qualquer um dos argumentos do slice pode ser omitido para usar um padrão sensato. Neste exemplo, se o índice máximo for omitido, ele usa como padrão o comprimento da tabela. Isso pegará tudo exceto o primeiro elemento: @@ -210,13 +247,16 @@ Qualquer um dos argumentos do slice pode ser omitido para usar um padrão sensat slice = [item for item in *items[2,]] ``` - +
+ + +
Se o limite mínimo for omitido, ele usa como padrão 1. Aqui fornecemos apenas um tamanho de passo e deixamos os outros limites em branco. Isso pega todos os itens com índice ímpar: (1, 3, 5, …) @@ -224,13 +264,16 @@ Se o limite mínimo for omitido, ele usa como padrão 1. Aqui fornecemos apenas slice = [item for item in *items[,,2]] ``` - +
+ + +
Tanto o limite mínimo quanto o máximo podem ser negativos, o que significa que os limites são contados a partir do fim da tabela. @@ -239,14 +282,17 @@ Tanto o limite mínimo quanto o máximo podem ser negativos, o que significa que slice = [item for item in *items[-4,-1]] ``` - +
+ + +
O tamanho do passo também pode ser negativo, o que significa que os itens são tomados em ordem reversa. @@ -254,13 +300,16 @@ O tamanho do passo também pode ser negativo, o que significa que os itens são reverse_slice = [item for item in *items[-1,1,-1]] ``` - +
+ + +
### Expressão de slicing @@ -274,7 +323,9 @@ sub_list = items[2, 4] last_four_items = items[-4, -1] ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/data-structures/table-literals.md b/doc/src/content/docs/pt-br/doc/data-structures/table-literals.md similarity index 69% rename from doc/docs/pt-br/doc/data-structures/table-literals.md rename to doc/src/content/docs/pt-br/doc/data-structures/table-literals.md index 546aea4c..9a9f60f2 100644 --- a/doc/docs/pt-br/doc/data-structures/table-literals.md +++ b/doc/src/content/docs/pt-br/doc/data-structures/table-literals.md @@ -1,4 +1,8 @@ -# Literais de tabela +--- +title: Literais de tabela +sidebar: + order: 24 +--- Como no Lua, as tabelas são delimitadas por chaves. @@ -6,13 +10,16 @@ Como no Lua, as tabelas são delimitadas por chaves. some_values = {1, 2, 3, 4} ``` - +
+ + +
Diferente do Lua, atribuir um valor a uma chave em uma tabela é feito com **:** (em vez de **=**). @@ -24,7 +31,9 @@ some_values = { } ``` - +
+ + +
As chaves podem ser omitidas se uma única tabela de pares chave-valor está sendo atribuída. @@ -45,7 +55,9 @@ profile = favorite_foods: ["ice cream", "donuts"] ``` - +
+ + +
Quebras de linha podem ser usadas para delimitar valores em vez de vírgula (ou ambos): @@ -67,7 +80,9 @@ values = { } ``` - +
+ + +
Ao criar um literal de tabela em uma única linha, as chaves também podem ser omitidas: @@ -88,7 +104,9 @@ my_function dance: "Tango", partner: "none" y = type: "dog", legs: 4, tails: 1 ``` - +
+ + +
As chaves de um literal de tabela podem ser palavras-chave da linguagem sem precisar escapar: @@ -107,7 +126,9 @@ tbl = { } ``` - +
+ + +
Se você está construindo uma tabela a partir de variáveis e deseja que as chaves sejam iguais aos nomes das variáveis, então o operador de prefixo **:** pode ser usado: @@ -128,7 +150,9 @@ person = { :hair, :height, shoe_size: 40 } print_table :hair, :height ``` - +
+ + +
Se você quiser que a chave de um campo na tabela seja o resultado de uma expressão, então pode envolvê-la em **[ ]**, assim como no Lua. Você também pode usar um literal de string diretamente como chave, omitindo os colchetes. Isso é útil se sua chave tiver caracteres especiais. @@ -149,7 +174,9 @@ t = { } ``` - +
+ + +
As tabelas Lua têm tanto uma parte array quanto uma parte hash, mas às vezes é útil fazer uma distinção semântica entre as duas. Você pode usar **[ ]** em vez de **{ }** para declarar explicitamente uma tabela como um array, fazer isso impedirá que quaisquer pares chave-valor sejam escritos dentro dela. @@ -167,11 +195,14 @@ some_values = [1, 2, 3, 4] list_with_one_element = [1, ] ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/extras/license-mit.md b/doc/src/content/docs/pt-br/doc/extras/license-mit.md similarity index 95% rename from doc/docs/pt-br/doc/extras/license-mit.md rename to doc/src/content/docs/pt-br/doc/extras/license-mit.md index 0e00e90d..29b730cf 100644 --- a/doc/docs/pt-br/doc/extras/license-mit.md +++ b/doc/src/content/docs/pt-br/doc/extras/license-mit.md @@ -1,4 +1,8 @@ -# Licença: MIT +--- +title: "Licença: MIT" +sidebar: + order: 34 +--- Copyright (c) 2017-2026 Li Jin \ diff --git a/doc/src/content/docs/pt-br/doc/extras/mascot.md b/doc/src/content/docs/pt-br/doc/extras/mascot.md new file mode 100644 index 00000000..afed49b7 --- /dev/null +++ b/doc/src/content/docs/pt-br/doc/extras/mascot.md @@ -0,0 +1,43 @@ +--- +title: Mascote, Xiaoyu +sidebar: + order: 33 +--- + +## Sobre + +Xiaoyu, a Coelha Cibernética + +Xiaoyu (小玉, "pequeno jade") é uma coelha cibernética e a mascote oficial do projeto YueScript. Ela fica empoleirada em uma lua crescente, escrevendo YueScript em seu laptop. + +Seu titulo completo é Xiaoyu, a Coelha Cibernética (机兔小玉). Ela reflete o que o YueScript busca: limpo, expressivo e divertido. + +**[Tyson Tan](https://tysontan.com)** projetou e ilustrou Xiaoyu para o projeto de forma gratuita. Somos gratos pela sua contribuição. + +## Imagens + +Clique em qualquer imagem para abri-la em tamanho real. + +### Arte completa + + + Xiaoyu, arte completa com fundo + + +

Baixar PNG em tamanho real

+ +### Fundo transparente + + + Xiaoyu, fundo transparente + + +

Baixar PNG transparente

+ +### Arquivo .kra compactado + +

Baixar arquivo .kra compactado

+ +## Licença + +Xiaoyu é duplamente licenciada sob a [Licença MIT](https://opensource.org/licenses/MIT) e a Creative Commons [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/doc/docs/pt-br/doc/functions/backcalls.md b/doc/src/content/docs/pt-br/doc/functions/backcalls.md similarity index 67% rename from doc/docs/pt-br/doc/functions/backcalls.md rename to doc/src/content/docs/pt-br/doc/functions/backcalls.md index bc327a35..d2321cf7 100644 --- a/doc/docs/pt-br/doc/functions/backcalls.md +++ b/doc/src/content/docs/pt-br/doc/functions/backcalls.md @@ -1,4 +1,8 @@ -# Backcalls +--- +title: Backcalls +sidebar: + order: 16 +--- Backcalls são usados para desaninhar callbacks. Eles são definidos usando setas apontando para a esquerda como o último parâmetro, preenchendo por padrão uma chamada de função. Toda a sintaxe é basicamente a mesma das funções seta regulares, exceto que apenas aponta para o outro lado e o corpo da função não requer indentação. @@ -7,14 +11,17 @@ x <- f print "hello" .. x ``` - +
+ + +
Funções seta "fat" também estão disponíveis. @@ -23,14 +30,17 @@ Funções seta "fat" também estão disponíveis. print @value ``` - +
+ + +
Você pode especificar um placeholder para onde deseja que a função backcall vá como parâmetro. @@ -39,14 +49,17 @@ Você pode especificar um placeholder para onde deseja que a função backcall v x * 2 ``` - +
+ + +
Se você desejar ter mais código após seus backcalls, pode colocá-los em uma instrução do. E os parênteses podem ser omitidos com funções seta não-fat. @@ -59,7 +72,9 @@ result, msg = do print result, msg ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/functions/function-literals.md b/doc/src/content/docs/pt-br/doc/functions/function-literals.md similarity index 77% rename from doc/docs/pt-br/doc/functions/function-literals.md rename to doc/src/content/docs/pt-br/doc/functions/function-literals.md index 590af71b..acbb62c7 100644 --- a/doc/docs/pt-br/doc/functions/function-literals.md +++ b/doc/src/content/docs/pt-br/doc/functions/function-literals.md @@ -1,4 +1,8 @@ -# Literais de função +--- +title: Literais de função +sidebar: + order: 15 +--- Todas as funções são criadas usando uma expressão de função. Uma função simples é denotada usando a seta: **->**. @@ -7,14 +11,17 @@ my_function = -> my_function() -- chama a função vazia ``` - +
+ + +
O corpo da função pode ser uma instrução colocada diretamente após a seta, ou pode ser uma série de instruções indentadas nas linhas seguintes: @@ -26,7 +33,9 @@ func_b = -> print "The value:", value ``` - +
+ + +
Se uma função não tem argumentos, ela pode ser chamada usando o operador !, em vez de parênteses vazios. A invocação ! é a forma preferida de chamar funções sem argumentos. @@ -45,14 +55,17 @@ func_a! func_b() ``` - +
+ + +
Funções com argumentos podem ser criadas precedendo a seta com uma lista de nomes de argumentos entre parênteses: @@ -60,13 +73,16 @@ Funções com argumentos podem ser criadas precedendo a seta com uma lista de no sum = (x, y) -> print "sum", x + y ``` - +
+ + +
Funções podem ser chamadas listando os argumentos após o nome de uma expressão que avalia para uma função. Ao encadear chamadas de função, os argumentos são aplicados à função mais próxima à esquerda. @@ -77,7 +93,9 @@ print sum 10, 20 a b c "a", "b", "c" ``` - +
+ + +
Para evitar ambiguidade ao chamar funções, parênteses também podem ser usados para envolver os argumentos. Isso é necessário aqui para garantir que os argumentos certos sejam enviados às funções certas. @@ -94,13 +113,16 @@ Para evitar ambiguidade ao chamar funções, parênteses também podem ser usado print "x:", sum(10, 20), "y:", sum(30, 40) ``` - +
+ + +
Não deve haver espaço entre o parêntese de abertura e a função. @@ -111,14 +133,17 @@ sum = (x, y) -> x + y print "The sum is ", sum 10, 20 ``` - +
+ + +
E se você precisar retornar explicitamente, pode usar a palavra-chave return: @@ -126,13 +151,16 @@ E se você precisar retornar explicitamente, pode usar a palavra-chave return: sum = (x, y) -> return x + y ``` - +
+ + +
Assim como no Lua, as funções podem retornar múltiplos valores. A última instrução deve ser uma lista de valores separados por vírgulas: @@ -141,14 +169,17 @@ mystery = (x, y) -> x + y, x - y a, b = mystery 10, 20 ``` - +
+ + +
## Setas fat @@ -158,13 +189,16 @@ Como é um idioma em Lua enviar um objeto como primeiro argumento ao chamar um m func = (num) => @value + num ``` - +
+ + +
## Valores padrão de argumentos @@ -176,7 +210,9 @@ my_function = (name = "something", height = 100) -> print "My height is", height ``` - +
+ + +
Uma expressão de valor padrão de argumento é avaliada no corpo da função na ordem das declarações de argumentos. Por esse motivo, os valores padrão têm acesso aos argumentos declarados anteriormente. @@ -193,14 +230,17 @@ some_args = (x = 100, y = x + 1000) -> print x + y ``` - +
+ + +
## Considerações @@ -215,7 +255,9 @@ c = x -y d = x- z ``` - +
+ + +
A precedência do primeiro argumento de uma chamada de função pode ser controlada usando espaço em branco se o argumento for um literal de string. Em Lua, é comum omitir parênteses ao chamar uma função com uma única string ou literal de tabela. @@ -237,14 +280,17 @@ x = func"hello" + 100 y = func "hello" + 100 ``` - +
+ + +
## Argumentos multilinha @@ -262,7 +308,9 @@ cool_func 1, 2, 7, 8 ``` - +
+ + +
Este tipo de invocação pode ser aninhado. O nível de indentação é usado para determinar a qual função os argumentos pertencem. @@ -285,7 +334,9 @@ my_func 5, 6, 7, 5, 4 ``` - +
+ + +
Como as tabelas também usam vírgula como delimitador, esta sintaxe de indentação ajuda a deixar os valores fazerem parte da lista de argumentos em vez de fazerem parte da tabela. @@ -306,7 +358,9 @@ x = [ ] ``` - +
+ + +
Embora incomum, observe como podemos dar uma indentação mais profunda para argumentos de função se soubermos que usaremos uma indentação menor mais adiante. @@ -327,7 +382,9 @@ y = [ my_func 1, 2, 3, ] ``` - +
+ + +
A mesma coisa pode ser feita com outras instruções em nível de bloco como condicionais. Podemos usar o nível de indentação para determinar a qual instrução um valor pertence: @@ -354,7 +412,9 @@ if func 1, 2, 3, print "I am inside if" ``` - +
+ + +
## Desestruturação de parâmetros @@ -393,7 +454,9 @@ arg1 = {a: 0} f2 arg1, arg2 ``` - +
+ + +
## Expressão de retorno prefixada @@ -423,7 +487,9 @@ findFirstEven = (list): nil -> return sub ``` - +
+ + +
Isso é equivalente a: @@ -448,7 +515,9 @@ findFirstEven = (list) -> nil ``` - +
+ + +
A única diferença é que você pode mover a expressão de retorno final antes do token `->` ou `=>` para indicar o valor de retorno implícito da função como última instrução. Dessa forma, mesmo em funções com múltiplos loops aninhados ou ramificações condicionais, você não precisa mais escrever uma expressão de retorno no final do corpo da função, tornando a estrutura lógica mais direta e fácil de seguir. @@ -490,7 +560,9 @@ process = (...args) -> process 1, nil, 3, nil, 5 ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/functions/function-stubs.md b/doc/src/content/docs/pt-br/doc/functions/function-stubs.md similarity index 88% rename from doc/docs/pt-br/doc/functions/function-stubs.md rename to doc/src/content/docs/pt-br/doc/functions/function-stubs.md index 74b78213..a072fac2 100644 --- a/doc/docs/pt-br/doc/functions/function-stubs.md +++ b/doc/src/content/docs/pt-br/doc/functions/function-stubs.md @@ -1,4 +1,8 @@ -# Stubs de função +--- +title: Stubs de função +sidebar: + order: 17 +--- É comum passar uma função de um objeto como valor, por exemplo, passando um método de instância para uma função como callback. Se a função espera o objeto em que está operando como primeiro argumento, então você deve de alguma forma empacotar esse objeto com a função para que ela possa ser chamada corretamente. @@ -25,7 +29,9 @@ run_callback my_object.write run_callback my_object\write ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/getting-started/installation.md b/doc/src/content/docs/pt-br/doc/getting-started/installation.md similarity index 95% rename from doc/docs/pt-br/doc/getting-started/installation.md rename to doc/src/content/docs/pt-br/doc/getting-started/installation.md index c5ee875a..6a3c947a 100644 --- a/doc/docs/pt-br/doc/getting-started/installation.md +++ b/doc/src/content/docs/pt-br/doc/getting-started/installation.md @@ -1,4 +1,8 @@ -# Instalação +--- +title: Instalação +sidebar: + order: 2 +--- ## Módulo Lua diff --git a/doc/docs/pt-br/doc/getting-started/introduction.md b/doc/src/content/docs/pt-br/doc/getting-started/introduction.md similarity index 93% rename from doc/docs/pt-br/doc/getting-started/introduction.md rename to doc/src/content/docs/pt-br/doc/getting-started/introduction.md index c5b52d82..aa199898 100644 --- a/doc/docs/pt-br/doc/getting-started/introduction.md +++ b/doc/src/content/docs/pt-br/doc/getting-started/introduction.md @@ -1,4 +1,8 @@ -# Introdução +--- +title: Introdução +sidebar: + order: 1 +--- YueScript é uma linguagem dinâmica que compila para Lua. É um dialeto do [MoonScript](https://github.com/leafo/moonscript). O código escrito em YueScript é expressivo e extremamente conciso. É adequado para escrever lógica de aplicação variável com código mais manutenível e roda em ambientes Lua embutidos, como jogos ou servidores web. @@ -51,7 +55,9 @@ with apple export 🌛 = "Script da Lua" ``` - +
+ + +
## Sobre o Dora SSR diff --git a/doc/docs/pt-br/doc/getting-started/usage.md b/doc/src/content/docs/pt-br/doc/getting-started/usage.md similarity index 99% rename from doc/docs/pt-br/doc/getting-started/usage.md rename to doc/src/content/docs/pt-br/doc/getting-started/usage.md index c3b5dfe1..5f7c54c8 100644 --- a/doc/docs/pt-br/doc/getting-started/usage.md +++ b/doc/src/content/docs/pt-br/doc/getting-started/usage.md @@ -1,4 +1,8 @@ -# Uso +--- +title: Uso +sidebar: + order: 3 +--- ## Módulo Lua diff --git a/doc/docs/pt-br/doc/index.md b/doc/src/content/docs/pt-br/doc/index.md old mode 100755 new mode 100644 similarity index 60% rename from doc/docs/pt-br/doc/index.md rename to doc/src/content/docs/pt-br/doc/index.md index bf2d15a1..b013654e --- a/doc/docs/pt-br/doc/index.md +++ b/doc/src/content/docs/pt-br/doc/index.md @@ -1,10 +1,11 @@ --- title: Referência +sidebar: + order: 0 +tableOfContents: false --- -# Documentação do YueScript - -logo +YueScript logo Bem-vindo à documentação oficial do YueScript!
Aqui você encontra recursos da linguagem, uso, exemplos de referência e materiais úteis.
diff --git a/doc/docs/pt-br/doc/language-basics/attributes.md b/doc/src/content/docs/pt-br/doc/language-basics/attributes.md similarity index 63% rename from doc/docs/pt-br/doc/language-basics/attributes.md rename to doc/src/content/docs/pt-br/doc/language-basics/attributes.md index 18bc585e..6a22ba26 100644 --- a/doc/docs/pt-br/doc/language-basics/attributes.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/attributes.md @@ -1,4 +1,8 @@ -# Atributos +--- +title: Atributos +sidebar: + order: 8 +--- Suporte de sintaxe para atributos do Lua 5.4. E você ainda pode usar tanto a declaração `const` quanto `close` e obter verificação de constante e callback com escopo funcionando ao direcionar para versões do Lua abaixo da 5.4. @@ -7,14 +11,17 @@ const a = 123 close _ = : -> print "Fora do escopo." ``` - +
+ + +
Você pode fazer desestruturação com variáveis atribuídas como constante. @@ -23,14 +30,17 @@ const {:a, :b, c, d} = tb -- a = 1 ``` - +
+ + +
Você também pode declarar uma variável global como `const`. @@ -39,11 +49,14 @@ global const Constant = 123 -- Constant = 1 ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/language-basics/comment.md b/doc/src/content/docs/pt-br/doc/language-basics/comment.md similarity index 70% rename from doc/docs/pt-br/doc/language-basics/comment.md rename to doc/src/content/docs/pt-br/doc/language-basics/comment.md index 63160846..405525c4 100644 --- a/doc/docs/pt-br/doc/language-basics/comment.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/comment.md @@ -1,4 +1,8 @@ -# Comentário +--- +title: Comentário +sidebar: + order: 5 +--- ```yuescript -- Eu sou um comentário @@ -13,7 +17,9 @@ Está OK. func --[[port]] 3000, --[[ip]] "192.168.1.1" ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/language-basics/literals.md b/doc/src/content/docs/pt-br/doc/language-basics/literals.md similarity index 78% rename from doc/docs/pt-br/doc/language-basics/literals.md rename to doc/src/content/docs/pt-br/doc/language-basics/literals.md index 6db3f019..dc491fe3 100644 --- a/doc/docs/pt-br/doc/language-basics/literals.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/literals.md @@ -1,4 +1,8 @@ -# Literais +--- +title: Literais +sidebar: + order: 6 +--- Todos os literais primitivos do Lua podem ser usados. Isso se aplica a números, strings, booleanos e **nil**. @@ -13,7 +17,9 @@ some_string = "Aqui está uma string print "Tenho #{math.random! * 100}% de certeza." ``` - +
+ + +
## Literais numéricos @@ -36,7 +43,9 @@ hex = 0xEF_BB_BF binary = 0B10011 ``` - +
+ + +
## String multilinha estilo YAML @@ -58,7 +68,9 @@ str = | - #{expr} ``` - +
+ + +
Isso permite escrever texto estruturado multilinha convenientemente. Todas as quebras de linha e indentação são preservadas em relação à primeira linha não vazia, e expressões dentro de `#{...}` são interpoladas automaticamente como `tostring(expr)`. @@ -82,7 +95,9 @@ fn = -> return str ``` - +
+ + +
A indentação interna é preservada em relação ao prefixo comum removido, permitindo estruturas aninhadas limpas. @@ -104,7 +120,9 @@ str = | note: 'Ele disse: "#{Hello}!"' ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/language-basics/module.md b/doc/src/content/docs/pt-br/doc/language-basics/module.md similarity index 80% rename from doc/docs/pt-br/doc/language-basics/module.md rename to doc/src/content/docs/pt-br/doc/language-basics/module.md index ed131074..439d7126 100644 --- a/doc/docs/pt-br/doc/language-basics/module.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/module.md @@ -1,4 +1,8 @@ -# Módulo +--- +title: Módulo +sidebar: + order: 9 +--- ## Import @@ -29,7 +33,9 @@ do import "export" as {one, two, Something:{umm:{ch}}} ``` - +
+ + +
## Import Global @@ -69,7 +76,9 @@ do print concat ["a", tostring 1] ``` - +
+ + +
### Importação automática de variável global @@ -101,7 +111,9 @@ do FLAG = 123 ``` - +
+ + +
## Export @@ -144,7 +157,9 @@ export class Something umm: "cool" ``` - +
+ + +
Fazendo export nomeado com desestruturação. @@ -171,14 +187,17 @@ export :loadstring, to_lua: tolua = yue export {itemA: {:fieldA = 'default'}} = tb ``` - +
+ + +
Exportar itens nomeados do módulo sem criar variáveis locais. @@ -188,7 +207,9 @@ export. = items export["a-b-c"] = 123 ``` - +
+ + +
### Export sem nome @@ -215,7 +237,9 @@ export with tmp j = 2000 ``` - +
+ + +
### Export padrão @@ -242,7 +267,9 @@ export default -> 123 ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/language-basics/operator.md b/doc/src/content/docs/pt-br/doc/language-basics/operator.md similarity index 79% rename from doc/docs/pt-br/doc/language-basics/operator.md rename to doc/src/content/docs/pt-br/doc/language-basics/operator.md index 976cb435..6ece96fa 100644 --- a/doc/docs/pt-br/doc/language-basics/operator.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/operator.md @@ -1,4 +1,8 @@ -# Operador +--- +title: Operador +sidebar: + order: 7 +--- Todos os operadores binários e unários do Lua estão disponíveis. Além disso, **!=** é um alias para **~=**, e **\\** ou **::** podem ser usados para escrever uma chamada de função encadeada como `tb\func!` ou `tb::func!`. E o YueScript oferece alguns outros operadores especiais para escrever códigos mais expressivos. @@ -7,14 +11,17 @@ tb\func! if tb ~= nil tb::func! if tb != nil ``` - +
+ + +
## Comparações encadeadas @@ -29,7 +36,9 @@ print 1 <= a <= 10 -- saída: true ``` - +
+ + +
Observe o comportamento de avaliação das comparações encadeadas: @@ -67,7 +77,9 @@ print v(1) > v(2) <= v(3) ]] ``` - +
+ + +
A expressão do meio é avaliada apenas uma vez, em vez de duas vezes como seria se a expressão fosse escrita como `v(1) < v(2) and v(2) <= v(3)`. No entanto, a ordem das avaliações em uma comparação encadeada é indefinida. É fortemente recomendado não usar expressões com efeitos colaterais (como impressão) em comparações encadeadas. Se efeitos colaterais forem necessários, o operador de curto-circuito `and` deve ser usado explicitamente. @@ -105,14 +118,17 @@ tab = [] tab[] = "Value" ``` - +
+ + +
Você também pode usar o operador spread `...` para anexar todos os elementos de uma lista a outra: @@ -123,7 +139,9 @@ tbA[] = ...tbB -- tbA agora é [1, 2, 3, 4, 5, 6] ``` - +
+ + +
## Spread de tabela @@ -157,7 +176,9 @@ b = {4, 5, y: 1} merge = {...a, ...b} ``` - +
+ + +
### Spread de tabela de lista @@ -190,7 +212,9 @@ listCopy = [...source,] -- listCopy => [1, 2, 3] ``` - +
+ + +
## Indexação reversa de tabela @@ -212,7 +237,9 @@ second_last = data.items[#-1] data.items[#] = 1 ``` - +
+ + +
## Metatable @@ -246,7 +274,9 @@ print d.value close _ = : -> print "fora do escopo" ``` - +
+ + +
### Acesso à metatable @@ -280,7 +311,9 @@ tb.<> = __index: {item: "hello"} print tb.item ``` - +
+ + +
### Desestruturação de metatable @@ -302,14 +336,17 @@ Desestruture a metatable com chave de metamétodo cercada por **<>**. print item, new, close, getter ``` - +
+ + +
## Existência @@ -330,7 +367,9 @@ with? io.open "test.txt", "w" \close! ``` - +
+ + +
## Pipe @@ -367,7 +407,9 @@ readFile "example.txt" |> print ``` - +
+ + +
## Coalescência de nil @@ -397,7 +440,9 @@ func a ?? {} a ??= false ``` - +
+ + +
## Objeto implícito @@ -455,7 +501,9 @@ tb = ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/language-basics/whitespace.md b/doc/src/content/docs/pt-br/doc/language-basics/whitespace.md similarity index 79% rename from doc/docs/pt-br/doc/language-basics/whitespace.md rename to doc/src/content/docs/pt-br/doc/language-basics/whitespace.md index bad11d13..ddbf48c5 100644 --- a/doc/docs/pt-br/doc/language-basics/whitespace.md +++ b/doc/src/content/docs/pt-br/doc/language-basics/whitespace.md @@ -1,4 +1,8 @@ -# Espaço em branco +--- +title: Espaço em branco +sidebar: + order: 4 +--- YueScript é uma linguagem sensível a espaço em branco. Você precisa escrever blocos de código na mesma indentação com espaço **' '** ou tabulação **'\t'**, como corpo de função, lista de valores e alguns blocos de controle. E expressões contendo diferentes espaços em branco podem significar coisas diferentes. Tabulação é tratada como 4 espaços, mas é melhor não misturar o uso de espaços e tabulações. @@ -10,13 +14,16 @@ Uma instrução normalmente termina em uma quebra de linha. Você também pode u a = 1; b = 2; print a + b ``` - +
+ + +
## Encadeamento multilinha @@ -31,7 +38,9 @@ Rx.Observable \subscribe print ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/objects/object-oriented-programming.md b/doc/src/content/docs/pt-br/doc/objects/object-oriented-programming.md similarity index 81% rename from doc/docs/pt-br/doc/objects/object-oriented-programming.md rename to doc/src/content/docs/pt-br/doc/objects/object-oriented-programming.md index 01aeff39..51e710b5 100644 --- a/doc/docs/pt-br/doc/objects/object-oriented-programming.md +++ b/doc/src/content/docs/pt-br/doc/objects/object-oriented-programming.md @@ -1,4 +1,8 @@ -# Programação orientada a objetos +--- +title: Programação orientada a objetos +sidebar: + order: 26 +--- Nestes exemplos, o código Lua gerado pode parecer avassalador. É melhor focar primeiro no significado do código YueScript e depois olhar o código Lua se desejar conhecer os detalhes da implementação. @@ -16,7 +20,9 @@ class Inventory @items[name] = 1 ``` - +
+ + +
Uma classe é declarada com uma instrução class seguida de uma declaração semelhante a tabela onde todos os métodos e propriedades são listados. @@ -50,7 +57,9 @@ class User print tostring User "Yue" ``` - +
+ + +
Criar uma instância da classe é feito chamando o nome da classe como uma função. @@ -70,7 +80,9 @@ inv\add_item "t-shirt" inv\add_item "pants" ``` - +
+ + +
Como a instância da classe precisa ser enviada aos métodos quando são chamados, o operador \ é usado. @@ -102,7 +115,9 @@ b\give_item "shirt" print item for item in *a.clothes ``` - +
+ + +
A forma correta de evitar esse problema é criar o estado mutável do objeto no construtor: @@ -130,7 +146,9 @@ class Person @clothes = [] ``` - +
+ + +
## Herança @@ -152,7 +171,9 @@ class BackPack extends Inventory super name ``` - +
+ + +
Aqui estendemos nossa classe Inventory e limitamos a quantidade de itens que ela pode carregar. @@ -179,7 +201,9 @@ class Shelf class Cupboard extends Shelf ``` - +
+ + +
## Super @@ -218,7 +243,9 @@ class MyClass extends ParentClass assert super == ParentClass ``` - +
+ + +
**super** também pode ser usado no lado esquerdo de um Function Stub. A única diferença principal é que, em vez da função resultante estar vinculada ao valor de super, ela está vinculada a self. @@ -247,7 +275,9 @@ assert b.__class == BackPack print BackPack.size -- imprime 10 ``` - +
+ + +
## Objetos de classe @@ -278,13 +309,16 @@ O nome da classe quando foi declarada é armazenado como string no campo \_\_nam print BackPack.__name -- imprime Backpack ``` - +
+ + +
O objeto base é armazenado em \_\_base. Podemos modificar esta tabela para adicionar funcionalidade a instâncias que já foram criadas e às que ainda serão criadas. @@ -304,7 +338,9 @@ Things\some_func! assert Things().some_func == nil ``` - +
+ + +
Em expressões, podemos usar @@ para acessar um valor armazenado no **class de self. Assim, @@hello é abreviação para self.**class.hello. @@ -333,7 +370,9 @@ Counter! print Counter.count -- imprime 2 ``` - +
+ + +
A semântica de chamada de @@ é semelhante a @. Chamar um nome @@ passará a classe como primeiro argumento usando a sintaxe de dois pontos do Lua. @@ -356,13 +396,16 @@ A semântica de chamada de @@ é semelhante a @. Chamar um nome @@ passará a cl @@hello 1,2,3,4 ``` - +
+ + +
## Instruções de declaração de classe @@ -375,14 +418,17 @@ class Things @class_var = "hello world" ``` - +
+ + +
Estas expressões são executadas após todas as propriedades terem sido adicionadas à base. @@ -397,7 +443,9 @@ class MoreThings log "hello world: " .. secret ``` - +
+ + +
## Valores @ e @@ @@ -421,14 +470,17 @@ assert @ == self assert @@ == self.__class ``` - +
+ + +
Por exemplo, uma forma rápida de criar uma nova instância da mesma classe a partir de um método de instância usando @@: @@ -436,13 +488,16 @@ Por exemplo, uma forma rápida de criar uma nova instância da mesma classe a pa some_instance_method = (...) => @@ ... ``` - +
+ + +
## Promoção de propriedade no construtor @@ -462,7 +517,9 @@ class Something @@baz = baz ``` - +
+ + +
Você também pode usar esta sintaxe para uma função comum para inicializar os campos de um objeto. @@ -488,7 +546,9 @@ obj = new {}, 123, "abc" print obj ``` - +
+ + +
## Expressões de classe @@ -508,7 +569,9 @@ x = class Bucket add_drop: => @drops += 1 ``` - +
+ + +
## Classes anônimas @@ -529,7 +593,9 @@ BigBucket = class extends Bucket assert Bucket.__name == "BigBucket" ``` - +
+ + +
Você pode até omitir o corpo, significando que pode escrever uma classe anônima em branco assim: @@ -546,13 +613,16 @@ Você pode até omitir o corpo, significando que pode escrever uma classe anôni x = class ``` - +
+ + +
## Mistura de classes @@ -576,7 +646,9 @@ y\func! assert y.__class.__parent ~= X -- X não é pai de Y ``` - +
+ + +
diff --git a/doc/docs/pt-br/doc/objects/with-statement.md b/doc/src/content/docs/pt-br/doc/objects/with-statement.md similarity index 74% rename from doc/docs/pt-br/doc/objects/with-statement.md rename to doc/src/content/docs/pt-br/doc/objects/with-statement.md index 06986a45..1e9c4423 100644 --- a/doc/docs/pt-br/doc/objects/with-statement.md +++ b/doc/src/content/docs/pt-br/doc/objects/with-statement.md @@ -1,4 +1,8 @@ -# Instrução With +--- +title: Instrução With +sidebar: + order: 27 +--- Um padrão comum envolvendo a criação de um objeto é chamar uma série de funções e definir uma série de propriedades imediatamente após criá-lo. @@ -16,7 +20,9 @@ with Person! print .name ``` - +
+ + +
A instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso. @@ -35,14 +42,17 @@ file = with File "favorite_foods.txt" \set_encoding "utf8" ``` - +
+ + +
Expressões `with` suportam `break` com um valor: @@ -51,14 +61,17 @@ result = with obj break .value ``` - +
+ + +
Depois que `break value` é usado dentro de `with`, a expressão `with` deixa de retornar seu objeto-alvo e passa a retornar o valor de `break`. @@ -72,7 +85,9 @@ b = with obj -- b é .x, não obj ``` - +
+ + +
Diferente de `for` / `while` / `repeat` / `do`, `with` suporta apenas um valor de `break`. @@ -99,7 +115,9 @@ create_person = (name, relatives) -> me = create_person "Leaf", [dad, mother, sister] ``` - +
+ + +
Neste uso, with pode ser visto como uma forma especial do combinador K. @@ -122,7 +141,9 @@ with str := "Hello" print "upper:", \upper! ``` - +
+ + +
Você pode acessar chaves especiais com `[]` em uma instrução `with`. @@ -144,7 +166,9 @@ with tb [] = "abc" -- anexando a "tb" ``` - +
+ + +
`with?` é uma versão aprimorada da sintaxe `with`, que introduz uma verificação existencial para acessar com segurança objetos que podem ser nil sem verificações explícitas de null. @@ -165,11 +190,14 @@ with? obj print .name ``` - +
+ + +
diff --git a/doc/src/content/docs/pt-br/index.md b/doc/src/content/docs/pt-br/index.md new file mode 100644 index 00000000..434231e1 --- /dev/null +++ b/doc/src/content/docs/pt-br/index.md @@ -0,0 +1,41 @@ +--- +hero: + tagline: Uma linguagem encantadora que compila para Lua + image: + alt: YueScript + html: YueScript + actions: + - text: Início rápido → + link: /pt-br/doc/ + variant: primary + - text: Ver no GitHub + link: https://github.com/IppClub/YueScript + variant: minimal + icon: external +title: YueScript +sidebar: + order: -1 +template: splash +description: Uma linguagem encantadora que compila para Lua +--- + +
+
+

Fluxo de trabalho familiar do Lua

+

Escreva uma sintaxe concisa que compila para Lua legível, com saída previsível.

+
+
+

Recursos modernos de linguagem

+

Pipe, pattern matching, slicing e destructuring sem abrir mão da interoperabilidade com Lua.

+
+
+

Iteração rápida

+

Todo feedback é bem-vindo para ajudar a acelerar o desenvolvimento e a evolução da linguagem!

+
+
+ + diff --git a/doc/src/content/docs/pt-br/try/index.md b/doc/src/content/docs/pt-br/try/index.md new file mode 100644 index 00000000..ce64491b --- /dev/null +++ b/doc/src/content/docs/pt-br/try/index.md @@ -0,0 +1,9 @@ +--- +title: Compilador online do YueScript +sidebar: + order: 100 +--- + +Experimente YueScript no navegador com WASM. + +
diff --git a/doc/src/content/docs/try/index.md b/doc/src/content/docs/try/index.md new file mode 100644 index 00000000..4e4df0cb --- /dev/null +++ b/doc/src/content/docs/try/index.md @@ -0,0 +1,12 @@ +--- +prev: false +next: false +title: YueScript Online Compiler +sidebar: + order: 100 +tableOfContents: false +--- + +Try YueScript in the browser with WASM. + +
diff --git a/doc/docs/zh/doc/advanced/do.md b/doc/src/content/docs/zh/doc/advanced/do.md similarity index 64% rename from doc/docs/zh/doc/advanced/do.md rename to doc/src/content/docs/zh/doc/advanced/do.md index 2c149d26..c723cedf 100644 --- a/doc/docs/zh/doc/advanced/do.md +++ b/doc/src/content/docs/zh/doc/advanced/do.md @@ -1,4 +1,8 @@ -# do 语句 +--- +title: do 语句 +sidebar: + order: 30 +---   当用作语句时,do 语句的作用就像在 Lua 中差不多。 @@ -9,7 +13,9 @@ do print var -- 这里是nil ``` - +
+ + +
  月之脚本的 **do** 也可以用作表达式。允许你将多行代码的处理合并为一个表达式,并将 do 语句代码块的最后一个语句作为表达式返回的结果。 @@ -33,7 +40,9 @@ print counter! print counter! ``` - +
+ + +
```yuescript tbl = { @@ -56,7 +66,9 @@ tbl = { } ``` - +
+ + +
  `do` 表达式支持通过 `break` 打断执行流并提前返回多个值。 @@ -78,7 +91,9 @@ status, value = do break "small", n ``` - +
+ + +
diff --git a/doc/docs/zh/doc/advanced/line-decorators.md b/doc/src/content/docs/zh/doc/advanced/line-decorators.md similarity index 57% rename from doc/docs/zh/doc/advanced/line-decorators.md rename to doc/src/content/docs/zh/doc/advanced/line-decorators.md index 853e3960..a4970e70 100644 --- a/doc/docs/zh/doc/advanced/line-decorators.md +++ b/doc/src/content/docs/zh/doc/advanced/line-decorators.md @@ -1,4 +1,8 @@ -# 代码行修饰 +--- +title: 代码行修饰 +sidebar: + order: 29 +---   为了方便编写代码,循环语句和 if 语句可以应用于单行代码语句的末尾: @@ -6,13 +10,16 @@ print "你好,世界" if name == "Rob" ``` - +
+ + +
  修饰 for 循环的示例: @@ -20,13 +27,16 @@ print "你好,世界" if name == "Rob" print "项目: ", item for item in *items ``` - +
+ + +
  修饰 while 循环的示例: @@ -36,7 +46,9 @@ game\update! while game\isRunning! reader\parse_line! until reader\eof! ``` - +
+ + +
diff --git a/doc/docs/zh/doc/advanced/macro.md b/doc/src/content/docs/zh/doc/advanced/macro.md similarity index 85% rename from doc/docs/zh/doc/advanced/macro.md rename to doc/src/content/docs/zh/doc/advanced/macro.md index 0d7ee6dd..31ce62d1 100644 --- a/doc/docs/zh/doc/advanced/macro.md +++ b/doc/src/content/docs/zh/doc/advanced/macro.md @@ -1,4 +1,8 @@ -# 宏 +--- +title: 宏 +sidebar: + order: 28 +--- ## 常见用法 @@ -33,7 +37,9 @@ if $and f1!, f2!, f3! print "OK" ``` - +
+ + +
## 直接插入代码 @@ -96,7 +103,9 @@ end ]==] ``` - +
+ + +
## 导出宏 @@ -145,7 +155,9 @@ import "utils" as { [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ ``` - +
+ + +
## 内置宏 @@ -176,14 +189,17 @@ print $FILE -- 获取当前模块名称的字符串 print $LINE -- 获取当前代码行数:2 ``` - +
+ + +
## 用宏生成宏 @@ -207,7 +223,9 @@ print "有效的枚举类型:", $BodyType Static -- print "编译报错的枚举类型:", $BodyType Unknown ``` - +
+ + +
## 生成多行代码 @@ -246,7 +265,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
```yuescript macro default_conf = (conf) -> | @@ -271,7 +293,9 @@ love.conf = (t) -> $default_conf t ``` - +
+ + +
## 宏参数检查 @@ -299,7 +324,9 @@ macro printNumAndStr = (num `Num, str `String) -> | $printNumAndStr 123, "hello" ``` - +
+ + +
  如果需要做更加灵活的参数检查操作,可以使用内置的 `$is_ast` 宏函数在合适的位置进行手动检查。 @@ -324,7 +352,9 @@ macro printNumAndStr = (num, str) -> $printNumAndStr 123, "hello" ``` - +
+ + +
  更多关于可用 AST 节点的详细信息,请参考 [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp) 中大写的规则定义。 @@ -355,7 +386,9 @@ myFunc = -> return ``` - +
+ + +
  如果注解宏返回的是配置表,可选字段 `before` 可以控制生成结果插入到被注解语句之前还是之后。 @@ -388,7 +422,9 @@ tableB = {} return ``` - +
+ + +
  由于后面的语句会作为额外的宏参数传入,注解也可以从类声明生成注册代码。它同样可以使用普通宏支持的 AST 参数检查。 @@ -426,7 +463,9 @@ class Worker return ``` - +
+ + +
  注解也可以用来给函数注入包装代码。 @@ -461,7 +501,9 @@ $[ValidateNumberArgs] add = (a, b) -> a + b ``` - +
+ + +
  注解后面必须紧跟一条语句,而且不能作用在 `return` 语句上。如果被注解的语句正好位于代码块末尾,而你又需要拿到原始的语句 AST 形态,就需要额外补一个显式的 `return`,避免它被隐式返回表达式包起来。 diff --git a/doc/docs/zh/doc/advanced/the-yuescript-library.md b/doc/src/content/docs/zh/doc/advanced/the-yuescript-library.md similarity index 99% rename from doc/docs/zh/doc/advanced/the-yuescript-library.md rename to doc/src/content/docs/zh/doc/advanced/the-yuescript-library.md index 9565b018..964bc082 100644 --- a/doc/docs/zh/doc/advanced/the-yuescript-library.md +++ b/doc/src/content/docs/zh/doc/advanced/the-yuescript-library.md @@ -1,4 +1,8 @@ -# 月之脚本语言库 +--- +title: 月之脚本语言库 +sidebar: + order: 32 +--- 在 Lua 中使用 `local yue = require("yue")` 来访问。 diff --git a/doc/docs/zh/doc/advanced/try.md b/doc/src/content/docs/zh/doc/advanced/try.md similarity index 82% rename from doc/docs/zh/doc/advanced/try.md rename to doc/src/content/docs/zh/doc/advanced/try.md index ef90831b..5061b960 100644 --- a/doc/docs/zh/doc/advanced/try.md +++ b/doc/src/content/docs/zh/doc/advanced/try.md @@ -1,4 +1,8 @@ -# 错误处理 +--- +title: 错误处理 +sidebar: + order: 31 +---   用于统一进行 Lua 错误处理的便捷语法。 @@ -30,7 +34,9 @@ catch err print result ``` - +
+ + +
## 错误处理简化 @@ -84,7 +91,9 @@ catch e e ``` - +
+ + +
diff --git a/doc/docs/zh/doc/assignment/assignment.md b/doc/src/content/docs/zh/doc/assignment/assignment.md similarity index 75% rename from doc/docs/zh/doc/assignment/assignment.md rename to doc/src/content/docs/zh/doc/assignment/assignment.md index 7245e18d..70800adf 100644 --- a/doc/docs/zh/doc/assignment/assignment.md +++ b/doc/src/content/docs/zh/doc/assignment/assignment.md @@ -1,4 +1,8 @@ -# 赋值 +--- +title: 赋值 +sidebar: + order: 10 +---   月之脚本中定义的变量是动态类型的,并默认为局部变量。但你可以通过 **local** 和 **global** 声明来改变声明变量的作用范围。 @@ -8,7 +12,9 @@ a, b, c = 1, 2, 3 hello = 123 -- 访问现有的变量 ``` - +
+ + +
## 执行更新 @@ -33,7 +40,9 @@ s ..= "world" -- 如果执行更新的局部变量不存在,将新建一个局 arg or= "默认值" ``` - +
+ + +
## 链式赋值 @@ -57,14 +67,17 @@ a = b = c = d = e = 0 x = y = z = f! ``` - +
+ + +
## 显式声明局部变量 @@ -85,7 +98,9 @@ do B = 2 ``` - +
+ + +
## 显式声明全局变量 @@ -125,7 +141,9 @@ do local Temp = "一个局部值" ``` - +
+ + +
diff --git a/doc/docs/zh/doc/assignment/destructuring-assignment.md b/doc/src/content/docs/zh/doc/assignment/destructuring-assignment.md similarity index 75% rename from doc/docs/zh/doc/assignment/destructuring-assignment.md rename to doc/src/content/docs/zh/doc/assignment/destructuring-assignment.md index 469071f7..9ad8fa44 100644 --- a/doc/docs/zh/doc/assignment/destructuring-assignment.md +++ b/doc/src/content/docs/zh/doc/assignment/destructuring-assignment.md @@ -1,4 +1,8 @@ -# 解构赋值 +--- +title: 解构赋值 +sidebar: + order: 11 +---   解构赋值是一种快速从 Lua 表中按名称或基于数组中的位置提取值的方法。 @@ -13,7 +17,9 @@ thing = [1, 2] print a, b ``` - +
+ + +
  在解构表格字面量中,键代表从右侧读取的键,值代表读取的值将被赋予的名称。 @@ -39,7 +46,9 @@ print hello, the_day :day = obj -- 可以不带大括号进行简单的解构 ``` - +
+ + +
  这也适用于嵌套的数据结构: @@ -71,7 +81,9 @@ obj2 = { print first, second, color ``` - +
+ + +
  如果解构语句很复杂,也可以任意将其分散在几行中。稍微复杂一些的示例: @@ -99,7 +112,9 @@ print first, second, color } = obj2 ``` - +
+ + +
  有时候我们会需要从 Lua 表中提取值并将它们赋给与键同名的局部变量。为了避免编写重复代码,我们可以使用 **:** 前缀操作符: @@ -118,13 +134,16 @@ print first, second, color {:concat, :insert} = table ``` - +
+ + +
  这样的用法与导入语法有些相似。但我们可以通过混合语法重命名我们想要提取的字段: @@ -132,13 +151,16 @@ print first, second, color {:mix, :max, random: rand} = math ``` - +
+ + +
  在进行解构时,你可以指定默认值,如: @@ -146,13 +168,16 @@ print first, second, color {:name = "nameless", :job = "jobless"} = person ``` - +
+ + +
  在进行列表解构时,你可以使用`_`作为占位符: @@ -160,13 +185,16 @@ print first, second, color [_, two, _, four] = items ``` - +
+ + +
## 范围解构 @@ -180,7 +208,9 @@ print bulk -- 打印: {"second", "third", "fourth"} print last -- 打印: last ``` - +
+ + +
  展开运算符可以用在不同的位置来捕获不同的范围,并且你可以使用 `_` 作为占位符来表示你想跳过对应范围的捕获: @@ -205,7 +236,9 @@ print last -- 打印: last [first, ..._, last] = orders ``` - +
+ + +
## 在其它地方的解构赋值 @@ -234,7 +268,9 @@ for [left, right] in *tuples print left, right ``` - +
+ + +
  我们知道数组表中的每个元素都是一个两项的元组,所以我们可以直接在 for 语句的名称子句中使用解构来解包它。 diff --git a/doc/docs/zh/doc/assignment/if-assignment.md b/doc/src/content/docs/zh/doc/assignment/if-assignment.md similarity index 73% rename from doc/docs/zh/doc/assignment/if-assignment.md rename to doc/src/content/docs/zh/doc/assignment/if-assignment.md index 915b1d50..33fd448f 100644 --- a/doc/docs/zh/doc/assignment/if-assignment.md +++ b/doc/src/content/docs/zh/doc/assignment/if-assignment.md @@ -1,4 +1,8 @@ -# If 赋值 +--- +title: If 赋值 +sidebar: + order: 12 +---   `if` 和 `elseif` 代码块可以在条件表达式的位置进行赋值。在代码执行到要计算条件时,会首先进行赋值计算,并使用赋与的值作为分支判断的条件。赋值的变量仅在条件分支的代码块内有效,这意味着如果值不是真值,那么它就不会被用到。注意,你必须使用“海象运算符” `:=` 而不是 `=` 来做赋值。 @@ -7,14 +11,17 @@ if user := database.find_user "moon" print user.name ``` - +
+ + +
```yuescript if hello := os.getenv "hello" @@ -25,7 +32,9 @@ else print "什么都没有 :(" ``` - +
+ + +
  使用多个返回值的 If 赋值。只有第一个值会被检查,其他值都有同样的作用域。 @@ -46,7 +56,9 @@ if success, result := pcall -> "无报错地获取结果" print "好的" ``` - +
+ + +
## While 赋值 @@ -66,7 +79,9 @@ while byte := stream\read_one! print byte ``` - +
+ + +
diff --git a/doc/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md b/doc/src/content/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md similarity index 81% rename from doc/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md rename to doc/src/content/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md index 8a9acf49..39b9093a 100644 --- a/doc/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md +++ b/doc/src/content/docs/zh/doc/assignment/the-using-clause-controlling-destructive-assignment.md @@ -1,4 +1,8 @@ -# 使用 using 语句:防止破坏性赋值 +--- +title: 使用 using 语句:防止破坏性赋值 +sidebar: + order: 14 +---   Lua 的变量作用域是降低代码复杂度的重要工具。然而,随着代码量的增加,维护这些变量可能变得更加困难。比如,看看下面的代码片段: @@ -18,7 +22,9 @@ my_func! print i -- 将打印 0 ``` - +
+ + +
  在 `my_func` 中,我们不小心覆盖了变量 `i` 的值。虽然在这个例子中这个问题很明显,但在一个庞大的或者是由多人共同维护的代码库中,很难追踪每个变量的声明情况。 @@ -54,7 +61,9 @@ my_func! print i -- 打印 100,i 没有受到影响 ``` - +
+ + +
  using子句中可以填写多个用逗号分隔名称。指定可以访问和修改的外部变量的名称: @@ -83,7 +93,9 @@ my_func(22) print i, k -- 这些已经被更新 ``` - +
+ + +
diff --git a/doc/docs/zh/doc/assignment/varargs-assignment.md b/doc/src/content/docs/zh/doc/assignment/varargs-assignment.md similarity index 71% rename from doc/docs/zh/doc/assignment/varargs-assignment.md rename to doc/src/content/docs/zh/doc/assignment/varargs-assignment.md index cc9206e3..1103dd99 100644 --- a/doc/docs/zh/doc/assignment/varargs-assignment.md +++ b/doc/src/content/docs/zh/doc/assignment/varargs-assignment.md @@ -1,4 +1,8 @@ -# 可变参数赋值 +--- +title: 可变参数赋值 +sidebar: + order: 13 +---   你可以将函数返回的结果赋值给一个可变参数符号 `...`。然后使用 Lua 的方式访问其内容。 @@ -11,7 +15,9 @@ first = select 1, ... print ok, count, first ``` - +
+ + +
diff --git a/doc/docs/zh/doc/control-flow/conditionals.md b/doc/src/content/docs/zh/doc/control-flow/conditionals.md similarity index 69% rename from doc/docs/zh/doc/control-flow/conditionals.md rename to doc/src/content/docs/zh/doc/control-flow/conditionals.md index f8d2851b..e3c630e9 100644 --- a/doc/docs/zh/doc/control-flow/conditionals.md +++ b/doc/src/content/docs/zh/doc/control-flow/conditionals.md @@ -1,4 +1,8 @@ -# 条件语句 +--- +title: 条件语句 +sidebar: + order: 18 +--- ```yuescript have_coins = false @@ -8,7 +12,9 @@ else print "没有硬币" ``` - +
+ + +
  对于简单的语句,也可以使用简短的语法: @@ -27,14 +34,17 @@ have_coins = false if have_coins then print "有硬币" else print "没有硬币" ``` - +
+ + +
  因为 if 语句可以用作表达式,所以也可以这样写: @@ -43,14 +53,17 @@ have_coins = false print if have_coins then "有硬币" else "没有硬币" ``` - +
+ + +
  条件语句也可以作为表达式用在返回语句和赋值语句中: @@ -69,7 +82,9 @@ else print message -- 打印: 我很高 ``` - +
+ + +
  if 的反义词是 unless(相当于 if not,正如“如果”对应“除非”): @@ -95,26 +111,32 @@ unless os.date("%A") == "Monday" print "今天不是星期一!" ``` - +
+ + +
```yuescript print "你真幸运!" unless math.random! > 0.1 ``` - +
+ + +
## 范围表达式 @@ -130,7 +152,9 @@ if a in list print "检查`a`是否在列表中" ``` - +
+ + +
`in` 运算符也可以用于表,并支持 `not in` 变体来进行否定检查: @@ -157,7 +182,9 @@ not_exist = item not in list check = -> value not in table ``` - +
+ + +
单元素列表或表会检查与该元素的相等性: @@ -186,7 +214,9 @@ with tb c = a in [1] ``` - +
+ + +
diff --git a/doc/docs/zh/doc/control-flow/continue.md b/doc/src/content/docs/zh/doc/control-flow/continue.md similarity index 66% rename from doc/docs/zh/doc/control-flow/continue.md rename to doc/src/content/docs/zh/doc/control-flow/continue.md index 3b1a0934..dc3e093f 100644 --- a/doc/docs/zh/doc/control-flow/continue.md +++ b/doc/src/content/docs/zh/doc/control-flow/continue.md @@ -1,4 +1,8 @@ -# continue 语句 +--- +title: continue 语句 +sidebar: + order: 21 +---   继续语句可以用来跳出当前的循环迭代。 @@ -10,7 +14,9 @@ while i < 10 print i ``` - +
+ + +
  继续语句也可以与各种循环表达式一起使用,以防止当前的循环迭代结果累积到结果列表中。以下示例将数组表过滤为仅包含偶数的数组: @@ -31,7 +38,9 @@ odds = for x in *my_numbers x ``` - +
+ + +
diff --git a/doc/docs/zh/doc/control-flow/for-loop.md b/doc/src/content/docs/zh/doc/control-flow/for-loop.md similarity index 73% rename from doc/docs/zh/doc/control-flow/for-loop.md rename to doc/src/content/docs/zh/doc/control-flow/for-loop.md index 97e66f90..3d7a9d4a 100644 --- a/doc/docs/zh/doc/control-flow/for-loop.md +++ b/doc/src/content/docs/zh/doc/control-flow/for-loop.md @@ -1,4 +1,8 @@ -# for 循环 +--- +title: for 循环 +sidebar: + order: 19 +---   Lua 中有两种 for 循环形式,数字型和通用型: @@ -13,7 +17,9 @@ for key, value in pairs object print key, value ``` - +
+ + +
  可以使用切片和 **\*** 操作符,就像在列表推导中一样: @@ -35,14 +42,17 @@ for item in *items[2, 4] print item ``` - +
+ + +
  当代码语句只有一行时,循环语句也都可以写作更短的语法: @@ -52,7 +62,9 @@ for item in *items do print item for j = 1, 10, 3 do print j ``` - +
+ + +
  for 循环也可以用作表达式。for 循环主体中的最后一条语句会被强制转换为一个返回值的表达式,并会将表达式计算结果的值追加到一个作为结果的数组表中。 @@ -74,7 +87,9 @@ doubled_evens = for i = 1, 20 i ``` - +
+ + +
  此外,for 循环还支持带返回值的 break 语句,这样循环本身就可以作为一个表达式,在满足条件时提前退出并返回有意义的结果。for 循环表达式支持 `break` 返回多个值。 @@ -95,28 +111,34 @@ first_large = for n in *numbers break n if n > 10 ``` - +
+ + +
```yuescript key, score = for k, v in pairs data break k, v * 10 if k == "target" ``` - +
+ + +
  你还可以结合 for 循环表达式与 continue 语句来过滤值。 @@ -130,7 +152,9 @@ print func_a! -- 打印 nil print func_b! -- 打印 table 对象 ``` - +
+ + +
  这样做是为了避免在不需要返回循环结果的函数,创建无效的返回值表格。 diff --git a/doc/docs/zh/doc/control-flow/goto.md b/doc/src/content/docs/zh/doc/control-flow/goto.md similarity index 75% rename from doc/docs/zh/doc/control-flow/goto.md rename to doc/src/content/docs/zh/doc/control-flow/goto.md index 6d1cc89b..9726701d 100644 --- a/doc/docs/zh/doc/control-flow/goto.md +++ b/doc/src/content/docs/zh/doc/control-flow/goto.md @@ -1,4 +1,8 @@ -# Goto +--- +title: Goto +sidebar: + order: 22 +--- YueScript 支持 goto 语句和标签语法来控制程序流程,该语法遵循与 Lua 的 goto 语句相同的规则。**注意:** goto 语句需要 Lua 5.2 或更高版本。当编译目标是 Lua 5.1 时,使用 goto 语法将导致编译错误。 @@ -10,7 +14,9 @@ YueScript 支持 goto 语句和标签语法来控制程序流程,该语法遵 ::我的标签:: ``` - +
+ + +
goto 语句可以跳转到指定的标签: @@ -32,7 +39,9 @@ goto 开始 print "a 现在是 5" ``` - +
+ + +
goto 语句对于跳出深层嵌套循环非常有用: @@ -57,7 +67,9 @@ for z = 1, 10 ::完成:: ``` - +
+ + +
你也可以使用标签跳转到特定的循环层级: @@ -83,7 +96,9 @@ for z = 1, 10 ::继续z:: ``` - +
+ + +
## 注意事项 diff --git a/doc/docs/zh/doc/control-flow/switch.md b/doc/src/content/docs/zh/doc/control-flow/switch.md similarity index 80% rename from doc/docs/zh/doc/control-flow/switch.md rename to doc/src/content/docs/zh/doc/control-flow/switch.md index 69ba5b56..393f067e 100644 --- a/doc/docs/zh/doc/control-flow/switch.md +++ b/doc/src/content/docs/zh/doc/control-flow/switch.md @@ -1,4 +1,8 @@ -# switch 语句 +--- +title: switch 语句 +sidebar: + order: 23 +---   switch 语句是为了简化检查一系列相同值的if语句而提供的简写语法。要注意用于比较检查的目标值只会计算一次。和 if 语句一样,switch 语句在最后可以接一个 else 代码块来处理没有匹配的情况。在生成的 Lua 代码中,进行比较是使用 == 操作符完成的。switch 语句中也可以使用赋值表达式来储存临时变量值。 @@ -12,7 +16,9 @@ switch name := "Dan" print "我不认识你,你的名字是#{name}" ``` - +
+ + +
  switch 语句的 when 子句中可以通过使用逗号分隔的列表来匹配多个值。 @@ -41,7 +48,9 @@ next_number = switch b error "数字数得太大了!" ``` - +
+ + +
  我们可以使用 then 关键字在 when 子句的同一行上编写处理代码。else 代码块的后续代码中要写在同一行上不需要额外的关键字。 @@ -65,7 +75,9 @@ msg = switch math.random(1, 5) else "不太幸运" ``` - +
+ + +
  如果在编写 switch 语句时希望少写一个缩进,那么你可以把第一个 when 子句放在 switch 开始语句的第一行,然后后续的子语句就都可以都少写一个缩进。 @@ -91,7 +104,9 @@ else print "不太幸运" ``` - +
+ + +
  值得注意的是,在生成 Lua 代码时,我们要做检查的目标变量会放在 == 表达式的右侧。当你希望给 when 子句的比较对象定义一个 \_\_eq 元方法来重载判断逻辑时,可能会有用。 @@ -129,7 +145,9 @@ for item in *items print "尺寸 #{width}, #{height}" ``` - +
+ + +
  你可以使用默认值来选择性地解构表格的某些字段。 @@ -160,7 +179,9 @@ switch item print "Vec2 #{x}, #{y}" -- 表格解构仍然会通过 ``` - +
+ + +
  你也可以匹配数组元素、表格字段,甚至使用数组或表格字面量来匹配嵌套的结构。 @@ -188,7 +210,9 @@ switch tb print "1, 2, #{b}" ``` - +
+ + +
  匹配表格字段。 @@ -214,7 +239,9 @@ switch tb print "无效值" ``` - +
+ + +
  匹配嵌套的表格结构。 @@ -240,7 +268,9 @@ switch tb print "无效值" ``` - +
+ + +
  匹配表格数组。 @@ -267,7 +298,9 @@ switch tb print "匹配成功", fourth ``` - +
+ + +
  匹配一个列表并捕获特定范围内的元素。 @@ -293,7 +327,9 @@ switch segments print "Action:", action -- 打印: "view" ``` - +
+ + +
diff --git a/doc/docs/zh/doc/control-flow/while-loop.md b/doc/src/content/docs/zh/doc/control-flow/while-loop.md similarity index 66% rename from doc/docs/zh/doc/control-flow/while-loop.md rename to doc/src/content/docs/zh/doc/control-flow/while-loop.md index 0138d853..d6ede43b 100644 --- a/doc/docs/zh/doc/control-flow/while-loop.md +++ b/doc/src/content/docs/zh/doc/control-flow/while-loop.md @@ -1,4 +1,8 @@ -# while 循环 +--- +title: while 循环 +sidebar: + order: 20 +---   在月之脚本中的 while 循环支持几种不同的写法: @@ -11,7 +15,9 @@ while i > 0 while running == true do my_function! ``` - +
+ + +
```yuescript i = 10 @@ -33,7 +40,9 @@ until i == 0 until running == false do my_function! ``` - +
+ + +
  像 for 循环的语法一样,while 循环也可以作为一个表达式使用。while / until 循环表达式支持 `break` 返回多个值。 @@ -53,7 +63,9 @@ value, doubled = while true break n, n * 2 if n > 10 ``` - +
+ + +
  为了使函数返回 while 循环的累积列表值,必须明确使用返回语句返回 while 循环表达式。 @@ -77,7 +90,9 @@ repeat until i == 0 ``` - +
+ + +
  repeat 循环表达式同样支持 `break` 返回多个值: @@ -99,7 +115,9 @@ value, scaled = repeat until false ``` - +
+ + +
diff --git a/doc/docs/zh/doc/data-structures/comprehensions.md b/doc/src/content/docs/zh/doc/data-structures/comprehensions.md similarity index 72% rename from doc/docs/zh/doc/data-structures/comprehensions.md rename to doc/src/content/docs/zh/doc/data-structures/comprehensions.md index 62f08966..2f1abfe9 100644 --- a/doc/docs/zh/doc/data-structures/comprehensions.md +++ b/doc/src/content/docs/zh/doc/data-structures/comprehensions.md @@ -1,4 +1,8 @@ -# 推导式 +--- +title: 推导式 +sidebar: + order: 25 +---   推导式为我们提供了一种便捷的语法,通过遍历现有对象并对其值应用表达式来构造出新的表格。月之脚本有两种推导式:列表推导式和表格推导式。它们最终都是产生 Lua 表格;列表推导式将值累积到类似数组的表格中,而表格推导式允许你在每次遍历时设置新表格的键和值。 @@ -11,14 +15,17 @@ items = [1, 2, 3, 4] doubled = [item * 2 for i, item in ipairs items] ``` - +
+ + +
  可以使用 `when` 子句筛选新表中包含的项目: @@ -26,13 +33,16 @@ doubled = [item * 2 for i, item in ipairs items] slice = [item for i, item in ipairs items when i > 1 and i < 3] ``` - +
+ + +
  因为我们常常需要迭代数值索引表的值,所以引入了 **\*** 操作符来做语法简化。doubled 示例可以重写为: @@ -40,13 +50,16 @@ slice = [item for i, item in ipairs items when i > 1 and i < 3] doubled = [item * 2 for item in *items] ``` - +
+ + +
  在列表推导式中,你还可以使用展开操作符 `...` 来实现对列表嵌套层级进行扁平化的处理: @@ -59,7 +72,9 @@ flat = [...v for k,v in pairs data] -- flat 现在为 [1, 2, 3, 4, 5, 6] ``` - +
+ + +
  for 和 when 子句可以根据需要进行链式操作。唯一的要求是推导式中至少要有一个 for 子句。 @@ -84,7 +100,9 @@ points = [ [x, y] for x in *x_coords \ for y in *y_coords] ``` - +
+ + +
  在推导式中也可以使用简单的数值 for 循环: @@ -102,13 +121,16 @@ for y in *y_coords] evens = [i for i = 1, 100 when i % 2 == 0] ``` - +
+ + +
## 表格推导式 @@ -126,7 +148,9 @@ thing = { thing_copy = {k, v for k, v in pairs thing} ``` - +
+ + +
```yuescript no_color = {k, v for k, v in pairs thing when k != "color"} ``` - +
+ + +
  **\*** 操作符在表格推导式中能使用。在下面的例子里,我们为几个数字创建了一个平方根查找表。 @@ -159,14 +187,17 @@ numbers = [1, 2, 3, 4] sqrts = {i, math.sqrt i for i in *numbers} ``` - +
+ + +
  表格推导式中的键值元组也可以来自单个表达式,在这种情况下,表达式在计算后应返回两个值。第一个用作键,第二个用作值: @@ -177,14 +208,17 @@ tuples = [ ["hello", "world"], ["foo", "bar"]] tbl = {unpack tuple for tuple in *tuples} ``` - +
+ + +
## 切片 @@ -196,13 +230,16 @@ tbl = {unpack tuple for tuple in *tuples} slice = [item for item in *items[1, 5]] ``` - +
+ + +
  切片的任意参数都可以省略,并会使用默认值。在如下示例中,如果省略了最大索引边界,它默认为表的长度。使下面的代码取除第一个元素之外的所有元素: @@ -210,13 +247,16 @@ slice = [item for item in *items[1, 5]] slice = [item for item in *items[2,]] ``` - +
+ + +
  如果省略了最小边界,便默认会设置为 1。这里我们只提供一个步长,并留下其他边界为空。这样会使得代码取出所有奇数索引的项目:(1, 3, 5, …) @@ -224,13 +264,16 @@ slice = [item for item in *items[2,]] slice = [item for item in *items[,,2]] ``` - +
+ + +
  最小和最大边界都可以是负数,使用负数意味着边界是从表的末尾开始计算的。 @@ -239,14 +282,17 @@ slice = [item for item in *items[,,2]] slice = [item for item in *items[-4,-1]] ``` - +
+ + +
  切片的步长也可以是负数,这意味着元素会以相反的顺序被取出。 @@ -254,13 +300,16 @@ slice = [item for item in *items[-4,-1]] reverse_slice = [item for item in *items[-1,1,-1]] ``` - +
+ + +
### 切片表达式 @@ -274,7 +323,9 @@ sub_list = items[2, 4] last_four_items = items[-4, -1] ``` - +
+ + +
diff --git a/doc/docs/zh/doc/data-structures/table-literals.md b/doc/src/content/docs/zh/doc/data-structures/table-literals.md similarity index 69% rename from doc/docs/zh/doc/data-structures/table-literals.md rename to doc/src/content/docs/zh/doc/data-structures/table-literals.md index 11221709..8475bfcc 100644 --- a/doc/docs/zh/doc/data-structures/table-literals.md +++ b/doc/src/content/docs/zh/doc/data-structures/table-literals.md @@ -1,4 +1,8 @@ -# 表格字面量 +--- +title: 表格字面量 +sidebar: + order: 24 +---   和 Lua 一样,表格可以通过花括号进行定义。 @@ -6,13 +10,16 @@ some_values = {1, 2, 3, 4} ``` - +
+ + +
  但与Lua不同的是,给表格中的键赋值是用 **:**(而不是 **=**)。 @@ -24,7 +31,9 @@ some_values = { } ``` - +
+ + +
  如果只分配一个键值对的表格,可以省略花括号。 @@ -45,7 +55,9 @@ profile = favorite_foods: ["冰淇淋", "甜甜圈"] ``` - +
+ + +
  可以使用换行符而不使用逗号(或两者都用)来分隔表格中的值: @@ -67,7 +80,9 @@ values = { } ``` - +
+ + +
  创建单行表格字面量时,也可以省略花括号: @@ -88,7 +104,9 @@ my_function dance: "探戈", partner: "无" y = type: "狗", legs: 4, tails: 1 ``` - +
+ + +
  表格字面量的键可以使用 Lua 语言的关键字,而无需转义: @@ -107,7 +126,9 @@ tbl = { } ``` - +
+ + +
  如果你要构造一个由变量组成的表,并希望键与变量名相同,那么可以使用 **:** 前缀操作符: @@ -128,7 +150,9 @@ person = { :hair, :height, shoe_size: 40 } print_table :hair, :height ``` - +
+ + +
  如果你希望表中字段的键是某个表达式的结果,那么可以用 **[ ]** 包裹它,就像在 Lua 中一样。如果键中有任何特殊字符,也可以直接使用字符串字面量作为键,省略方括号。 @@ -149,7 +174,9 @@ t = { } ``` - +
+ + +
  Lua 的表同时具有数组部分和哈希部分,但有时候你会希望在书写 Lua 表时,对 Lua 表做数组和哈希不同用法的语义区分。然后你可以用 **[ ]** 而不是 **{ }** 来编写表示数组的 Lua 表,并且不允许在数组 Lua 表中写入任何键值对。 @@ -167,11 +195,14 @@ some_values = [ 1, 2, 3, 4 ] list_with_one_element = [ 1, ] ``` - +
+ + +
diff --git a/doc/docs/zh/doc/extras/license-mit.md b/doc/src/content/docs/zh/doc/extras/license-mit.md similarity index 94% rename from doc/docs/zh/doc/extras/license-mit.md rename to doc/src/content/docs/zh/doc/extras/license-mit.md index 79796637..c53f7cfa 100644 --- a/doc/docs/zh/doc/extras/license-mit.md +++ b/doc/src/content/docs/zh/doc/extras/license-mit.md @@ -1,4 +1,8 @@ -# MIT 许可证 +--- +title: MIT 许可证 +sidebar: + order: 34 +--- 版权 (c) 2017-2026 李瑾 \ diff --git a/doc/src/content/docs/zh/doc/extras/mascot.md b/doc/src/content/docs/zh/doc/extras/mascot.md new file mode 100644 index 00000000..6531ea93 --- /dev/null +++ b/doc/src/content/docs/zh/doc/extras/mascot.md @@ -0,0 +1,43 @@ +--- +title: 吉祥物,小玉 +sidebar: + order: 33 +--- + +## 简介 + +机兔小玉 + +小玉(Xiaoyu,意为"小小的玉")是一只赛博兔,也是 YueScript 项目的官方吉祥物。她坐在一弯新月上,用笔记本电脑写 YueScript。 + +她的全称是机兔小玉,体现了 YueScript 的追求:简洁、富有表现力、带着一点俏皮。 + +**[Tyson Tan](https://tysontan.com)** 为本项目免费设计和绘制了小玉,我们对此十分感谢。 + +## 图片 + +点击任意图片可查看原始尺寸。 + +### 完整画作 + + + 小玉,含背景的完整画作 + + +

下载完整 PNG

+ +### 透明背景 + + + 小玉,透明背景 + + +

下载透明背景 PNG

+ +### .kra 压缩文件 + +

下载 .kra 压缩文件

+ +## 许可证 + +小玉采用 [MIT 许可证](https://opensource.org/licenses/MIT) 和知识共享 [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 双重许可。 diff --git a/doc/docs/zh/doc/functions/backcalls.md b/doc/src/content/docs/zh/doc/functions/backcalls.md similarity index 68% rename from doc/docs/zh/doc/functions/backcalls.md rename to doc/src/content/docs/zh/doc/functions/backcalls.md index 7baac908..26473477 100644 --- a/doc/docs/zh/doc/functions/backcalls.md +++ b/doc/src/content/docs/zh/doc/functions/backcalls.md @@ -1,4 +1,8 @@ -# 反向回调 +--- +title: 反向回调 +sidebar: + order: 16 +---   反向回调用于减少函数回调的嵌套。它们使用指向左侧的箭头,并且默认会被定义为传入后续函数调用的最后一个参数。它的语法大部分与常规箭头函数相同,只是它指向另一方向,并且后续的函数体不需要进行缩进。 @@ -7,14 +11,17 @@ x <- f print "hello" .. x ``` - +
+ + +
  月之脚本也提供了粗箭头反向回调函数。 @@ -23,14 +30,17 @@ print "hello" .. x print @value ``` - +
+ + +
  你可以通过一个占位符指定回调函数的传参位置。 @@ -39,14 +49,17 @@ print @value x * 2 ``` - +
+ + +
  如果你希望在反向回调处理后继续编写更多其它的代码,可以使用 do 语句将不属于反向回调的代码分隔开。对于非粗箭头函数的反向回调,回调返回值的括号也是可以省略的。 @@ -59,7 +72,9 @@ result, msg = do print result, msg ``` - +
+ + +
diff --git a/doc/docs/zh/doc/functions/function-literals.md b/doc/src/content/docs/zh/doc/functions/function-literals.md similarity index 76% rename from doc/docs/zh/doc/functions/function-literals.md rename to doc/src/content/docs/zh/doc/functions/function-literals.md index 163d155a..702ffe31 100644 --- a/doc/docs/zh/doc/functions/function-literals.md +++ b/doc/src/content/docs/zh/doc/functions/function-literals.md @@ -1,4 +1,8 @@ -# 函数字面量 +--- +title: 函数字面量 +sidebar: + order: 15 +---   所有函数都是使用月之脚本的函数表达式创建的。一个简单的函数可以用箭头表示为:**->**。 @@ -7,14 +11,17 @@ my_function = -> my_function() -- 调用空函数 ``` - +
+ + +
  函数体可以是紧跟在箭头后的一个语句,或者是在后面的行上使用同样缩进的一系列语句: @@ -26,7 +33,9 @@ func_b = -> print "这个值是:", value ``` - +
+ + +
  如果一个函数没有参数,可以使用 **\!** 操作符调用它,而不是空括号。使用 **\!** 调用没有参数的函数是推荐的写法。 @@ -45,14 +55,17 @@ func_a! func_b() ``` - +
+ + +
  带有参数的函数可以通过在箭头前加上括号中的参数名列表来进行创建: @@ -60,13 +73,16 @@ func_b() sum = (x, y) -> print "数字的和", x + y ``` - +
+ + +
  函数可以通过在函数名后列出参数来调用。当对函数做嵌套的调用时,后面列出的参数会应用于左侧最近的函数。 @@ -77,7 +93,9 @@ print sum 10, 20 a b c "a", "b", "c" ``` - +
+ + +
  为了避免在调用函数时产生歧义,也可以使用括号将参数括起来。比如在以下的例子中是必需的,这样才能确保参数被传入到正确的函数。 @@ -94,13 +113,16 @@ a b c "a", "b", "c" print "x:", sum(10, 20), "y:", sum(30, 40) ``` - +
+ + +
  注意:函数名与开始括号之间不能有任何空格。 @@ -111,14 +133,17 @@ sum = (x, y) -> x + y print "数字的和是", sum 10, 20 ``` - +
+ + +
  如果你需要做显式返回,可以使用 return 关键字: @@ -126,13 +151,16 @@ print "数字的和是", sum 10, 20 sum = (x, y) -> return x + y ``` - +
+ + +
  就像在Lua中一样,函数可以返回多个值。最后一个语句必须是由逗号分隔的值列表: @@ -141,14 +169,17 @@ mystery = (x, y) -> x + y, x - y a, b = mystery 10, 20 ``` - +
+ + +
## 粗箭头 @@ -158,13 +189,16 @@ a, b = mystery 10, 20 func = (num) => @value + num ``` - +
+ + +
## 参数默认值 @@ -176,7 +210,9 @@ my_function = (name = "某物", height = 100) -> print "我的高度是", height ``` - +
+ + +
  函数参数的默认值表达式在函数体中会按参数声明的顺序进行计算。因此,在默认值的表达式中可以访问先前声明的参数。 @@ -193,14 +230,17 @@ some_args = (x = 100, y = x + 1000) -> print x + y ``` - +
+ + +
## 注意事项 @@ -215,7 +255,9 @@ c = x -y d = x- z ``` - +
+ + +
  当函数调用的第一个参数是字符串字面量时,可以通过空白控制其优先级。在 Lua 中,常见的写法是调用仅有一个字符串或表字面量参数的函数时省略括号。 @@ -237,14 +280,17 @@ x = func"hello" + 100 y = func "hello" + 100 ``` - +
+ + +
## 多行参数 @@ -262,7 +308,9 @@ cool_func 1, 2, 7, 8 ``` - +
+ + +
  这种调用方式可以做嵌套。并通过缩进级别来确定参数属于哪一个函数。 @@ -285,7 +334,9 @@ my_func 5, 6, 7, 5, 4 ``` - +
+ + +
  因为 Lua 表也使用逗号作为分隔符,这种缩进语法有助于让值成为参数列表的一部分,而不是 Lua 表的一部分。 @@ -306,7 +358,9 @@ x = [ ] ``` - +
+ + +
  有个不常见的写法可以注意一下,如果我们将在后面使用较低的缩进,我们可以为函数参数提供更深的缩进来区分列表的归属。 @@ -327,7 +382,9 @@ y = [ my_func 1, 2, 3, ] ``` - +
+ + +
  对于其它有代码块跟随的语句,比如条件语句,也可以通过小心安排缩进来做类似的事。比如我们可以通过调整缩进级别来控制一些值归属于哪个语句: @@ -354,7 +412,9 @@ if func 1, 2, 3, print "我在if内部" ``` - +
+ + +
## 参数解构 @@ -393,7 +454,9 @@ arg1 = {a: 0} f2 arg1, arg2 ``` - +
+ + +
## 前置返回表达式 @@ -423,7 +487,9 @@ findFirstEven = (list): nil -> return sub ``` - +
+ + +
  这个写法等价于: @@ -448,7 +515,9 @@ findFirstEven = (list) -> nil ``` - +
+ + +
  唯一的区别在于:你可以将函数的返回值表达式提前写在 `->` 或 `=>` 前,用以指示该函数应隐式返回该表达式的值。这样即使在多层循环或条件判断的场景下,也无需编写尾行悬挂的返回表达式,逻辑结构会更加直观清晰。 @@ -490,7 +560,9 @@ process = (...args) -> process 1, nil, 3, nil, 5 ``` - +
+ + +
diff --git a/doc/docs/zh/doc/functions/function-stubs.md b/doc/src/content/docs/zh/doc/functions/function-stubs.md similarity index 88% rename from doc/docs/zh/doc/functions/function-stubs.md rename to doc/src/content/docs/zh/doc/functions/function-stubs.md index 888c3ebb..5ed327a5 100644 --- a/doc/docs/zh/doc/functions/function-stubs.md +++ b/doc/src/content/docs/zh/doc/functions/function-stubs.md @@ -1,4 +1,8 @@ -# 函数存根 +--- +title: 函数存根 +sidebar: + order: 17 +---   在编程中,将对象的方法作为函数类型的值进行传递是一种常见做法,尤其是在将实例方法作为回调函数传递给其他函数的情形中。当目标函数需要将该对象作为其第一个参数时,我们需要找到一种方式将对象和函数绑定在一起,以便能够正确地调用该函数。 @@ -25,7 +29,9 @@ run_callback my_object.write run_callback my_object\write ``` - +
+ + +
diff --git a/doc/docs/zh/doc/getting-started/installation.md b/doc/src/content/docs/zh/doc/getting-started/installation.md similarity index 95% rename from doc/docs/zh/doc/getting-started/installation.md rename to doc/src/content/docs/zh/doc/getting-started/installation.md index 618da2ad..45705e99 100644 --- a/doc/docs/zh/doc/getting-started/installation.md +++ b/doc/src/content/docs/zh/doc/getting-started/installation.md @@ -1,4 +1,8 @@ -# 安装 +--- +title: 安装 +sidebar: + order: 2 +--- ## Lua 模块 diff --git a/doc/docs/zh/doc/getting-started/introduction.md b/doc/src/content/docs/zh/doc/getting-started/introduction.md similarity index 92% rename from doc/docs/zh/doc/getting-started/introduction.md rename to doc/src/content/docs/zh/doc/getting-started/introduction.md index 5cbb59fe..6e9a81d7 100644 --- a/doc/docs/zh/doc/getting-started/introduction.md +++ b/doc/src/content/docs/zh/doc/getting-started/introduction.md @@ -1,4 +1,8 @@ -# 介绍 +--- +title: 介绍 +sidebar: + order: 1 +--- 月之脚本(YueScript)是一种动态语言,可以编译为 Lua。它是 [MoonScript](https://github.com/leafo/moonscript) 的方言。用月之脚本编写的代码既有表现力又非常简洁。它适合编写一些更易于维护的代码,并在嵌入 Lua 的环境中运行,如游戏或网站服务器。 @@ -51,7 +55,9 @@ with apple export 🌛 = "月之脚本" ``` - +
+ + +
## 关于 Dora SSR diff --git a/doc/docs/zh/doc/getting-started/usage.md b/doc/src/content/docs/zh/doc/getting-started/usage.md similarity index 98% rename from doc/docs/zh/doc/getting-started/usage.md rename to doc/src/content/docs/zh/doc/getting-started/usage.md index b605e7ce..cc84a24c 100644 --- a/doc/docs/zh/doc/getting-started/usage.md +++ b/doc/src/content/docs/zh/doc/getting-started/usage.md @@ -1,4 +1,8 @@ -# 使用方法 +--- +title: 使用方法 +sidebar: + order: 3 +--- ## Lua 模块 diff --git a/doc/docs/zh/doc/index.md b/doc/src/content/docs/zh/doc/index.md old mode 100755 new mode 100644 similarity index 59% rename from doc/docs/zh/doc/index.md rename to doc/src/content/docs/zh/doc/index.md index 7611fc65..66040c84 --- a/doc/docs/zh/doc/index.md +++ b/doc/src/content/docs/zh/doc/index.md @@ -1,10 +1,11 @@ --- title: 参考手册 +sidebar: + order: 0 +tableOfContents: false --- -# 月之脚本文档 - -logo +YueScript logo 欢迎来到 月之脚本(YueScript) 官方文档!
这里收录了语言特性、用法、参考示例和资源。
diff --git a/doc/docs/zh/doc/language-basics/attributes.md b/doc/src/content/docs/zh/doc/language-basics/attributes.md similarity index 64% rename from doc/docs/zh/doc/language-basics/attributes.md rename to doc/src/content/docs/zh/doc/language-basics/attributes.md index 43bc5f96..bbbe362f 100644 --- a/doc/docs/zh/doc/language-basics/attributes.md +++ b/doc/src/content/docs/zh/doc/language-basics/attributes.md @@ -1,4 +1,8 @@ -# 属性 +--- +title: 属性 +sidebar: + order: 8 +---   月之脚本现在提供了 Lua 5.4 新增的叫做属性的语法支持。在月之脚本编译到的 Lua 目标版本低于 5.4 时,你仍然可以同时使用`const` 和 `close` 的属性声明语法,并获得常量检查和作用域回调的功能。 @@ -7,14 +11,17 @@ const a = 123 close _ = : -> print "超出范围。" ``` - +
+ + +
  你可以对进行解构得到的变量标记为常量。 @@ -23,14 +30,17 @@ const {:a, :b, c, d} = tb -- a = 1 ``` - +
+ + +
  你也可以声明全局变量为常量。 @@ -39,11 +49,14 @@ global const Constant = 123 -- Constant = 1 ``` - +
+ + +
diff --git a/doc/docs/zh/doc/language-basics/comment.md b/doc/src/content/docs/zh/doc/language-basics/comment.md similarity index 69% rename from doc/docs/zh/doc/language-basics/comment.md rename to doc/src/content/docs/zh/doc/language-basics/comment.md index 0e69979f..1c7d756f 100644 --- a/doc/docs/zh/doc/language-basics/comment.md +++ b/doc/src/content/docs/zh/doc/language-basics/comment.md @@ -1,4 +1,8 @@ -# 注释 +--- +title: 注释 +sidebar: + order: 5 +--- ```yuescript -- 我是一个注释 @@ -13,7 +17,9 @@ str = --[[ func --[[端口]] 3000, --[[ip]] "192.168.1.1" ``` - +
+ + +
diff --git a/doc/docs/zh/doc/language-basics/literals.md b/doc/src/content/docs/zh/doc/language-basics/literals.md similarity index 76% rename from doc/docs/zh/doc/language-basics/literals.md rename to doc/src/content/docs/zh/doc/language-basics/literals.md index 0837c714..be6706ae 100644 --- a/doc/docs/zh/doc/language-basics/literals.md +++ b/doc/src/content/docs/zh/doc/language-basics/literals.md @@ -1,4 +1,8 @@ -# 字面量 +--- +title: 字面量 +sidebar: + order: 6 +---   Lua 中的所有基本字面量都可以在月之脚本中使用。包括数字、字符串、布尔值和 **nil**。 @@ -13,7 +17,9 @@ some_string = "这是一个字符串 print "我有#{math.random! * 100}%的把握。" ``` - +
+ + +
## 数字字面量 @@ -36,7 +43,9 @@ hex = 0xEF_BB_BF binary = 0B10011 ``` - +
+ + +
## YAML 风格字符串 @@ -58,7 +68,9 @@ str = | - #{expr} ``` - +
+ + +
  其效果类似于原生 Lua 的多行拼接,所有文本(含换行)将被保留下来,并支持 `#{...}` 语法,通过 `tostring(expr)` 插入表达式结果。 @@ -82,7 +95,9 @@ fn = -> return str ``` - +
+ + +
  输出字符串中的 foo: 对齐到行首,不会带有函数缩进空格。保留内部缩进的相对结构,适合书写结构化嵌套样式的内容。 @@ -104,7 +120,9 @@ str = | note: 'He said: "#{Hello}!"' ``` - +
+ + +
diff --git a/doc/docs/zh/doc/language-basics/module.md b/doc/src/content/docs/zh/doc/language-basics/module.md similarity index 80% rename from doc/docs/zh/doc/language-basics/module.md rename to doc/src/content/docs/zh/doc/language-basics/module.md index 6c90f0e9..d909db71 100644 --- a/doc/docs/zh/doc/language-basics/module.md +++ b/doc/src/content/docs/zh/doc/language-basics/module.md @@ -1,4 +1,8 @@ -# 模块 +--- +title: 模块 +sidebar: + order: 9 +--- ## 导入 @@ -29,7 +33,9 @@ do import "export" as {one, two, Something:{umm:{ch}}} ``` - +
+ + +
## 导入全局变量 @@ -69,7 +76,9 @@ do print concat ["a", tostring 1] ``` - +
+ + +
### 自动全局变量导入 @@ -101,7 +111,9 @@ do FLAG = 123 ``` - +
+ + +
## 导出 @@ -144,7 +157,9 @@ export class Something umm: "cool" ``` - +
+ + +
  使用解构进行命名导出。 @@ -171,14 +187,17 @@ export :loadstring, to_lua: tolua = yue export {itemA: {:fieldA = '默认值'}} = tb ``` - +
+ + +
  从模块导出命名项目时,可以不用创建局部变量。 @@ -188,7 +207,9 @@ export. = items export["a-b-c"] = 123 ``` - +
+ + +
### 未命名导出 @@ -215,7 +237,9 @@ export with tmp j = 2000 ``` - +
+ + +
### 默认导出 @@ -242,7 +267,9 @@ export default -> 123 ``` - +
+ + +
diff --git a/doc/docs/zh/doc/language-basics/operator.md b/doc/src/content/docs/zh/doc/language-basics/operator.md similarity index 79% rename from doc/docs/zh/doc/language-basics/operator.md rename to doc/src/content/docs/zh/doc/language-basics/operator.md index 6e3721f7..29d6e041 100644 --- a/doc/docs/zh/doc/language-basics/operator.md +++ b/doc/src/content/docs/zh/doc/language-basics/operator.md @@ -1,4 +1,8 @@ -# 操作符 +--- +title: 操作符 +sidebar: + order: 7 +---   Lua 的所有二元和一元操作符在月之脚本中都是可用的。此外,**!=** 符号是 **~=** 的别名,而 **\\** 或 **::** 均可用于编写链式函数调用,如写作 `tb\func!` 或 `tb::func!`。此外月之脚本还提供了一些其他特殊的操作符,以编写更具表达力的代码。 @@ -7,14 +11,17 @@ tb\func! if tb ~= nil tb::func! if tb != nil ``` - +
+ + +
## 链式比较 @@ -29,7 +36,9 @@ print 1 <= a <= 10 -- 输出:true ``` - +
+ + +
  可以注意一下链式比较表达式的求值行为: @@ -67,7 +77,9 @@ print v(1) > v(2) <= v(3) ]] ``` - +
+ + +
  在上面的例子里,中间的表达式 `v(2)` 仅被计算一次,如果把表达式写成 `v(1) < v(2) and v(2) <= v(3)` 的方式,中间的 `v(2)` 才会被计算两次。在链式比较中,求值的顺序往往是未定义的。所以强烈建议不要在链式比较中使用具有副作用(比如做打印操作)的表达式。如果需要使用有副作用的函数,应明确使用短路 `and` 运算符来做连接。 @@ -105,14 +118,17 @@ tab = [] tab[] = "Value" ``` - +
+ + +
  你还可以使用展开操作符 `...` 来将一个列表中的所有元素追加到另一个列表中: @@ -123,7 +139,9 @@ tbA[] = ...tbB -- tbA 现在为 [1, 2, 3, 4, 5, 6] ``` - +
+ + +
## 表扩展 @@ -157,7 +176,9 @@ b = {4, 5, y: 1} merge = {...a, ...b} ``` - +
+ + +
### 列表表扩展 @@ -190,7 +212,9 @@ listCopy = [...source,] -- listCopy => [1, 2, 3] ``` - +
+ + +
## 表反向索引 @@ -212,7 +237,9 @@ second_last = data.items[#-1] data.items[#] = 1 ``` - +
+ + +
## 元表 @@ -246,7 +274,9 @@ print d.value close _ = : -> print "超出范围" ``` - +
+ + +
### 元表访问 @@ -280,7 +311,9 @@ tb.<> = __index: {item: "hello"} print tb.item ``` - +
+ + +
### 元表解构 @@ -302,14 +336,17 @@ print tb.item print item, new, close, getter ``` - +
+ + +
## 存在性 @@ -330,7 +367,9 @@ with? io.open "test.txt", "w" \close! ``` - +
+ + +
## 管道 @@ -367,7 +407,9 @@ readFile "example.txt" |> print ``` - +
+ + +
## 空值合并 @@ -397,7 +440,9 @@ func a ?? {} a ??= false ``` - +
+ + +
## 隐式对象 @@ -454,7 +500,9 @@ tb = tb: { } ``` - +
+ + +
diff --git a/doc/docs/zh/doc/language-basics/whitespace.md b/doc/src/content/docs/zh/doc/language-basics/whitespace.md similarity index 77% rename from doc/docs/zh/doc/language-basics/whitespace.md rename to doc/src/content/docs/zh/doc/language-basics/whitespace.md index e27165f3..18d64a2f 100644 --- a/doc/docs/zh/doc/language-basics/whitespace.md +++ b/doc/src/content/docs/zh/doc/language-basics/whitespace.md @@ -1,4 +1,8 @@ -# 空白 +--- +title: 空白 +sidebar: + order: 4 +---   月之脚本是一个对空白敏感的语言。你必须在相同的缩进中使用空格 **' '** 或制表符 **'\t'** 来编写一些代码块,如函数体、值列表和一些控制块。包含不同空白的表达式可能意味着不同的事情。制表符被视为4个空格,但最好不要混合使用空格和制表符。 @@ -10,13 +14,16 @@ a = 1; b = 2; print a + b ``` - +
+ + +
## 多行链式调用 @@ -31,7 +38,9 @@ Rx.Observable \subscribe print ``` - +
+ + +
diff --git a/doc/docs/zh/doc/objects/object-oriented-programming.md b/doc/src/content/docs/zh/doc/objects/object-oriented-programming.md similarity index 81% rename from doc/docs/zh/doc/objects/object-oriented-programming.md rename to doc/src/content/docs/zh/doc/objects/object-oriented-programming.md index 270c2b3b..f64db3ec 100644 --- a/doc/docs/zh/doc/objects/object-oriented-programming.md +++ b/doc/src/content/docs/zh/doc/objects/object-oriented-programming.md @@ -1,4 +1,8 @@ -# 面向对象编程 +--- +title: 面向对象编程 +sidebar: + order: 26 +---   在以下的示例中,月之脚本生成的 Lua 代码可能看起来会很复杂。所以最好主要关注月之脚本代码层面的意义,然后如果你想知道关于面向对象功能的实现细节,再查看 Lua 代码。 @@ -16,7 +20,9 @@ class Inventory @items[name] = 1 ``` - +
+ + +
  在月之脚本中采用面向对象的编程方式时,通常会使用类声明语句结合 Lua 表格字面量来做类定义。这个类的定义包含了它的所有方法和属性。在这种结构中,键名为 “new” 的成员扮演了一个重要的角色,是作为构造函数来使用。 @@ -48,7 +55,9 @@ class User print tostring User "Yue" ``` - +
+ + +
  为了创建类的一个新实例,可以将类名当作一个函数来调用,这样就可以生成并返回一个新的实例。 @@ -68,7 +78,9 @@ inv\add_item "t-shirt" inv\add_item "pants" ``` - +
+ + +
  在月之脚本的类中,由于需要将类的实例作为参数传入到调用的方法中,因此使用了 **\\** 操作符做类的成员函数调用。 @@ -100,7 +113,9 @@ b\give_item "shirt" print item for item in *a.clothes ``` - +
+ + +
  避免这个问题的正确方法是在构造函数中创建对象的可变状态: @@ -128,7 +144,9 @@ class Person @clothes = [] ``` - +
+ + +
## 继承 @@ -150,7 +169,9 @@ class BackPack extends Inventory super name ``` - +
+ + +
  在这一部分,我们对月之脚本中的 `Inventory` 类进行了扩展,加入了对可以携带物品数量的限制。 @@ -177,7 +199,9 @@ class Shelf class Cupboard extends Shelf ``` - +
+ + +
## super 关键字 @@ -214,7 +239,9 @@ class MyClass extends ParentClass assert super == ParentClass ``` - +
+ + +
  **super** 也可以用在函数存根的左侧。唯一的主要区别是,生成的函数不是绑定到 super 的值,而是绑定到 self。 @@ -243,7 +271,9 @@ assert b.__class == BackPack print BackPack.size -- 打印 10 ``` - +
+ + +
## 类对象 @@ -272,13 +303,16 @@ print BackPack.size -- 打印 10 print BackPack.__name -- 打印 Backpack ``` - +
+ + +
  基础对象被保存在一个名为 `__base` 的特殊表中。我们可以编辑这个表,以便为那些已经创建出来的实例和还未创建的实例增加新的功能。 @@ -298,7 +332,9 @@ Things\some_func! assert Things().some_func == nil ``` - +
+ + +
  在表达式中,我们可以使用 @@ 来访问存储在 `self.__class` 中的值。因此,`@@hello` 是 `self.__class.hello` 的简写。 @@ -327,7 +364,9 @@ Counter! print Counter.count -- 输出 2 ``` - +
+ + +
  @@ 的调用语义与 @ 类似。调用 @@ 时,会使用 Lua 的冒号语法将类作为第一个参数传入。 @@ -350,13 +390,16 @@ print Counter.count -- 输出 2 @@hello 1,2,3,4 ``` - +
+ + +
## 类声明语句 @@ -369,14 +412,17 @@ class Things @class_var = "hello world" ``` - +
+ + +
  这些表达式会在所有属性被添加到类的基对象后执行。 @@ -391,7 +437,9 @@ class MoreThings log "hello world: " .. secret ``` - +
+ + +
## @ 和 @@ 值 @@ -415,14 +464,17 @@ assert @ == self assert @@ == self.__class ``` - +
+ + +
  例如,使用 @@ 从实例方法快速创建同一类的新实例的方法: @@ -430,13 +482,16 @@ assert @@ == self.__class some_instance_method = (...) => @@ ... ``` - +
+ + +
## 构造属性提升 @@ -456,7 +511,9 @@ class Something @@baz = baz ``` - +
+ + +
  你也可以使用这种语法为一个函数初始化传入对象的字段。 @@ -482,7 +540,9 @@ obj = new {}, 123, "abc" print obj ``` - +
+ + +
## 类表达式 @@ -502,7 +563,9 @@ x = class Bucket add_drop: => @drops += 1 ``` - +
+ + +
## 匿名类 @@ -523,7 +587,9 @@ BigBucket = class extends Bucket assert Bucket.__name == "BigBucket" ``` - +
+ + +
  你甚至可以省略掉主体,这意味着你可以这样写一个空白的匿名类: @@ -540,13 +607,16 @@ assert Bucket.__name == "BigBucket" x = class ``` - +
+ + +
## 类混合 @@ -570,7 +640,9 @@ y\func! assert y.__class.__parent ~= X -- X 不是 Y 的父类 ``` - +
+ + +
diff --git a/doc/docs/zh/doc/objects/with-statement.md b/doc/src/content/docs/zh/doc/objects/with-statement.md similarity index 73% rename from doc/docs/zh/doc/objects/with-statement.md rename to doc/src/content/docs/zh/doc/objects/with-statement.md index 2b5b80ad..86dd4d98 100644 --- a/doc/docs/zh/doc/objects/with-statement.md +++ b/doc/src/content/docs/zh/doc/objects/with-statement.md @@ -1,4 +1,8 @@ -# with 语句 +--- +title: with 语句 +sidebar: + order: 27 +--- 在编写 Lua 代码时,我们在创建对象后的常见操作是立即调用这个对象一系列操作函数并设置一系列属性。 @@ -16,7 +20,9 @@ with Person! print .name ``` - +
+ + +
with 语句也可以用作一个表达式,并返回它的代码块正在处理的对象。 @@ -35,14 +42,17 @@ file = with File "favorite_foods.txt" \set_encoding "utf8" ``` - +
+ + +
`with` 表达式支持 `break` 返回一个值: @@ -51,14 +61,17 @@ result = with obj break .value ``` - +
+ + +
在 `with` 中使用 `break value` 后,`with` 表达式将不再返回其目标对象,而是返回 `break` 给出的值。 @@ -72,7 +85,9 @@ b = with obj -- b 是 .x,不是 obj ``` - +
+ + +
与 `for` / `while` / `repeat` / `do` 不同,`with` 只支持一个 break 返回值。 @@ -99,7 +115,9 @@ create_person = (name, relatives) -> me = create_person "Leaf", [dad, mother, sister] ``` - +
+ + +
在此用法中,with 可以被视为K组合子(k-combinator)的一种特殊形式。 @@ -122,7 +141,9 @@ with str := "你好" print "大写:", \upper! ``` - +
+ + +
你可以在 `with` 语句中使用 `[]` 访问特殊键。 @@ -144,7 +166,9 @@ with tb [] = "abc" -- 追加到 "tb" ``` - +
+ + +
`with?` 是 `with` 语法的一个增强版本,引入了存在性检查,用于在不显式判空的情况下安全访问可能为 nil 的对象。 @@ -165,11 +190,14 @@ with? obj print .name ``` - +
+ + +
diff --git a/doc/src/content/docs/zh/index.md b/doc/src/content/docs/zh/index.md new file mode 100644 index 00000000..ad1f883a --- /dev/null +++ b/doc/src/content/docs/zh/index.md @@ -0,0 +1,41 @@ +--- +hero: + tagline: 一门令人愉悦且可编译为 Lua 的语言 + image: + alt: 月之脚本 + html: 月之脚本 + actions: + - text: 快速上手 → + link: /zh/doc/ + variant: primary + - text: 在 GitHub 上查看 + link: https://github.com/IppClub/YueScript + variant: minimal + icon: external +title: 月之脚本 +sidebar: + order: -1 +template: splash +description: 一门令人愉悦且可编译为 Lua 的语言 +--- + +
+
+

熟悉的 Lua 工作流

+

更精简的语法,编译为可读 Lua,输出可预测、易集成。

+
+
+

现代语言特性

+

管道、模式匹配、切片与解构,同时保留 Lua 互操作性。

+
+
+

快速迭代

+

虚心接受用户反馈,以帮助改进和加速语言的开发和演进!

+
+
+ + diff --git a/doc/src/content/docs/zh/try/index.md b/doc/src/content/docs/zh/try/index.md new file mode 100644 index 00000000..321ad10e --- /dev/null +++ b/doc/src/content/docs/zh/try/index.md @@ -0,0 +1,12 @@ +--- +prev: false +next: false +title: 月之脚本的在线编译器 +sidebar: + order: 100 +tableOfContents: false +--- + +在这里试试 WASM 版的 YueScript 吧。 + +
diff --git a/doc/docs/.vitepress/grammars/yuescript.tmLanguage.json b/doc/src/grammars/yuescript.tmLanguage.json similarity index 100% rename from doc/docs/.vitepress/grammars/yuescript.tmLanguage.json rename to doc/src/grammars/yuescript.tmLanguage.json diff --git a/doc/src/locales.mjs b/doc/src/locales.mjs new file mode 100644 index 00000000..fbbbba7d --- /dev/null +++ b/doc/src/locales.mjs @@ -0,0 +1,15 @@ +export const locales = { + root: { label: "English", lang: "en-US" }, + "id-id": { label: "Bahasa Indonesia", lang: "id-ID" }, + de: { label: "Deutsch", lang: "de-DE" }, + "pt-br": { label: "Português (Brasil)", lang: "pt-BR" }, + zh: { label: "简体中文", lang: "zh-CN" }, +}; + +export const allInOneLabels = { + "en-US": "All-in-One View", + "id-ID": "Tampilan Satu Halaman", + "de-DE": "Alles auf einer Seite", + "pt-BR": "Visualização em página única", + "zh-CN": "单页视图", +}; diff --git a/doc/src/pages/[...locale]/all-in-one.astro b/doc/src/pages/[...locale]/all-in-one.astro new file mode 100644 index 00000000..a4f20bf2 --- /dev/null +++ b/doc/src/pages/[...locale]/all-in-one.astro @@ -0,0 +1,40 @@ +--- +import { getCollection, render } from 'astro:content'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; +import AggregateContent from '../../components/AggregateContent.astro'; +import { locales, allInOneLabels } from '../../locales.mjs'; + +interface Props { + locale: string; + lang: keyof typeof allInOneLabels; +} + +export function getStaticPaths() { + return Object.entries(locales).map(([locale, { lang }]) => ({ + params: { locale: locale === 'root' ? undefined : locale }, + props: { locale, lang }, + })); +} + +const { locale, lang } = Astro.props; +const entries = (await getCollection('docs', ({ id, data }) => { + const entryLocale = Object.keys(locales).find((key) => id === key || id.startsWith(`${key}/`)) ?? 'root'; + return !data.draft && data.template !== 'splash' && entryLocale === locale; +})).sort( + (a, b) => + (a.data.sidebar.order ?? Infinity) - (b.data.sidebar.order ?? Infinity) || + a.id.localeCompare(b.id), +); +const sections = await Promise.all( + entries.map(async (entry) => ({ entry, ...(await render(entry)) })), +); +--- + + + {sections.map(({ entry, Content }) => ( +
+

{entry.data.title}

+ +
+ ))} +
diff --git a/doc/src/styles/custom.css b/doc/src/styles/custom.css new file mode 100644 index 00000000..8ae41203 --- /dev/null +++ b/doc/src/styles/custom.css @@ -0,0 +1,681 @@ +@import "@fontsource/merriweather/400.css"; +@import "@fontsource/merriweather/700.css"; +@import "@fontsource/merriweather/900.css"; +@import "@fontsource/merriweather/400-italic.css"; +@import "@fontsource/merriweather/700-italic.css"; +@import "@fontsource/merriweather/900-italic.css"; + +@import "@fontsource/noto-serif-sc/400.css"; +@import "@fontsource/noto-serif-sc/700.css"; +@import "@fontsource/noto-serif-sc/900.css"; + +:root { + /* --- TYPOGRAPHY --- */ + --sl-font: + system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --sl-font-mono: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --font-serif: "Merriweather", "Noto Serif SC", serif; + + /* --- BRAND COLORS (Original Moon Gold) --- */ + --vp-c-brand-1: #b4ac8f; + --color-brand: #b4ac8f; + --color-on-brand: #0b0e14; +} + +:root[data-has-sidebar] { + --sl-content-width: 75ch; +} + +/* --- DARK MODE THEME (Midnight Blue) --- */ +:root, +:root[data-theme="dark"], +[data-theme="dark"] { + /* Brand Accent */ + --sl-color-accent-low: #2b271d; + --sl-color-accent: #b4ac8f; + --sl-color-accent-high: #d4ceb8; + + /* Deep Midnight Blue background (replaces standard grey) */ + --sl-color-bg: #0b0e14; + --sl-color-bg-nav: #1a1f2e; + --sl-color-bg-sidebar: #1a1f2e; + --sl-color-bg-inline-code: #1e293b; + --sl-color-bg-accent: #b4ac8f; + --sl-color-black: #0b0e14; + --sl-color-gray-6: #131722; + --sl-color-gray-5: #1e293b; + --sl-color-gray-4: #475569; + + /* Adjust border colors to blend with blue, not grey */ + --sl-color-hairline: #2b364b; + --sl-color-hairline-light: #2b364b; + --sl-color-hairline-shade: #0b0e14; + + /* Text Colors: Moonlight Silver */ + --sl-color-white: #f1f5f9; + --sl-color-text: #e2e8f0; + --sl-color-gray-1: #f1f5f9; + --sl-color-gray-2: #e2e8f0; + --sl-color-gray-3: #94a3b8; + --sl-color-text-accent: #d4ceb8; + --sl-color-text-invert: #0b0e14; + + /* Code block theme styling */ + --ec-codeBg: #1e1e1e; + --ec-frame-tabBg: #1a1f2e; +} + +/* --- LIGHT MODE THEME (Creamy Paper) --- */ +:root[data-theme="light"], +[data-theme="light"] { + /* Brand Accent */ + --sl-color-accent-low: #f4f1e8; + --sl-color-accent: #8c8260; + --sl-color-accent-high: #5c553d; + + /* A warmer, "creamy" paper feel instead of harsh white */ + --sl-color-bg: #fdfbf7; + --sl-color-bg-nav: #e9e5dc; + --sl-color-bg-sidebar: #e9e5dc; + --sl-color-bg-inline-code: #e9e5dc; + --sl-color-bg-accent: #b4ac8f; + --sl-color-black: #fdfbf7; + --sl-color-gray-7: #e9e5dc; + --sl-color-gray-6: #f2efe7; + --sl-color-gray-5: #c4bcae; + --sl-color-gray-4: #827969; + + /* Borders / Hairlines */ + --sl-color-hairline: #b8b0a0; + --sl-color-hairline-light: #c4bcae; + --sl-color-hairline-shade: #b8b0a0; + + /* Text Colors: Deep Navy instead of pure black for softer contrast */ + --sl-color-white: #0b1220; + --sl-color-text: #111827; + --sl-color-gray-1: #111827; + --sl-color-gray-2: #1f2937; + --sl-color-gray-3: #374151; + --sl-color-text-accent: var(--sl-color-accent-high); + --sl-color-text-invert: #ffffff; + + /* Code block theme styling */ + --ec-codeBg: #ffffff; + --ec-frame-tabBg: var(--sl-color-bg-nav); +} + +/* Shared details keep both themes legible during interaction. */ +:where(a, button, input, textarea, output, select, summary):focus-visible { + outline: 2px solid var(--sl-color-text-accent); + outline-offset: 3px; +} + +.header :where(a, button, select):focus-visible { + outline-offset: 2px; +} + +:where(starlight-theme-select, starlight-lang-select) + label:has(select:focus-visible) { + z-index: 1; +} + +:where(a, button, select, summary) { + touch-action: manipulation; + -webkit-tap-highlight-color: rgba(180, 172, 143, 0.3); +} + +:where(h1, h2, h3, h4, h5, h6, article[id]) { + scroll-margin-top: 1.5rem; +} + +.sidebar-pane { + overscroll-behavior: contain; +} + +/* Utopia-style gutters collapse on narrow or short viewports. */ +dialog { + --dialog-gutter: clamp(0rem, min(5vw - 2.4rem, 10dvh - 3rem), 2rem); + --dialog-available-height: calc(100dvh - var(--dialog-gutter) * 4); + inset: 0; + margin: auto; + width: min( + max( + var(--dialog-max-width, 68.75rem), + calc(100vw - var(--dialog-gutter) * 32) + ), + calc(100% - var(--dialog-gutter) * 2) + ); + max-width: none; + height: fit-content; + min-height: min( + var(--dialog-available-height), + max(15rem, calc(100dvh - var(--dialog-gutter) * 24)) + ); + max-height: var(--dialog-available-height); + border-width: min(1px, var(--dialog-gutter)); + border-radius: min(0.5rem, var(--dialog-gutter)); +} + +site-search dialog { + --dialog-max-width: 40rem; +} + +@media (min-width: 48rem) { + site-search dialog { + min-height: 0; + } +} + +site-search .dialog-frame { + padding: clamp(1rem, 0.8rem + 1vw, 1.5rem); +} + +site-search button[data-close-modal] { + display: flex; +} + +site-search #starlight__search { + --sl-search-cancel-space: 5rem; +} + +:root:has(#yue-compiler-dialog[open]) { + overflow: hidden; +} + +header.header { + border-left: env(safe-area-inset-left) solid transparent; + border-right: env(safe-area-inset-right) solid transparent; +} + +@media (pointer: fine) { + html { + overscroll-behavior: none; + } +} + +::selection { + background: var(--sl-color-accent-high); + color: var(--sl-color-black); +} + +.sl-markdown-content a { + text-underline-offset: 0.18em; +} + +.sidebar-content a:not([aria-current="page"]):hover, +.sidebar-content summary:hover { + background: var(--sl-color-gray-6); + border-radius: 0.25rem; +} + +:root[data-theme="light"] site-search button[data-open-modal] { + border-color: var(--sl-color-gray-4); +} + +/* --- HEADINGS: Apply the Serif Font --- */ +h1, +h2, +h3, +h4, +h5, +h6, +.site-title, +.hero h1, +.hero [data-page-title] { + font-family: "Merriweather", "Noto Serif SC", serif !important; + letter-spacing: -0.02em; + text-wrap: balance; +} + +.site-title { + font-size: 1.1rem; + font-weight: 700; + gap: 0.5rem; +} + +.site-title img { + height: 1.75rem; + flex-shrink: 0; + filter: brightness(0) invert(var(--_logo-invert, 0)); +} + +:root:not([data-theme="light"]) .site-title img, +[data-theme="dark"] .site-title img { + --_logo-invert: 1; +} + +/* --- NAVBAR SELECTS (THEME & LANGUAGE) --- */ +starlight-theme-select label { + --sl-select-width: auto-fit !important; +} + +starlight-lang-select label { + --sl-select-width: auto-fit !important; +} + +starlight-theme-select select, +starlight-lang-select select { + width: auto !important; + min-width: calc(var(--sl-select-width) + var(--sl-inline-padding) * 2); + field-sizing: content; + background-color: var(--sl-color-bg-nav); + color: var(--sl-color-gray-2); +} + +@media (width < 50rem) { + .mobile-preferences { + gap: 0.75rem; + padding-block: 1rem; + border-top-color: var(--sl-color-hairline); + } + + .mobile-preferences .social-icons { + width: 100%; + gap: 0.5rem; + margin: 0; + padding: 0; + } + + .mobile-preferences .social-icons a { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2.75rem; + min-height: 2.75rem; + margin: 0; + border: 1px solid var(--sl-color-hairline); + border-radius: 0.5rem; + background-color: var(--sl-color-bg-nav); + } + + .mobile-preferences .social-icons .try-link { + margin-inline-end: auto; + padding-inline: 1rem; + border-color: var(--color-brand); + background-color: var(--color-brand); + color: var(--color-on-brand); + } + + .mobile-preferences :is(starlight-theme-select, starlight-lang-select) { + flex: 1 1 auto; + min-width: 0; + } + + .mobile-preferences label { + border: 1px solid var(--sl-color-hairline); + border-radius: 0.5rem; + background-color: var(--sl-color-bg-nav); + } + + .mobile-preferences select { + width: 100% !important; + min-height: 2.75rem; + margin: 0; + border-radius: inherit; + background-color: transparent; + } + + .mobile-preferences .label-icon { + inset-inline-start: 0.5rem; + } + + .mobile-preferences .caret { + inset-inline-end: 0.5rem; + } +} + +/* Make the Hero Title (YueScript) feel more "Editorial" */ +.hero h1, +.hero [data-page-title] { + font-weight: 900 !important; + color: var(--sl-color-accent) !important; +} + +/* Utopia-style spacing interpolates between 20rem and 90rem viewports. */ +[data-has-hero] { + --home-space-xs: clamp(0.5rem, 0.4286rem + 0.3571vw, 0.75rem); + --home-space-s: clamp(1rem, 0.8571rem + 0.7143vw, 1.5rem); + --home-space-m: clamp(1.5rem, 1.2143rem + 1.4286vw, 2.5rem); + --home-space-l: clamp(2rem, 1.7143rem + 1.4286vw, 3rem); + --sl-main-pad: 0 0 var(--home-space-m); +} + +[data-has-hero] .content-panel { + padding: var(--home-space-s); +} + +[data-has-hero] .sl-container { + margin-inline: auto; +} + +[data-has-hero] .hero { + display: flex; + flex-wrap: wrap-reverse; + gap: var(--home-space-l); + padding-block: var(--home-space-s); + container-type: inline-size; + container-name: hero; +} + +[data-has-hero] .hero > .stack { + order: 1; + flex: 2 1 26rem; + min-width: 0; + gap: var(--home-space-m); + text-align: start; +} + +[data-has-hero] .hero .copy { + align-items: flex-start; + gap: var(--home-space-s); +} + +[data-has-hero] .hero h1 { + font-size: clamp(2.25rem, 1.75rem + 2.5vw, 4rem); +} + +[data-has-hero] .hero .tagline { + font-size: clamp(1rem, 0.9286rem + 0.3571vw, 1.25rem); +} + +[data-has-hero] .hero .actions { + justify-content: flex-start; + align-items: center; + gap: var(--home-space-xs) var(--home-space-m); +} + +/* Center text and buttons when the hero container is narrow enough + that the image wraps above the text stack. */ +@container hero (max-width: 67rem) { + [data-has-hero] .hero > .stack { + text-align: center; + } + + [data-has-hero] .hero .copy { + align-items: center; + } + + [data-has-hero] .hero .actions { + justify-content: center; + } +} + +[data-has-hero] .hero .sl-link-button { + font-size: clamp(0.875rem, 0.8393rem + 0.1786vw, 1rem); + padding-block: var(--home-space-xs); +} + +[data-has-hero] .hero .sl-link-button.primary { + padding: var(--home-space-xs) var(--home-space-s) !important; +} + +[data-has-hero] .hero > img, +[data-has-hero] .hero > .hero-html { + order: 2; + flex: 1 1 18rem; + min-width: 0; + width: auto; + margin: 0; + justify-content: center; +} + +[data-has-hero] .hero > img, +[data-has-hero] .hero > .hero-html img { + display: block; + height: auto; + max-height: 30rem; + object-fit: contain; +} + +[data-has-hero] .hero > .hero-html img { + width: min(100%, clamp(14rem, 11.8571rem + 10.7143vw, 21.5rem)); +} + +[data-has-hero] .hero > .hero-html a { + display: flex; + justify-content: center; + align-items: center; + width: 100%; +} + +/* --- BUTTONS --- */ +/* Dark labels keep the original gold fill readable in both themes. */ +.sl-link-button.primary { + color: var(--color-on-brand) !important; + background-color: var(--vp-c-brand-1) !important; + border-color: var(--vp-c-brand-1) !important; + font-weight: 600 !important; + padding: 0.6rem 1.4rem !important; + transition: + background-color 0.15s ease, + opacity 0.15s ease; +} + +.sl-link-button.primary:hover { + background-color: #a39b7d !important; + border-color: #a39b7d !important; +} + +button[data-yue-compile] { + border: none; + display: inline-block; + font-size: 14px; + font-weight: 500; + color: var(--color-on-brand) !important; + background-color: var(--vp-c-brand-1) !important; + text-decoration: none; + padding: 0.35rem 0.85rem; + border-radius: 4px; + transition: background-color 0.15s ease; + box-sizing: border-box; + border-bottom: 1px solid #9c9371; + cursor: pointer; + margin-bottom: 1rem; + min-height: 2.75rem; +} + +.sl-markdown-content img { + height: auto; +} + +button[data-yue-compile]:hover { + background-color: #a39b7d !important; +} + +/* --- HOME PAGE FEATURES & FOOTER --- */ +[data-has-hero] .sl-markdown-content { + margin: var(--home-space-m) 0 0; + padding: 0; +} + +.features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); + gap: var(--home-space-s); + margin: 0; +} + +.feature { + margin: 0; + background-color: var(--sl-color-gray-6); + border: 1px solid var(--sl-color-hairline); + border-radius: 12px; + padding: var(--home-space-s); + display: flex; + flex-direction: column; + transition: + border-color 0.2s ease, + transform 0.2s ease; +} + +.feature:hover { + border-color: var(--vp-c-brand-1); +} + +.feature h2, +.feature h3 { + margin-top: 0 !important; + margin-bottom: 0.5rem !important; + font-size: 1.2rem !important; + color: var(--sl-color-white); + font-family: "Merriweather", "Noto Serif SC", serif !important; + letter-spacing: -0.02em; +} + +.feature p { + margin: 0 !important; + font-size: 0.95rem; + line-height: 1.6; + color: var(--sl-color-gray-3); +} + +.home-footer { + border-top: 1px solid var(--sl-color-hairline); + padding: var(--home-space-m) 0 0; + margin-top: var(--home-space-l); + text-align: center; +} + +.home-footer p { + margin: 0 !important; + line-height: 24px; + font-size: 14px; + font-weight: 500; + color: var(--sl-color-gray-3); +} + +@media (prefers-reduced-motion: reduce) { + .sl-link-button.primary, + button[data-yue-compile], + .feature { + transition: none; + } +} + +/* Prism theme for YueCompiler output (shikijs/themes light-plus & dark-plus) */ +.code-output, +.code-output code { + background: #ffffff; + color: #000000; + font-size: 14px; +} + +:root:not([data-theme="light"]) .code-output, +:root:not([data-theme="light"]) .code-output code, +[data-theme="dark"] .code-output, +[data-theme="dark"] .code-output code { + background: #1e1e1e; + color: #d4d4d4; +} + +/* light-plus */ +.code-output .token.comment { + color: #008000; +} + +.code-output .token.keyword { + color: #af00db; +} + +.code-output .token.operator, +.code-output .token.punctuation { + color: #000000; +} + +.code-output .token.string, +.code-output .token.char { + color: #a31515; +} + +.code-output .token.regex { + color: #811f3f; +} + +.code-output .token.variable, +.code-output .token.parameter { + color: #001080; +} + +.code-output .token.number, +.code-output .token.boolean, +.code-output .token.constant { + color: #098658; +} + +.code-output .token.function { + color: #795e26; +} + +.code-output .token.class-name, +.code-output .token.builtin { + color: #267f99; +} + +.code-output .token.invalid { + color: #cd3131; +} + +/* dark-plus */ +:root:not([data-theme="light"]) .code-output .token.comment, +[data-theme="dark"] .code-output .token.comment { + color: #6a9955; +} + +:root:not([data-theme="light"]) .code-output .token.keyword, +[data-theme="dark"] .code-output .token.keyword { + color: #c586c0; +} + +:root:not([data-theme="light"]) .code-output .token.operator, +:root:not([data-theme="light"]) .code-output .token.punctuation, +[data-theme="dark"] .code-output .token.operator, +[data-theme="dark"] .code-output .token.punctuation { + color: #d4d4d4; +} + +:root:not([data-theme="light"]) .code-output .token.string, +:root:not([data-theme="light"]) .code-output .token.char, +[data-theme="dark"] .code-output .token.string, +[data-theme="dark"] .code-output .token.char { + color: #ce9178; +} + +:root:not([data-theme="light"]) .code-output .token.regex, +[data-theme="dark"] .code-output .token.regex { + color: #d16969; +} + +:root:not([data-theme="light"]) .code-output .token.variable, +:root:not([data-theme="light"]) .code-output .token.parameter, +[data-theme="dark"] .code-output .token.variable, +[data-theme="dark"] .code-output .token.parameter { + color: #9cdcfe; +} + +:root:not([data-theme="light"]) .code-output .token.number, +:root:not([data-theme="light"]) .code-output .token.boolean, +:root:not([data-theme="light"]) .code-output .token.constant, +[data-theme="dark"] .code-output .token.number, +[data-theme="dark"] .code-output .token.boolean, +[data-theme="dark"] .code-output .token.constant { + color: #b5cea8; +} + +:root:not([data-theme="light"]) .code-output .token.function, +[data-theme="dark"] .code-output .token.function { + color: #dcdcaa; +} + +:root:not([data-theme="light"]) .code-output .token.class-name, +:root:not([data-theme="light"]) .code-output .token.builtin, +[data-theme="dark"] .code-output .token.class-name, +[data-theme="dark"] .code-output .token.builtin { + color: #4ec9b0; +} + +:root:not([data-theme="light"]) .code-output .token.invalid, +[data-theme="dark"] .code-output .token.invalid { + color: #f44747; +} diff --git a/doc/tsconfig.json b/doc/tsconfig.json index e8b48d8a..cef5a789 100644 --- a/doc/tsconfig.json +++ b/doc/tsconfig.json @@ -1,18 +1,5 @@ { - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "jsx": "preserve", - "types": ["vitepress/client"], - "skipLibCheck": true, - "noEmit": true - }, - "include": [ - "docs/.vitepress/**/*.ts", - "docs/.vitepress/**/*.mts", - "docs/.vitepress/**/*.vue", - "docs/.vitepress/env.d.ts" - ] + "extends": "astro/tsconfigs/strictest", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] } diff --git a/doc/yue-de.md b/doc/yue-de.md deleted file mode 100644 index bb4495fd..00000000 --- a/doc/yue-de.md +++ /dev/null @@ -1,3570 +0,0 @@ -# YueScript-Dokumentation - -Willkommen in der offiziellen YueScript-Dokumentation!
-Hier findest du Sprachfeatures, Nutzung, Referenzbeispiele und Ressourcen.
-Bitte wähle ein Kapitel in der Seitenleiste, um mit YueScript zu beginnen. - -# Do - -Als Statement verhält sich `do` wie in Lua. - -```yuescript -do - var = "hallo" - print var -print var -- nil hier -``` - -YueScripts **do** kann auch als Ausdruck verwendet werden. So kannst du mehrere Zeilen in einem Ausdruck kombinieren. Das Ergebnis des `do`-Ausdrucks ist die letzte Anweisung im Block. - -```yuescript -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```yuescript -tbl = { - key: do - print "Schlüssel wird zugewiesen!" - 1234 -} -``` - -`do`-Ausdrücke unterstützen die Verwendung von `break`, um den Kontrollfluss zu unterbrechen und mehrere Rückgabewerte vorzeitig zurückzugeben. - -```yuescript -status, value = do - n = 12 - if n > 10 - break "large", n - break "small", n -``` - -# Line-Decorators - -Zur Vereinfachung können `for`-Schleifen und `if`-Anweisungen auf einzelne Anweisungen am Zeilenende angewendet werden: - -```yuescript -print "Hallo Welt" if name == "Rob" -``` - -Und mit einfachen Schleifen: - -```yuescript -print "Element: ", item for item in *items -``` - -Und mit `while`-Schleifen: - -```yuescript -game\update! while game\isRunning! - -reader\parse_line! until reader\eof! -``` - -# Makros - -## Häufige Verwendung - -Makrofunktionen werden verwendet, um zur Compile-Zeit einen String auszuwerten und den generierten Code in die finale Kompilierung einzufügen. - -```yuescript -macro PI2 = -> math.pi * 2 -area = $PI2 * 5 - -macro HELLO = -> "'Hallo Welt'" -print $HELLO - -macro config = (debugging) -> - global debugMode = debugging == "true" - "" - -macro asserts = (cond) -> - debugMode and "assert #{cond}" or "" - -macro assert = (cond) -> - debugMode and "assert #{cond}" or "#{cond}" - -$config true -$asserts item ~= nil - -$config false -value = $assert item - --- übergebene Ausdrücke werden als Strings behandelt -macro and = (...) -> "#{ table.concat {...}, ' and ' }" -if $and f1!, f2!, f3! - print "OK" -``` - -## Rohcode einfügen - -Eine Makrofunktion kann entweder einen YueScript-String oder eine Konfigurationstabelle mit Lua-Code zurückgeben. - -```yuescript -macro yueFunc = (var) -> "local #{var} = ->" -$yueFunc funcA -funcA = -> "Zuweisung an die vom Yue-Makro definierte Variable schlägt fehl" - -macro luaFunc = (var) -> { - code: "local function #{var}() end" - type: "lua" -} -$luaFunc funcB -funcB = -> "Zuweisung an die vom Lua-Makro definierte Variable schlägt fehl" - -macro lua = (code) -> { - :code - type: "lua" -} - --- führende und abschließende Symbole des Raw-Strings werden automatisch getrimmt -$lua[==[ --- Einfügen von rohem Lua-Code -if cond then - print("Ausgabe") -end -]==] -``` - -## Makros exportieren - -Makrofunktionen können aus einem Modul exportiert und in ein anderes Modul importiert werden. Exportierte Makros müssen in einer einzelnen Datei liegen, und im Export-Modul dürfen nur Makrodefinitionen, Makro-Imports und Makro-Expansionen stehen. - -```yuescript --- Datei: utils.yue -export macro map = (items, action) -> "[#{action} for _ in *#{items}]" -export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" -export macro foreach = (items, action) -> "for _ in *#{items} - #{action}" - --- Datei main.yue -import "utils" as { - $, -- Symbol zum Importieren aller Makros - $foreach: $each -- Makro $foreach in $each umbenennen -} -[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ -``` - -## Eingebaute Makros - -Es gibt einige eingebaute Makros, aber du kannst sie überschreiben, indem du Makros mit denselben Namen deklarierst. - -```yuescript -print $FILE -- String des aktuellen Modulnamens -print $LINE -- gibt 2 aus -``` - -## Makros mit Makros erzeugen - -In YueScript erlauben Makrofunktionen Codegenerierung zur Compile-Zeit. Durch das Verschachteln von Makrofunktionen kannst du komplexere Generierungsmuster erzeugen. Damit kannst du eine Makrofunktion definieren, die eine andere Makrofunktion erzeugt. - -```yuescript -macro Enum = (...) -> - items = {...} - itemSet = {item, true for item in *items} - (item) -> - error "erhalten: \"#{item}\", erwartet eines von #{table.concat items, ', '}" unless itemSet[item] - "\"#{item}\"" - -macro BodyType = $Enum( - Static - Dynamic - Kinematic -) - -print "Gültiger Enum-Typ:", $BodyType Static --- print "Kompilierungsfehler bei Enum-Typ:", $BodyType Unknown -``` - -## Mehrzeiligen Code erzeugen - -Wenn ein Makro mehrzeiligen Yue-Code zurückgibt, ist eine mehrzeilige Zeichenkette in Anführungszeichen nicht zu empfehlen. Verwende stattdessen bevorzugt `-> |`. - -Eine Zeichenkette in Anführungszeichen behält den Text wörtlich bei, während ein YAML-Mehrzeilen-String die gemeinsame führende Einrückung entfernt. Dadurch bleiben erzeugte Yue-Blöcke in der Regel stabiler, besonders wenn der erzeugte Code Kommentare oder verschachtelte Blöcke enthält. - -```yuescript -macro default_conf = (conf) -> " - -- useful; only set once -#{conf}.identity = 'LOVE' -#{conf}.version = \"11.5\" - " - -love.conf = (t) -> - $default_conf t -``` - -```yuescript -macro default_conf = (conf) -> | - -- useful; only set once - #{conf}.identity = 'LOVE' - #{conf}.version = "11.5" - -love.conf = (t) -> - $default_conf t -``` - -## Argument-Validierung - -Du kannst erwartete AST-Knotentypen in der Argumentliste deklarieren und zur Compile-Zeit prüfen, ob die übergebenen Makroargumente den Erwartungen entsprechen. - -```yuescript -macro printNumAndStr = (num `Num, str `String) -> | - print( - #{num} - #{str} - ) - -$printNumAndStr 123, "hallo" -``` - -Wenn du flexiblere Argumentprüfungen brauchst, kannst du das eingebaute Makro `$is_ast` verwenden, um manuell an der passenden Stelle zu prüfen. - -```yuescript -macro printNumAndStr = (num, str) -> - error "als erstes Argument Num erwartet" unless $is_ast Num, num - error "als zweites Argument String erwartet" unless $is_ast String, str - "print(#{num}, #{str})" - -$printNumAndStr 123, "hallo" -``` - -Weitere Details zu verfügbaren AST-Knoten findest du in den großgeschriebenen Definitionen in `yue_parser.cpp`. - -## Annotation-Anweisungen - -Annotation-Anweisungen wenden ein Makro auf die direkt folgende Anweisung an. - -Das entspricht einem Makroaufruf, bei dem der Quelltext der folgenden Anweisung als letztes Argument zusätzlich übergeben wird. - -```yuescript -macro ShowName = (code) -> | - print "#{code\match '^[%w_]*'}" - -$[ShowName] -myFunc = -> - -return -``` - -Wenn das Annotationsmakro eine Konfigurationstabelle zurückgibt, steuert das optionale Feld `before`, ob das Ergebnis vor oder nach der annotierten Anweisung eingefügt wird. - -```yuescript -macro Tag = (tag, code) -> - tableName = code\match "^[%w_]+" - return - type: "text" - before: tag == "before" - code: "-- #{tag}:#{tableName}" - -$[Tag before] -tableA = {} - -$[Tag after] -tableB = {} - -return -``` - -Da die folgende Anweisung als zusätzliches Makroargument übergeben wird, lassen sich mit Annotationen auch direkt Registrierungszeilen aus Klassendeklarationen erzeugen. Du kannst dabei dieselben AST-Argumentprüfungen wie bei normalen Makros verwenden. - -```yuescript -macro Register = (registry, code`ClassDecl) -> - className = code\match "^class%s+(%w+)" - return | - #{registry}["#{className}"] = #{className} - -registry = {} - -$[Register(registry)] -class Worker - run: => "ok" - -return -``` - -Annotationen können auch Wrapper-Code um Funktionen herum einfügen: - -```yuescript -macro ValidateNumberArgs = (code) -> - funcName = code\match "^(%w+)%s*=" - return | - local __orig_#{funcName} = #{funcName} - #{funcName} = (...) -> - for i = 1, select "#", ... - assert type(select i, ...) == "number", "expected number for arg \#{i}" - __orig_#{funcName} ... - -$[ValidateNumberArgs] -add = (a, b) -> a + b -``` - -Auf eine Annotation muss immer eine Anweisung folgen, und sie kann nicht auf eine `return`-Anweisung angewendet werden. Wenn die annotierte Anweisung am Ende eines Blocks steht und du die rohe AST-Form der Anweisung brauchst, füge ein explizites `return` danach ein, damit sie nicht in einen implizit zurückgegebenen Ausdruck eingebettet wird. - -# Try - -Die Syntax für Fehlerbehandlung in Lua in einer gängigen Form. - -```yuescript -try - func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try - func 1, 2, 3 -catch err - yue.traceback err - -try func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try func 1, 2, 3 - -try - print "Versuche" - func 1, 2, 3 - --- Verwendung mit if-Zuweisungsmuster -if success, result := try func 1, 2, 3 -catch err - print yue.traceback err - print result -``` - -## Try? - -`try?` ist eine vereinfachte Fehlerbehandlungs-Syntax, die den booleschen Status aus dem `try`-Statement weglässt. Bei Erfolg gibt sie das Ergebnis des `try`-Blocks zurück, ansonsten `nil` statt eines Fehlerobjekts. - -```yuescript -a, b, c = try? func! - --- mit Nil-Verschmelzungs-Operator -a = (try? func!) ?? "Standardwert" - --- als Funktionsargument -f try? func! - --- mit catch-Block -f try? - print 123 - func! -catch e - print e - e -``` - -# Tabellenliterale - -Wie in Lua werden Tabellen mit geschweiften Klammern definiert. - -```yuescript -some_values = {1, 2, 3, 4} -``` - -Anders als in Lua weist man einem Schlüssel in einer Tabelle mit **:** (statt **=**) einen Wert zu. - -```yuescript -some_values = { - name: "Bill", - age: 200, - ["Lieblingsessen"]: "Reis" -} -``` - -Die geschweiften Klammern können weggelassen werden, wenn eine einzelne Tabelle aus Schlüssel-Wert-Paaren zugewiesen wird. - -```yuescript -profile = - height: "4 Fuß", - shoe_size: 13, - favorite_foods: ["Eis", "Donuts"] -``` - -Zeilenumbrüche können Werte statt eines Kommas trennen (oder zusätzlich): - -```yuescript -values = { - 1, 2, 3, 4 - 5, 6, 7, 8 - name: "Superman" - occupation: "Verbrechensbekämpfung" -} -``` - -Beim Erstellen eines einzeiligen Tabellenliterals können die geschweiften Klammern ebenfalls weggelassen werden: - -```yuescript -my_function dance: "Tango", partner: "keiner" - -y = type: "Hund", legs: 4, tails: 1 -``` - -Die Schlüssel eines Tabellenliterals können Sprach-Schlüsselwörter sein, ohne sie zu escapen: - -```yuescript -tbl = { - do: "etwas" - end: "Hunger" -} -``` - -Wenn du eine Tabelle aus Variablen konstruierst und die Schlüssel den Variablennamen entsprechen sollen, kannst du den Präfix-Operator **:** verwenden: - -```yuescript -hair = "golden" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -Wenn der Schlüssel eines Feldes das Ergebnis eines Ausdrucks sein soll, kannst du ihn wie in Lua in **[ ]** setzen. Du kannst auch ein String-Literal direkt als Schlüssel verwenden und die eckigen Klammern weglassen. Das ist nützlich, wenn dein Schlüssel Sonderzeichen enthält. - -```yuescript -t = { - [1 + 2]: "hallo" - "Hallo Welt": true -} -``` - -Lua-Tabellen haben sowohl einen Array-Teil als auch einen Hash-Teil, aber manchmal ist es nützlich, hier eine semantische Unterscheidung zu treffen. Du kannst **[ ]** anstelle von **{ }** verwenden, um eine Tabelle explizit als Array zu deklarieren; dadurch wird verhindert, dass Schlüssel-Wert-Paare hineingeschrieben werden. - -```yuescript -some_values = [1, 2, 3, 4] -list_with_one_element = [1, ] -``` - -# Comprehensions - -Comprehensions bieten eine bequeme Syntax, um eine neue Tabelle zu erzeugen, indem man über ein bestehendes Objekt iteriert und einen Ausdruck auf seine Werte anwendet. Es gibt zwei Arten: Listen-Comprehensions und Tabellen-Comprehensions. Beide erzeugen Lua-Tabellen; Listen-Comprehensions sammeln Werte in einer array-ähnlichen Tabelle, und Tabellen-Comprehensions erlauben es, Schlüssel und Wert pro Iteration zu setzen. - -## Listen-Comprehensions - -Das folgende Beispiel erstellt eine Kopie der `items`-Tabelle, aber mit verdoppelten Werten. - -```yuescript -items = [ 1, 2, 3, 4 ] -doubled = [item * 2 for i, item in ipairs items] -``` - -Die Elemente in der neuen Tabelle können mit einer `when`-Klausel eingeschränkt werden: - -```yuescript -slice = [item for i, item in ipairs items when i > 1 and i < 3] -``` - -Da es üblich ist, über die Werte einer numerisch indizierten Tabelle zu iterieren, gibt es den **\***-Operator. Das Verdopplungsbeispiel kann so umgeschrieben werden: - -```yuescript -doubled = [item * 2 for item in *items] -``` - -In Listen-Comprehensions kannst du außerdem den Spread-Operator `...` verwenden, um verschachtelte Listen zu flatten und einen Flat-Map-Effekt zu erzielen: - -```yuescript -data = - a: [1, 2, 3] - b: [4, 5, 6] - -flat = [...v for k,v in pairs data] --- flat ist jetzt [1, 2, 3, 4, 5, 6] -``` - -Die `for`- und `when`-Klauseln können beliebig oft verkettet werden. Die einzige Anforderung ist, dass eine Comprehension mindestens eine `for`-Klausel enthält. - -Mehrere `for`-Klauseln entsprechen verschachtelten Schleifen: - -```yuescript -x_coords = [4, 5, 6, 7] -y_coords = [9, 2, 3] - -points = [ [x, y] for x in *x_coords \ -for y in *y_coords] -``` - -Numerische `for`-Schleifen können ebenfalls in Comprehensions verwendet werden: - -```yuescript -evens = [i for i = 1, 100 when i % 2 == 0] -``` - -## Tabellen-Comprehensions - -Die Syntax für Tabellen-Comprehensions ist sehr ähnlich, unterscheidet sich jedoch dadurch, dass **{** und **}** verwendet werden und pro Iteration zwei Werte erzeugt werden. - -Dieses Beispiel erstellt eine Kopie von `thing`: - -```yuescript -thing = { - color: "rot" - name: "schnell" - width: 123 -} - -thing_copy = {k, v for k, v in pairs thing} -``` - -```yuescript -no_color = {k, v for k, v in pairs thing when k != "color"} -``` - -Der **\***-Operator wird ebenfalls unterstützt. Hier erstellen wir eine Nachschlagetabelle für Quadratwurzeln einiger Zahlen. - -```yuescript -numbers = [1, 2, 3, 4] -sqrts = {i, math.sqrt i for i in *numbers} -``` - -Das Schlüssel-Wert-Tupel in einer Tabellen-Comprehension kann auch aus einem einzelnen Ausdruck stammen; der Ausdruck muss dann zwei Werte zurückgeben. Der erste wird als Schlüssel und der zweite als Wert verwendet: - -In diesem Beispiel konvertieren wir ein Array von Paaren in eine Tabelle, wobei das erste Element des Paars der Schlüssel und das zweite der Wert ist. - -```yuescript -tuples = [ ["hallo", "Welt"], ["foo", "bar"]] -tbl = {unpack tuple for tuple in *tuples} -``` - -## Slicing - -Eine spezielle Syntax erlaubt es, die iterierten Elemente bei Verwendung des **\***-Operators einzuschränken. Das ist äquivalent zum Setzen von Iterationsgrenzen und Schrittweite in einer `for`-Schleife. - -Hier setzen wir die minimalen und maximalen Grenzen und nehmen alle Elemente mit Indizes zwischen 1 und 5 (inklusive): - -```yuescript -slice = [item for item in *items[1, 5]] -``` - -Jedes der Slice-Argumente kann weggelassen werden, um einen sinnvollen Standard zu verwenden. Wenn der maximale Index weggelassen wird, entspricht er der Länge der Tabelle. Dieses Beispiel nimmt alles außer dem ersten Element: - -```yuescript -slice = [item for item in *items[2,]] -``` - -Wenn die Mindestgrenze weggelassen wird, ist sie standardmäßig 1. Hier geben wir nur die Schrittweite an und lassen die anderen Grenzen leer. Das nimmt alle ungerad indizierten Elemente (1, 3, 5, …): - -```yuescript -slice = [item for item in *items[,,2]] -``` - -Sowohl die Mindest- als auch die Maximalgrenze können negativ sein; dann werden die Grenzen vom Ende der Tabelle gezählt. - -```yuescript --- die letzten 4 Elemente nehmen -slice = [item for item in *items[-4,-1]] -``` - -Die Schrittweite kann ebenfalls negativ sein, wodurch die Elemente in umgekehrter Reihenfolge genommen werden. - -```yuescript -reverse_slice = [item for item in *items[-1,1,-1]] -``` - -### Slicing-Ausdruck - -Slicing kann auch als Ausdruck verwendet werden. Das ist nützlich, um eine Teilliste einer Tabelle zu erhalten. - -```yuescript --- das 2. und 4. Element als neue Liste nehmen -sub_list = items[2, 4] - --- die letzten 4 Elemente nehmen -last_four_items = items[-4, -1] -``` - -# Objektorientierte Programmierung - -In diesen Beispielen kann der generierte Lua-Code überwältigend wirken. Am besten konzentrierst du dich zunächst auf die Bedeutung des YueScript-Codes und schaust dir den Lua-Code nur an, wenn du die Implementierungsdetails wissen möchtest. - -Eine einfache Klasse: - -```yuescript -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -Eine Klasse wird mit einem `class`-Statement deklariert, gefolgt von einer tabellenähnlichen Deklaration mit allen Methoden und Eigenschaften. - -Die Eigenschaft `new` ist besonders, da sie zum Konstruktor wird. - -Beachte, dass alle Methoden in der Klasse die Fat-Arrow-Syntax verwenden. Beim Aufruf von Methoden auf einer Instanz wird die Instanz selbst als erstes Argument übergeben. Der Fat-Arrow übernimmt die Erstellung des `self`-Arguments. - -Das `@`-Präfix ist Kurzform für `self.`. `@items` wird zu `self.items`. - -Der Klassenblock unterstützt auch Metatable-Felder, indem Metamethod-Schlüssel in spitzen Klammern geschrieben werden, zum Beispiel ``. - -```yuescript -class User - new: (@name) => - : => "User(#{@name})" - -print tostring User "Yue" -``` - -Eine Instanz der Klasse wird erstellt, indem man den Klassennamen wie eine Funktion aufruft. - -```yuescript -inv = Inventory! -inv\add_item "T-Shirt" -inv\add_item "Hose" -``` - -Da die Instanz bei Methodenaufrufen an die Methoden übergeben werden muss, wird der `\`-Operator verwendet. - -Alle Eigenschaften einer Klasse werden von allen Instanzen gemeinsam genutzt. Für Funktionen ist das ok, aber bei anderen Objekten kann das zu unerwünschten Ergebnissen führen. - -Im folgenden Beispiel wird die Eigenschaft `clothes` von allen Instanzen geteilt, sodass Änderungen in einer Instanz in einer anderen sichtbar werden: - -```yuescript -class Person - clothes: [] - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "Hose" -b\give_item "Hemd" - --- gibt sowohl Hose als auch Hemd aus -print item for item in *a.clothes -``` - -Der richtige Weg, das zu vermeiden, ist, den veränderlichen Zustand im Konstruktor zu erstellen: - -```yuescript -class Person - new: => - @clothes = [] -``` - -## Vererbung - -Das Schlüsselwort `extends` kann in einer Klassendeklaration verwendet werden, um Eigenschaften und Methoden von einer anderen Klasse zu erben. - -```yuescript -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "Rucksack ist voll" - super name -``` - -Hier erweitern wir unsere `Inventory`-Klasse und begrenzen die Anzahl der Elemente. - -In diesem Beispiel definieren wir keinen Konstruktor in der Subklasse, daher wird der Konstruktor der Elternklasse beim Erstellen einer neuen Instanz aufgerufen. Definieren wir einen Konstruktor, können wir mit `super` den Elternkonstruktor aufrufen. - -Wenn eine Klasse von einer anderen erbt, sendet sie eine Nachricht an die Elternklasse, indem die Methode `__inherited` der Elternklasse aufgerufen wird, falls vorhanden. Die Funktion erhält zwei Argumente: die Klasse, die vererbt wird, und die Kindklasse. - -```yuescript -class Shelf - @__inherited: (child) => - print @__name, "wurde vererbt von", child.__name - --- gibt aus: Shelf wurde von Cupboard geerbt -class Cupboard extends Shelf -``` - -## Super - -**super** ist ein spezielles Schlüsselwort, das auf zwei Arten verwendet werden kann: als Objekt oder als Funktionsaufruf. Es hat besondere Funktionalität nur innerhalb einer Klasse. - -Wenn es als Funktion aufgerufen wird, ruft es die gleichnamige Funktion in der Elternklasse auf. `self` wird automatisch als erstes Argument übergeben (wie im Vererbungsbeispiel oben). - -Wenn `super` als normaler Wert verwendet wird, ist es eine Referenz auf das Objekt der Elternklasse. - -Du kannst es wie jedes andere Objekt verwenden, um Werte der Elternklasse zu lesen, die von der Kindklasse überschattet wurden. - -Wenn der `\`-Aufrufoperator mit `super` verwendet wird, wird `self` als erstes Argument eingefügt statt des Wertes von `super`. Wenn man `.` zum Abrufen einer Funktion verwendet, wird die rohe Funktion zurückgegeben. - -Ein paar Beispiele für `super` in unterschiedlichen Formen: - -```yuescript -class MyClass extends ParentClass - a_method: => - -- Folgendes hat dieselbe Wirkung: - super "hallo", "Welt" - super\a_method "hallo", "Welt" - super.a_method self, "hallo", "Welt" - - -- super als Wert entspricht der Elternklasse: - assert super == ParentClass -``` - -**super** kann auch links einer Funktions-Stub verwendet werden. Der einzige große Unterschied ist, dass die resultierende Funktion statt an `super` an `self` gebunden wird. - -## Typen - -Jede Instanz einer Klasse trägt ihren Typ in sich. Dieser wird in der speziellen Eigenschaft `__class` gespeichert. Diese Eigenschaft enthält das Klassenobjekt. Das Klassenobjekt wird aufgerufen, um eine neue Instanz zu erstellen. Wir können das Klassenobjekt auch indizieren, um Klassenmethoden und Eigenschaften abzurufen. - -```yuescript -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- gibt 10 aus -``` - -## Klassenobjekte - -Das Klassenobjekt entsteht, wenn wir ein `class`-Statement verwenden. Es wird in einer Variablen mit dem Klassennamen gespeichert. - -Das Klassenobjekt kann wie eine Funktion aufgerufen werden, um neue Instanzen zu erstellen. So haben wir die Instanzen in den Beispielen oben erstellt. - -Eine Klasse besteht aus zwei Tabellen: der Klassentabelle selbst und der Basistabelle. Die Basis wird als Metatable für alle Instanzen verwendet. Alle in der Klassendeklaration aufgeführten Eigenschaften werden in der Basis platziert. - -Das Metatable des Klassenobjekts liest Eigenschaften aus der Basis, wenn sie im Klassenobjekt nicht existieren. Das bedeutet, dass wir Funktionen und Eigenschaften direkt von der Klasse aus aufrufen können. - -Wichtig: Zuweisungen an das Klassenobjekt schreiben nicht in die Basis. Das ist keine gültige Methode, um neue Methoden zu Instanzen hinzuzufügen. Stattdessen muss die Basis explizit geändert werden. Siehe das Feld `__base` unten. - -Das Klassenobjekt hat einige spezielle Eigenschaften: - -Der Name der Klasse, wie sie deklariert wurde, wird im Feld `__name` gespeichert. - -```yuescript -print BackPack.__name -- gibt Backpack aus -``` - -Die Basistabelle ist in `__base` gespeichert. Du kannst diese Tabelle ändern, um Instanzen Funktionalität hinzuzufügen, die bereits existieren oder noch erstellt werden. - -Wenn die Klasse von etwas erbt, ist das Elternklassenobjekt in `__parent` gespeichert. - -## Klassenvariablen - -Du kannst Variablen direkt im Klassenobjekt statt in der Basis erstellen, indem du in der Klassendeklaration `@` vor den Eigenschaftsnamen setzt. - -```yuescript -class Things - @some_func: => print "Hallo von", @__name - -Things\some_func! - --- Klassenvariablen in Instanzen nicht sichtbar -assert Things().some_func == nil -``` - -In Ausdrücken können wir `@@` verwenden, um auf einen Wert zuzugreifen, der in `self.__class` gespeichert ist. `@@hello` ist also eine Kurzform für `self.__class.hello`. - -```yuescript -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- gibt 2 aus -``` - -Die Aufrufsemantik von `@@` ist ähnlich wie bei `@`. Wenn du einen `@@`-Namen aufrufst, wird die Klasse als erstes Argument übergeben (Lua-`:`-Syntax). - -```yuescript -@@hello 1,2,3,4 -``` - -## Klassendeklarations-Statements - -Im Rumpf einer Klassendeklaration können wir normale Ausdrücke zusätzlich zu Schlüssel/Wert-Paaren haben. In diesem Kontext ist `self` gleich dem Klassenobjekt. - -Hier ist eine alternative Möglichkeit, eine Klassenvariable zu erstellen: - -```yuescript -class Things - @class_var = "Hallo Welt" -``` - -Diese Ausdrücke werden ausgeführt, nachdem alle Eigenschaften zur Basis hinzugefügt wurden. - -Alle Variablen, die im Klassenkörper deklariert werden, sind lokal zu den Klasseneigenschaften. Das ist praktisch, um private Werte oder Hilfsfunktionen zu platzieren, auf die nur die Klassenmethoden zugreifen können: - -```yuescript -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "Hallo Welt: " .. secret -``` - -## @- und @@-Werte - -Wenn `@` und `@@` vor einem Namen stehen, repräsentieren sie den Namen in `self` bzw. `self.__class`. - -Wenn sie alleine verwendet werden, sind sie Aliase für `self` und `self.__class`. - -```yuescript -assert @ == self -assert @@ == self.__class -``` - -Zum Beispiel kannst du mit `@@` in einer Instanzmethode schnell eine neue Instanz derselben Klasse erzeugen: - -```yuescript -some_instance_method = (...) => @@ ... -``` - -## Konstruktor-Property-Promotion - -Um Boilerplate beim Definieren einfacher Value-Objekte zu reduzieren, kannst du eine Klasse so schreiben: - -```yuescript -class Something - new: (@foo, @bar, @@biz, @@baz) => - --- Kurzform für - -class Something - new: (foo, bar, biz, baz) => - @foo = foo - @bar = bar - @@biz = biz - @@baz = baz -``` - -Du kannst diese Syntax auch für eine gemeinsame Funktion verwenden, um Objektfelder zu initialisieren. - -```yuescript -new = (@fieldA, @fieldB) => @ -obj = new {}, 123, "abc" -print obj -``` - -## Klassenausdrücke - -Die `class`-Syntax kann auch als Ausdruck verwendet werden, der einer Variable zugewiesen oder explizit zurückgegeben wird. - -```yuescript -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -## Anonyme Klassen - -Der Name kann beim Deklarieren einer Klasse weggelassen werden. Das `__name`-Attribut ist dann `nil`, es sei denn, der Klassenausdruck steht in einer Zuweisung. In diesem Fall wird der Name auf der linken Seite statt `nil` verwendet. - -```yuescript -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -Du kannst sogar den Körper weglassen und eine leere anonyme Klasse schreiben: - -```yuescript -x = class -``` - -## Class Mixing - -Du kannst mit dem Schlüsselwort `using` mischen, um Funktionen aus einer einfachen Tabelle oder einem vordefinierten Klassenobjekt in deine neue Klasse zu kopieren. Beim Mischen mit einer einfachen Tabelle kannst du die Klassen-Indexing-Funktion (Metamethod `__index`) überschreiben. Beim Mischen mit einem bestehenden Klassenobjekt werden dessen Metamethoden nicht kopiert. - -```yuescript -MyIndex = __index: var: 1 - -class X using MyIndex - func: => - print 123 - -x = X! -print x.var - -class Y using X - -y = Y! -y\func! - -assert y.__class.__parent ~= X -- X ist nicht die Elternklasse von Y -``` - -# With-Statement - -Ein häufiges Muster bei der Erstellung eines Objekts ist, unmittelbar danach eine Reihe von Funktionen aufzurufen und Eigenschaften zu setzen. - -Das führt dazu, dass der Objektname mehrfach wiederholt wird und unnötiges Rauschen entsteht. Eine gängige Lösung ist, eine Tabelle als Argument zu übergeben, die eine Sammlung von Schlüsseln und Werten enthält, die überschrieben werden sollen. Der Nachteil ist, dass der Konstruktor dieses Objekts diese Form unterstützen muss. - -Der `with`-Block hilft, das zu vermeiden. Innerhalb eines `with`-Blocks können wir spezielle Anweisungen verwenden, die mit `.` oder `\` beginnen und die Operationen auf das Objekt anwenden, mit dem wir gerade arbeiten. - -Zum Beispiel arbeiten wir mit einem neu erstellten Objekt: - -```yuescript -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -Das `with`-Statement kann auch als Ausdruck verwendet werden und gibt den Wert zurück, auf den es Zugriff gewährt. - -```yuescript -file = with File "Lieblingsessen.txt" - \set_encoding "utf8" -``` - -`with`-Ausdrücke unterstützen `break` mit genau einem Wert: - -```yuescript -result = with obj - break .value -``` - -Sobald `break value` in `with` verwendet wird, gibt der `with`-Ausdruck nicht mehr sein Zielobjekt zurück, sondern den von `break` gelieferten Wert. - -```yuescript -a = with obj - .x = 1 --- a ist obj - -b = with obj - break .x --- b ist .x, nicht obj -``` - -Im Unterschied zu `for` / `while` / `repeat` / `do` unterstützt `with` nur einen `break`-Wert. - -Oder … - -```yuescript -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", [dad, mother, sister] -``` - -In dieser Verwendung kann `with` als spezielle Form des K-Kombinators gesehen werden. - -Der Ausdruck im `with`-Statement kann auch eine Zuweisung sein, wenn du dem Ausdruck einen Namen geben willst. - -```yuescript -with str := "Hallo" - print "Original:", str - print "Großbuchstaben:", \upper! -``` - -Du kannst in einem `with`-Statement über `[]` auf spezielle Schlüssel zugreifen. - -```yuescript -with tb - [1] = 1 - print [2] - with [abc] - [3] = [2]\func! - ["key-name"] = value - [] = "abc" -- an "tb" anhängen -``` - -`with?` ist eine erweiterte Version der `with`-Syntax, die einen Existenz-Check einführt, um Objekte, die `nil` sein könnten, sicher zuzugreifen, ohne explizite Nullprüfungen. - -```yuescript -with? obj - print .name -``` - -# Zuweisung - -Variablen sind dynamisch typisiert und standardmäßig `local`. Du kannst den Geltungsbereich mit den Statements **local** und **global** ändern. - -```yuescript -hello = "world" -a, b, c = 1, 2, 3 -hello = 123 -- nutzt die bestehende Variable -``` - -## Update-Zuweisung - -Du kannst Update-Zuweisungen mit vielen binären Operatoren durchführen. - -```yuescript -x = 1 -x += 1 -x -= 1 -x *= 10 -x /= 10 -x %= 10 -s ..= "world" -- legt eine neue lokale Variable an, wenn sie nicht existiert -arg or= "default value" -``` - -## Verkettete Zuweisung - -Mit verketteten Zuweisungen kannst du mehrere Variablen auf denselben Wert setzen. - -```yuescript -a = b = c = d = e = 0 -x = y = z = f! -``` - -## Explizite Locals - -```yuescript -do - local a = 1 - local * - print "forward declare all variables as locals" - x = -> 1 + y + z - y, z = 2, 3 - global instance = Item\new! - -do - local X = 1 - local ^ - print "only forward declare upper case variables" - a = 1 - B = 2 -``` - -## Explizite Globals - -```yuescript -do - global a = 1 - global * - print "declare all variables as globals" - x = -> 1 + y + z - y, z = 2, 3 - -do - global X = 1 - global ^ - print "only declare upper case variables as globals" - a = 1 - B = 2 - local Temp = "a local value" -``` - -# Varargs-Zuweisung - -Du kannst Rückgabewerte einer Funktion dem Varargs-Symbol `...` zuweisen und dann den Inhalt auf die Lua-Weise auslesen. - -```yuescript -list = [1, 2, 3, 4, 5] -fn = (ok) -> ok, table.unpack list -ok, ... = fn true -count = select '#', ... -first = select 1, ... -print ok, count, first -``` - -# If-Zuweisung - -`if`- und `elseif`-Blöcke können eine Zuweisung anstelle eines Bedingungsausdrucks enthalten. Beim Auswerten der Bedingung findet die Zuweisung statt, und der zugewiesene Wert wird als Bedingung verwendet. Die zugewiesene Variable ist nur im Geltungsbereich des Bedingungsblocks verfügbar, d. h. sie ist nicht verfügbar, wenn der Wert nicht truthy ist. Für die Zuweisung musst du den "Walrus-Operator" `:=` statt `=` verwenden. - -```yuescript -if user := database.find_user "moon" - print user.name -``` - -```yuescript -if hello := os.getenv "hello" - print "Du hast hello", hello -elseif world := os.getenv "world" - print "Du hast world", world -else - print "nichts :(" -``` - -If-Zuweisung mit mehreren Rückgabewerten. Nur der erste Wert wird geprüft, andere Werte bleiben im Scope. - -```yuescript -if success, result := pcall -> "Ergebnis ohne Probleme erhalten" - print result -- Variable result ist im Scope -print "OK" -``` - -## While-Zuweisung - -Du kannst if-Zuweisung auch in einer while-Schleife verwenden, um den Wert als Schleifenbedingung zu nutzen. - -```yuescript -while byte := stream\read_one! - -- mit dem Byte etwas anfangen - print byte -``` - -# Destructuring-Zuweisung - -Destructuring-Zuweisung ist eine Möglichkeit, schnell Werte aus einer Tabelle nach Name oder Position in array-basierten Tabellen zu extrahieren. - -Normalerweise steht ein Tabellenliteral wie `{1,2,3}` auf der rechten Seite einer Zuweisung, weil es ein Wert ist. Destructuring-Zuweisung tauscht die Rolle des Tabellenliterals und setzt es auf die linke Seite der Zuweisung. - -Am besten lässt sich das mit Beispielen erklären. So entpackst du die ersten zwei Werte einer Tabelle: - -```yuescript -thing = [1, 2] - -[a, b] = thing -print a, b -``` - -Im Destructuring-Tabellenliteral repräsentiert der Schlüssel den zu lesenden Schlüssel der rechten Seite, und der Wert ist der Name, dem der gelesene Wert zugewiesen wird. - -```yuescript -obj = { - hello: "Welt" - day: "Dienstag" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day - -:day = obj -- einfache Destructuring-Zuweisung ohne Klammern ist ok -``` - -Das funktioniert auch mit verschachtelten Datenstrukturen: - -```yuescript -obj2 = { - numbers: [1, 2, 3, 4] - properties: { - color: "grün" - height: 13.5 - } -} - -{numbers: [first, second], properties: {color: color}} = obj2 -print first, second, color -``` - -Wenn die Destructuring-Anweisung kompliziert ist, kannst du sie gerne auf mehrere Zeilen verteilen. Ein etwas komplexeres Beispiel: - -```yuescript -{ - numbers: [first, second] - properties: { - color: color - } -} = obj2 -``` - -Es ist üblich, Werte aus einer Tabelle zu extrahieren und ihnen lokale Variablen mit demselben Namen wie der Schlüssel zuzuweisen. Um Wiederholungen zu vermeiden, kannst du den Präfix-Operator **:** verwenden: - -```yuescript -{:concat, :insert} = table -``` - -Das ist effektiv dasselbe wie `import`, aber du kannst Felder umbenennen, indem du die Syntax mischst: - -```yuescript -{:mix, :max, random: rand} = math -``` - -Du kannst Standardwerte beim Destructuring angeben, z. B.: - -```yuescript -{:name = "namenlos", :job = "arbeitlos"} = person -``` - -Du kannst `_` als Platzhalter verwenden, wenn du eine Listen-Destructuring-Zuweisung machst: - -```yuescript -[_, two, _, four] = items -``` - -## Bereichs-Destructuring - -Du kannst den Spread-Operator `...` in Listen-Destructuring verwenden, um einen Wertebereich zu erfassen. Das ist nützlich, wenn du bestimmte Elemente am Anfang und Ende einer Liste extrahieren und den Rest dazwischen sammeln willst. - -```yuescript -orders = ["erster", "zweiter", "dritter", "vierter", "letzter"] -[first, ...bulk, last] = orders -print first -- gibt aus: erster -print bulk -- gibt aus: {"zweiter", "dritter", "vierter"} -print last -- gibt aus: letzter -``` - -Der Spread-Operator kann an unterschiedlichen Positionen verwendet werden, um unterschiedliche Bereiche zu erfassen, und du kannst `_` als Platzhalter für Werte verwenden, die du nicht erfassen willst: - -```yuescript --- Alles nach dem ersten Element erfassen -[first, ...rest] = orders - --- Alles vor dem letzten Element erfassen -[...start, last] = orders - --- Alles außer den mittleren Elementen erfassen -[first, ..._, last] = orders -``` - -## Destructuring an anderen Stellen - -Destructuring kann auch an Stellen vorkommen, an denen eine Zuweisung implizit erfolgt. Ein Beispiel ist eine `for`-Schleife: - -```yuescript -tuples = [ - ["hallo", "Welt"] - ["Ei", "Kopf"] -] - -for [left, right] in *tuples - print left, right -``` - -Wir wissen, dass jedes Element der Array-Tabelle ein 2er-Tupel ist, daher können wir es direkt in der Namensliste der `for`-Anweisung mittels Destructuring entpacken. - -# Die Using-Klausel: Destruktive Zuweisung kontrollieren - -Lexikalisches Scoping kann die Komplexität des Codes stark reduzieren, aber mit wachsendem Codeumfang kann es unübersichtlich werden. Betrachte folgendes Beispiel: - -```yuescript -i = 100 - --- viele Zeilen Code... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- wird 0 ausgeben -``` - -In `my_func` haben wir den Wert von `i` versehentlich überschrieben. In diesem Beispiel ist es offensichtlich, aber in einer großen oder fremden Codebasis ist oft nicht klar, welche Namen bereits deklariert wurden. - -Es wäre hilfreich, anzugeben, welche Variablen aus dem umschließenden Scope wir verändern wollen, um versehentliche Änderungen zu vermeiden. - -Das Schlüsselwort `using` ermöglicht das. `using nil` stellt sicher, dass keine geschlossenen Variablen bei Zuweisungen überschrieben werden. Die `using`-Klausel steht nach der Argumentliste einer Funktion oder ersetzt sie, wenn es keine Argumente gibt. - -```yuescript -i = 100 - -my_func = (using nil) -> - i = "hello" -- hier wird eine neue lokale Variable erstellt - -my_func! -print i -- gibt 100 aus, i bleibt unverändert -``` - -Mehrere Namen können durch Kommas getrennt werden. Closure-Werte können weiterhin gelesen, aber nicht verändert werden: - -```yuescript -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k, i) -> - tmp = tmp + add -- ein neues lokales tmp wird erstellt - i += tmp - k += tmp - -my_func(22) -print i, k -- diese wurden aktualisiert -``` - -# Verwendung - -## Lua-Modul - -YueScript-Modul in Lua verwenden: - -- **Fall 1** - - "your_yuescript_entry.yue" in Lua require'n. - - ```lua - require("yue")("your_yuescript_entry") - ``` - - Dieser Code funktioniert weiterhin, wenn du "your_yuescript_entry.yue" im gleichen Pfad zu "your_yuescript_entry.lua" kompilierst. In den restlichen YueScript-Dateien verwendest du einfach normales **require** oder **import**. Die Zeilennummern in Fehlermeldungen werden korrekt behandelt. - -- **Fall 2** - - YueScript-Modul require'n und das Fehlermapping manuell umschreiben. - - ```lua - local yue = require("yue") - yue.insert_loader() - local success, result = xpcall(function() - return require("yuescript_module_name") - end, function(err) - return yue.traceback(err) - end) - ``` - -- **Fall 3** - - Die YueScript-Compilerfunktion in Lua verwenden. - - ```lua - local yue = require("yue") - local codes, err, globals = yue.to_lua([[ - f = -> - print "Hallo Welt" - f! - ]],{ - implicit_return_root = true, - reserve_line_number = true, - lint_global = true, - space_over_tab = false, - options = { - target = "5.4", - path = "/script" - } - }) - ``` - -## YueScript-Tool - -YueScript-Tool verwenden mit: - -```shell -> yue -h -Verwendung: yue - [Optionen] [] ... - yue -e [argumente...] - yue -w [] [optionen] - yue - - -Hinweise: - - '-' / '--' muss das erste und einzige Argument sein. - - '-o/--output' kann nicht mit mehreren Eingabedateien verwendet werden. - - '-w/--watch' kann nicht mit Dateieingabe verwendet werden (nur Verzeichnisse). - - Mit '-e/--execute' werden verbleibende Tokens als Skriptargumente behandelt. - -Optionen: - -h, --help Zeigt diese Hilfemeldung an und beendet das Programm. - -e , --execute Datei oder Quellcode ausführen - -m, --minify Minimierten Code erzeugen - -r, --rewrite Ausgabe so umschreiben, dass die Zeilennummern dem Original entsprechen - -t , --output-to - Ziel für kompilierte Dateien angeben - -o , --output - Schreibe die Ausgabe in eine Datei - -p, --print Schreibe die Ausgabe auf die Standardausgabe - -b, --benchmark Gibt die Kompilierungszeit aus (keine Ausgabe schreiben) - -g, --globals Gibt verwendete globale Variablen im Format NAME ZEILE SPALTE aus - -s, --spaces Verwende Leerzeichen anstelle von Tabs im generierten Code - -l, --line-numbers Schreibe Zeilennummern aus dem Quellcode - -j, --no-implicit-return Deaktiviert implizites Rückgabe am Datei-Ende - -c, --reserve-comments Kommentare aus dem Quellcode vor Anweisungen beibehalten - -w [], --watch [] - Änderungen beobachten und alle Dateien im Verzeichnis kompilieren - -v, --version Version ausgeben - - Lese von Standardinput, schreibe auf Standardausgabe - (muss das erste und einzige Argument sein) - -- Wie '-', bleibt zur Abwärtskompatibilität bestehen - - --target Gib an, welche Lua-Version erzeugt werden soll - (Version nur von 5.1 bis 5.5 möglich) - --path Füge einen zusätzlichen Lua-Suchpfad zu package.path hinzu - --= Übertrage Compileroption im Schlüssel=Wert-Format (bestehendes Verhalten) - - Ohne Optionen wird die REPL gestartet, gebe das Symbol '$' - in eine einzelne Zeile ein, um den Multi-Line-Modus zu starten/beenden -``` - -Anwendungsfälle: - -Rekursiv jede YueScript-Datei mit der Endung **.yue** unter dem aktuellen Pfad kompilieren: **yue .** - -Kompilieren und Ergebnisse in einen Zielpfad schreiben: **yue -t /target/path/ .** - -Kompilieren und Debug-Infos beibehalten: **yue -l .** - -Kompilieren und minifizierten Code erzeugen: **yue -m .** - -Rohcode ausführen: **yue -e 'print 123'** - -Eine YueScript-Datei ausführen: **yue -e main.yue** - -# Einführung - -YueScript ist eine dynamische Sprache, die zu Lua kompiliert. Sie ist ein Dialekt von [MoonScript](https://github.com/leafo/moonscript). Code, der in YueScript geschrieben wird, ist ausdrucksstark und sehr kompakt. YueScript eignet sich zum Schreiben von veränderlicher Anwendungslogik mit besser wartbarem Code und läuft in eingebetteten Lua-Umgebungen wie Spielen oder Webservern. - -Yue (月) ist das chinesische Wort für Mond und wird als [jyɛ] ausgesprochen. - -## Ein Überblick über YueScript - -```yuescript --- Import-Syntax -import p, to_lua from "yue" - --- Objekt-Literale -inventory = - equipment: - - "Schwert" - - "Schild" - items: - - name: "Trank" - count: 10 - - name: "Brot" - count: 3 - --- Listen-Abstraktion -map = (arr, action) -> - [action item for item in *arr] - -filter = (arr, cond) -> - [item for item in *arr when cond item] - -reduce = (arr, init, action): init -> - init = action init, item for item in *arr - --- Pipe-Operator -[1, 2, 3] - |> map (x) -> x * 2 - |> filter (x) -> x > 4 - |> reduce 0, (a, b) -> a + b - |> print - --- Metatable-Manipulation -apple = - size: 15 - : - color: 0x00ffff - -with apple - p .size, .color, . if .<>? - --- export-Syntax (ähnlich wie in JavaScript) -export 🌛 = "Skript des Mondes" -``` - -## Über Dora SSR - -YueScript wird zusammen mit der Open-Source-Spiel-Engine [Dora SSR](https://github.com/IppClub/Dora-SSR) entwickelt und gepflegt. Es wird zum Erstellen von Engine-Tools, Spiel-Demos und Prototypen eingesetzt und hat seine Leistungsfähigkeit in realen Szenarien unter Beweis gestellt, während es gleichzeitig die Dora-SSR-Entwicklungserfahrung verbessert. - -# Installation - -## Lua-Modul - -Installiere [luarocks](https://luarocks.org), einen Paketmanager für Lua-Module. Installiere YueScript dann als Lua-Modul und ausführbare Datei mit: - -```shell -luarocks install yuescript -``` - -Oder du kannst die Datei `yue.so` bauen mit: - -```shell -make shared LUAI=/usr/local/include/lua LUAL=/usr/local/lib/lua -``` - -Anschließend findest du die Binärdatei unter **bin/shared/yue.so**. - -## Binär-Tool bauen - -Klone dieses Repo und baue/installiere die ausführbare Datei mit: - -```shell -make install -``` - -YueScript-Tool ohne Makro-Feature bauen: - -```shell -make install NO_MACRO=true -``` - -YueScript-Tool ohne eingebautes Lua-Binary bauen: - -```shell -make install NO_LUA=true -``` - -## Vorgefertigtes Binary herunterladen - -Du kannst vorkompilierte Binärdateien herunterladen, inklusive ausführbarer Dateien für unterschiedliche Lua-Versionen und Bibliotheksdateien. - -Lade vorkompilierte Binärdateien von [hier](https://github.com/IppClub/YueScript/releases) herunter. - -# Bedingungen - -```yuescript -have_coins = false -if have_coins - print "Münzen erhalten" -else - print "Keine Münzen" -``` - -Eine Kurzsyntax für einzelne Anweisungen kann ebenfalls verwendet werden: - -```yuescript -have_coins = false -if have_coins then print "Münzen erhalten" else print "Keine Münzen" -``` - -Da `if`-Anweisungen als Ausdrücke verwendet werden können, kann man das auch so schreiben: - -```yuescript -have_coins = false -print if have_coins then "Münzen erhalten" else "Keine Münzen" -``` - -Bedingungen können auch in `return`-Anweisungen und Zuweisungen verwendet werden: - -```yuescript -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "Ich bin sehr groß" -else - "Ich bin nicht so groß" - -print message -- gibt aus: Ich bin sehr groß -``` - -Das Gegenteil von `if` ist `unless`: - -```yuescript -unless os.date("%A") == "Monday" - print "Es ist nicht Montag!" -``` - -```yuescript -print "You're lucky!" unless math.random! > 0.1 -``` - -## In-Ausdruck - -Mit einem `in`-Ausdruck kannst du Bereichsprüfungen schreiben. - -```yuescript -a = 5 - -if a in [1, 3, 5, 7] - print "Gleichheitsprüfung mit diskreten Werten" - -if a in list - print "Prüfen, ob `a` in einer Liste ist" -``` - -Der `in`-Operator kann auch mit Tabellen verwendet werden und unterstützt die Variante `not in` für Verneinungen: - -```yuescript -has = "foo" in {"bar", "foo"} - -if a in {1, 2, 3} - print "a ist in der Tabelle" - -not_exist = item not in list - -check = -> value not in table -``` - -Eine Ein-Element-Liste oder Tabelle prüft auf Gleichheit mit diesem Element: - -```yuescript --- [1,] prüft, ob wert == 1 -c = a in [1,] - --- {1} prüft auch, ob wert == 1 -c = a in {1} - --- Ohne Komma ist [1] ein Indexzugriff (tb[1]) -with tb - c = a in [1] -``` - -# For-Schleife - -Es gibt zwei Formen der `for`-Schleife, genau wie in Lua: eine numerische und eine generische. - -```yuescript -for i = 10, 20 - print i - -for k = 1, 15, 2 -- ein optionaler Schritt - print k - -for key, value in pairs object - print key, value -``` - -Die Slicing- und **\***-Operatoren können verwendet werden, genau wie bei Comprehensions: - -```yuescript -for item in *items[2, 4] - print item -``` - -Eine kürzere Syntax ist für alle Varianten verfügbar, wenn der Rumpf nur eine Zeile hat: - -```yuescript -for item in *items do print item - -for j = 1, 10, 3 do print j -``` - -Eine `for`-Schleife kann auch als Ausdruck verwendet werden. Die letzte Anweisung im Schleifenrumpf wird in einen Ausdruck umgewandelt und an eine wachsende Array-Tabelle angehängt. - -Alle geraden Zahlen verdoppeln: - -```yuescript -doubled_evens = for i = 1, 20 - if i % 2 == 0 - i * 2 - else - i -``` - -Zusätzlich unterstützen `for`-Schleifen `break` mit Rückgabewerten, sodass die Schleife selbst als Ausdruck verwendet werden kann, der früh mit einem sinnvollen Ergebnis endet. `for`-Ausdrücke unterstützen mehrere `break`-Werte. - -Beispiel: die erste Zahl größer als 10 finden: - -```yuescript -first_large = for n in *numbers - break n if n > 10 -``` - -Diese `break`-mit-Wert-Syntax ermöglicht knappe und ausdrucksstarke Such- bzw. Early-Exit-Muster direkt in Schleifenausdrücken. - -```yuescript -key, score = for k, v in pairs data - break k, v * 10 if k == "target" -``` - -Du kannst Werte auch filtern, indem du den `for`-Ausdruck mit `continue` kombinierst. - -`for`-Schleifen am Ende eines Funktionsrumpfs werden nicht in eine Tabelle für einen Rückgabewert gesammelt (stattdessen gibt die Funktion `nil` zurück). Du kannst entweder explizit `return` verwenden oder die Schleife in eine Listen-Comprehension umwandeln. - -```yuescript -func_a = -> for i = 1, 10 do print i -func_b = -> return for i = 1, 10 do i - -print func_a! -- gibt nil aus -print func_b! -- gibt Tabellenobjekt aus -``` - -Das verhindert die unnötige Erstellung von Tabellen in Funktionen, die die Ergebnisse der Schleife nicht zurückgeben müssen. - -# Continue - -Eine `continue`-Anweisung überspringt die aktuelle Iteration einer Schleife. - -```yuescript -i = 0 -while i < 10 - i += 1 - continue if i % 2 == 0 - print i -``` - -`continue` kann auch mit Schleifenausdrücken verwendet werden, um zu verhindern, dass diese Iteration in das Ergebnis akkumuliert wird. Dieses Beispiel filtert die Array-Tabelle auf gerade Zahlen: - -```yuescript -my_numbers = [1, 2, 3, 4, 5, 6] -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -# Switch - -Die `switch`-Anweisung ist eine Kurzform für eine Reihe von `if`-Anweisungen, die gegen denselben Wert prüfen. Der Wert wird nur einmal ausgewertet. Wie bei `if` kann `switch` einen `else`-Block haben, wenn keine Übereinstimmung gefunden wird. Verglichen wird mit dem Operator `==`. In einer `switch`-Anweisung kannst du auch eine Zuweisung verwenden, um den temporären Wert zu speichern. - -```yuescript -switch name := "Dan" - when "Robert" - print "Du bist Robert" - when "Dan", "Daniel" - print "Dein Name ist Dan" - else - print "Ich kenne dich nicht mit dem Namen #{name}" -``` - -Eine `when`-Klausel kann mehrere Werte prüfen, indem sie kommasepariert aufgelistet werden. - -`switch` kann auch als Ausdruck verwendet werden. Hier wird das Ergebnis der `switch`-Anweisung einer Variable zugewiesen: - -```yuescript -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "so hoch kann ich nicht zählen!" -``` - -Du kannst das Schlüsselwort `then` verwenden, um einen `when`-Block in einer Zeile zu schreiben. Für den `else`-Block braucht es kein zusätzliches Schlüsselwort. - -```yuescript -msg = switch math.random(1, 5) - when 1 then "Du hast Glück" - when 2 then "Du hast fast Glück" - else "nicht so viel Glück" -``` - -Wenn du eine Einrückung weniger möchtest, kannst du die erste `when`-Klausel in die Startzeile der Anweisung setzen und alle weiteren Klauseln mit einer Einrückung weniger schreiben. - -```yuescript -switch math.random(1, 5) - when 1 - print "Du hast Glück" -- zwei Einrückungen - else - print "nicht so viel Glück" - -switch math.random(1, 5) when 1 - print "Du hast Glück" -- eine Einrückung -else - print "nicht so viel Glück" -``` - -Beachte die Reihenfolge des Case-Vergleichsausdrucks. Der Case-Ausdruck steht auf der linken Seite. Das kann nützlich sein, wenn der Case-Ausdruck die Vergleichslogik über eine `__eq`-Metamethod selbst definiert. - -## Tabellen-Matching - -Du kannst in einer `switch`-`when`-Klausel Tabellen-Matching verwenden, wenn die Tabelle durch eine bestimmte Struktur destrukturiert werden kann und dabei nicht-`nil`-Werte liefert. - -```yuescript -items = - * x: 100 - y: 200 - * width: 300 - height: 400 - -for item in *items - switch item - when :x, :y - print "Vec2 #{x}, #{y}" - when :width, :height - print "Größe #{width}, #{height}" -``` - -Du kannst Standardwerte verwenden, um bestimmte Felder optional zu destrukturieren. - -```yuescript -item = {} - -{pos: {:x = 50, :y = 200}} = item -- Fehler: Versuch, einen nil-Wert zu indexieren (Feld 'pos') - -switch item - when {pos: {:x = 50, :y = 200}} - print "Vec2 #{x}, #{y}" -- Tabellen-Destrukturierung greift trotzdem -``` - -Du kannst auch gegen Array-Elemente, Tabellenfelder und sogar verschachtelte Strukturen mit Array- oder Tabellenliteralen matchen. - -Matchen gegen Array-Elemente. - -```yuescript -switch tb - when [1, 2, 3] - print "1, 2, 3" - when [1, b, 3] - print "1, #{b}, 3" - when [1, 2, b = 3] -- b hat einen Standardwert - print "1, 2, #{b}" -``` - -Matchen gegen Tabellenfelder mit Destructuring. - -```yuescript -switch tb - when success: true, :result - print "Erfolg", result - when success: false - print "fehlgeschlagen", result - else - print "ungültig" -``` - -Matchen gegen verschachtelte Tabellenstrukturen. - -```yuescript -switch tb - when data: {type: "success", :content} - print "Erfolg", content - when data: {type: "error", :content} - print "fehlgeschlagen", content - else - print "ungültig" -``` - -Matchen gegen Array von Tabellen. - -```yuescript -switch tb - when [ - {a: 1, b: 2} - {a: 3, b: 4} - {a: 5, b: 6} - fourth - ] - print "getroffen", fourth -``` - -Matchen gegen eine Liste und einen Bereich von Elementen erfassen. - -```yuescript -segments = ["admin", "users", "logs", "view"] -switch segments - when [...groups, resource, action] - print "Gruppe:", groups -- gibt aus: {"admin", "users"} - print "Ressource:", resource -- gibt aus: "logs" - print "Aktion:", action -- gibt aus: "view" -``` - -# While-Schleife - -Die `while`-Schleife gibt es ebenfalls in vier Variationen: - -```yuescript -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -```yuescript -i = 10 -until i == 0 - print i - i -= 1 - -until running == false do my_function! -``` - -Wie bei `for`-Schleifen kann die `while`-Schleife auch als Ausdruck verwendet werden. `while`- und `until`-Ausdrücke unterstützen `break` mit mehreren Rückgabewerten. - -```yuescript -value, doubled = while true - n = get_next! - break n, n * 2 if n > 10 -``` - -Damit eine Funktion den akkumulierten Wert einer `while`-Schleife zurückgibt, muss die Anweisung explizit mit `return` zurückgegeben werden. - -## Repeat-Schleife - -Die `repeat`-Schleife stammt aus Lua: - -```yuescript -i = 10 -repeat - print i - i -= 1 -until i == 0 -``` - -`repeat`-Ausdrücke unterstützen ebenfalls `break` mit mehreren Rückgabewerten: - -```yuescript -i = 1 -value, scaled = repeat - break i, i * 100 if i > 3 - i += 1 -until false -``` - -# Funktions-Stubs - -Es ist üblich, eine Funktion eines Objekts als Wert weiterzureichen, z. B. eine Instanzmethode als Callback. Wenn die Funktion das Objekt, auf dem sie arbeitet, als erstes Argument erwartet, musst du dieses Objekt irgendwie mit der Funktion bündeln, damit sie korrekt aufgerufen werden kann. - -Die Funktions-Stub-Syntax ist eine Kurzform, um eine neue Closure-Funktion zu erstellen, die sowohl Objekt als auch Funktion bündelt. Diese neue Funktion ruft die umschlossene Funktion im richtigen Kontext des Objekts auf. - -Die Syntax entspricht dem Aufruf einer Instanzmethode mit dem `\`-Operator, jedoch ohne Argumentliste. - -```yuescript -my_object = { - value: 1000 - write: => print "der Wert:", @value -} - -run_callback = (func) -> - print "Callback wird ausgeführt..." - func! - --- das funktioniert nicht: --- die Funktion darf keine Referenz auf my_object haben -run_callback my_object.write - --- Funktions-Stub-Syntax --- bindet das Objekt in eine neue Funktion ein -run_callback my_object\write -``` - -# Backcalls - -Backcalls werden verwendet, um Callbacks zu entkoppeln (unnesting). Sie werden mit Pfeilen nach links definiert und füllen standardmäßig als letzter Parameter einen Funktionsaufruf. Die Syntax ist weitgehend wie bei normalen Pfeilfunktionen, nur dass der Pfeil in die andere Richtung zeigt und der Funktionskörper keine Einrückung benötigt. - -```yuescript -x <- f -print "hallo" .. x -``` - -Fat-Arrow-Funktionen sind ebenfalls verfügbar. - -```yuescript -<= f -print @value -``` - -Du kannst einen Platzhalter angeben, an welcher Stelle die Backcall-Funktion als Parameter eingesetzt werden soll. - -```yuescript -(x) <- map _, [1, 2, 3] -x * 2 -``` - -Wenn du nach deinen Backcalls weiteren Code haben willst, kannst du sie mit einem `do`-Statement absetzen. Bei Nicht-Fat-Arrow-Funktionen können die Klammern weggelassen werden. - -```yuescript -result, msg = do - data <- readAsync "dateiname.txt" - print data - info <- processAsync data - check info -print result, msg -``` - -# Funktionsliterale - -Alle Funktionen werden mit einem Funktionsausdruck erstellt. Eine einfache Funktion wird mit dem Pfeil **->** notiert. - -```yuescript -my_function = -> -my_function() -- leere Funktion aufrufen -``` - -Der Funktionskörper kann entweder eine einzelne Anweisung direkt nach dem Pfeil sein oder aus mehreren Anweisungen bestehen, die in den folgenden Zeilen eingerückt werden: - -```yuescript -func_a = -> print "Hallo Welt" - -func_b = -> - value = 100 - print "Der Wert:", value -``` - -Wenn eine Funktion keine Argumente hat, kann sie mit dem `!`-Operator statt leerer Klammern aufgerufen werden. Der `!`-Aufruf ist die bevorzugte Art, Funktionen ohne Argumente aufzurufen. - -```yuescript -func_a! -func_b() -``` - -Funktionen mit Argumenten werden erstellt, indem der Pfeil von einer Argumentliste in Klammern eingeleitet wird: - -```yuescript -sum = (x, y) -> print "Summe", x + y -``` - -Funktionen können aufgerufen werden, indem die Argumente hinter dem Namen eines Ausdrucks stehen, der zu einer Funktion evaluiert. Beim Verketten mehrerer Funktionsaufrufe werden die Argumente der nächstliegenden Funktion links zugeordnet. - -```yuescript -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -Um Mehrdeutigkeiten beim Aufruf zu vermeiden, können die Argumente auch in Klammern gesetzt werden. Das ist hier nötig, damit die richtigen Argumente an die richtigen Funktionen gehen. - -```yuescript -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -Zwischen öffnender Klammer und Funktionsname darf kein Leerzeichen stehen. - -Funktionen wandeln die letzte Anweisung im Funktionskörper in ein `return` um. Das nennt sich implizites Return: - -```yuescript -sum = (x, y) -> x + y -print "Die Summe ist ", sum 10, 20 -``` - -Wenn du explizit zurückgeben willst, verwende `return`: - -```yuescript -sum = (x, y) -> return x + y -``` - -Wie in Lua können Funktionen mehrere Werte zurückgeben. Die letzte Anweisung muss eine Liste von Werten sein, getrennt durch Kommas: - -```yuescript -mystery = (x, y) -> x + y, x - y -a, b = mystery 10, 20 -``` - -## Fat Arrows - -Da es in Lua üblich ist, beim Methodenaufruf ein Objekt als erstes Argument zu übergeben, gibt es eine spezielle Syntax zum Erstellen von Funktionen, die automatisch ein `self`-Argument enthalten. - -```yuescript -func = (num) => @value + num -``` - -## Standardwerte für Argumente - -Es ist möglich, Standardwerte für Funktionsargumente anzugeben. Ein Argument gilt als leer, wenn sein Wert `nil` ist. Alle `nil`-Argumente mit Standardwert werden vor Ausführung des Funktionskörpers ersetzt. - -```yuescript -my_function = (name = "etwas", height = 100) -> - print "Hallo, ich bin", name - print "Meine Größe ist", height -``` - -Der Ausdruck für den Standardwert wird im Funktionskörper in der Reihenfolge der Argumentdeklarationen ausgewertet. Daher können Standardwerte auf zuvor deklarierte Argumente zugreifen. - -```yuescript -some_args = (x = 100, y = x + 1000) -> - print x + y -``` - -## Hinweise - -Aufgrund der ausdrucksstarken, klammerlosen Funktionsaufrufe müssen einige Einschränkungen gelten, um Parsing-Mehrdeutigkeiten mit Leerraum zu vermeiden. - -Das Minuszeichen hat zwei Rollen: unäre Negation und binäre Subtraktion. Sieh dir an, wie die folgenden Beispiele kompiliert werden: - -```yuescript -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -Die Präzedenz des ersten Arguments eines Funktionsaufrufs kann mit Leerraum gesteuert werden, wenn das Argument ein String-Literal ist. In Lua lässt man bei Aufrufen mit einem einzelnen String- oder Tabellenliteral häufig die Klammern weg. - -Wenn kein Leerzeichen zwischen Variable und String-Literal steht, hat der Funktionsaufruf Vorrang vor nachfolgenden Ausdrücken. In dieser Form können keine weiteren Argumente übergeben werden. - -Steht ein Leerzeichen zwischen Variable und String-Literal, verhält sich der Aufruf wie oben gezeigt. Das String-Literal gehört dann zu nachfolgenden Ausdrücken (falls vorhanden) und dient als Argumentliste. - -```yuescript -x = func"hallo" + 100 -y = func "hallo" + 100 -``` - -## Mehrzeilige Argumente - -Wenn Funktionsaufrufe viele Argumente haben, ist es praktisch, die Argumentliste auf mehrere Zeilen zu verteilen. Wegen der whitespace-sensitiven Natur der Sprache muss man dabei sorgfältig sein. - -Wenn eine Argumentliste in der nächsten Zeile fortgesetzt wird, muss die aktuelle Zeile mit einem Komma enden. Die folgende Zeile muss stärker eingerückt sein als die aktuelle. Sobald eingerückt, müssen alle weiteren Argumentzeilen auf derselben Einrückungsebene liegen, um Teil der Argumentliste zu sein. - -```yuescript -my_func 5, 4, 3, - 8, 9, 10 - -cool_func 1, 2, - 3, 4, - 5, 6, - 7, 8 -``` - -Diese Art des Aufrufs kann verschachtelt werden. Die Einrückungsebene bestimmt, zu welcher Funktion die Argumente gehören. - -```yuescript -my_func 5, 6, 7, - 6, another_func 6, 7, 8, - 9, 1, 2, - 5, 4 -``` - -Da Tabellen ebenfalls das Komma als Trennzeichen verwenden, hilft diese Einrückungssyntax dabei, Werte zur Argumentliste gehören zu lassen, statt zur Tabelle. - -```yuescript -x = [ - 1, 2, 3, 4, a_func 4, 5, - 5, 6, - 8, 9, 10 -] -``` - -Obwohl es selten ist: Du kannst Funktionsargumente tiefer einrücken, wenn du weißt, dass du später eine geringere Einrückungsebene verwenden wirst. - -```yuescript -y = [ my_func 1, 2, 3, - 4, 5, - 5, 6, 7 -] -``` - -Dasselbe lässt sich mit anderen Block-Statements wie Bedingungen machen. Wir können die Einrückungsebene verwenden, um zu bestimmen, zu welcher Anweisung ein Wert gehört: - -```yuescript -if func 1, 2, 3, - "hallo", - "Welt" - print "hallo" - print "Ich bin innerhalb der if-Bedingung" - -if func 1, 2, 3, - "hallo", - "Welt" - print "hallo" - print "Ich bin innerhalb der if-Bedingung" -``` - -## Parameter-Destructuring - -YueScript unterstützt jetzt Destructuring von Funktionsparametern, wenn das Argument ein Objekt ist. Es gibt zwei Formen von Destructuring-Tabellenliteralen: - -- **Geschweifte Klammern/Objektparameter**, die optionale Standardwerte erlauben, wenn Felder fehlen (z. B. `{:a, :b}`, `{a: a1 = 123}`). -- **Unverpackte einfache Tabellensyntax**, die mit einer Sequenz aus Key-Value- oder Shorthand-Bindings beginnt und so lange läuft, bis ein anderer Ausdruck sie beendet (z. B. `:a, b: b1, :c`). Diese Form extrahiert mehrere Felder aus demselben Objekt. - -```yuescript -f1 = (:a, :b, :c) -> - print a, b, c - -f1 a: 1, b: "2", c: {} - -f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> - print a1, b, c - -arg1 = {a: 0} -f2 arg1, arg2 -``` - -## Präfixiertes Return-Expression - -Wenn du mit tief verschachtelten Funktionskörpern arbeitest, kann es mühsam sein, die Lesbarkeit und Konsistenz des Rückgabewerts zu erhalten. Dafür führt YueScript die Syntax der **präfixierten Return-Expression** ein. Sie hat folgende Form: - -```yuescript -findFirstEven = (list): nil -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub -``` - -Das ist äquivalent zu: - -```yuescript -findFirstEven = (list) -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub - nil -``` - -Der einzige Unterschied ist, dass du den finalen Rückgabeausdruck vor das `->`- oder `=>`-Token ziehen kannst, um den impliziten Rückgabewert der Funktion als letzte Anweisung zu kennzeichnen. So musst du selbst bei Funktionen mit mehreren verschachtelten Schleifen oder bedingten Zweigen kein abschließendes `return` am Ende des Funktionskörpers mehr schreiben, was die Logikstruktur klarer und leichter nachvollziehbar macht. - -## Benannte Varargs - -Mit der Syntax `(...t) ->` kannst du Varargs automatisch in einer benannten Tabelle speichern. Diese Tabelle enthält alle übergebenen Argumente (einschließlich `nil`-Werten), und das Feld `n` der Tabelle speichert die tatsächliche Anzahl übergebener Argumente (einschließlich `nil`-Werten). - -```yuescript -f = (...t) -> - print "Anzahl der Argumente:", t.n - print "Tabellenlänge:", #t - for i = 1, t.n - print t[i] - -f 1, 2, 3 -f "a", "b", "c", "d" -f! - --- Fälle mit nil-Werten behandeln -process = (...args) -> - sum = 0 - for i = 1, args.n - if args[i] != nil and type(args[i]) == "number" - sum += args[i] - sum - -process 1, nil, 3, nil, 5 -``` - -# Leerraum - -YueScript ist eine whitespace-sensible Sprache. Du musst bestimmte Code-Blöcke mit derselben Einrückung (Leerzeichen **' '** oder Tab **'\t'**) schreiben, z. B. Funktionskörper, Wertelisten und Kontrollblöcke. Ausdrücke mit unterschiedlichem Leerraum können unterschiedliche Bedeutungen haben. Ein Tab wird wie 4 Leerzeichen behandelt, aber es ist besser, Leerzeichen und Tabs nicht zu mischen. - -## Anweisungs-Trenner - -Eine Anweisung endet normalerweise an einem Zeilenumbruch. Du kannst auch ein Semikolon `;` verwenden, um eine Anweisung explizit zu beenden, wodurch mehrere Anweisungen in einer Zeile möglich sind: - -```yuescript -a = 1; b = 2; print a + b -``` - -## Mehrzeiliges Chaining - -Du kannst mehrzeilige, verkettete Funktionsaufrufe mit derselben Einrückung schreiben. - -```yuescript -Rx.Observable - .fromRange 1, 8 - \filter (x) -> x % 2 == 0 - \concat Rx.Observable.of 'who do we appreciate' - \map (value) -> value .. '!' - \subscribe print -``` - -# Kommentare - -```yuescript --- Ich bin ein Kommentar - -str = --[[ -Dies ist ein mehrzeiliger Kommentar. -Alles okay. -]] strA \ -- Kommentar 1 - .. strB \ -- Kommentar 2 - .. strC - -func --[[Port]] 3000, --[[IP]] "192.168.1.1" -``` - -# Attribute - -Syntax-Unterstützung für Lua-5.4-Attribute. Du kannst weiterhin die Deklarationen `const` und `close` verwenden und erhältst Konstantenprüfung sowie Scoped-Callbacks, wenn du auf Lua-Versionen unter 5.4 zielst. - -```yuescript -const a = 123 -close _ = : -> print "Außerhalb des Gültigkeitsbereichs." -``` - -Du kannst Destructuring mit als konstant markierten Variablen verwenden. - -```yuescript -const {:a, :b, c, d} = tb --- a = 1 -``` - -Du kannst auch eine globale Variable als `const` deklarieren. - -```yuescript -global const Constant = 123 --- Constant = 1 -``` - -# Operatoren - -Alle binären und unären Operatoren von Lua sind verfügbar. Zusätzlich ist **!=** ein Alias für **~=**, und entweder **\*\* oder **::\*\* kann für verkettete Funktionsaufrufe wie `tb\func!` oder `tb::func!` verwendet werden. Außerdem bietet YueScript einige spezielle Operatoren für ausdrucksstärkeren Code. - -```yuescript -tb\func! if tb ~= nil -tb::func! if tb != nil -``` - -## Verkettete Vergleiche - -Vergleiche können beliebig verkettet werden: - -```yuescript -print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 --- Ausgabe: true - -a = 5 -print 1 <= a <= 10 --- Ausgabe: true -``` - -Beachte das Auswertungsverhalten verketteter Vergleiche: - -```yuescript -v = (x) -> - print x - x - -print v(1) < v(2) <= v(3) ---[[ - Ausgabe: - 2 - 1 - 3 - true -]] - -print v(1) > v(2) <= v(3) ---[[ - Ausgabe: - 2 - 1 - false -]] -``` - -Der mittlere Ausdruck wird nur einmal ausgewertet, nicht zweimal wie bei `v(1) < v(2) and v(2) <= v(3)`. Die Auswertungsreihenfolge in verketteten Vergleichen ist jedoch undefiniert. Es wird dringend empfohlen, in verketteten Vergleichen keine Ausdrücke mit Seiteneffekten (z. B. `print`) zu verwenden. Wenn Seiteneffekte nötig sind, sollte der Short-Circuit-Operator `and` explizit verwendet werden. - -## Tabellenerweiterung - -Der Operator **[] =** wird verwendet, um Werte an Tabellen anzuhängen. - -```yuescript -tab = [] -tab[] = "Wert" -``` - -Du kannst auch den Spread-Operator `...` verwenden, um alle Elemente einer Liste an eine andere anzuhängen: - -```yuescript -tbA = [1, 2, 3] -tbB = [4, 5, 6] -tbA[] = ...tbB --- tbA ist jetzt [1, 2, 3, 4, 5, 6] -``` - -## Tabellen-Spread - -Du kannst Array-Tabellen oder Hash-Tabellen mit dem Spread-Operator `...` vor Ausdrücken in Tabellenliteralen zusammenführen. - -Wenn in ein Tabellenliteral mit geschweiften Klammern gespreadet wird (zum Beispiel `{...other}`), werden sowohl der Array-Teil als auch der Hash-Teil der Lua-Tabelle kopiert. - -```yuescript -parts = - * "Schultern" - * "Knie" -lyrics = - * "Kopf" - * ...parts - * "und" - * "Zehen" - -copy = {...other} - -a = {1, 2, 3, x: 1} -b = {4, 5, y: 1} -merge = {...a, ...b} -``` - -### List-Tabellen-Spread - -Wenn in ein Tabellenliteral mit eckigen Klammern gespreadet wird (zum Beispiel `[...other,]`), wird nur der Array-Teil kopiert. - -```yuescript -source = {1, 2, 3, name: "Yue"} -fullCopy = {...source} -listCopy = [...source,] --- fullCopy => {1, 2, 3, name: "Yue"} --- listCopy => [1, 2, 3] -``` - -## Umgekehrter Tabellenindex - -Mit dem Operator **#** kannst du auf die letzten Elemente einer Tabelle zugreifen. - -```yuescript -last = data.items[#] -second_last = data.items[#-1] -data.items[#] = 1 -``` - -## Metatable - -Der Operator **<>** kann als Abkürzung für Metatable-Manipulation verwendet werden. - -### Metatable erstellen - -Erzeuge eine normale Tabelle mit leeren Klammern **<>** oder einem Metamethod-Schlüssel, der von **<>** umschlossen ist. - -```yuescript -mt = {} -add = (right) => <>: mt, value: @value + right.value -mt.__add = add - -a = <>: mt, value: 1 - -- Feld mit gleichnamiger Variable setzen -b = :, value: 2 -c = : mt.__add, value: 3 - -d = a + b + c -print d.value - -close _ = : -> print "Außerhalb des Gültigkeitsbereichs" -``` - -### Metatable-Zugriff - -Metatable mit **<>** oder einem von **<>** umschlossenen Metamethod-Namen aufrufen oder einen Ausdruck in **<>** schreiben. - -```yuescript --- erstellen mit Metatable, das das Feld "value" enthält -tb = <"value">: 123 -tb. = tb.<> -print tb.value - -tb.<> = __index: {item: "hallo"} -print tb.item -``` - -### Metatable-Destrukturierung - -Destrukturiere Metatable mit Metamethoden-Schlüssel, der von **<>** umschlossen ist. - -```yuescript -{item, :new, :, : getter} = tb -print item, new, close, getter -``` - -## Existenz - -Der Operator **?** kann in verschiedenen Kontexten verwendet werden, um die Existenz zu prüfen. - -```yuescript -func?! -print abc?["hello world"]?.xyz - -x = tab?.value -len = utf8?.len or string?.len or (o) -> #o - -if print and x? - print x - -with? io.open "test.txt", "w" - \write "hello" - \close! -``` - -## Piping - -Anstelle einer Reihe verschachtelter Funktionsaufrufe kannst du Werte mit dem Operator **|>** weiterleiten. - -```yuescript -"hello" |> print -1 |> print 2 -- Pipe-Element als erstes Argument einfügen -2 |> print 1, _, 3 -- Pipe mit Platzhalter - --- Pipe-Ausdruck über mehrere Zeilen -readFile "example.txt" - |> extract language, {} - |> parse language - |> emit - |> render - |> print -``` - -## Nil-Coalescing - -Der Nil-Coalescing-Operator **??** gibt den Wert des linken Operanden zurück, wenn er nicht **nil** ist; andernfalls wird der rechte Operand ausgewertet und sein Ergebnis zurückgegeben. Der **??**-Operator wertet seinen rechten Operanden nicht aus, wenn der linke Operand nicht nil ergibt. - -```yuescript -local a, b, c, d -a = b ?? c ?? d -func a ?? {} - -a ??= false -``` - -## Implizites Objekt - -Du kannst innerhalb eines Tabellenblocks eine Liste impliziter Strukturen schreiben, die mit dem Symbol **\*** oder **-** beginnt. Beim Erstellen eines impliziten Objekts müssen die Felder des Objekts dieselbe Einrückung haben. - -```yuescript --- Zuweisung mit implizitem Objekt -list = - * 1 - * 2 - * 3 - --- Funktionsaufruf mit implizitem Objekt -func - * 1 - * 2 - * 3 - --- Rückgabe mit implizitem Objekt -f = -> - return - * 1 - * 2 - * 3 - --- Tabelle mit implizitem Objekt -tb = - name: "abc" - - values: - - "a" - - "b" - - "c" - - objects: - - name: "a" - value: 1 - func: => @value + 1 - tb: - fieldA: 1 - - - name: "b" - value: 2 - func: => @value + 2 - tb: { } - -``` - -# Literale - -Alle primitiven Literale in Lua können verwendet werden. Das gilt für Zahlen, Strings, Booleans und **nil**. - -Anders als in Lua sind Zeilenumbrüche innerhalb einfacher und doppelter Anführungszeichen ohne Escape-Sequenz erlaubt: - -```yuescript -some_string = "Hier ist ein String - mit einem Zeilenumbruch." - --- Mit der #{}-Syntax kannst du Ausdrücke in String-Literale einbinden. --- String-Interpolation gibt es nur in doppelt angeführten Strings. -print "Ich bin mir zu #{math.random! * 100}% sicher." -``` - -## Zahlenliterale - -Du kannst Unterstriche in Zahlenliteralen verwenden, um die Lesbarkeit zu erhöhen. - -```yuescript -integer = 1_000_000 -hex = 0xEF_BB_BF -binary = 0B10011 -``` - -## YAML-Mehrzeilen-String - -Das Präfix `|` führt ein mehrzeiliges String-Literal im YAML-Stil ein: - -```yuescript -str = | - key: value - list: - - item1 - - #{expr} -``` - -Damit lässt sich strukturierter, mehrzeiliger Text bequem schreiben. Alle Zeilenumbrüche und Einrückungen bleiben relativ zur ersten nicht-leeren Zeile erhalten, und Ausdrücke innerhalb von `#{...}` werden automatisch als `tostring(expr)` interpoliert. - -Der YAML-Mehrzeilen-String erkennt automatisch das gemeinsame führende Leerraumpräfix (minimale Einrückung über alle nicht-leeren Zeilen) und entfernt es aus allen Zeilen. So kannst du deinen Code optisch einrücken, ohne den resultierenden String zu verändern. - -```yuescript -fn = -> - str = | - foo: - bar: baz - return str -``` - -Die interne Einrückung bleibt relativ zum entfernten gemeinsamen Präfix erhalten, wodurch saubere, verschachtelte Strukturen möglich sind. - -Alle Sonderzeichen wie Anführungszeichen (`"`) und Backslashes (`\`) im YAML-Mehrzeilen-Block werden automatisch escaped, sodass der erzeugte Lua-String syntaktisch korrekt ist und wie erwartet funktioniert. - -```yuescript -str = | - path: "C:\Program Files\App" - note: 'He said: "#{Hello}!"' -``` - -# Module - -## Import - -Die `import`-Anweisung ist syntaktischer Zucker für `require` und hilft beim Extrahieren von Einträgen aus importierten Modulen. Importierte Elemente sind standardmäßig `const`. - -```yuescript --- als Tabellen-Destrukturierung -do - import insert, concat from table - -- Fehler beim Zuweisen zu insert, concat - import C, Ct, Cmt from require "lpeg" - -- Kurzform für implizites Require - import x, y, z from 'mymodule' - -- Import im Python-Stil - from 'module' import a, b, c - --- Kurzform zum Laden eines Moduls -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- Modul mit Alias oder Tabellen-Destrukturierung laden -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - -## Import von Globals - -Du kannst mit `import` bestimmte Globals in lokale Variablen importieren. Wenn du eine Kette von Globalzugriffen importierst, wird das letzte Feld der lokalen Variable zugewiesen. - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - -### Automatischer Global-Import - -Du kannst `import global` am Anfang eines Blocks platzieren, um automatisch alle Namen zu importieren, die im aktuellen Scope nicht explizit deklariert oder zugewiesen sind. Diese impliziten Importe werden als lokale `const` behandelt, die an die entsprechenden Globals zum Zeitpunkt der Anweisung gebunden sind. - -Namen, die im selben Scope explizit als `global` deklariert werden, werden nicht importiert, sodass du sie weiterhin zuweisen kannst. - -```yuescript -do - import global - print "hallo" - math.random 3 - -- print = nil -- Fehler: importierte Globals sind const - -do - -- explizite globale Variable wird nicht importiert - import global - global FLAG - print FLAG - FLAG = 123 -``` - -## Export - -Die `export`-Anweisung bietet eine knappe Möglichkeit, Module zu definieren. - -### Benannter Export - -Benannter Export definiert eine lokale Variable und fügt ein Feld in die exportierte Tabelle ein. - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "Katze" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - -Benannter Export mit Destructuring. - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = 'default'}} = tb -``` - -Benannte Elemente aus dem Modul exportieren, ohne lokale Variablen zu erstellen. - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - -### Unbenannter Export - -Unbenannter Export fügt das Ziel-Element in den Array-Teil der exportierten Tabelle ein. - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - -### Default-Export - -Mit dem Schlüsselwort **default** in einer `export`-Anweisung wird die exportierte Tabelle durch ein beliebiges Objekt ersetzt. - -```yuescript -export default -> - print "hallo" - 123 -``` - -# Lizenz: MIT - -Hinweis: Die MIT-Lizenz ist unten im englischen Originaltext wiedergegeben. - -Urheberrecht (c) 2017-2026 Li Jin - -Hiermit wird unentgeltlich jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, die Erlaubnis erteilt, uneingeschränkt mit der Software zu verfahren, einschließlich und ohne Beschränkung der Rechte, die Software zu benutzen, zu kopieren, zu verändern, zusammenzuführen, zu veröffentlichen, zu verbreiten, zu unterlizenzieren und/oder zu verkaufen, sowie Personen, denen die Software zur Verfügung gestellt wird, dies ebenfalls zu gestatten, unter den folgenden Bedingungen: - -Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein. - -DIE SOFTWARE WIRD OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GARANTIE ZUR VERFÜGUNG GESTELLT, EINSCHLIESSLICH DER GARANTIEN DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR ANSPRÜCHE, SCHÄDEN ODER SONSTIGE HAFTUNGEN VERANTWORTLICH, SEI ES AUS EINEM VERTRAG, EINER UNERLAUBTEN HANDLUNG ODER ANDERWEITIG, DIE SICH AUS DER SOFTWARE ODER DER BENUTZUNG DER SOFTWARE ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE ERGEBEN ODER DAMIT IN ZUSAMMENHANG STEHEN. - -# Die YueScript-Bibliothek - -Zugriff in Lua über `local yue = require("yue")`. - -## yue - -**Beschreibung:** - -Die YueScript-Sprachbibliothek. - -### version - -**Typ:** Feld. - -**Beschreibung:** - -Die YueScript-Version. - -**Signatur:** - -```lua -version: string -``` - -### dirsep - -**Typ:** Feld. - -**Beschreibung:** - -Der Dateitrennzeichen-String der aktuellen Plattform. - -**Signatur:** - -```lua -dirsep: string -``` - -### yue_compiled - -**Typ:** Feld. - -**Beschreibung:** - -Der Cache für kompilierten Modulcode. - -**Signatur:** - -```lua -yue_compiled: {string: string} -``` - -### to_lua - -**Typ:** Funktion. - -**Beschreibung:** - -Die YueScript-Compilerfunktion. Sie kompiliert YueScript-Code zu Lua-Code. - -**Signatur:** - -```lua -to_lua: function(code: string, config?: Config): - --[[codes]] string | nil, - --[[error]] string | nil, - --[[globals]] {{string, integer, integer}} | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| code | string | Der YueScript-Code. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -| string \| nil | Der kompilierte Lua-Code oder `nil`, falls die Kompilierung fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls die Kompilierung erfolgreich war. | -| {{string, integer, integer}} \| nil | Die globalen Variablen im Code (mit Name, Zeile und Spalte) oder `nil`, wenn die Compiler-Option `lint_global` false ist. | - -### file_exist - -**Typ:** Funktion. - -**Beschreibung:** - -Prüft, ob eine Quelldatei existiert. Kann überschrieben werden, um das Verhalten anzupassen. - -**Signatur:** - -```lua -file_exist: function(filename: string): boolean -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | -------------- | -| filename | string | Der Dateiname. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ----------------------- | -| boolean | Ob die Datei existiert. | - -### read_file - -**Typ:** Funktion. - -**Beschreibung:** - -Liest eine Quelldatei. Kann überschrieben werden, um das Verhalten anzupassen. - -**Signatur:** - -```lua -read_file: function(filename: string): string -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | -------------- | -| filename | string | Der Dateiname. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ---------------- | -| string | Der Dateiinhalt. | - -### insert_loader - -**Typ:** Funktion. - -**Beschreibung:** - -Fügt den YueScript-Loader in die Package-Loader (Searcher) ein. - -**Signatur:** - -```lua -insert_loader: function(pos?: integer): boolean -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------- | ---------------------------------------------------------------------- | -| pos | integer | [Optional] Position, an der der Loader eingefügt wird. Standard ist 3. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ------------------------------------------------------------------------------------ | -| boolean | Ob der Loader erfolgreich eingefügt wurde. Scheitert, wenn er bereits eingefügt ist. | - -### remove_loader - -**Typ:** Funktion. - -**Beschreibung:** - -Entfernt den YueScript-Loader aus den Package-Loadern (Searchern). - -**Signatur:** - -```lua -remove_loader: function(): boolean -``` - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | --------------------------------------------------------------------------------- | -| boolean | Ob der Loader erfolgreich entfernt wurde. Scheitert, wenn er nicht eingefügt ist. | - -### loadstring - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einem String in eine Funktion. - -**Signatur:** - -```lua -loadstring: function(input: string, chunkname: string, env: table, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| input | string | Der YueScript-Code. | -| chunkname | string | Der Name des Code-Chunks. | -| env | table | Die Environment-Tabelle. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| --------------- | --------------------------------------------------------------------- | -| function \| nil | Die geladene Funktion oder `nil`, falls das Laden fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls das Laden erfolgreich war. | - -### loadstring - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einem String in eine Funktion. - -**Signatur:** - -```lua -loadstring: function(input: string, chunkname: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| input | string | Der YueScript-Code. | -| chunkname | string | Der Name des Code-Chunks. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| --------------- | --------------------------------------------------------------------- | -| function \| nil | Die geladene Funktion oder `nil`, falls das Laden fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls das Laden erfolgreich war. | - -### loadstring - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einem String in eine Funktion. - -**Signatur:** - -```lua -loadstring: function(input: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| input | string | Der YueScript-Code. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| --------------- | --------------------------------------------------------------------- | -| function \| nil | Die geladene Funktion oder `nil`, falls das Laden fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls das Laden erfolgreich war. | - -### loadfile - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einer Datei in eine Funktion. - -**Signatur:** - -```lua -loadfile: function(filename: string, env: table, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| filename | string | Der Dateiname. | -| env | table | Die Environment-Tabelle. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| --------------- | --------------------------------------------------------------------- | -| function \| nil | Die geladene Funktion oder `nil`, falls das Laden fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls das Laden erfolgreich war. | - -### loadfile - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einer Datei in eine Funktion. - -**Signatur:** - -```lua -loadfile: function(filename: string, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| filename | string | Der Dateiname. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| --------------- | --------------------------------------------------------------------- | -| function \| nil | Die geladene Funktion oder `nil`, falls das Laden fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls das Laden erfolgreich war. | - -### dofile - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einer Datei in eine Funktion und führt sie aus. - -**Signatur:** - -```lua -dofile: function(filename: string, env: table, config?: Config): any... -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| filename | string | Der Dateiname. | -| env | table | Die Environment-Tabelle. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ----------------------------------------- | -| any... | Die Rückgabewerte der geladenen Funktion. | - -### dofile - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt YueScript-Code aus einer Datei in eine Funktion und führt sie aus. - -**Signatur:** - -```lua -dofile: function(filename: string, config?: Config): any... -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | --------------------------------- | -| filename | string | Der Dateiname. | -| config | Config | [Optional] Die Compiler-Optionen. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ----------------------------------------- | -| any... | Die Rückgabewerte der geladenen Funktion. | - -### find_modulepath - -**Typ:** Funktion. - -**Beschreibung:** - -Löst den YueScript-Modulnamen in einen Dateipfad auf. - -**Signatur:** - -```lua -find_modulepath: function(name: string): string -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | -------------- | -| name | string | Der Modulname. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | -------------- | -| string | Der Dateipfad. | - -### pcall - -**Typ:** Funktion. - -**Beschreibung:** - -Ruft eine Funktion im geschützten Modus auf. -Fängt Fehler ab und gibt einen Statuscode sowie Ergebnisse oder ein Fehlerobjekt zurück. -Schreibt die Fehlerzeilennummer bei Fehlern auf die ursprüngliche Zeilennummer im YueScript-Code um. - -**Signatur:** - -```lua -pcall: function(f: function, ...: any): boolean, any... -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | -------- | --------------------------- | -| f | function | Die aufzurufende Funktion. | -| ... | any | Argumente für die Funktion. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ------------ | ---------------------------------------------------- | -| boolean, ... | Statuscode und Funktionsresultate oder Fehlerobjekt. | - -### require - -**Typ:** Funktion. - -**Beschreibung:** - -Lädt ein Modul (Lua oder YueScript). -Schreibt die Fehlerzeilennummer auf die ursprüngliche Zeilennummer im YueScript-Code um, wenn das Modul ein YueScript-Modul ist und das Laden fehlschlägt. - -**Signatur:** - -```lua -require: function(name: string): any... -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | -------------------------------- | -| modname | string | Der Name des zu ladenden Moduls. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| any | Der Wert in `package.loaded[modname]`, falls das Modul bereits geladen ist. Andernfalls wird ein Loader gesucht und der finale Wert von `package.loaded[modname]` sowie Loader-Daten als zweites Ergebnis zurückgegeben. | - -### p - -**Typ:** Funktion. - -**Beschreibung:** - -Inspiziert die Struktur der übergebenen Werte und gibt String-Repräsentationen aus. - -**Signatur:** - -```lua -p: function(...: any) -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | --- | ---------------------------- | -| ... | any | Die zu inspizierenden Werte. | - -### options - -**Typ:** Feld. - -**Beschreibung:** - -Die aktuellen Compiler-Optionen. - -**Signatur:** - -```lua -options: Config.Options -``` - -### traceback - -**Typ:** Funktion. - -**Beschreibung:** - -Die Traceback-Funktion, die Stacktrace-Zeilennummern auf die ursprünglichen Zeilennummern im YueScript-Code umschreibt. - -**Signatur:** - -```lua -traceback: function(message: string): string -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | ------------------------ | -| message | string | Die Traceback-Nachricht. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | --------------------------------------- | -| string | Die umgeschriebene Traceback-Nachricht. | - -### is_ast - -**Typ:** Funktion. - -**Beschreibung:** - -Prüft, ob der Code dem angegebenen AST entspricht. - -**Signatur:** - -```lua -is_ast: function(astName: string, code: string): boolean -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | ------------- | -| astName | string | Der AST-Name. | -| code | string | Der Code. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | ------------------------------- | -| boolean | Ob der Code dem AST entspricht. | - -### AST - -**Typ:** Feld. - -**Beschreibung:** - -Die AST-Typdefinition mit Name, Zeile, Spalte und Unterknoten. - -**Signatur:** - -```lua -type AST = {string, integer, integer, any} -``` - -### to_ast - -**Typ:** Funktion. - -**Beschreibung:** - -Konvertiert Code in AST. - -**Signatur:** - -```lua -to_ast: function(code: string, flattenLevel?: number, astName?: string, reserveComment?: boolean): - --[[AST]] AST | nil, - --[[error]] nil | string -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| -------------- | ------- | -------------------------------------------------------------------------------------------- | -| code | string | Der Code. | -| flattenLevel | integer | [Optional] Der Flatten-Level. Höher bedeutet mehr Flattening. Standard ist 0. Maximum ist 2. | -| astName | string | [Optional] Der AST-Name. Standard ist "File". | -| reserveComment | boolean | [Optional] Ob die ursprünglichen Kommentare beibehalten werden. Standard ist false. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ------------- | ---------------------------------------------------------------------- | -| AST \| nil | Der AST oder `nil`, falls die Konvertierung fehlgeschlagen ist. | -| string \| nil | Die Fehlermeldung oder `nil`, falls die Konvertierung erfolgreich war. | - -### format - -**Typ:** Funktion. - -**Beschreibung:** - -Formatiert den YueScript-Code. - -**Signatur:** - -```lua -format: function(code: string, tabSize?: number, reserveComment?: boolean): string -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| -------------- | ------- | ---------------------------------------------------------------------------------- | -| code | string | Der Code. | -| tabSize | integer | [Optional] Die Tab-Größe. Standard ist 4. | -| reserveComment | boolean | [Optional] Ob die ursprünglichen Kommentare beibehalten werden. Standard ist true. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | --------------------- | -| string | Der formatierte Code. | - -### \_\_call - -**Typ:** Metamethod. - -**Beschreibung:** - -Required das YueScript-Modul. -Schreibt die Fehlerzeilennummer bei Ladefehlern auf die ursprüngliche Zeilennummer im YueScript-Code um. - -**Signatur:** - -```lua -metamethod __call: function(self: yue, module: string): any... -``` - -**Parameter:** - -| Parameter | Typ | Beschreibung | -| --------- | ------ | -------------- | -| module | string | Der Modulname. | - -**Rückgabe:** - -| Rückgabetyp | Beschreibung | -| ----------- | -------------- | -| any | Der Modulwert. | - -## Config - -**Beschreibung:** - -Die Compiler-Optionen. - -### lint_global - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler die globalen Variablen im Code sammeln soll. - -**Signatur:** - -```lua -lint_global: boolean -``` - -### implicit_return_root - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler für den Root-Codeblock ein implizites Return verwenden soll. - -**Signatur:** - -```lua -implicit_return_root: boolean -``` - -### reserve_line_number - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler die ursprüngliche Zeilennummer im kompilierten Code beibehalten soll. - -**Signatur:** - -```lua -reserve_line_number: boolean -``` - -### reserve_comment - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler die ursprünglichen Kommentare im kompilierten Code beibehalten soll. - -**Signatur:** - -```lua -reserve_comment: boolean -``` - -### space_over_tab - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler statt Tabzeichen Leerzeichen verwenden soll. - -**Signatur:** - -```lua -space_over_tab: boolean -``` - -### same_module - -**Typ:** Feld. - -**Beschreibung:** - -Ob der Compiler den zu kompilierenden Code als dasselbe aktuell kompilierte Modul behandeln soll. Nur für internen Gebrauch. - -**Signatur:** - -```lua -same_module: boolean -``` - -### line_offset - -**Typ:** Feld. - -**Beschreibung:** - -Ob die Compiler-Fehlermeldung einen Zeilennummern-Offset enthalten soll. Nur für internen Gebrauch. - -**Signatur:** - -```lua -line_offset: integer -``` - -### yue.Config.LuaTarget - -**Typ:** Enumeration. - -**Beschreibung:** - -Die Ziel-Lua-Version. - -**Signatur:** - -```lua -enum LuaTarget - "5.1" - "5.2" - "5.3" - "5.4" - "5.5" -end -``` - -### options - -**Typ:** Feld. - -**Beschreibung:** - -Zusätzliche Optionen für die Kompilierung. - -**Signatur:** - -```lua -options: Options -``` - -## Options - -**Beschreibung:** - -Zusätzliche Compiler-Optionen. - -### target - -**Typ:** Feld. - -**Beschreibung:** - -Die Ziel-Lua-Version für die Kompilierung. - -**Signatur:** - -```lua -target: LuaTarget -``` - -### path - -**Typ:** Feld. - -**Beschreibung:** - -Zusätzlicher Modul-Suchpfad. - -**Signatur:** - -```lua -path: string -``` - -### dump_locals - -**Typ:** Feld. - -**Beschreibung:** - -Ob lokale Variablen in Traceback-Fehlermeldungen ausgegeben werden sollen. Standard ist false. - -**Signatur:** - -```lua -dump_locals: boolean -``` - -### simplified - -**Typ:** Feld. - -**Beschreibung:** - -Ob Fehlermeldungen vereinfacht werden sollen. Standard ist true. - -**Signatur:** - -```lua -simplified: boolean -``` diff --git a/doc/yue-en.md b/doc/yue-en.md deleted file mode 100644 index 618f4d72..00000000 --- a/doc/yue-en.md +++ /dev/null @@ -1,3591 +0,0 @@ -# YueScript Documentation - -Welcome to the YueScript official documentation!
-Here you can find the language features, usage, reference examples and resources.
-Please select a chapter from the sidebar to start learning about YueScript. - -# Do - -When used as a statement, do works just like it does in Lua. - -```yuescript -do - var = "hello" - print var -print var -- nil here -``` - -YueScript's **do** can also be used an expression. Allowing you to combine multiple lines into one. The result of the do expression is the last statement in its body. - -```yuescript -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```yuescript -tbl = { - key: do - print "assigning key!" - 1234 -} -``` - -`do` expressions also support using `break` to interrupt control flow and return multiple values early: - -```yuescript -status, value = do - n = 12 - if n > 10 - break "large", n - break "small", n -``` - -# Line Decorators - -For convenience, the for loop and if statement can be applied to single statements at the end of the line: - -```yuescript -print "hello world" if name == "Rob" -``` - -And with basic loops: - -```yuescript -print "item: ", item for item in *items -``` - -And with while loops: - -```yuescript -game\update! while game\isRunning! - -reader\parse_line! until reader\eof! -``` - -# Macro - -## Common Usage - -Macro function is used for evaluating a string in the compile time and insert the generated codes into final compilation. - -```yuescript -macro PI2 = -> math.pi * 2 -area = $PI2 * 5 - -macro HELLO = -> "'hello world'" -print $HELLO - -macro config = (debugging) -> - global debugMode = debugging == "true" - "" - -macro asserts = (cond) -> - debugMode and "assert #{cond}" or "" - -macro assert = (cond) -> - debugMode and "assert #{cond}" or "#{cond}" - -$config true -$asserts item ~= nil - -$config false -value = $assert item - --- the passed expressions are treated as strings -macro and = (...) -> "#{ table.concat {...}, ' and ' }" -if $and f1!, f2!, f3! - print "OK" -``` - -## Insert Raw Codes - -A macro function can either return a YueScript string or a config table containing generated code. - -```yuescript -macro yueFunc = (var) -> "local #{var} = ->" -$yueFunc funcA -funcA = -> "fail to assign to the Yue macro defined variable" - -macro luaFunc = (var) -> { - code: "local function #{var}() end" - type: "lua" -} -$luaFunc funcB -funcB = -> "fail to assign to the Lua macro defined variable" - -macro lua = (code) -> { - :code - type: "lua" -} - --- the raw string leading and ending symbols are auto trimed -$lua[==[ --- raw Lua codes insertion -if cond then - print("output") -end -]==] -``` - -The returned table can be used to control how the generated code gets inserted. - -- `code` is the generated text. -- `type` chooses how the text is handled. It can be `"yue"` (the default), `"lua"`, or `"text"`. -- `locals` declares local names introduced by inserted text. -- `before` puts the generated result before the annotated statement instead of after it. - -In most cases you only need to choose a `type`. Use `"yue"` for generated YueScript, `"lua"` for raw Lua, and `"text"` for text that should be copied straight into the final output. - -## Export Macro - -Macro functions can be exported from a module and get imported in another module. You have to put export macro functions in a single file to be used, and only macro definition, macro importing and macro expansion in place can be put into the macro exporting module. - -```yuescript --- file: utils.yue -export macro map = (items, action) -> "[#{action} for _ in *#{items}]" -export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" -export macro foreach = (items, action) -> "for _ in *#{items} - #{action}" - --- file main.yue -import "utils" as { - $, -- symbol to import all macros - $foreach: $each -- rename macro $foreach to $each -} -[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ -``` - -## Builtin Macro - -There are some builtin macros but you can override them by declaring macros with the same names. - -```yuescript -print $FILE -- get string of current module name -print $LINE -- get number 2 -``` - -## Generating Macros with Macros - -In YueScript, macro functions allow you to generate code at compile time. By nesting macro functions, you can create more complex generation patterns. This feature enables you to define a macro function that generates another macro function, allowing for more dynamic code generation. - -```yuescript -macro Enum = (...) -> - items = {...} - itemSet = {item, true for item in *items} - (item) -> - error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item] - "\"#{item}\"" - -macro BodyType = $Enum( - Static - Dynamic - Kinematic -) - -print "Valid enum type:", $BodyType Static --- print "Compilation error with enum type:", $BodyType Unknown -``` - -## Generating Multi-line Code - -When a macro returns multi-line Yue code, using a quoted multi-line string is not recommended. Prefer `-> |` instead. - -A quoted string keeps the literal text as-is, while a YAML multiline string removes the common leading indentation. This usually makes generated Yue blocks more stable, especially when the generated code contains comments or nested blocks. - -```yuescript -macro default_conf = (conf) -> " - -- useful; only set once -#{conf}.identity = 'LOVE' -#{conf}.version = \"11.5\" - " - -love.conf = (t) -> - $default_conf t -``` - -```yuescript -macro default_conf = (conf) -> | - -- useful; only set once - #{conf}.identity = 'LOVE' - #{conf}.version = "11.5" - -love.conf = (t) -> - $default_conf t -``` - -## Argument Validation - -You can declare the expected AST node types in the argument list, and check whether the incoming macro arguments meet the expectations at compile time. - -```yuescript -macro printNumAndStr = (num `Num, str `String) -> | - print( - #{num} - #{str} - ) - -$printNumAndStr 123, "hello" -``` - -If you need more flexible argument checking, you can use the built-in `$is_ast` macro function to manually check at the appropriate place. - -```yuescript -macro printNumAndStr = (num, str) -> - error "expected Num as first argument" unless $is_ast Num, num - error "expected String as second argument" unless $is_ast String, str - "print(#{num}, #{str})" - -$printNumAndStr 123, "hello" -``` - -For more details about available AST nodes, please refer to the uppercased definitions in [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). - -## Annotation Statements - -Annotation statements apply a macro to the statement immediately following them. - -This is equivalent to calling the macro with the following statement's source text appended as the last argument. - -```yuescript -macro ShowName = (code) -> | - print "#{code\match '^[%w_]*'}" - -$[ShowName] -myFunc = -> - -return -``` - -When the annotation macro returns a config table, the optional `before` field controls whether the generated result is emitted before or after the annotated statement. - -```yuescript -macro Tag = (tag, code) -> - tableName = code\match "^[%w_]+" - return - type: "text" - before: tag == "before" - code: "-- #{tag}:#{tableName}" - -$[Tag before] -tableA = {} - -$[Tag after] -tableB = {} - -return -``` - -Because the followed statement is passed in as an extra macro argument, annotations can also be used to generate registration code from class declarations. Because the followed statement is passed in as an extra macro argument, you can use the same AST argument checks as normal macros: - -```yuescript -macro Register = (registry, code`ClassDecl) -> - className = code\match "^class%s+(%w+)" - return | - #{registry}["#{className}"] = #{className} - -registry = {} - -$[Register(registry)] -class Worker - run: => "ok" - -return -``` - -Annotations can also inject wrapper code around functions: - -```yuescript -macro ValidateNumberArgs = (code) -> - funcName = code\match "^(%w+)%s*=" - return | - local __orig_#{funcName} = #{funcName} - #{funcName} = (...) -> - for i = 1, select "#", ... - assert type(select i, ...) == "number", "expected number for arg \#{i}" - __orig_#{funcName} ... - -$[ValidateNumberArgs] -add = (a, b) -> a + b -``` - -An annotation must always be followed by a statement, and it can not be applied to a `return` statement. If the annotated statement appears at the end of a block, add an explicit trailing `return` when you need the raw statement AST shape instead of an implicitly returned expression. - -# Try - -The syntax for Lua error handling in a common form. - -```yuescript -try - func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try - func 1, 2, 3 -catch err - yue.traceback err - -try func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try func 1, 2, 3 - -try - print "trying" - func 1, 2, 3 - --- working with if assignment pattern -if success, result := try func 1, 2, 3 -catch err - print yue.traceback err - print result -``` - -## Try? - -`try?` is a simplified use for error handling syntax that omit the boolean status from the `try` statement, and it will return the result from the try block when success, return nil instead of error object otherwise. - -```yuescript -a, b, c = try? func! - --- with nil coalescing operator -a = (try? func!) ?? "default" - --- as function argument -f try? func! - --- with catch block -f try? - print 123 - func! -catch e - print e - e -``` - -# Table Literals - -Like in Lua, tables are delimited in curly braces. - -```yuescript -some_values = {1, 2, 3, 4} -``` - -Unlike Lua, assigning a value to a key in a table is done with **:** (instead of **=**). - -```yuescript -some_values = { - name: "Bill", - age: 200, - ["favorite food"]: "rice" -} -``` - -The curly braces can be left off if a single table of key value pairs is being assigned. - -```yuescript -profile = - height: "4 feet", - shoe_size: 13, - favorite_foods: ["ice cream", "donuts"] -``` - -Newlines can be used to delimit values instead of a comma (or both): - -```yuescript -values = { - 1, 2, 3, 4 - 5, 6, 7, 8 - name: "superman" - occupation: "crime fighting" -} -``` - -When creating a single line table literal, the curly braces can also be left off: - -```yuescript -my_function dance: "Tango", partner: "none" - -y = type: "dog", legs: 4, tails: 1 -``` - -The keys of a table literal can be language keywords without being escaped: - -```yuescript -tbl = { - do: "something" - end: "hunger" -} -``` - -If you are constructing a table out of variables and wish the keys to be the same as the variable names, then the **:** prefix operator can be used: - -```yuescript -hair = "golden" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -If you want the key of a field in the table to to be result of an expression, then you can wrap it in **[ ]**, just like in Lua. You can also use a string literal directly as a key, leaving out the square brackets. This is useful if your key has any special characters. - -```yuescript -t = { - [1 + 2]: "hello" - "hello world": true -} -``` - -Lua tables have both an array part and a hash part, but sometimes it's useful to make a semantic distinction between the two. You can use **[ ]** instead of **{ }** to explicitly declare a table as an array, doing so will prevent any key-value pairs from being written inside it. - -```yuescript -some_values = [1, 2, 3, 4] -list_with_one_element = [1, ] -``` - -# Comprehensions - -Comprehensions provide a convenient syntax for constructing a new table by iterating over some existing object and applying an expression to its values. There are two kinds of comprehensions: list comprehensions and table comprehensions. They both produce Lua tables; list comprehensions accumulate values into an array-like table, and table comprehensions let you set both the key and the value on each iteration. - -## List Comprehensions - -The following creates a copy of the items table but with all the values doubled. - -```yuescript -items = [ 1, 2, 3, 4 ] -doubled = [item * 2 for i, item in ipairs items] -``` - -The items included in the new table can be restricted with a when clause: - -```yuescript -slice = [item for i, item in ipairs items when i > 1 and i < 3] -``` - -Because it is common to iterate over the values of a numerically indexed table, an **\*** operator is introduced. The doubled example can be rewritten as: - -```yuescript -doubled = [item * 2 for item in *items] -``` - -In list comprehensions, you can also use the spread operator `...` to flatten nested lists, achieving a flat map effect: - -```yuescript -data = - a: [1, 2, 3] - b: [4, 5, 6] - -flat = [...v for k,v in pairs data] --- flat is now [1, 2, 3, 4, 5, 6] -``` - -The for and when clauses can be chained as much as desired. The only requirement is that a comprehension has at least one for clause. - -Using multiple for clauses is the same as using nested loops: - -```yuescript -x_coords = [4, 5, 6, 7] -y_coords = [9, 2, 3] - -points = [ [x, y] for x in *x_coords \ -for y in *y_coords] -``` - -Numeric for loops can also be used in comprehensions: - -```yuescript -evens = [i for i = 1, 100 when i % 2 == 0] -``` - -## Table Comprehensions - -The syntax for table comprehensions is very similar, only differing by using **{** and **}** and taking two values from each iteration. - -This example makes a copy of the tablething: - -```yuescript -thing = { - color: "red" - name: "fast" - width: 123 -} - -thing_copy = {k, v for k, v in pairs thing} -``` - -```yuescript -no_color = {k, v for k, v in pairs thing when k != "color"} -``` - -The **\*** operator is also supported. Here we create a square root look up table for a few numbers. - -```yuescript -numbers = [1, 2, 3, 4] -sqrts = {i, math.sqrt i for i in *numbers} -``` - -The key-value tuple in a table comprehension can also come from a single expression, in which case the expression should return two values. The first is used as the key and the second is used as the value: - -In this example we convert an array of pairs to a table where the first item in the pair is the key and the second is the value. - -```yuescript -tuples = [ ["hello", "world"], ["foo", "bar"]] -tbl = {unpack tuple for tuple in *tuples} -``` - -## Slicing - -A special syntax is provided to restrict the items that are iterated over when using the **\*** operator. This is equivalent to setting the iteration bounds and a step size in a for loop. - -Here we can set the minimum and maximum bounds, taking all items with indexes between 1 and 5 inclusive: - -```yuescript -slice = [item for item in *items[1, 5]] -``` - -Any of the slice arguments can be left off to use a sensible default. In this example, if the max index is left off it defaults to the length of the table. This will take everything but the first element: - -```yuescript -slice = [item for item in *items[2,]] -``` - -If the minimum bound is left out, it defaults to 1. Here we only provide a step size and leave the other bounds blank. This takes all odd indexed items: (1, 3, 5, …) - -```yuescript -slice = [item for item in *items[,,2]] -``` - -Both the minimum and maximum bounds can be negative, which means that the bounds are counted from the end of the table. - -```yuescript --- take the last 4 items -slice = [item for item in *items[-4,-1]] -``` - -The step size can also be negative, which means that the items are taken in reverse order. - -```yuescript -reverse_slice = [item for item in *items[-1,1,-1]] -``` - -### Slicing Expression - -Slicing can also be used as an expression. This is useful for getting a sub-list of a table. - -```yuescript --- take the 2nd and 4th items as a new list -sub_list = items[2, 4] - --- take the last 4 items -last_four_items = items[-4, -1] -``` - -# Object Oriented Programming - -In these examples, the generated Lua code may appear overwhelming. It is best to focus on the meaning of the YueScript code at first, then look into the Lua code if you wish to know the implementation details. - -A simple class: - -```yuescript -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -A class is declared with a class statement followed by a table-like declaration where all of the methods and properties are listed. - -The new property is special in that it will become the constructor. - -Notice how all the methods in the class use the fat arrow function syntax. When calling methods on a instance, the instance itself is sent in as the first argument. The fat arrow handles the creation of a self argument. - -The @ prefix on a variable name is shorthand for self.. @items becomes self.items. - -The class block also supports metatable fields by writing metamethod keys in angle brackets, such as ``. - -```yuescript -class User - new: (@name) => - : => "User(#{@name})" - -print tostring User "Yue" -``` - -Creating an instance of the class is done by calling the name of the class as a function. - -```yuescript -inv = Inventory! -inv\add_item "t-shirt" -inv\add_item "pants" -``` - -Because the instance of the class needs to be sent to the methods when they are called, the \ operator is used. - -All properties of a class are shared among the instances. This is fine for functions, but for other types of objects, undesired results may occur. - -Consider the example below, the clothes property is shared amongst all instances, so modifications to it in one instance will show up in another: - -```yuescript -class Person - clothes: [] - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "pants" -b\give_item "shirt" - --- will print both pants and shirt -print item for item in *a.clothes -``` - -The proper way to avoid this problem is to create the mutable state of the object in the constructor: - -```yuescript -class Person - new: => - @clothes = [] -``` - -## Inheritance - -The extends keyword can be used in a class declaration to inherit the properties and methods from another class. - -```yuescript -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "backpack is full" - super name -``` - -Here we extend our Inventory class, and limit the amount of items it can carry. - -In this example, we don't define a constructor on the subclass, so the parent class' constructor is called when we make a new instance. If we did define a constructor then we can use the super method to call the parent constructor. - -Whenever a class inherits from another, it sends a message to the parent class by calling the method \_\_inherited on the parent class if it exists. The function receives two arguments, the class that is being inherited and the child class. - -```yuescript -class Shelf - @__inherited: (child) => - print @__name, "was inherited by", child.__name - --- will print: Shelf was inherited by Cupboard -class Cupboard extends Shelf -``` - -## Super - -**super** is a special keyword that can be used in two different ways: It can be treated as an object, or it can be called like a function. It only has special functionality when inside a class. - -When called as a function, it will call the function of the same name in the parent class. The current self will automatically be passed as the first argument. (As seen in the inheritance example above) - -When super is used as a normal value, it is a reference to the parent class object. - -It can be accessed like any of object in order to retrieve values in the parent class that might have been shadowed by the child class. - -When the \ calling operator is used with super, self is inserted as the first argument instead of the value of super itself. When using . to retrieve a function, the raw function is returned. - -A few examples of using super in different ways: - -```yuescript -class MyClass extends ParentClass - a_method: => - -- the following have the same effect: - super "hello", "world" - super\a_method "hello", "world" - super.a_method self, "hello", "world" - - -- super as a value is equal to the parent class: - assert super == ParentClass -``` - -**super** can also be used on left side of a Function Stub. The only major difference is that instead of the resulting function being bound to the value of super, it is bound to self. - -## Types - -Every instance of a class carries its type with it. This is stored in the special \_\_class property. This property holds the class object. The class object is what we call to build a new instance. We can also index the class object to retrieve class methods and properties. - -```yuescript -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- prints 10 -``` - -## Class Objects - -The class object is what we create when we use a class statement. The class object is stored in a variable of the same name of the class. - -The class object can be called like a function in order to create new instances. That's how we created instances of classes in the examples above. - -A class is made up of two tables. The class table itself, and the base table. The base is used as the metatable for all the instances. All properties listed in the class declaration are placed in the base. - -The class object's metatable reads properties from the base if they don't exist in the class object. This means we can access functions and properties directly from the class. - -It is important to note that assigning to the class object does not assign into the base, so it's not a valid way to add new methods to instances. Instead the base must explicitly be changed. See the \_\_base field below. - -The class object has a couple special properties: - -The name of the class as when it was declared is stored as a string in the \_\_name field of the class object. - -```yuescript -print BackPack.__name -- prints Backpack -``` - -The base object is stored in \_\_base. We can modify this table to add functionality to instances that have already been created and ones that are yet to be created. - -If the class extends from anything, the parent class object is stored in \_\_parent. - -## Class Variables - -We can create variables directly in the class object instead of in the base by using @ in the front of the property name in a class declaration. - -```yuescript -class Things - @some_func: => print "Hello from", @__name - -Things\some_func! - --- class variables not visible in instances -assert Things().some_func == nil -``` - -In expressions, we can use @@ to access a value that is stored in the **class of self. Thus, @@hello is shorthand for self.**class.hello. - -```yuescript -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- prints 2 -``` - -The calling semantics of @@ are similar to @. Calling a @@ name will pass the class in as the first argument using Lua's colon syntax. - -```yuescript -@@hello 1,2,3,4 -``` - -## Class Declaration Statements - -In the body of a class declaration, we can have normal expressions in addition to key/value pairs. In this context, self is equal to the class object. - -Here is an alternative way to create a class variable compared to what's described above: - -```yuescript -class Things - @class_var = "hello world" -``` - -These expressions are executed after all the properties have been added to the base. - -All variables declared in the body of the class are local to the classes properties. This is convenient for placing private values or helper functions that only the class methods can access: - -```yuescript -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "hello world: " .. secret -``` - -## @ and @@ Values - -When @ and @@ are prefixed in front of a name they represent, respectively, that name accessed in self and self.\_\_class. - -If they are used all by themselves, they are aliases for self and self.\_\_class. - -```yuescript -assert @ == self -assert @@ == self.__class -``` - -For example, a quick way to create a new instance of the same class from an instance method using @@: - -```yuescript -some_instance_method = (...) => @@ ... -``` - -## Constructor Property Promotion - -To reduce the boilerplate code for definition of simple value objects. You can write a simple class like: - -```yuescript -class Something - new: (@foo, @bar, @@biz, @@baz) => - --- Which is short for - -class Something - new: (foo, bar, biz, baz) => - @foo = foo - @bar = bar - @@biz = biz - @@baz = baz -``` - -You can also use this syntax for a common function to initialize a object's fields. - -```yuescript -new = (@fieldA, @fieldB) => @ -obj = new {}, 123, "abc" -print obj -``` - -## Class Expressions - -The class syntax can also be used as an expression which can be assigned to a variable or explicitly returned. - -```yuescript -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -## Anonymous classes - -The name can be left out when declaring a class. The \_\_name attribute will be nil, unless the class expression is in an assignment. The name on the left hand side of the assignment is used instead of nil. - -```yuescript -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -You can even leave off the body, meaning you can write a blank anonymous class like this: - -```yuescript -x = class -``` - -## Class Mixing - -You can do mixing with keyword `using` to copy functions from either a plain table or a predefined class object into your new class. When doing mixing with a plain table, you can override the class indexing function (metamethod `__index`) to your customized implementation. When doing mixing with an existing class object, the class object's metamethods won't be copied. - -```yuescript -MyIndex = __index: var: 1 - -class X using MyIndex - func: => - print 123 - -x = X! -print x.var - -class Y using X - -y = Y! -y\func! - -assert y.__class.__parent ~= X -- X is not parent of Y -``` - -# With Statement - -A common pattern involving the creation of an object is calling a series of functions and setting a series of properties immediately after creating it. - -This results in repeating the name of the object multiple times in code, adding unnecessary noise. A common solution to this is to pass a table in as an argument which contains a collection of keys and values to overwrite. The downside to this is that the constructor of this object must support this form. - -The with block helps to alleviate this. Within a with block we can use a special statements that begin with either . or \ which represent those operations applied to the object we are using with on. - -For example, we work with a newly created object: - -```yuescript -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -The with statement can also be used as an expression which returns the value it has been giving access to. - -```yuescript -file = with File "favorite_foods.txt" - \set_encoding "utf8" -``` - -`with` expressions support `break` with one value: - -```yuescript -result = with obj - break .value -``` - -After `break value` is used inside `with`, the `with` expression no longer returns its target object. Instead, it returns the value from `break`. - -```yuescript -a = with obj - .x = 1 --- a is obj - -b = with obj - break .x --- b is .x, not obj -``` - -Unlike `for` / `while` / `repeat` / `do`, `with` only supports one break value. - -Or… - -```yuescript -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", [dad, mother, sister] -``` - -In this usage, with can be seen as a special form of the K combinator. - -The expression in the with statement can also be an assignment, if you want to give a name to the expression. - -```yuescript -with str := "Hello" - print "original:", str - print "upper:", \upper! -``` - -You can access special keys with `[]` in a `with` statement. - -```yuescript -with tb - [1] = 1 - print [2] - with [abc] - [3] = [2]\func! - ["key-name"] = value - [] = "abc" -- appending to "tb" -``` - -`with?` is an enhanced version of `with` syntax, which introduces an existential check to safely access objects that may be nil without explicit null checks. - -```yuescript -with? obj - print .name -``` - -# Assignment - -The variable is dynamic typed and is defined as local by default. But you can change the scope of declaration by **local** and **global** statement. - -```yuescript -hello = "world" -a, b, c = 1, 2, 3 -hello = 123 -- uses the existing variable -``` - -## Perform Update - -You can perform update assignment with many binary operators. - -```yuescript -x = 1 -x += 1 -x -= 1 -x *= 10 -x /= 10 -x %= 10 -s ..= "world" -- will add a new local if local variable is not exist -arg or= "default value" -``` - -## Chaining Assignment - -You can do chaining assignment to assign multiple items to hold the same value. - -```yuescript -a = b = c = d = e = 0 -x = y = z = f! -``` - -## Explicit Locals - -```yuescript -do - local a = 1 - local * - print "forward declare all variables as locals" - x = -> 1 + y + z - y, z = 2, 3 - global instance = Item\new! - -do - local X = 1 - local ^ - print "only forward declare upper case variables" - a = 1 - B = 2 -``` - -## Explicit Globals - -```yuescript -do - global a = 1 - global * - print "declare all variables as globals" - x = -> 1 + y + z - y, z = 2, 3 - -do - global X = 1 - global ^ - print "only declare upper case variables as globals" - a = 1 - B = 2 - local Temp = "a local value" -``` - -# Varargs Assignment - -You can assign the results returned from a function to a varargs symbol `...`. And then access its content using the Lua way. - -```yuescript -list = [1, 2, 3, 4, 5] -fn = (ok) -> ok, table.unpack list -ok, ... = fn true -count = select '#', ... -first = select 1, ... -print ok, count, first -``` - -# If Assignment - -`if` and `elseif` blocks can take an assignment in place of a conditional expression. Upon evaluating the conditional, the assignment will take place and the value that was assigned to will be used as the conditional expression. The assigned variable is only in scope for the body of the conditional, meaning it is never available if the value is not truthy. And you have to use "the walrus operator" `:=` instead of `=` to do assignment. - -```yuescript -if user := database.find_user "moon" - print user.name -``` - -```yuescript -if hello := os.getenv "hello" - print "You have hello", hello -elseif world := os.getenv "world" - print "you have world", world -else - print "nothing :(" -``` - -If assignment with multiple return values. Only the first value is getting checked, other values are scoped. - -```yuescript -if success, result := pcall -> "get result without problems" - print result -- variable result is scoped -print "OK" -``` - -## While Assignment - -You can also use if assignment in a while loop to get the value as the loop condition. - -```yuescript -while byte := stream\read_one! - -- do something with the byte - print byte -``` - -# Destructuring Assignment - -Destructuring assignment is a way to quickly extract values from a table by their name or position in array based tables. - -Typically when you see a table literal, {1,2,3}, it is on the right hand side of an assignment because it is a value. Destructuring assignment swaps the role of the table literal, and puts it on the left hand side of an assign statement. - -This is best explained with examples. Here is how you would unpack the first two values from a table: - -```yuescript -thing = [1, 2] - -[a, b] = thing -print a, b -``` - -In the destructuring table literal, the key represents the key to read from the right hand side, and the value represents the name the read value will be assigned to. - -```yuescript -obj = { - hello: "world" - day: "tuesday" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day - -:day = obj -- OK to do simple destructuring without braces -``` - -This also works with nested data structures as well: - -```yuescript -obj2 = { - numbers: [1, 2, 3, 4] - properties: { - color: "green" - height: 13.5 - } -} - -{numbers: [first, second], properties: {color: color}} = obj2 -print first, second, color -``` - -If the destructuring statement is complicated, feel free to spread it out over a few lines. A slightly more complicated example: - -```yuescript -{ - numbers: [first, second] - properties: { - color: color - } -} = obj2 -``` - -It's common to extract values from at table and assign them the local variables that have the same name as the key. In order to avoid repetition we can use the **:** prefix operator: - -```yuescript -{:concat, :insert} = table -``` - -This is effectively the same as import, but we can rename fields we want to extract by mixing the syntax: - -```yuescript -{:mix, :max, random: rand} = math -``` - -You can write default values while doing destructuring like: - -```yuescript -{:name = "nameless", :job = "jobless"} = person -``` - -You can use `_` as placeholder when doing a list destructuring: - -```yuescript -[_, two, _, four] = items -``` - -## Range Destructuring - -You can use the spread operator `...` in list destructuring to capture a range of values. This is useful when you want to extract specific elements from the beginning and end of a list while collecting the rest in between. - -```yuescript -orders = ["first", "second", "third", "fourth", "last"] -[first, ...bulk, last] = orders -print first -- prints: first -print bulk -- prints: {"second", "third", "fourth"} -print last -- prints: last -``` - -The spread operator can be used in different positions to capture different ranges, and you can use `_` as a placeholder for the values you don't want to capture: - -```yuescript --- Capture everything after first element -[first, ...rest] = orders - --- Capture everything before last element -[...start, last] = orders - --- Capture things except the middle elements -[first, ..._, last] = orders -``` - -## Destructuring In Other Places - -Destructuring can also show up in places where an assignment implicitly takes place. An example of this is a for loop: - -```yuescript -tuples = [ - ["hello", "world"] - ["egg", "head"] -] - -for [left, right] in *tuples - print left, right -``` - -We know each element in the array table is a two item tuple, so we can unpack it directly in the names clause of the for statement using a destructure. - -# The Using Clause; Controlling Destructive Assignment - -While lexical scoping can be a great help in reducing the complexity of the code we write, things can get unwieldy as the code size increases. Consider the following snippet: - -```yuescript -i = 100 - --- many lines of code... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- will print 0 -``` - -In my_func, we've overwritten the value of i mistakenly. In this example it is quite obvious, but consider a large, or foreign code base where it isn't clear what names have already been declared. - -It would be helpful to say which variables from the enclosing scope we intend on change, in order to prevent us from changing others by accident. - -The using keyword lets us do that. using nil makes sure that no closed variables are overwritten in assignment. The using clause is placed after the argument list in a function, or in place of it if there are no arguments. - -```yuescript -i = 100 - -my_func = (using nil) -> - i = "hello" -- a new local variable is created here - -my_func! -print i -- prints 100, i is unaffected -``` - -Multiple names can be separated by commas. Closure values can still be accessed, they just cant be modified: - -```yuescript -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k, i) -> - tmp = tmp + add -- a new local tmp is created - i += tmp - k += tmp - -my_func(22) -print i, k -- these have been updated -``` - -# Usage - -## Lua Module - -Use YueScript module in Lua: - -- **Case 1** - - Require "your_yuescript_entry.yue" in Lua. - - ```lua - require("yue")("your_yuescript_entry") - ``` - - And this code still works when you compile "your_yuescript_entry.yue" to "your_yuescript_entry.lua" in the same path. In the rest YueScript files just use the normal **require** or **import**. The code line numbers in error messages will also be handled correctly. - -- **Case 2** - - Require YueScript module and rewite message by hand. - - ```lua - local yue = require("yue") - yue.insert_loader() - local success, result = xpcall(function() - return require("yuescript_module_name") - end, function(err) - return yue.traceback(err) - end) - ``` - -- **Case 3** - - Use the YueScript compiler function in Lua. - - ```lua - local yue = require("yue") - local codes, err, globals = yue.to_lua([[ - f = -> - print "hello world" - f! - ]],{ - implicit_return_root = true, - reserve_line_number = true, - lint_global = true, - space_over_tab = false, - options = { - target = "5.4", - path = "/script" - } - }) - ``` - -## YueScript Tool - -Use YueScript tool with: - -```shell -> yue -h -Usage: yue - [options] [] ... - yue -e [args...] - yue -w [] [options] - yue - - -Notes: - - '-' / '--' must be the first and only argument. - - '-o/--output' can not be used with multiple input files. - - '-w/--watch' can not be used with file input (directory only). - - with '-e/--execute', remaining tokens are treated as script args. - -Options: - -h, --help Show this help message and exit. - -e , --execute Execute a file or raw codes - -m, --minify Generate minified codes - -r, --rewrite Rewrite output to match original line numbers - -t , --output-to - Specify where to place compiled files - -o , --output Write output to file - -p, --print Write output to standard out - -b, --benchmark Dump compile time (doesn't write output) - -g, --globals Dump global variables used in NAME LINE COLUMN - -s, --spaces Use spaces in generated codes instead of tabs - -l, --line-numbers Write line numbers from source codes - -j, --no-implicit-return Disable implicit return at end of file - -c, --reserve-comments Reserve comments before statement from source codes - -w [], --watch [] - Watch changes and compile every file under directory - -v, --version Print version - - Read from standard in, print to standard out - (Must be first and only argument) - -- Same as '-' (kept for backward compatibility) - - --target Specify the Lua version that codes will be generated to - (version can only be 5.1 to 5.5) - --path Append an extra Lua search path string to package.path - --= Pass compiler option in key=value form (existing behavior) - - Execute without options to enter REPL, type symbol '$' - in a single line to start/stop multi-line mode -``` - -Use cases: - -Recursively compile every YueScript file with extension **.yue** under current path: **yue .** - -Compile and save results to a target path: **yue -t /target/path/ .** - -Compile and reserve debug info: **yue -l .** - -Compile and generate minified codes: **yue -m .** - -Execute raw codes: **yue -e 'print 123'** - -Execute a YueScript file: **yue -e main.yue** - -# Introduction - -YueScript is a dynamic language that compiles to Lua. And it's a [MoonScript](https://github.com/leafo/moonscript) dialect. The codes written in YueScript are expressive and extremely concise. And it is suitable for writing some changing application logic with more maintainable codes and runs in a Lua embeded environment such as games or website servers. - -Yue (月) is the name of moon in Chinese and it's pronounced as [jyɛ]. - -## An Overview of YueScript - -```yuescript --- import syntax -import p, to_lua from "yue" - --- object literals -inventory = - equipment: - - "sword" - - "shield" - items: - - name: "potion" - count: 10 - - name: "bread" - count: 3 - --- list comprehension -map = (arr, action) -> - [action item for item in *arr] - -filter = (arr, cond) -> - [item for item in *arr when cond item] - -reduce = (arr, init, action): init -> - init = action init, item for item in *arr - --- pipe operator -[1, 2, 3] - |> map (x) -> x * 2 - |> filter (x) -> x > 4 - |> reduce 0, (a, b) -> a + b - |> print - --- metatable manipulation -apple = - size: 15 - : - color: 0x00ffff - -with apple - p .size, .color, . if .<>? - --- js-like export syntax -export 🌛 = "Script of Moon" -``` - -## About Dora SSR - -YueScript is being developed and maintained alongside the open-source game engine [Dora SSR](https://github.com/IppClub/Dora-SSR). It has been used to create engine tools, game demos and prototypes, validating its capabilities in real-world scenarios while enhancing the Dora SSR development experience. - -# Installation - -## Lua Module - -Install [luarocks](https://luarocks.org), a package manager for Lua modules. Then install it as a Lua module and executable with: - -```shell -luarocks install yuescript -``` - -Or you can build `yue.so` file with: - -```shell -make shared LUAI=/usr/local/include/lua LUAL=/usr/local/lib/lua -``` - -Then get the binary file from path **bin/shared/yue.so**. - -## Build Binary Tool - -Clone this repo, then build and install executable with: - -```shell -make install -``` - -Build YueScript tool without macro feature: - -```shell -make install NO_MACRO=true -``` - -Build YueScript tool without built-in Lua binary: - -```shell -make install NO_LUA=true -``` - -## Download Precompiled Binary - -You can download precompiled binary files, including binary executable files compatible with different Lua versions and library files. - -Download precompiled binary files from [here](https://github.com/IppClub/YueScript/releases). - -# Conditionals - -```yuescript -have_coins = false -if have_coins - print "Got coins" -else - print "No coins" -``` - -A short syntax for single statements can also be used: - -```yuescript -have_coins = false -if have_coins then print "Got coins" else print "No coins" -``` - -Because if statements can be used as expressions, this can also be written as: - -```yuescript -have_coins = false -print if have_coins then "Got coins" else "No coins" -``` - -Conditionals can also be used in return statements and assignments: - -```yuescript -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "I am very tall" -else - "I am not so tall" - -print message -- prints: I am very tall -``` - -The opposite of if is unless: - -```yuescript -unless os.date("%A") == "Monday" - print "it is not Monday!" -``` - -```yuescript -print "You're lucky!" unless math.random! > 0.1 -``` - -## In Expression - -You can write range checking code with an `in-expression`. - -```yuescript -a = 5 - -if a in [1, 3, 5, 7] - print "checking equality with discrete values" - -if a in list - print "checking if `a` is in a list" -``` - -The `in` operator can also be used with tables and supports the `not in` variant for negation: - -```yuescript -has = "foo" in {"bar", "foo"} - -if a in {1, 2, 3} - print "a is in the table" - -not_exist = item not in list - -check = -> value not in table -``` - -A single-element list or table checks for equality with that element: - -```yuescript --- [1,] checks if value == 1 -c = a in [1,] - --- {1} also checks if value == 1 -c = a in {1} - --- Without comma, [1] is indexing (tb[1]) -with tb - c = a in [1] -``` - -# For Loop - -There are two for loop forms, just like in Lua. A numeric one and a generic one: - -```yuescript -for i = 10, 20 - print i - -for k = 1, 15, 2 -- an optional step provided - print k - -for key, value in pairs object - print key, value -``` - -The slicing and **\*** operators can be used, just like with comprehensions: - -```yuescript -for item in *items[2, 4] - print item -``` - -A shorter syntax is also available for all variations when the body is only a single line: - -```yuescript -for item in *items do print item - -for j = 1, 10, 3 do print j -``` - -A for loop can also be used as an expression. The last statement in the body of the for loop is coerced into an expression and appended to an accumulating array table. - -Doubling every even number: - -```yuescript -doubled_evens = for i = 1, 20 - if i % 2 == 0 - i * 2 - else - i -``` - -In addition, for loops support break with return values, allowing the loop itself to be used as an expression that exits early with meaningful results. - -For example, to find the first number greater than 10: - -```yuescript -first_large = for n in *numbers - break n if n > 10 -``` - -This break-with-value syntax enables concise and expressive search or early-exit patterns directly within loop expressions. - -For loop expressions can break with multiple values: - -```yuescript -key, score = for k, v in pairs data - break k, v * 10 if k == "target" -``` - -You can also filter values by combining the for loop expression with the continue statement. - -For loops at the end of a function body are not accumulated into a table for a return value (Instead the function will return nil). Either an explicit return statement can be used, or the loop can be converted into a list comprehension. - -```yuescript -func_a = -> for i = 1, 10 do print i -func_b = -> return for i = 1, 10 do i - -print func_a! -- prints nil -print func_b! -- prints table object -``` - -This is done to avoid the needless creation of tables for functions that don't need to return the results of the loop. - -# Continue - -A continue statement can be used to skip the current iteration in a loop. - -```yuescript -i = 0 -while i < 10 - i += 1 - continue if i % 2 == 0 - print i -``` - -continue can also be used with loop expressions to prevent that iteration from accumulating into the result. This examples filters the array table into just even numbers: - -```yuescript -my_numbers = [1, 2, 3, 4, 5, 6] -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -# Switch - -The switch statement is shorthand for writing a series of if statements that check against the same value. Note that the value is only evaluated once. Like if statements, switches can have an else block to handle no matches. Comparison is done with the == operator. In switch statement, you can also use assignment expression to store temporary variable value. - -```yuescript -switch name := "Dan" - when "Robert" - print "You are Robert" - when "Dan", "Daniel" - print "Your name, it's Dan" - else - print "I don't know about you with name #{name}" -``` - -A switch when clause can match against multiple values by listing them out comma separated. - -Switches can be used as expressions as well, here we can assign the result of the switch to a variable: - -```yuescript -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "can't count that high!" -``` - -We can use the then keyword to write a switch's when block on a single line. No extra keyword is needed to write the else block on a single line. - -```yuescript -msg = switch math.random(1, 5) - when 1 then "you are lucky" - when 2 then "you are almost lucky" - else "not so lucky" -``` - -If you want to write code with one less indent when writing a switch statement, you can put the first when clause on the statement start line, and then all other clauses can be written with one less indent. - -```yuescript -switch math.random(1, 5) - when 1 - print "you are lucky" -- two indents - else - print "not so lucky" - -switch math.random(1, 5) when 1 - print "you are lucky" -- one indent -else - print "not so lucky" -``` - -It is worth noting the order of the case comparison expression. The case's expression is on the left hand side. This can be useful if the case's expression wants to overwrite how the comparison is done by defining an eq metamethod. - -## Table Matching - -You can do table matching in a switch when clause, if the table can be destructured by a specific structure and get non-nil values. - -```yuescript -items = - * x: 100 - y: 200 - * width: 300 - height: 400 - -for item in *items - switch item - when :x, :y - print "Vec2 #{x}, #{y}" - when :width, :height - print "size #{width}, #{height}" -``` - -You can use default values to optionally destructure the table for some fields. - -```yuescript -item = {} - -{pos: {:x = 50, :y = 200}} = item -- get error: attempt to index a nil value (field 'pos') - -switch item - when {pos: {:x = 50, :y = 200}} - print "Vec2 #{x}, #{y}" -- table destructuring will still pass -``` - -You can also match against array elements, table fields, and even nested structures with array or table literals. - -Match against array elements. - -```yuescript -switch tb - when [1, 2, 3] - print "1, 2, 3" - when [1, b, 3] - print "1, #{b}, 3" - when [1, 2, b = 3] -- b has a default value - print "1, 2, #{b}" -``` - -Match against table fields with destructuring. - -```yuescript -switch tb - when success: true, :result - print "success", result - when success: false - print "failed", result - else - print "invalid" -``` - -Match against nested table structures. - -```yuescript -switch tb - when data: {type: "success", :content} - print "success", content - when data: {type: "error", :content} - print "failed", content - else - print "invalid" -``` - -Match against array of tables. - -```yuescript -switch tb - when [ - {a: 1, b: 2} - {a: 3, b: 4} - {a: 5, b: 6} - fourth - ] - print "matched", fourth -``` - -Match against a list and capture a range of elements. - -```yuescript -segments = ["admin", "users", "logs", "view"] -switch segments - when [...groups, resource, action] - print "Group:", groups -- prints: {"admin", "users"} - print "Resource:", resource -- prints: "logs" - print "Action:", action -- prints: "view" -``` - -# While Loop - -The while loop also comes in four variations: - -```yuescript -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -```yuescript -i = 10 -until i == 0 - print i - i -= 1 - -until running == false do my_function! -``` - -Like for loops, the while loop can also be used as an expression. While and until loop expressions support `break` with multiple return values. - -```yuescript -value, doubled = while true - n = get_next! - break n, n * 2 if n > 10 -``` - -Additionally, for a function to return the accumulated value of a while loop, the statement must be explicitly returned. - -## Repeat Loop - -The repeat loop comes from Lua: - -```yuescript -i = 10 -repeat - print i - i -= 1 -until i == 0 -``` - -Repeat loop expressions also support `break` with multiple return values: - -```yuescript -i = 1 -value, scaled = repeat - break i, i * 100 if i > 3 - i += 1 -until false -``` - -# Function Stubs - -It is common to pass a function from an object around as a value, for example, passing an instance method into a function as a callback. If the function expects the object it is operating on as the first argument then you must somehow bundle that object with the function so it can be called properly. - -The function stub syntax is a shorthand for creating a new closure function that bundles both the object and function. This new function calls the wrapped function in the correct context of the object. - -Its syntax is the same as calling an instance method with the \ operator but with no argument list provided. - -```yuescript -my_object = { - value: 1000 - write: => print "the value:", @value -} - -run_callback = (func) -> - print "running callback..." - func! - --- this will not work: --- the function has to no reference to my_object -run_callback my_object.write - --- function stub syntax --- lets us bundle the object into a new function -run_callback my_object\write -``` - -# Backcalls - -Backcalls are used for unnesting callbacks. They are defined using arrows pointed to the left as the last parameter by default filling in a function call. All the syntax is mostly the same as regular arrow functions except that it is just pointing the other way and the function body does not require indent. - -```yuescript -x <- f -print "hello" .. x -``` - -Fat arrow functions are also available. - -```yuescript -<= f -print @value -``` - -You can specify a placeholder for where you want the backcall function to go as a parameter. - -```yuescript -(x) <- map _, [1, 2, 3] -x * 2 -``` - -If you wish to have further code after your backcalls, you can set them aside with a do statement. And the parentheses can be omitted with non-fat arrow functions. - -```yuescript -result, msg = do - data <- readAsync "filename.txt" - print data - info <- processAsync data - check info -print result, msg -``` - -# Function Literals - -All functions are created using a function expression. A simple function is denoted using the arrow: **->**. - -```yuescript -my_function = -> -my_function() -- call the empty function -``` - -The body of the function can either be one statement placed directly after the arrow, or it can be a series of statements indented on the following lines: - -```yuescript -func_a = -> print "hello world" - -func_b = -> - value = 100 - print "The value:", value -``` - -If a function has no arguments, it can be called using the ! operator, instead of empty parentheses. The ! invocation is the preferred way to call functions with no arguments. - -```yuescript -func_a! -func_b() -``` - -Functions with arguments can be created by preceding the arrow with a list of argument names in parentheses: - -```yuescript -sum = (x, y) -> print "sum", x + y -``` - -Functions can be called by listing the arguments after the name of an expression that evaluates to a function. When chaining together function calls, the arguments are applied to the closest function to the left. - -```yuescript -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -In order to avoid ambiguity in when calling functions, parentheses can also be used to surround the arguments. This is required here in order to make sure the right arguments get sent to the right functions. - -```yuescript -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -There must not be any space between the opening parenthesis and the function. - -Functions will coerce the last statement in their body into a return statement, this is called implicit return: - -```yuescript -sum = (x, y) -> x + y -print "The sum is ", sum 10, 20 -``` - -And if you need to explicitly return, you can use the return keyword: - -```yuescript -sum = (x, y) -> return x + y -``` - -Just like in Lua, functions can return multiple values. The last statement must be a list of values separated by commas: - -```yuescript -mystery = (x, y) -> x + y, x - y -a, b = mystery 10, 20 -``` - -## Fat Arrows - -Because it is an idiom in Lua to send an object as the first argument when calling a method, a special syntax is provided for creating functions which automatically includes a self argument. - -```yuescript -func = (num) => @value + num -``` - -## Argument Defaults - -It is possible to provide default values for the arguments of a function. An argument is determined to be empty if its value is nil. Any nil arguments that have a default value will be replace before the body of the function is run. - -```yuescript -my_function = (name = "something", height = 100) -> - print "Hello I am", name - print "My height is", height -``` - -An argument default value expression is evaluated in the body of the function in the order of the argument declarations. For this reason default values have access to previously declared arguments. - -```yuescript -some_args = (x = 100, y = x + 1000) -> - print x + y -``` - -## Considerations - -Because of the expressive parentheses-less way of calling functions, some restrictions must be put in place to avoid parsing ambiguity involving whitespace. - -The minus sign plays two roles, a unary negation operator and a binary subtraction operator. Consider how the following examples compile: - -```yuescript -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -The precedence of the first argument of a function call can be controlled using whitespace if the argument is a literal string. In Lua, it is common to leave off parentheses when calling a function with a single string or table literal. - -When there is no space between a variable and a string literal, the function call takes precedence over any following expressions. No other arguments can be passed to the function when it is called this way. - -Where there is a space following a variable and a string literal, the function call acts as show above. The string literal belongs to any following expressions (if they exist), which serves as the argument list. - -```yuescript -x = func"hello" + 100 -y = func "hello" + 100 -``` - -## Multi-line arguments - -When calling functions that take a large number of arguments, it is convenient to split the argument list over multiple lines. Because of the white-space sensitive nature of the language, care must be taken when splitting up the argument list. - -If an argument list is to be continued onto the next line, the current line must end in a comma. And the following line must be indented more than the current indentation. Once indented, all other argument lines must be at the same level of indentation to be part of the argument list - -```yuescript -my_func 5, 4, 3, - 8, 9, 10 - -cool_func 1, 2, - 3, 4, - 5, 6, - 7, 8 -``` - -This type of invocation can be nested. The level of indentation is used to determine to which function the arguments belong to. - -```yuescript -my_func 5, 6, 7, - 6, another_func 6, 7, 8, - 9, 1, 2, - 5, 4 -``` - -Because tables also use the comma as a delimiter, this indentation syntax is helpful for letting values be part of the argument list instead of being part of the table. - -```yuescript -x = [ - 1, 2, 3, 4, a_func 4, 5, - 5, 6, - 8, 9, 10 -] -``` - -Although uncommon, notice how we can give a deeper indentation for function arguments if we know we will be using a lower indentation further on. - -```yuescript -y = [ my_func 1, 2, 3, - 4, 5, - 5, 6, 7 -] -``` - -The same thing can be done with other block level statements like conditionals. We can use indentation level to determine what statement a value belongs to: - -```yuescript -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" - -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" -``` - -## Parameter Destructuring - -YueScript now supports destructuring function parameters when the argument is an object. Two forms of destructuring table literals are available: - -- **Curly-brace wrapped literals/object parameters**, allowing optional default values when fields are missing (e.g., `{:a, :b}`, `{a: a1 = 123}`). - -- **Unwrapped simple table syntax**, starting with a sequence of key-value or shorthand bindings and continuing until another expression terminates it (e.g., `:a, b: b1, :c`). This form extracts multiple fields from the same object. - -```yuescript -f1 = (:a, :b, :c) -> - print a, b, c - -f1 a: 1, b: "2", c: {} - -f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> - print a1, b, c - -arg1 = {a: 0} -f2 arg1, arg2 -``` - -## Prefixed Return Expression - -When working with deeply nested function bodies, it can be tedious to maintain readability and consistency of the return value. To address this, YueScript introduces the **Prefixed Return Expression** syntax. Its form is as follows: - -```yuescript -findFirstEven = (list): nil -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub -``` - -This is equivalent to: - -```yuescript -findFirstEven = (list) -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub - nil -``` - -The only difference is that you can move the final return expression before the `->` or `=>` token to indicate the function’s implicit return value as the last statement. This way, even in functions with multiple nested loops or conditional branches, you no longer need to write a trailing return expression at the end of the function body, making the logic structure more straightforward and easier to follow. - -## Named Varargs - -You can use the `(...t) ->` syntax to automatically store varargs into a named table. This table will contain all passed arguments (including `nil` values), and the `n` field of the table will store the actual number of arguments passed (including `nil` values). - -```yuescript -f = (...t) -> - print "argument count:", t.n - print "table length:", #t - for i = 1, t.n - print t[i] - -f 1, 2, 3 -f "a", "b", "c", "d" -f! - --- Handling cases with nil values -process = (...args) -> - sum = 0 - for i = 1, args.n - if args[i] != nil and type(args[i]) == "number" - sum += args[i] - sum - -process 1, nil, 3, nil, 5 -``` - -# Whitespace - -YueScript is a whitespace significant language. You have to write some code block in the same indent with space **' '** or tab **'\t'** like function body, value list and some control blocks. And expressions containing different whitespaces might mean different things. Tab is treated like 4 space, but it's better not mix the use of spaces and tabs. - -## Statement Separator - -A statement normally ends at a line break. You can also use a semicolon `;` to explicitly terminate a statement, which allows writing multiple statements on the same line: - -```yuescript -a = 1; b = 2; print a + b -``` - -## Multiline Chaining - -You can write multi-line chaining function calls with a same indent. - -```yuescript -Rx.Observable - .fromRange 1, 8 - \filter (x) -> x % 2 == 0 - \concat Rx.Observable.of 'who do we appreciate' - \map (value) -> value .. '!' - \subscribe print -``` - -# Comment - -```yuescript --- I am a comment - -str = --[[ -This is a multi-line comment. -It's OK. -]] strA \ -- comment 1 - .. strB \ -- comment 2 - .. strC - -func --[[port]] 3000, --[[ip]] "192.168.1.1" -``` - -# Attributes - -Syntax support for Lua 5.4 attributes. And you can still use both the `const` and `close` declaration and get constant check and scoped callback working when targeting Lua versions below 5.4. - -```yuescript -const a = 123 -close _ = : -> print "Out of scope." -``` - -You can do desctructuring with variables attributed as constant. - -```yuescript -const {:a, :b, c, d} = tb --- a = 1 -``` - -You can also declare a global variable to be `const`. - -```yuescript -global const Constant = 123 --- Constant = 1 -``` - -# Operator - -All of Lua's binary and unary operators are available. Additionally **!=** is as an alias for **~=**, and either **\\** or **::** can be used to write a chaining function call like `tb\func!` or `tb::func!`. And Yuescipt offers some other special operators to write more expressive codes. - -```yuescript -tb\func! if tb ~= nil -tb::func! if tb != nil -``` - -## Chaining Comparisons - -Comparisons can be arbitrarily chained: - -```yuescript -print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 --- output: true - -a = 5 -print 1 <= a <= 10 --- output: true -``` - -Note the evaluation behavior of chained comparisons: - -```yuescript -v = (x) -> - print x - x - -print v(1) < v(2) <= v(3) ---[[ - output: - 2 - 1 - 3 - true -]] - -print v(1) > v(2) <= v(3) ---[[ - output: - 2 - 1 - false -]] -``` - -The middle expression is only evaluated once, rather than twice as it would be if the expression were written as `v(1) < v(2) and v(2) <= v(3)`. However, the order of evaluations in a chained comparison is undefined. It is strongly recommended not to use expressions with side effects (such as printing) in chained comparisons. If side effects are required, the short-circuit `and` operator should be used explicitly. - -## Table Appending - -The **[] =** operator is used to append values to tables. - -```yuescript -tab = [] -tab[] = "Value" -``` - -You can also use the spread operator `...` to append all elements from one list to another: - -```yuescript -tbA = [1, 2, 3] -tbB = [4, 5, 6] -tbA[] = ...tbB --- tbA is now [1, 2, 3, 4, 5, 6] -``` - -## Table Spreading - -You can concatenate array tables or hash tables using spread operator `...` before expressions in table literals. - -When spreading into a brace table literal (for example, `{...other}`), both the array part and hash part of the Lua table are copied. - -```yuescript -parts = - * "shoulders" - * "knees" -lyrics = - * "head" - * ...parts - * "and" - * "toes" - -copy = {...other} - -a = {1, 2, 3, x: 1} -b = {4, 5, y: 1} -merge = {...a, ...b} -``` - -### List Table Spreading - -When spreading into a bracket table literal (for example, `[...other,]`), only the array part is copied. - -```yuescript -source = {1, 2, 3, name: "Yue"} -fullCopy = {...source} -listCopy = [...source,] --- fullCopy => {1, 2, 3, name: "Yue"} --- listCopy => [1, 2, 3] -``` - -## Table Reversed Indexing - -You can use the **#** operator to get the last elements of a table. - -```yuescript -last = data.items[#] -second_last = data.items[#-1] -data.items[#] = 1 -``` - -## Metatable - -The **<>** operator can be used as a shortcut for metatable manipulation. - -### Metatable Creation - -Create normal table with empty bracekets **<>** or metamethod key which is surrounded by **<>**. - -```yuescript -mt = {} -add = (right) => <>: mt, value: @value + right.value -mt.__add = add - -a = <>: mt, value: 1 - -- set field with variable of the same name -b = :, value: 2 -c = : mt.__add, value: 3 - -d = a + b + c -print d.value - -close _ = : -> print "out of scope" -``` - -### Metatable Accessing - -Accessing metatable with **<>** or metamethod name surrounded by **<>** or writing some expression in **<>**. - -```yuescript --- create with metatable containing field "value" -tb = <"value">: 123 -tb. = tb.<> -print tb.value - -tb.<> = __index: {item: "hello"} -print tb.item -``` - -### Metatable Destructure - -Destruct metatable with metamethod key surrounded by **<>**. - -```yuescript -{item, :new, :, : getter} = tb -print item, new, close, getter -``` - -## Existence - -The **?** operator can be used in a variety of contexts to check for existence. - -```yuescript -func?! -print abc?["hello world"]?.xyz - -x = tab?.value -len = utf8?.len or string?.len or (o) -> #o - -if print and x? - print x - -with? io.open "test.txt", "w" - \write "hello" - \close! -``` - -## Piping - -Instead of a series of nested function calls, you can pipe values with operator **|>**. - -```yuescript -"hello" |> print -1 |> print 2 -- insert pipe item as the first argument -2 |> print 1, _, 3 -- pipe with a placeholder - --- pipe expression in multiline -readFile "example.txt" - |> extract language, {} - |> parse language - |> emit - |> render - |> print -``` - -## Nil Coalescing - -The nil-coalescing operator **??** returns the value of its left-hand operand if it isn't **nil**; otherwise, it evaluates the right-hand operand and returns its result. The **??** operator doesn't evaluate its right-hand operand if the left-hand operand evaluates to non-nil. - -```yuescript -local a, b, c, d -a = b ?? c ?? d -func a ?? {} - -a ??= false -``` - -## Implicit Object - -You can write a list of implicit structures that starts with the symbol **\*** or **-** inside a table block. If you are creating implicit object, the fields of the object must be with the same indent. - -```yuescript --- assignment with implicit object -list = - * 1 - * 2 - * 3 - --- function call with implicit object -func - * 1 - * 2 - * 3 - --- return with implicit object -f = -> - return - * 1 - * 2 - * 3 - --- table with implicit object -tb = - name: "abc" - - values: - - "a" - - "b" - - "c" - - objects: - - name: "a" - value: 1 - func: => @value + 1 - tb: - fieldA: 1 - - - name: "b" - value: 2 - func: => @value + 2 - tb: { } - -``` - -# Literals - -All of the primitive literals in Lua can be used. This applies to numbers, strings, booleans, and **nil**. - -Unlike Lua, Line breaks are allowed inside of single and double quote strings without an escape sequence: - -```yuescript -some_string = "Here is a string - that has a line break in it." - --- You can mix expressions into string literals using #{} syntax. --- String interpolation is only available in double quoted strings. -print "I am #{math.random! * 100}% sure." -``` - -## Number Literals - -You can use underscores in a number literal to increase readability. - -```yuescript -integer = 1_000_000 -hex = 0xEF_BB_BF -binary = 0B10011 -``` - -## YAML Multiline String - -The `|` prefix introduces a YAML-style multiline string literal: - -```yuescript -str = | - key: value - list: - - item1 - - #{expr} -``` - -This allows writing structured multiline text conveniently. All line breaks and indentation are preserved relative to the first non-empty line, and expressions inside `#{...}` are interpolated automatically as `tostring(expr)`. - -YAML Multiline String automatically detects the common leading whitespace prefix (minimum indentation across all non-empty lines) and removes it from all lines. This makes it easy to indent your code visually without affecting the resulting string content. - -```yuescript -fn = -> - str = | - foo: - bar: baz - return str -``` - -Internal indentation is preserved relative to the removed common prefix, allowing clean nested structures. - -All special characters like quotes (`"`) and backslashes (`\`) in the YAMLMultiline block are automatically escaped so that the generated Lua string is syntactically valid and behaves as expected. - -```yuescript -str = | - path: "C:\Program Files\App" - note: 'He said: "#{Hello}!"' -``` - -# Module - -## Import - -The import statement is a syntax sugar for requiring a module or help extracting items from an imported module. The imported items are const by default. - -```yuescript --- used as table destructuring -do - import insert, concat from table - -- report error when assigning to insert, concat - import C, Ct, Cmt from require "lpeg" - -- shortcut for implicit requiring - import x, y, z from 'mymodule' - -- import with Python style - from 'module' import a, b, c - --- shortcut for requring a module -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- requring module with aliasing or table destructuring -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - -## Import Global - -You can import specific globals into local variables with `import`. When importing a chain of global variable accessings, the last field will be assigned to the local variable. - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - -### Automatic Global Variable Import - -You can place `import global` at the top of a block to automatically import all names that have not been explicitly declared or assigned in the current scope as globals. These implicit imports are treated as local consts that reference the corresponding globals at the position of the statement. - -Names that are explicitly declared as globals in the same scope will not be imported, so you can still assign to them. - -```yuescript -do - import global - print "hello" - math.random 3 - -- print = nil -- error: imported globals are const - -do - -- explicit global variable will not be imported - import global - global FLAG - print FLAG - FLAG = 123 -``` - -## Export - -The export statement offers a concise way to define modules. - -### Named Export - -Named export will define a local variable as well as adding a field in the exported table. - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - -Doing named export with destructuring. - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = 'default'}} = tb -``` - -Export named items from module without creating local variables. - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - -### Unnamed Export - -Unnamed export will add the target item into the array part of the exported table. - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - -### Default Export - -Using the **default** keyword in export statement to replace the exported table with any thing. - -```yuescript -export default -> - print "hello" - 123 -``` - -# License: MIT - -Copyright (c) 2017-2026 Li Jin \ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -# The YueScript Library - -Access it by `local yue = require("yue")` in Lua. - -## yue - -**Description:** - -The YueScript language library. - -### version - -**Type:** Field. - -**Description:** - -The YueScript version. - -**Signature:** - -```lua -version: string -``` - -### dirsep - -**Type:** Field. - -**Description:** - -The file separator for the current platform. - -**Signature:** - -```lua -dirsep: string -``` - -### yue_compiled - -**Type:** Field. - -**Description:** - -The compiled module code cache. - -**Signature:** - -```lua -yue_compiled: {string: string} -``` - -### to_lua - -**Type:** Function. - -**Description:** - -The YueScript compiling function. It compiles the YueScript code to Lua code. - -**Signature:** - -```lua -to_lua: function(code: string, config?: Config): - --[[codes]] string | nil, - --[[error]] string | nil, - --[[globals]] {{string, integer, integer}} | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| code | string | The YueScript code. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| string \| nil | The compiled Lua code, or nil if the compilation failed. | -| string \| nil | The error message, or nil if the compilation succeeded. | -| {{string, integer, integer}} \| nil | The global variables appearing in the code (with name, row and column), or nil if the compiler option `lint_global` is false. | - -### file_exist - -**Type:** Function. - -**Description:** - -The source file existence checking function. Can be overridden to customize the behavior. - -**Signature:** - -```lua -file_exist: function(filename: string): boolean -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------- | -| filename | string | The file name. | - -**Returns:** - -| Return Type | Description | -| ----------- | ------------------------ | -| boolean | Whether the file exists. | - -### read_file - -**Type:** Function. - -**Description:** - -The source file reading function. Can be overridden to customize the behavior. - -**Signature:** - -```lua -read_file: function(filename: string): string -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------- | -| filename | string | The file name. | - -**Returns:** - -| Return Type | Description | -| ----------- | ----------------- | -| string | The file content. | - -### insert_loader - -**Type:** Function. - -**Description:** - -Insert the YueScript loader to the package loaders (searchers). - -**Signature:** - -```lua -insert_loader: function(pos?: integer): boolean -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------- | ----------------------------------------------------------- | -| pos | integer | [Optional] The position to insert the loader. Default is 3. | - -**Returns:** - -| Return Type | Description | -| ----------- | -------------------------------------------------------------------------------------------- | -| boolean | Whether the loader is inserted successfully. It will fail if the loader is already inserted. | - -### remove_loader - -**Type:** Function. - -**Description:** - -Remove the YueScript loader from the package loaders (searchers). - -**Signature:** - -```lua -remove_loader: function(): boolean -``` - -**Returns:** - -| Return Type | Description | -| ----------- | --------------------------------------------------------------------------------------- | -| boolean | Whether the loader is removed successfully. It will fail if the loader is not inserted. | - -### loadstring - -**Type:** Function. - -**Description:** - -Loads YueScript code from a string into a function. - -**Signature:** - -```lua -loadstring: function(input: string, chunkname: string, env: table, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| input | string | The YueScript code. | -| chunkname | string | The name of the code chunk. | -| env | table | The environment table. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| --------------- | --------------------------------------------------- | -| function \| nil | The loaded function, or nil if the loading failed. | -| string \| nil | The error message, or nil if the loading succeeded. | - -### loadstring - -**Type:** Function. - -**Description:** - -Loads YueScript code from a string into a function. - -**Signature:** - -```lua -loadstring: function(input: string, chunkname: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| input | string | The YueScript code. | -| chunkname | string | The name of the code chunk. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| --------------- | --------------------------------------------------- | -| function \| nil | The loaded function, or nil if the loading failed. | -| string \| nil | The error message, or nil if the loading succeeded. | - -### loadstring - -**Type:** Function. - -**Description:** - -Loads YueScript code from a string into a function. - -**Signature:** - -```lua -loadstring: function(input: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| input | string | The YueScript code. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| --------------- | --------------------------------------------------- | -| function \| nil | The loaded function, or nil if the loading failed. | -| string \| nil | The error message, or nil if the loading succeeded. | - -### loadfile - -**Type:** Function. - -**Description:** - -Loads YueScript code from a file into a function. - -**Signature:** - -```lua -loadfile: function(filename: string, env: table, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| filename | string | The file name. | -| env | table | The environment table. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| --------------- | --------------------------------------------------- | -| function \| nil | The loaded function, or nil if the loading failed. | -| string \| nil | The error message, or nil if the loading succeeded. | - -### loadfile - -**Type:** Function. - -**Description:** - -Loads YueScript code from a file into a function. - -**Signature:** - -```lua -loadfile: function(filename: string, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| filename | string | The file name. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| --------------- | --------------------------------------------------- | -| function \| nil | The loaded function, or nil if the loading failed. | -| string \| nil | The error message, or nil if the loading succeeded. | - -### dofile - -**Type:** Function. - -**Description:** - -Loads YueScript code from a file into a function and executes it. - -**Signature:** - -```lua -dofile: function(filename: string, env: table, config?: Config): any... -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| filename | string | The file name. | -| env | table | The environment table. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| ----------- | ----------------------------------------- | -| any... | The return values of the loaded function. | - -### dofile - -**Type:** Function. - -**Description:** - -Loads YueScript code from a file into a function and executes it. - -**Signature:** - -```lua -dofile: function(filename: string, config?: Config): any... -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | -------------------------------- | -| filename | string | The file name. | -| config | Config | [Optional] The compiler options. | - -**Returns:** - -| Return Type | Description | -| ----------- | ----------------------------------------- | -| any... | The return values of the loaded function. | - -### find_modulepath - -**Type:** Function. - -**Description:** - -Resolves the YueScript module name to the file path. - -**Signature:** - -```lua -find_modulepath: function(name: string): string -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | ---------------- | -| name | string | The module name. | - -**Returns:** - -| Return Type | Description | -| ----------- | -------------- | -| string | The file path. | - -### pcall - -**Type:** Function. - -**Description:** - -Calls a function in protected mode. -Catches any errors and returns a status code and results or error object. -Rewrites the error line number to the original line number in the YueScript code when errors occur. - -**Signature:** - -```lua -pcall: function(f: function, ...: any): boolean, any... -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | -------- | ---------------------------------- | -| f | function | The function to call. | -| ... | any | Arguments to pass to the function. | - -**Returns:** - -| Return Type | Description | -| ------------ | ------------------------------------------------- | -| boolean, ... | Status code and function results or error object. | - -### require - -**Type:** Function. - -**Description:** - -Loads a given module. Can be either a Lua module or a YueScript module. -Rewrites the error line number to the original line number in the YueScript code if the module is a YueScript module and loading fails. - -**Signature:** - -```lua -require: function(name: string): any... -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | ------------------------------- | -| modname | string | The name of the module to load. | - -**Returns:** - -| Return Type | Description | -| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| any | The value stored at package.loaded[modname] if the module is already loaded.Otherwise, tries to find a loader and returns the final value of package.loaded[modname] and a loader data as a second result. | - -### p - -**Type:** Function. - -**Description:** - -Inspects the structures of the passed values and prints string representations. - -**Signature:** - -```lua -p: function(...: any) -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ---- | ---------------------- | -| ... | any | The values to inspect. | - -### options - -**Type:** Field. - -**Description:** - -The current compiler options. - -**Signature:** - -```lua -options: Config.Options -``` - -### traceback - -**Type:** Function. - -**Description:** - -The traceback function that rewrites the stack trace line numbers to the original line numbers in the YueScript code. - -**Signature:** - -```lua -traceback: function(message: string): string -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | ---------------------- | -| message | string | The traceback message. | - -**Returns:** - -| Return Type | Description | -| ----------- | -------------------------------- | -| string | The rewritten traceback message. | - -### is_ast - -**Type:** Function. - -**Description:** - -Checks whether the code matches the specified AST. - -**Signature:** - -```lua -is_ast: function(astName: string, code: string): boolean -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | ------------- | -| astName | string | The AST name. | -| code | string | The code. | - -**Returns:** - -| Return Type | Description | -| ----------- | --------------------------------- | -| boolean | Whether the code matches the AST. | - -### AST - -**Type:** Field. - -**Description:** - -The AST type definition with name, row, column and sub nodes. - -**Signature:** - -```lua -type AST = {string, integer, integer, any} -``` - -### to_ast - -**Type:** Function. - -**Description:** - -Converts the code to the AST. - -**Signature:** - -```lua -to_ast: function(code: string, flattenLevel?: number, astName?: string, reserveComment?: boolean): - --[[AST]] AST | nil, - --[[error]] nil | string -``` - -**Parameters:** - -| Parameter | Type | Description | -| -------------- | ------- | --------------------------------------------------------------------------------------------- | -| code | string | The code. | -| flattenLevel | integer | [Optional] The flatten level. Higher level means more flattening. Default is 0. Maximum is 2. | -| astName | string | [Optional] The AST name. Default is "File". | -| reserveComment | boolean | [Optional] Whether to reserve the original comments. Default is false. | - -**Returns:** - -| Return Type | Description | -| ------------- | ------------------------------------------------------ | -| AST \| nil | The AST, or nil if the conversion failed. | -| string \| nil | The error message, or nil if the conversion succeeded. | - -### format - -**Type:** Function. - -**Description:** - -Formats the YueScript code. - -**Signature:** - -```lua -format: function(code: string, tabSize?: number, reserveComment?: boolean): string -``` - -**Parameters:** - -| Parameter | Type | Description | -| -------------- | ------- | --------------------------------------------------------------------- | -| code | string | The code. | -| tabSize | integer | [Optional] The tab size. Default is 4. | -| reserveComment | boolean | [Optional] Whether to reserve the original comments. Default is true. | - -**Returns:** - -| Return Type | Description | -| ----------- | ------------------- | -| string | The formatted code. | - -### \_\_call - -**Type:** Metamethod. - -**Description:** - -Requires the YueScript module. -Rewrites the error line number to the original line number in the YueScript code when loading fails. - -**Signature:** - -```lua -metamethod __call: function(self: yue, module: string): any... -``` - -**Parameters:** - -| Parameter | Type | Description | -| --------- | ------ | ---------------- | -| module | string | The module name. | - -**Returns:** - -| Return Type | Description | -| ----------- | ----------------- | -| any | The module value. | - -## Config - -**Description:** - -The compiler compile options. - -### lint_global - -**Type:** Field. - -**Description:** - -Whether the compiler should collect the global variables appearing in the code. - -**Signature:** - -```lua -lint_global: boolean -``` - -### implicit_return_root - -**Type:** Field. - -**Description:** - -Whether the compiler should do an implicit return for the root code block. - -**Signature:** - -```lua -implicit_return_root: boolean -``` - -### reserve_line_number - -**Type:** Field. - -**Description:** - -Whether the compiler should reserve the original line number in the compiled code. - -**Signature:** - -```lua -reserve_line_number: boolean -``` - -### reserve_comment - -**Type:** Field. - -**Description:** - -Whether the compiler should reserve the original comments in the compiled code. - -**Signature:** - -```lua -reserve_comment: boolean -``` - -### space_over_tab - -**Type:** Field. - -**Description:** - -Whether the compiler should use the space character instead of the tab character in the compiled code. - -**Signature:** - -```lua -space_over_tab: boolean -``` - -### same_module - -**Type:** Field. - -**Description:** - -Whether the compiler should treat the code to be compiled as the same currently being compiled module. For internal use only. - -**Signature:** - -```lua -same_module: boolean -``` - -### line_offset - -**Type:** Field. - -**Description:** - -Whether the compiler error message should include the line number offset. For internal use only. - -**Signature:** - -```lua -line_offset: integer -``` - -### yue.Config.LuaTarget - -**Type:** Enumeration. - -**Description:** - -The target Lua version enumeration. - -**Signature:** - -```lua -enum LuaTarget - "5.1" - "5.2" - "5.3" - "5.4" - "5.5" -end -``` - -### options - -**Type:** Field. - -**Description:** - -The extra options to be passed to the compilation function. - -**Signature:** - -```lua -options: Options -``` - -## Options - -**Description:** - -The extra compiler options definition. - -### target - -**Type:** Field. - -**Description:** - -The target Lua version for the compilation. - -**Signature:** - -```lua -target: LuaTarget -``` - -### path - -**Type:** Field. - -**Description:** - -The extra module search path. - -**Signature:** - -```lua -path: string -``` - -### dump_locals - -**Type:** Field. - -**Description:** - -Whether to dump the local variables in the traceback error message. Default is false. - -**Signature:** - -```lua -dump_locals: boolean -``` - -### simplified - -**Type:** Field. - -**Description:** - -Whether to simplify the error message. Default is true. - -**Signature:** - -```lua -simplified: boolean -``` diff --git a/doc/yue-id-id.md b/doc/yue-id-id.md deleted file mode 100644 index a02f89f3..00000000 --- a/doc/yue-id-id.md +++ /dev/null @@ -1,3579 +0,0 @@ -# Dokumentasi YueScript - -Selamat datang di dokumentasi resmi YueScript!
-Di sini Anda dapat menemukan fitur bahasa, penggunaan, contoh referensi, dan sumber daya.
-Silakan pilih bab dari sidebar untuk mulai mempelajari YueScript. - -# Do - -Saat digunakan sebagai pernyataan, `do` bekerja seperti di Lua. - -```yuescript -do - var = "hello" - print var -print var -- nil di sini -``` - -`do` di YueScript juga bisa digunakan sebagai ekspresi, memungkinkan Anda menggabungkan beberapa baris menjadi satu. Hasil ekspresi `do` adalah pernyataan terakhir di badannya. - -```yuescript -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```yuescript -tbl = { - key: do - print "assigning key!" - 1234 -} -``` - -Ekspresi `do` mendukung penggunaan `break` untuk memutus alur eksekusi dan mengembalikan banyak nilai lebih awal. - -```yuescript -status, value = do - n = 12 - if n > 10 - break "large", n - break "small", n -``` - -# Dekorator Baris - -Untuk kemudahan, loop for dan pernyataan if dapat diterapkan pada pernyataan tunggal di akhir baris: - -```yuescript -print "hello world" if name == "Rob" -``` - -Dan dengan loop dasar: - -```yuescript -print "item: ", item for item in *items -``` - -Dan dengan loop while: - -```yuescript -game\update! while game\isRunning! - -reader\parse_line! until reader\eof! -``` - -# Makro - -## Penggunaan Umum - -Fungsi macro digunakan untuk mengevaluasi string pada waktu kompilasi dan menyisipkan kode yang dihasilkan ke kompilasi akhir. - -```yuescript -macro PI2 = -> math.pi * 2 -area = $PI2 * 5 - -macro HELLO = -> "'hello world'" -print $HELLO - -macro config = (debugging) -> - global debugMode = debugging == "true" - "" - -macro asserts = (cond) -> - debugMode and "assert #{cond}" or "" - -macro assert = (cond) -> - debugMode and "assert #{cond}" or "#{cond}" - -$config true -$asserts item ~= nil - -$config false -value = $assert item - --- ekspresi yang dikirim diperlakukan sebagai string -macro and = (...) -> "#{ table.concat {...}, ' and ' }" -if $and f1!, f2!, f3! - print "OK" -``` - -## Menyisipkan Kode Mentah - -Fungsi macro bisa mengembalikan string YueScript atau tabel konfigurasi yang berisi kode Lua. - -```yuescript -macro yueFunc = (var) -> "local #{var} = ->" -$yueFunc funcA -funcA = -> "gagal meng-assign ke variabel yang didefinisikan oleh macro Yue" - -macro luaFunc = (var) -> { - code: "local function #{var}() end" - type: "lua" -} -$luaFunc funcB -funcB = -> "gagal meng-assign ke variabel yang didefinisikan oleh macro Lua" - -macro lua = (code) -> { - :code - type: "lua" -} - --- simbol awal dan akhir string mentah otomatis di-trim -$lua[==[ --- penyisipan kode Lua mentah -if cond then - print("output") -end -]==] -``` - -## Export Macro - -Fungsi macro dapat diekspor dari modul dan diimpor di modul lain. Anda harus menaruh fungsi macro export dalam satu file agar dapat digunakan, dan hanya definisi macro, impor macro, dan ekspansi macro yang boleh ada di modul export macro. - -```yuescript --- file: utils.yue -export macro map = (items, action) -> "[#{action} for _ in *#{items}]" -export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" -export macro foreach = (items, action) -> "for _ in *#{items} - #{action}" - --- file main.yue -import "utils" as { - $, -- simbol untuk mengimpor semua macro - $foreach: $each -- ganti nama macro $foreach menjadi $each -} -[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ -``` - -## Macro Bawaan - -Ada beberapa macro bawaan tetapi Anda bisa menimpanya dengan mendeklarasikan macro dengan nama yang sama. - -```yuescript -print $FILE -- mendapatkan string nama modul saat ini -print $LINE -- mendapatkan angka 2 -``` - -## Menghasilkan Macro dengan Macro - -Di YueScript, fungsi macro memungkinkan Anda menghasilkan kode pada waktu kompilasi. Dengan menumpuk fungsi macro, Anda dapat membuat pola generasi yang lebih kompleks. Fitur ini memungkinkan Anda mendefinisikan fungsi macro yang menghasilkan fungsi macro lain, sehingga menghasilkan kode yang lebih dinamis. - -```yuescript -macro Enum = (...) -> - items = {...} - itemSet = {item, true for item in *items} - (item) -> - error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item] - "\"#{item}\"" - -macro BodyType = $Enum( - Static - Dynamic - Kinematic -) - -print "Valid enum type:", $BodyType Static --- print "Compilation error with enum type:", $BodyType Unknown -``` - -## Menghasilkan kode multi-baris - -Saat macro mengembalikan kode Yue multi-baris, penggunaan string multi-baris di dalam tanda kutip tidak direkomendasikan. Sebaiknya gunakan `-> |`. - -String bertanda kutip mempertahankan teks apa adanya, sedangkan string multi-baris YAML menghapus indentasi awal yang sama. Ini biasanya membuat blok Yue yang dihasilkan lebih stabil, terutama ketika kode yang dihasilkan berisi komentar atau blok bertingkat. - -```yuescript -macro default_conf = (conf) -> " - -- useful; only set once -#{conf}.identity = 'LOVE' -#{conf}.version = \"11.5\" - " - -love.conf = (t) -> - $default_conf t -``` - -```yuescript -macro default_conf = (conf) -> | - -- useful; only set once - #{conf}.identity = 'LOVE' - #{conf}.version = "11.5" - -love.conf = (t) -> - $default_conf t -``` - -## Validasi Argumen - -Anda dapat mendeklarasikan tipe node AST yang diharapkan dalam daftar argumen, dan memeriksa apakah argumen macro yang masuk memenuhi harapan pada waktu kompilasi. - -```yuescript -macro printNumAndStr = (num `Num, str `String) -> | - print( - #{num} - #{str} - ) - -$printNumAndStr 123, "hello" -``` - -Jika Anda membutuhkan pengecekan argumen yang lebih fleksibel, Anda dapat menggunakan fungsi macro bawaan `$is_ast` untuk memeriksa secara manual pada tempat yang tepat. - -```yuescript -macro printNumAndStr = (num, str) -> - error "expected Num as first argument" unless $is_ast Num, num - error "expected String as second argument" unless $is_ast String, str - "print(#{num}, #{str})" - -$printNumAndStr 123, "hello" -``` - -Untuk detail lebih lanjut tentang node AST yang tersedia, silakan lihat definisi huruf besar di [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). - -## Pernyataan anotasi - -Pernyataan anotasi menerapkan sebuah macro ke pernyataan yang tepat mengikutinya. - -Ini setara dengan memanggil macro sambil menambahkan kode sumber dari pernyataan berikutnya sebagai argumen terakhir. - -```yuescript -macro ShowName = (code) -> | - print "#{code\match '^[%w_]*'}" - -$[ShowName] -myFunc = -> - -return -``` - -Saat macro anotasi mengembalikan tabel konfigurasi, field opsional `before` mengatur apakah hasil yang dihasilkan akan diletakkan sebelum atau sesudah pernyataan yang dianotasi. - -```yuescript -macro Tag = (tag, code) -> - tableName = code\match "^[%w_]+" - return - type: "text" - before: tag == "before" - code: "-- #{tag}:#{tableName}" - -$[Tag before] -tableA = {} - -$[Tag after] -tableB = {} - -return -``` - -Karena pernyataan berikutnya diteruskan sebagai argumen macro tambahan, anotasi juga bisa digunakan untuk menghasilkan kode registrasi langsung dari deklarasi class. Anda juga dapat menggunakan pemeriksaan argumen AST yang sama seperti pada macro biasa. - -```yuescript -macro Register = (registry, code`ClassDecl) -> - className = code\match "^class%s+(%w+)" - return | - #{registry}["#{className}"] = #{className} - -registry = {} - -$[Register(registry)] -class Worker - run: => "ok" - -return -``` - -Anotasi juga bisa menyisipkan kode pembungkus di sekitar fungsi: - -```yuescript -macro ValidateNumberArgs = (code) -> - funcName = code\match "^(%w+)%s*=" - return | - local __orig_#{funcName} = #{funcName} - #{funcName} = (...) -> - for i = 1, select "#", ... - assert type(select i, ...) == "number", "expected number for arg \#{i}" - __orig_#{funcName} ... - -$[ValidateNumberArgs] -add = (a, b) -> a + b -``` - -Sebuah anotasi harus selalu diikuti oleh sebuah pernyataan, dan tidak bisa diterapkan ke pernyataan `return`. Jika pernyataan yang dianotasi berada di akhir sebuah blok dan Anda membutuhkan bentuk AST mentah dari pernyataan itu, tambahkan `return` eksplisit setelahnya agar ia tidak dibungkus menjadi ekspresi yang dikembalikan secara implisit. - -# Try - -Sintaks untuk penanganan error Lua dalam bentuk umum. - -```yuescript -try - func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try - func 1, 2, 3 -catch err - yue.traceback err - -try func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try func 1, 2, 3 - -try - print "trying" - func 1, 2, 3 - --- bekerja dengan pola if assignment -if success, result := try func 1, 2, 3 -catch err - print yue.traceback err - print result -``` - -## Try? - -`try?` adalah bentuk sederhana untuk penanganan error yang menghilangkan status boolean dari pernyataan `try`, dan akan mengembalikan hasil dari blok try ketika berhasil, atau mengembalikan nil alih-alih objek error bila gagal. - -```yuescript -a, b, c = try? func! - --- dengan operator nil coalescing -a = (try? func!) ?? "default" - --- sebagai argumen fungsi -f try? func! - --- dengan blok catch -f try? - print 123 - func! -catch e - print e - e -``` - -# Literal Tabel - -Seperti di Lua, tabel dibatasi dengan kurung kurawal. - -```yuescript -some_values = {1, 2, 3, 4} -``` - -Berbeda dengan Lua, assignment nilai ke sebuah kunci di tabel dilakukan dengan **:** (bukan **=**). - -```yuescript -some_values = { - name: "Bill", - age: 200, - ["favorite food"]: "rice" -} -``` - -Kurung kurawal dapat dihilangkan jika hanya satu tabel pasangan key-value yang di-assign. - -```yuescript -profile = - height: "4 feet", - shoe_size: 13, - favorite_foods: ["ice cream", "donuts"] -``` - -Baris baru dapat digunakan untuk memisahkan nilai sebagai ganti koma (atau keduanya): - -```yuescript -values = { - 1, 2, 3, 4 - 5, 6, 7, 8 - name: "superman" - occupation: "crime fighting" -} -``` - -Saat membuat literal tabel satu baris, kurung kurawal juga bisa dihilangkan: - -```yuescript -my_function dance: "Tango", partner: "none" - -y = type: "dog", legs: 4, tails: 1 -``` - -Kunci literal tabel dapat berupa kata kunci bahasa tanpa perlu di-escape: - -```yuescript -tbl = { - do: "something" - end: "hunger" -} -``` - -Jika Anda membangun tabel dari variabel dan ingin kunci sama dengan nama variabel, maka operator prefiks **:** dapat digunakan: - -```yuescript -hair = "golden" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -Jika Anda ingin kunci field dalam tabel menjadi hasil suatu ekspresi, Anda dapat membungkusnya dengan **[ ]**, seperti di Lua. Anda juga bisa menggunakan literal string langsung sebagai kunci tanpa tanda kurung siku. Ini berguna jika kunci memiliki karakter khusus. - -```yuescript -t = { - [1 + 2]: "hello" - "hello world": true -} -``` - -Tabel Lua memiliki bagian array dan bagian hash, tetapi kadang-kadang berguna untuk membuat perbedaan semantik di antara keduanya. Anda dapat menggunakan **[ ]** sebagai ganti **{ }** untuk mendeklarasikan tabel secara eksplisit sebagai array, dengan begitu akan mencegah pasangan key-value dituliskan di dalamnya. - -```yuescript -some_values = [1, 2, 3, 4] -list_with_one_element = [1, ] -``` - -# Komprehensi - -Komprehensi menyediakan sintaks yang nyaman untuk membangun tabel baru dengan mengiterasi objek yang ada dan menerapkan ekspresi pada nilainya. Ada dua jenis komprehensi: komprehensi list dan komprehensi tabel. Keduanya menghasilkan tabel Lua; komprehensi list mengakumulasi nilai ke tabel mirip array, dan komprehensi tabel memungkinkan Anda menetapkan kunci dan nilai pada setiap iterasi. - -## Komprehensi List - -Berikut membuat salinan tabel `items` tetapi semua nilainya digandakan. - -```yuescript -items = [ 1, 2, 3, 4 ] -doubled = [item * 2 for i, item in ipairs items] -``` - -Item yang disertakan dalam tabel baru bisa dibatasi dengan klausa `when`: - -```yuescript -slice = [item for i, item in ipairs items when i > 1 and i < 3] -``` - -Karena umum untuk mengiterasi nilai dari tabel berindeks numerik, operator **\*** diperkenalkan. Contoh `doubled` bisa ditulis ulang sebagai: - -```yuescript -doubled = [item * 2 for item in *items] -``` - -Dalam komprehensi list, Anda juga bisa menggunakan operator spread `...` untuk meratakan list bertingkat, menghasilkan efek flat map: - -```yuescript -data = - a: [1, 2, 3] - b: [4, 5, 6] - -flat = [...v for k,v in pairs data] --- flat sekarang [1, 2, 3, 4, 5, 6] -``` - -Klausa `for` dan `when` dapat dirantai sebanyak yang diinginkan. Satu-satunya syarat adalah komprehensi memiliki setidaknya satu klausa `for`. - -Menggunakan beberapa klausa `for` sama seperti menggunakan loop bertingkat: - -```yuescript -x_coords = [4, 5, 6, 7] -y_coords = [9, 2, 3] - -points = [ [x, y] for x in *x_coords \ -for y in *y_coords] -``` - -Perulangan for numerik juga bisa digunakan dalam komprehensi: - -```yuescript -evens = [i for i = 1, 100 when i % 2 == 0] -``` - -## Komprehensi Tabel - -Sintaks untuk komprehensi tabel sangat mirip, hanya berbeda dengan penggunaan **{** dan **}** serta mengambil dua nilai dari setiap iterasi. - -Contoh ini membuat salinan tabel `thing`: - -```yuescript -thing = { - color: "red" - name: "fast" - width: 123 -} - -thing_copy = {k, v for k, v in pairs thing} -``` - -```yuescript -no_color = {k, v for k, v in pairs thing when k != "color"} -``` - -Operator **\*** juga didukung. Di sini kita membuat tabel lookup akar kuadrat untuk beberapa angka. - -```yuescript -numbers = [1, 2, 3, 4] -sqrts = {i, math.sqrt i for i in *numbers} -``` - -Tuple key-value dalam komprehensi tabel juga bisa berasal dari satu ekspresi, yang berarti ekspresi tersebut harus mengembalikan dua nilai. Nilai pertama digunakan sebagai kunci dan nilai kedua digunakan sebagai nilai: - -Dalam contoh ini kita mengonversi array pasangan menjadi tabel di mana item pertama dalam pasangan menjadi kunci dan item kedua menjadi nilai. - -```yuescript -tuples = [ ["hello", "world"], ["foo", "bar"]] -tbl = {unpack tuple for tuple in *tuples} -``` - -## Slicing - -Sintaks khusus disediakan untuk membatasi item yang diiterasi saat menggunakan operator **\***. Ini setara dengan mengatur batas iterasi dan ukuran langkah pada loop for. - -Di sini kita bisa menetapkan batas minimum dan maksimum, mengambil semua item dengan indeks antara 1 dan 5 (inklusif): - -```yuescript -slice = [item for item in *items[1, 5]] -``` - -Salah satu argumen slice boleh dikosongkan untuk menggunakan default yang masuk akal. Pada contoh ini, jika indeks maksimum dikosongkan, defaultnya adalah panjang tabel. Ini akan mengambil semua item kecuali elemen pertama: - -```yuescript -slice = [item for item in *items[2,]] -``` - -Jika batas minimum dikosongkan, defaultnya adalah 1. Di sini kita hanya memberikan ukuran langkah dan membiarkan batas lainnya kosong. Ini akan mengambil semua item berindeks ganjil: (1, 3, 5, …) - -```yuescript -slice = [item for item in *items[,,2]] -``` - -Batas minimum dan maksimum bisa bernilai negatif, yang berarti batas dihitung dari akhir tabel. - -```yuescript --- ambil 4 item terakhir -slice = [item for item in *items[-4,-1]] -``` - -Ukuran langkah juga bisa negatif, yang berarti item diambil dalam urutan terbalik. - -```yuescript -reverse_slice = [item for item in *items[-1,1,-1]] -``` - -### Ekspresi Slicing - -Slicing juga bisa digunakan sebagai ekspresi. Ini berguna untuk mendapatkan sub-list dari sebuah tabel. - -```yuescript --- ambil item ke-2 dan ke-4 sebagai list baru -sub_list = items[2, 4] - --- ambil 4 item terakhir -last_four_items = items[-4, -1] -``` - -# Pemrograman Berorientasi Objek - -Dalam contoh-contoh ini, kode Lua yang dihasilkan mungkin tampak berat. Sebaiknya fokus dulu pada makna kode YueScript, lalu lihat kode Lua jika Anda ingin mengetahui detail implementasinya. - -Kelas sederhana: - -```yuescript -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -Kelas dideklarasikan dengan pernyataan `class` diikuti deklarasi mirip tabel di mana semua method dan properti dicantumkan. - -Properti `new` bersifat khusus karena akan menjadi konstruktor. - -Perhatikan bahwa semua method di kelas menggunakan sintaks fungsi panah tebal. Saat memanggil method pada instance, instance itu sendiri dikirim sebagai argumen pertama. Panah tebal menangani pembuatan argumen `self`. - -Prefiks `@` pada nama variabel adalah singkatan untuk `self.`. `@items` menjadi `self.items`. - -Blok kelas juga mendukung field metatable dengan menulis key metamethod dalam tanda kurung sudut, misalnya ``. - -```yuescript -class User - new: (@name) => - : => "User(#{@name})" - -print tostring User "Yue" -``` - -Membuat instance kelas dilakukan dengan memanggil nama kelas sebagai fungsi. - -```yuescript -inv = Inventory! -inv\add_item "t-shirt" -inv\add_item "pants" -``` - -Karena instance kelas perlu dikirim ke method saat dipanggil, operator `\` digunakan. - -Semua properti kelas dibagikan di antara instance. Ini baik untuk fungsi, tetapi untuk jenis objek lain dapat menimbulkan hasil yang tidak diinginkan. - -Pertimbangkan contoh di bawah ini, properti `clothes` dibagikan di antara semua instance, sehingga perubahan di satu instance akan terlihat di instance lainnya: - -```yuescript -class Person - clothes: [] - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "pants" -b\give_item "shirt" - --- akan mencetak pants dan shirt -print item for item in *a.clothes -``` - -Cara yang benar untuk menghindari masalah ini adalah membuat state yang dapat berubah di konstruktor: - -```yuescript -class Person - new: => - @clothes = [] -``` - -## Pewarisan - -Kata kunci `extends` dapat digunakan dalam deklarasi kelas untuk mewarisi properti dan method dari kelas lain. - -```yuescript -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "backpack is full" - super name -``` - -Di sini kita memperluas kelas Inventory, dan membatasi jumlah item yang bisa dibawa. - -Dalam contoh ini, kita tidak mendefinisikan konstruktor pada subclass, sehingga konstruktor kelas induk dipanggil ketika membuat instance baru. Jika kita mendefinisikan konstruktor, kita bisa menggunakan method `super` untuk memanggil konstruktor induk. - -Setiap kali sebuah kelas mewarisi dari kelas lain, ia mengirim pesan ke kelas induk dengan memanggil method `__inherited` pada kelas induk jika ada. Fungsi menerima dua argumen, kelas yang diwarisi dan kelas anak. - -```yuescript -class Shelf - @__inherited: (child) => - print @__name, "was inherited by", child.__name - --- akan mencetak: Shelf was inherited by Cupboard -class Cupboard extends Shelf -``` - -## Super - -**super** adalah kata kunci khusus yang dapat digunakan dengan dua cara: sebagai objek, atau dipanggil seperti fungsi. Ia hanya memiliki fungsi khusus ketika berada di dalam kelas. - -Ketika dipanggil sebagai fungsi, ia akan memanggil fungsi dengan nama yang sama di kelas induk. `self` saat ini akan otomatis dikirim sebagai argumen pertama. (Seperti pada contoh pewarisan di atas) - -Ketika `super` digunakan sebagai nilai normal, ia merupakan referensi ke objek kelas induk. - -Ia dapat diakses seperti objek biasa untuk mengambil nilai di kelas induk yang mungkin tertutup oleh kelas anak. - -Ketika operator pemanggilan `\` digunakan dengan `super`, `self` disisipkan sebagai argumen pertama alih-alih nilai `super` itu sendiri. Saat menggunakan `.` untuk mengambil fungsi, fungsi mentah dikembalikan. - -Beberapa contoh penggunaan `super` dengan cara berbeda: - -```yuescript -class MyClass extends ParentClass - a_method: => - -- berikut memiliki efek yang sama: - super "hello", "world" - super\a_method "hello", "world" - super.a_method self, "hello", "world" - - -- super sebagai nilai sama dengan kelas induk: - assert super == ParentClass -``` - -**super** juga dapat digunakan di sisi kiri Function Stub. Perbedaan utamanya adalah, alih-alih fungsi hasil terikat pada nilai `super`, fungsi terikat pada `self`. - -## Tipe - -Setiap instance kelas membawa tipenya sendiri. Ini disimpan di properti khusus `__class`. Properti ini memuat objek kelas. Objek kelas adalah yang kita panggil untuk membuat instance baru. Kita juga dapat mengindeks objek kelas untuk mengambil method dan properti kelas. - -```yuescript -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- mencetak 10 -``` - -## Objek Kelas - -Objek kelas adalah yang kita buat saat menggunakan pernyataan `class`. Objek kelas disimpan dalam variabel dengan nama yang sama dengan kelas. - -Objek kelas dapat dipanggil seperti fungsi untuk membuat instance baru. Begitulah cara kita membuat instance kelas pada contoh di atas. - -Sebuah kelas terdiri dari dua tabel: tabel kelas itu sendiri dan tabel base. Base digunakan sebagai metatable untuk semua instance. Semua properti yang dicantumkan dalam deklarasi kelas ditempatkan di base. - -Metatable objek kelas membaca properti dari base jika tidak ada di objek kelas. Ini berarti kita dapat mengakses fungsi dan properti langsung dari kelas. - -Penting untuk dicatat bahwa assignment ke objek kelas tidak meng-assign ke base, sehingga itu bukan cara yang valid untuk menambahkan method baru ke instance. Sebagai gantinya, base harus diubah secara eksplisit. Lihat field `__base` di bawah. - -Objek kelas memiliki beberapa properti khusus: - -Nama kelas saat dideklarasikan disimpan sebagai string di field `__name` pada objek kelas. - -```yuescript -print BackPack.__name -- mencetak Backpack -``` - -Objek base disimpan di `__base`. Kita dapat memodifikasi tabel ini untuk menambahkan fungsionalitas ke instance yang sudah dibuat maupun yang akan dibuat. - -Jika kelas memperluas kelas lain, objek kelas induk disimpan di `__parent`. - -## Variabel Kelas - -Kita dapat membuat variabel langsung di objek kelas alih-alih di base dengan menggunakan `@` di depan nama properti pada deklarasi kelas. - -```yuescript -class Things - @some_func: => print "Hello from", @__name - -Things\some_func! - --- variabel kelas tidak terlihat pada instance -assert Things().some_func == nil -``` - -Dalam ekspresi, kita dapat menggunakan `@@` untuk mengakses nilai yang disimpan di `__class` milik `self`. Jadi, `@@hello` adalah singkatan dari `self.__class.hello`. - -```yuescript -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- mencetak 2 -``` - -Semantik pemanggilan `@@` mirip dengan `@`. Memanggil nama `@@` akan meneruskan kelas sebagai argumen pertama menggunakan sintaks kolon Lua. - -```yuescript -@@hello 1,2,3,4 -``` - -## Pernyataan Deklarasi Kelas - -Di dalam badan deklarasi kelas, kita bisa memiliki ekspresi normal selain pasangan key/value. Dalam konteks ini, `self` sama dengan objek kelas. - -Berikut cara alternatif untuk membuat variabel kelas dibandingkan yang dijelaskan di atas: - -```yuescript -class Things - @class_var = "hello world" -``` - -Ekspresi ini dieksekusi setelah semua properti ditambahkan ke base. - -Semua variabel yang dideklarasikan di badan kelas bersifat lokal terhadap properti kelas. Ini berguna untuk menempatkan nilai privat atau fungsi pembantu yang hanya dapat diakses oleh method kelas: - -```yuescript -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "hello world: " .. secret -``` - -## Nilai @ dan @@ - -Ketika `@` dan `@@` diprefiks di depan sebuah nama, masing-masing merepresentasikan nama tersebut yang diakses di `self` dan `self.__class`. - -Jika digunakan sendirian, keduanya adalah alias untuk `self` dan `self.__class`. - -```yuescript -assert @ == self -assert @@ == self.__class -``` - -Contohnya, cara cepat untuk membuat instance baru dari kelas yang sama dari method instance menggunakan `@@`: - -```yuescript -some_instance_method = (...) => @@ ... -``` - -## Promosi Properti Konstruktor - -Untuk mengurangi boilerplate saat mendefinisikan objek nilai sederhana, Anda dapat menulis kelas sederhana seperti: - -```yuescript -class Something - new: (@foo, @bar, @@biz, @@baz) => - --- Yang merupakan singkatan dari - -class Something - new: (foo, bar, biz, baz) => - @foo = foo - @bar = bar - @@biz = biz - @@baz = baz -``` - -Anda juga bisa menggunakan sintaks ini untuk fungsi umum guna menginisialisasi field objek. - -```yuescript -new = (@fieldA, @fieldB) => @ -obj = new {}, 123, "abc" -print obj -``` - -## Ekspresi Kelas - -Sintaks kelas juga bisa digunakan sebagai ekspresi yang dapat di-assign ke variabel atau di-return secara eksplisit. - -```yuescript -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -## Kelas Anonim - -Nama bisa dihilangkan saat mendeklarasikan kelas. Atribut `__name` akan bernilai nil, kecuali ekspresi kelas berada dalam assignment. Nama di sisi kiri assignment digunakan sebagai ganti nil. - -```yuescript -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -Anda bahkan bisa menghilangkan badan kelas, artinya Anda bisa menulis kelas anonim kosong seperti ini: - -```yuescript -x = class -``` - -## Pencampuran Kelas - -Anda bisa melakukan mixing dengan kata kunci `using` untuk menyalin fungsi dari tabel biasa atau objek kelas yang sudah didefinisikan ke kelas baru Anda. Saat mixing dengan tabel biasa, Anda dapat mengganti fungsi pengindeksan kelas (metamethod `__index`) dengan implementasi kustom. Saat mixing dengan objek kelas yang sudah ada, metamethod objek kelas tidak akan disalin. - -```yuescript -MyIndex = __index: var: 1 - -class X using MyIndex - func: => - print 123 - -x = X! -print x.var - -class Y using X - -y = Y! -y\func! - -assert y.__class.__parent ~= X -- X bukan parent dari Y -``` - -# Pernyataan With - -Pola umum saat membuat objek adalah memanggil serangkaian fungsi dan mengatur serangkaian properti segera setelah objek dibuat. - -Hal ini menyebabkan nama objek diulang berkali-kali di kode, menambah noise yang tidak perlu. Solusi umum untuk ini adalah meneruskan tabel sebagai argumen yang berisi kumpulan kunci dan nilai untuk ditimpa. Kekurangannya adalah konstruktor objek harus mendukung bentuk ini. - -Blok `with` membantu mengatasi hal ini. Di dalam blok `with`, kita bisa menggunakan pernyataan khusus yang diawali dengan `.` atau `\` yang merepresentasikan operasi tersebut diterapkan pada objek yang sedang dipakai. - -Sebagai contoh, kita bekerja dengan objek yang baru dibuat: - -```yuescript -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -Pernyataan `with` juga bisa digunakan sebagai ekspresi yang mengembalikan nilai yang diberi akses. - -```yuescript -file = with File "favorite_foods.txt" - \set_encoding "utf8" -``` - -Ekspresi `with` mendukung `break` dengan satu nilai: - -```yuescript -result = with obj - break .value -``` - -Setelah `break value` digunakan di dalam `with`, ekspresi `with` tidak lagi mengembalikan objek targetnya, melainkan mengembalikan nilai dari `break`. - -```yuescript -a = with obj - .x = 1 --- a adalah obj - -b = with obj - break .x --- b adalah .x, bukan obj -``` - -Berbeda dari `for` / `while` / `repeat` / `do`, `with` hanya mendukung satu nilai `break`. - -Atau… - -```yuescript -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", [dad, mother, sister] -``` - -Dalam penggunaan ini, `with` dapat dilihat sebagai bentuk khusus dari kombinator K. - -Ekspresi pada pernyataan `with` juga bisa berupa assignment jika Anda ingin memberi nama pada ekspresi tersebut. - -```yuescript -with str := "Hello" - print "original:", str - print "upper:", \upper! -``` - -Anda bisa mengakses kunci khusus dengan `[]` di dalam pernyataan `with`. - -```yuescript -with tb - [1] = 1 - print [2] - with [abc] - [3] = [2]\func! - ["key-name"] = value - [] = "abc" -- menambahkan ke "tb" -``` - -`with?` adalah versi yang ditingkatkan dari sintaks `with`, yang memperkenalkan pengecekan keberadaan untuk mengakses objek yang mungkin nil secara aman tanpa pemeriksaan null eksplisit. - -```yuescript -with? obj - print .name -``` - -# Penugasan - -Variabel bersifat bertipe dinamis dan secara default dideklarasikan sebagai local. Namun Anda dapat mengubah cakupan deklarasi dengan pernyataan **local** dan **global**. - -```yuescript -hello = "world" -a, b, c = 1, 2, 3 -hello = 123 -- menggunakan variabel yang sudah ada -``` - -## Pembaruan Nilai - -Anda dapat melakukan assignment pembaruan dengan banyak operator biner. - -```yuescript -x = 1 -x += 1 -x -= 1 -x *= 10 -x /= 10 -x %= 10 -s ..= "world" -- akan menambah local baru jika variabel local belum ada -arg or= "default value" -``` - -## Assignment Berantai - -Anda bisa melakukan assignment berantai untuk menetapkan beberapa item ke nilai yang sama. - -```yuescript -a = b = c = d = e = 0 -x = y = z = f! -``` - -## Local Eksplisit - -```yuescript -do - local a = 1 - local * - print "deklarasikan semua variabel sebagai local di awal" - x = -> 1 + y + z - y, z = 2, 3 - global instance = Item\new! - -do - local X = 1 - local ^ - print "hanya deklarasikan variabel huruf besar sebagai local di awal" - a = 1 - B = 2 -``` - -## Global Eksplisit - -```yuescript -do - global a = 1 - global * - print "deklarasikan semua variabel sebagai global" - x = -> 1 + y + z - y, z = 2, 3 - -do - global X = 1 - global ^ - print "hanya deklarasikan variabel huruf besar sebagai global" - a = 1 - B = 2 - local Temp = "a local value" -``` - -# Penugasan Varargs - -Anda dapat meng-assign hasil yang dikembalikan dari sebuah fungsi ke simbol varargs `...`. Lalu akses isinya menggunakan cara Lua. - -```yuescript -list = [1, 2, 3, 4, 5] -fn = (ok) -> ok, table.unpack list -ok, ... = fn true -count = select '#', ... -first = select 1, ... -print ok, count, first -``` - -# Penugasan pada If - -Blok `if` dan `elseif` dapat menerima assignment sebagai ganti ekspresi kondisional. Saat kondisi dievaluasi, assignment akan dilakukan dan nilai yang di-assign akan digunakan sebagai ekspresi kondisional. Variabel yang di-assign hanya berada dalam scope badan kondisional, artinya tidak pernah tersedia jika nilai tidak truthy. Dan Anda harus menggunakan "walrus operator" `:=` sebagai ganti `=` untuk melakukan assignment. - -```yuescript -if user := database.find_user "moon" - print user.name -``` - -```yuescript -if hello := os.getenv "hello" - print "You have hello", hello -elseif world := os.getenv "world" - print "you have world", world -else - print "nothing :(" -``` - -Assignment if dengan beberapa nilai return. Hanya nilai pertama yang dicek, nilai lainnya tetap berada dalam scope. - -```yuescript -if success, result := pcall -> "get result without problems" - print result -- variabel result berada dalam scope -print "OK" -``` - -## Assignment pada While - -Anda juga bisa menggunakan assignment if di loop while untuk mendapatkan nilai sebagai kondisi loop. - -```yuescript -while byte := stream\read_one! - -- lakukan sesuatu dengan byte - print byte -``` - -# Penugasan Destrukturisasi - -Assignment destrukturisasi adalah cara cepat untuk mengekstrak nilai dari sebuah tabel berdasarkan nama kunci atau posisinya pada tabel berbasis array. - -Biasanya ketika Anda melihat literal tabel, `{1,2,3}`, ia berada di sisi kanan assignment karena merupakan nilai. Assignment destrukturisasi menukar peran literal tabel dan menaruhnya di sisi kiri pernyataan assignment. - -Ini paling mudah dijelaskan dengan contoh. Berikut cara membongkar dua nilai pertama dari sebuah tabel: - -```yuescript -thing = [1, 2] - -[a, b] = thing -print a, b -``` - -Di literal tabel destrukturisasi, kunci mewakili kunci yang dibaca dari sisi kanan, dan nilai mewakili nama yang akan menerima nilai tersebut. - -```yuescript -obj = { - hello: "world" - day: "tuesday" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day - -:day = obj -- OK untuk destrukturisasi sederhana tanpa kurung -``` - -Ini juga bekerja pada struktur data bertingkat: - -```yuescript -obj2 = { - numbers: [1, 2, 3, 4] - properties: { - color: "green" - height: 13.5 - } -} - -{numbers: [first, second], properties: {color: color}} = obj2 -print first, second, color -``` - -Jika pernyataan destrukturisasi kompleks, Anda bisa memecahnya ke beberapa baris. Contoh yang sedikit lebih rumit: - -```yuescript -{ - numbers: [first, second] - properties: { - color: color - } -} = obj2 -``` - -Umumnya mengekstrak nilai dari tabel lalu menugaskannya ke variabel local dengan nama yang sama dengan kuncinya. Untuk menghindari pengulangan, kita bisa menggunakan operator prefiks **:**: - -```yuescript -{:concat, :insert} = table -``` - -Ini secara efektif sama seperti import, tetapi kita dapat mengganti nama field yang ingin diekstrak dengan menggabungkan sintaks: - -```yuescript -{:mix, :max, random: rand} = math -``` - -Anda bisa menulis nilai default saat destrukturisasi seperti: - -```yuescript -{:name = "nameless", :job = "jobless"} = person -``` - -Anda dapat menggunakan `_` sebagai placeholder saat destrukturisasi list: - -```yuescript -[_, two, _, four] = items -``` - -## Destrukturisasi Rentang - -Anda dapat menggunakan operator spread `...` pada destrukturisasi list untuk menangkap rentang nilai. Ini berguna ketika Anda ingin mengekstrak elemen tertentu dari awal dan akhir list sambil mengumpulkan sisanya di tengah. - -```yuescript -orders = ["first", "second", "third", "fourth", "last"] -[first, ...bulk, last] = orders -print first -- prints: first -print bulk -- prints: {"second", "third", "fourth"} -print last -- prints: last -``` - -Operator spread dapat digunakan pada posisi berbeda untuk menangkap rentang yang berbeda, dan Anda bisa memakai `_` sebagai placeholder untuk nilai yang tidak ingin ditangkap: - -```yuescript --- Tangkap semuanya setelah elemen pertama -[first, ...rest] = orders - --- Tangkap semuanya sebelum elemen terakhir -[...start, last] = orders - --- Tangkap semuanya kecuali elemen tengah -[first, ..._, last] = orders -``` - -## Destrukturisasi di Tempat Lain - -Destrukturisasi juga dapat muncul di tempat-tempat di mana assignment terjadi secara implisit. Contohnya adalah perulangan for: - -```yuescript -tuples = [ - ["hello", "world"] - ["egg", "head"] -] - -for [left, right] in *tuples - print left, right -``` - -Kita tahu setiap elemen pada tabel array adalah tuple dua item, sehingga kita dapat membongkarnya langsung di klausa nama pada pernyataan for menggunakan destrukturisasi. - -# Klausa Using; Mengendalikan Penugasan Destruktif - -Meskipun scope leksikal sangat membantu mengurangi kompleksitas kode yang kita tulis, hal ini bisa menjadi sulit ketika ukuran kode membesar. Pertimbangkan cuplikan berikut: - -```yuescript -i = 100 - --- banyak baris kode... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- akan mencetak 0 -``` - -Di `my_func`, kita tanpa sengaja menimpa nilai `i`. Dalam contoh ini halnya cukup jelas, tetapi bayangkan kode besar atau basis kode asing di mana tidak jelas nama apa saja yang sudah dideklarasikan. - -Akan sangat membantu jika kita dapat menyatakan variabel mana dari scope luar yang memang ingin kita ubah, agar mencegah mengubah yang lain secara tidak sengaja. - -Kata kunci `using` memungkinkan kita melakukan itu. `using nil` memastikan bahwa tidak ada variabel tertutup yang ditimpa dalam assignment. Klausa `using` ditempatkan setelah daftar argumen pada fungsi, atau menggantikannya jika tidak ada argumen. - -```yuescript -i = 100 - -my_func = (using nil) -> - i = "hello" -- variabel local baru dibuat di sini - -my_func! -print i -- mencetak 100, i tidak terpengaruh -``` - -Beberapa nama dapat dipisahkan dengan koma. Nilai closure tetap bisa diakses, hanya saja tidak dapat dimodifikasi: - -```yuescript -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k, i) -> - tmp = tmp + add -- tmp local baru dibuat - i += tmp - k += tmp - -my_func(22) -print i, k -- ini telah diperbarui -``` - -# Penggunaan - -## Modul Lua - -Gunakan modul YueScript di Lua: - -- **Kasus 1** - - Require "your_yuescript_entry.yue" di Lua. - - ```lua - require("yue")("your_yuescript_entry") - ``` - - Dan kode ini tetap bekerja ketika Anda mengompilasi "your_yuescript_entry.yue" menjadi "your_yuescript_entry.lua" di path yang sama. Pada file YueScript lainnya cukup gunakan **require** atau **import** biasa. Nomor baris pada pesan error juga akan ditangani dengan benar. - -- **Kasus 2** - - Require modul YueScript dan tulis ulang pesan secara manual. - - ```lua - local yue = require("yue") - yue.insert_loader() - local success, result = xpcall(function() - return require("yuescript_module_name") - end, function(err) - return yue.traceback(err) - end) - ``` - -- **Kasus 3** - - Gunakan fungsi kompiler YueScript di Lua. - - ```lua - local yue = require("yue") - local codes, err, globals = yue.to_lua([[ - f = -> - print "hello world" - f! - ]],{ - implicit_return_root = true, - reserve_line_number = true, - lint_global = true, - space_over_tab = false, - options = { - target = "5.4", - path = "/script" - } - }) - ``` - -## Tool YueScript - -Gunakan tool YueScript dengan: - -```shell -> yue -h -Penggunaan: yue - [opsi] [] ... - yue -e [argumen...] - yue -w [] [opsi] - yue - - -Catatan: - - '-' / '--' harus menjadi argumen pertama dan satu-satunya. - - '-o/--output' tidak dapat digunakan dengan beberapa file input. - - '-w/--watch' tidak dapat digunakan dengan file input (khusus direktori). - - dengan '-e/--execute', token sisanya dianggap sebagai argumen skrip. - -Opsi: - -h, --help Tampilkan pesan bantuan ini dan keluar. - -e , --execute Eksekusi file atau kode mentah - -m, --minify Menghasilkan kode yang sudah diminimasi - -r, --rewrite Tulis ulang output agar sesuai dengan nomor baris asal - -t , --output-to - Tentukan lokasi untuk menaruh file hasil kompilasi - -o , --output Tulis output ke file - -p, --print Tulis output ke standar output - -b, --benchmark Tampilkan waktu kompilasi (tanpa menulis output) - -g, --globals Tampilkan variabel global yang digunakan dalam FORMAT NAMA BARIS KOLOM - -s, --spaces Pakai spasi di kode hasil kompilasi (bukan tab) - -l, --line-numbers Tulis nomor baris dari kode sumber - -j, --no-implicit-return Nonaktifkan return implisit di akhir file - -c, --reserve-comments Pertahankan komentar sebelum pernyataan dari kode sumber - -w [], --watch [] - Pantau perubahan dan kompilasi setiap file di bawah direktori - -v, --version Tampilkan versi - - Baca dari standar input, tulis ke standar output - (harus menjadi argumen pertama dan satu-satunya) - -- Sama dengan '-', dipertahankan untuk kompatibilitas lama - - --target Tentukan versi Lua yang akan dihasilkan kodenya - (versi hanya bisa dari 5.1 sampai 5.5) - --path Tambahkan path pencarian Lua tambahan ke package.path - --= Kirim opsi kompilasi dalam bentuk key=value (perilaku standar) - - Jalankan tanpa opsi untuk masuk ke REPL, ketik simbol '$' - dalam satu baris untuk memulai/mengakhiri mode multi-baris -``` - -Gunakan kasus: - -Kompilasi semua file YueScript dengan ekstensi **.yue** secara rekursif di bawah path saat ini: **yue .** - -Kompilasi dan simpan hasil ke path target: **yue -t /target/path/ .** - -Kompilasi dan pertahankan info debug: **yue -l .** - -Kompilasi dan hasilkan kode yang diminisasi: **yue -m .** - -Eksekusi kode mentah: **yue -e 'print 123'** - -Eksekusi file YueScript: **yue -e main.yue** - -# Pendahuluan - -YueScript adalah bahasa dinamis yang dikompilasi ke Lua, dan merupakan dialek [MoonScript](https://github.com/leafo/moonscript). Kode yang ditulis dengan YueScript ekspresif dan sangat ringkas. YueScript cocok untuk menulis logika aplikasi yang sering berubah dengan kode yang lebih mudah dipelihara, serta berjalan di lingkungan embed Lua seperti game atau server situs web. - -Yue (月) adalah kata untuk bulan dalam bahasa Tionghoa dan diucapkan sebagai [jyɛ]. - -## Ikhtisar YueScript - -```yuescript --- import syntax -import p, to_lua from "yue" - --- object literals -inventory = - equipment: - - "sword" - - "shield" - items: - - name: "potion" - count: 10 - - name: "bread" - count: 3 - --- list comprehension -map = (arr, action) -> - [action item for item in *arr] - -filter = (arr, cond) -> - [item for item in *arr when cond item] - -reduce = (arr, init, action): init -> - init = action init, item for item in *arr - --- pipe operator -[1, 2, 3] - |> map (x) -> x * 2 - |> filter (x) -> x > 4 - |> reduce 0, (a, b) -> a + b - |> print - --- metatable manipulation -apple = - size: 15 - : - color: 0x00ffff - -with apple - p .size, .color, . if .<>? - --- js-like export syntax -export 🌛 = "Skrip Bulan" -``` - -## Tentang Dora SSR - -YueScript dikembangkan dan dipelihara bersama mesin game open-source [Dora SSR](https://github.com/IppClub/Dora-SSR). YueScript telah digunakan untuk membuat alat mesin, demo game, dan prototipe, membuktikan kemampuannya dalam skenario dunia nyata sekaligus meningkatkan pengalaman pengembangan Dora SSR. - -# Instalasi - -## Modul Lua - -Instal [luarocks](https://luarocks.org), manajer paket untuk modul Lua. Lalu instal sebagai modul Lua dan executable dengan: - -```shell -luarocks install yuescript -``` - -Atau Anda dapat membangun file `yue.so` dengan: - -```shell -make shared LUAI=/usr/local/include/lua LUAL=/usr/local/lib/lua -``` - -Lalu ambil file biner dari path **bin/shared/yue.so**. - -## Membangun Tool Biner - -Klon repo ini, lalu bangun dan instal executable dengan: - -```shell -make install -``` - -Bangun tool YueScript tanpa fitur macro: - -```shell -make install NO_MACRO=true -``` - -Bangun tool YueScript tanpa biner Lua bawaan: - -```shell -make install NO_LUA=true -``` - -## Unduh Biner Pra-kompilasi - -Anda dapat mengunduh file biner pra-kompilasi, termasuk file executable biner yang kompatibel dengan berbagai versi Lua dan file library. - -Unduh file biner pra-kompilasi dari [sini](https://github.com/IppClub/YueScript/releases). - -# Kondisional - -```yuescript -have_coins = false -if have_coins - print "Dapat koin" -else - print "Tidak ada koin" -``` - -Sintaks pendek untuk pernyataan tunggal juga bisa digunakan: - -```yuescript -have_coins = false -if have_coins then print "Dapat koin" else print "Tidak ada koin" -``` - -Karena pernyataan if dapat digunakan sebagai ekspresi, ini juga bisa ditulis sebagai: - -```yuescript -have_coins = false -print if have_coins then "Dapat koin" else "Tidak ada koin" -``` - -Kondisional juga bisa digunakan di pernyataan return dan assignment: - -```yuescript -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "Saya sangat tinggi" -else - "Saya tidak terlalu tinggi" - -print message -- prints: Saya sangat tinggi -``` - -Kebalikan dari if adalah unless: - -```yuescript -unless os.date("%A") == "Monday" - print "hari ini bukan Senin!" -``` - -```yuescript -print "Kamu beruntung!" unless math.random! > 0.1 -``` - -## Ekspresi In - -Anda dapat menulis kode pengecekan rentang dengan `ekspresi in`. - -```yuescript -a = 5 - -if a in [1, 3, 5, 7] - print "memeriksa kesamaan dengan nilai-nilai diskrit" - -if a in list - print "memeriksa apakah `a` ada di dalam daftar" -``` - -Operator `in` juga dapat digunakan dengan tabel dan mendukung varian `not in` untuk negasi: - -```yuescript -has = "foo" in {"bar", "foo"} - -if a in {1, 2, 3} - print "a ada di dalam tabel" - -not_exist = item not in list - -check = -> value not in table -``` - -Daftar atau tabel dengan satu elemen memeriksa kesamaan dengan elemen tersebut: - -```yuescript --- [1,] memeriksa apakah nilai == 1 -c = a in [1,] - --- {1} juga memeriksa apakah nilai == 1 -c = a in {1} - --- Tanpa koma, [1] adalah akses indeks (tb[1]) -with tb - c = a in [1] -``` - -# Perulangan For - -Ada dua bentuk perulangan for, seperti di Lua. Satu numerik dan satu generik: - -```yuescript -for i = 10, 20 - print i - -for k = 1, 15, 2 -- an optional step provided - print k - -for key, value in pairs object - print key, value -``` - -Operator slicing dan **\*** dapat digunakan, seperti pada comprehension: - -```yuescript -for item in *items[2, 4] - print item -``` - -Sintaks yang lebih singkat juga tersedia untuk semua variasi ketika badan hanya satu baris: - -```yuescript -for item in *items do print item - -for j = 1, 10, 3 do print j -``` - -Perulangan for juga bisa digunakan sebagai ekspresi. Pernyataan terakhir di badan for dipaksa menjadi ekspresi dan ditambahkan ke tabel array yang terakumulasi. - -Menggandakan setiap bilangan genap: - -```yuescript -doubled_evens = for i = 1, 20 - if i % 2 == 0 - i * 2 - else - i -``` - -Selain itu, loop for mendukung break dengan nilai kembalian, sehingga loop itu sendiri bisa dipakai sebagai ekspresi yang keluar lebih awal dengan hasil bermakna. Ekspresi `for` mendukung `break` dengan banyak nilai. - -Contohnya, untuk menemukan angka pertama yang lebih besar dari 10: - -```yuescript -first_large = for n in *numbers - break n if n > 10 -``` - -Sintaks break-dengan-nilai ini memungkinkan pola pencarian atau keluar-lebih-awal yang ringkas langsung di dalam ekspresi loop. - -```yuescript -key, score = for k, v in pairs data - break k, v * 10 if k == "target" -``` - -Anda juga bisa memfilter nilai dengan menggabungkan ekspresi for dengan pernyataan continue. - -Loop for di akhir badan fungsi tidak diakumulasikan menjadi tabel untuk nilai kembalian (sebaliknya fungsi akan mengembalikan nil). Gunakan pernyataan return eksplisit, atau ubah loop menjadi list comprehension. - -```yuescript -func_a = -> for i = 1, 10 do print i -func_b = -> return for i = 1, 10 do i - -print func_a! -- prints nil -print func_b! -- prints table object -``` - -# Pernyataan Continue - -Pernyataan continue dapat digunakan untuk melewati iterasi saat ini di dalam loop. - -```yuescript -i = 0 -while i < 10 - i += 1 - continue if i % 2 == 0 - print i -``` - -continue juga bisa digunakan bersama ekspresi loop untuk mencegah iterasi tersebut diakumulasikan ke hasil. Contoh ini memfilter tabel array menjadi hanya angka genap: - -```yuescript -my_numbers = [1, 2, 3, 4, 5, 6] -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -# Pernyataan Switch - -Pernyataan switch adalah bentuk singkat untuk menulis serangkaian if yang membandingkan nilai yang sama. Perhatikan bahwa nilainya hanya dievaluasi sekali. Seperti if, switch bisa memiliki blok else untuk menangani tidak ada yang cocok. Perbandingan dilakukan dengan operator `==`. Di dalam switch, Anda juga bisa memakai ekspresi assignment untuk menyimpan nilai variabel sementara. - -```yuescript -switch name := "Dan" - when "Robert" - print "You are Robert" - when "Dan", "Daniel" - print "Your name, it's Dan" - else - print "I don't know about you with name #{name}" -``` - -Klausa when pada switch bisa mencocokkan beberapa nilai dengan menuliskannya dipisah koma. - -Switch juga bisa dipakai sebagai ekspresi; di sini kita dapat menetapkan hasil switch ke sebuah variabel: - -```yuescript -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "can't count that high!" -``` - -Kita bisa memakai kata kunci `then` untuk menulis blok when switch pada satu baris. Tidak ada kata kunci tambahan yang dibutuhkan untuk menulis blok else pada satu baris. - -```yuescript -msg = switch math.random(1, 5) - when 1 then "you are lucky" - when 2 then "you are almost lucky" - else "not so lucky" -``` - -Jika Anda ingin menulis kode dengan satu indentasi lebih sedikit saat menulis switch, Anda bisa menaruh klausa when pertama pada baris awal pernyataan, lalu semua klausa lain dapat ditulis dengan satu indentasi lebih sedikit. - -```yuescript -switch math.random(1, 5) - when 1 - print "you are lucky" -- two indents - else - print "not so lucky" - -switch math.random(1, 5) when 1 - print "you are lucky" -- one indent -else - print "not so lucky" -``` - -Perlu dicatat urutan ekspresi perbandingan kasus. Ekspresi kasus berada di sisi kiri. Ini bisa berguna jika ekspresi kasus ingin mengganti cara perbandingan dengan mendefinisikan metamethod `eq`. - -## Pencocokan Tabel - -Anda bisa melakukan pencocokan tabel dalam klausa when switch, jika tabel dapat didestrukturisasi oleh struktur tertentu dan mendapatkan nilai non-nil. - -```yuescript -items = - * x: 100 - y: 200 - * width: 300 - height: 400 - -for item in *items - switch item - when :x, :y - print "Vec2 #{x}, #{y}" - when :width, :height - print "size #{width}, #{height}" -``` - -Anda dapat menggunakan nilai default untuk mendestrukturisasi tabel secara opsional pada beberapa field. - -```yuescript -item = {} - -{pos: {:x = 50, :y = 200}} = item -- get error: attempt to index a nil value (field 'pos') - -switch item - when {pos: {:x = 50, :y = 200}} - print "Vec2 #{x}, #{y}" -- table destructuring will still pass -``` - -Anda juga bisa mencocokkan elemen array, field tabel, dan bahkan struktur bertingkat dengan literal array atau tabel. - -Cocokkan terhadap elemen array. - -```yuescript -switch tb - when [1, 2, 3] - print "1, 2, 3" - when [1, b, 3] - print "1, #{b}, 3" - when [1, 2, b = 3] -- b has a default value - print "1, 2, #{b}" -``` - -Cocokkan terhadap field tabel dengan destrukturisasi. - -```yuescript -switch tb - when success: true, :result - print "success", result - when success: false - print "failed", result - else - print "invalid" -``` - -Cocokkan terhadap struktur tabel bertingkat. - -```yuescript -switch tb - when data: {type: "success", :content} - print "success", content - when data: {type: "error", :content} - print "failed", content - else - print "invalid" -``` - -Cocokkan terhadap array dari tabel. - -```yuescript -switch tb - when [ - {a: 1, b: 2} - {a: 3, b: 4} - {a: 5, b: 6} - fourth - ] - print "matched", fourth -``` - -Cocokkan terhadap daftar dan tangkap rentang elemen. - -```yuescript -segments = ["admin", "users", "logs", "view"] -switch segments - when [...groups, resource, action] - print "Group:", groups -- prints: {"admin", "users"} - print "Resource:", resource -- prints: "logs" - print "Action:", action -- prints: "view" -``` - -# Perulangan While - -Perulangan while juga memiliki empat variasi: - -```yuescript -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -```yuescript -i = 10 -until i == 0 - print i - i -= 1 - -until running == false do my_function! -``` - -Seperti loop for, loop while juga bisa digunakan sebagai ekspresi. Ekspresi `while` dan `until` mendukung `break` dengan banyak nilai. - -```yuescript -value, doubled = while true - n = get_next! - break n, n * 2 if n > 10 -``` - -Selain itu, agar sebuah fungsi mengembalikan nilai akumulasi dari loop while, pernyataannya harus di-return secara eksplisit. - -## Repeat Loop - -Loop repeat berasal dari Lua: - -```yuescript -i = 10 -repeat - print i - i -= 1 -until i == 0 -``` - -Ekspresi `repeat` juga mendukung `break` dengan banyak nilai: - -```yuescript -i = 1 -value, scaled = repeat - break i, i * 100 if i > 3 - i += 1 -until false -``` - -# Stub Fungsi - -Sering kali fungsi dari sebuah objek diteruskan sebagai nilai, misalnya meneruskan method instance ke fungsi lain sebagai callback. Jika fungsi mengharapkan objek yang dioperasikan sebagai argumen pertama, maka Anda harus menggabungkan objek tersebut dengan fungsi agar dapat dipanggil dengan benar. - -Sintaks stub fungsi adalah singkatan untuk membuat fungsi closure baru yang menggabungkan objek dan fungsi. Fungsi baru ini memanggil fungsi yang dibungkus dalam konteks objek yang benar. - -Sintaksnya sama seperti memanggil method instance dengan operator `\`, tetapi tanpa menyediakan daftar argumen. - -```yuescript -my_object = { - value: 1000 - write: => print "the value:", @value -} - -run_callback = (func) -> - print "running callback..." - func! - --- ini tidak akan berfungsi: --- fungsi tidak memiliki referensi ke my_object -run_callback my_object.write - --- sintaks stub fungsi --- memungkinkan kita membundel objek ke fungsi baru -run_callback my_object\write -``` - -# Backcall - -Backcall digunakan untuk meratakan callback yang bersarang. Backcall didefinisikan menggunakan panah yang mengarah ke kiri sebagai parameter terakhir secara default yang akan mengisi pemanggilan fungsi. Semua sintaks pada dasarnya sama seperti fungsi panah biasa, kecuali arahnya berlawanan dan badan fungsi tidak memerlukan indentasi. - -```yuescript -x <- f -print "hello" .. x -``` - -Fungsi panah tebal juga tersedia. - -```yuescript -<= f -print @value -``` - -Anda dapat menentukan placeholder untuk posisi fungsi backcall sebagai parameter. - -```yuescript -(x) <- map _, [1, 2, 3] -x * 2 -``` - -Jika Anda ingin menulis kode lanjutan setelah backcall, Anda dapat memisahkannya dengan pernyataan `do`. Tanda kurung dapat dihilangkan untuk fungsi panah non-tebal. - -```yuescript -result, msg = do - data <- readAsync "filename.txt" - print data - info <- processAsync data - check info -print result, msg -``` - -# Literal Fungsi - -Semua fungsi dibuat menggunakan ekspresi fungsi. Fungsi sederhana ditandai dengan panah: **->**. - -```yuescript -my_function = -> -my_function() -- memanggil fungsi kosong -``` - -Badan fungsi bisa berupa satu pernyataan yang ditulis langsung setelah panah, atau berupa serangkaian pernyataan yang diindentasi di baris berikutnya: - -```yuescript -func_a = -> print "hello world" - -func_b = -> - value = 100 - print "The value:", value -``` - -Jika fungsi tidak memiliki argumen, ia dapat dipanggil menggunakan operator `!`, sebagai ganti tanda kurung kosong. Pemanggilan `!` adalah cara yang disarankan untuk memanggil fungsi tanpa argumen. - -```yuescript -func_a! -func_b() -``` - -Fungsi dengan argumen dapat dibuat dengan menaruh daftar nama argumen dalam tanda kurung sebelum panah: - -```yuescript -sum = (x, y) -> print "sum", x + y -``` - -Fungsi dapat dipanggil dengan menuliskan argumen setelah nama ekspresi yang mengevaluasi ke fungsi. Saat merangkai pemanggilan fungsi, argumen diterapkan ke fungsi terdekat di sebelah kiri. - -```yuescript -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -Untuk menghindari ambiguitas saat memanggil fungsi, tanda kurung juga bisa digunakan untuk mengelilingi argumen. Ini diperlukan di sini agar argumen yang tepat dikirim ke fungsi yang tepat. - -```yuescript -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -Tidak boleh ada spasi antara tanda kurung buka dan nama fungsi. - -Fungsi akan memaksa pernyataan terakhir di badannya menjadi pernyataan return, ini disebut return implisit: - -```yuescript -sum = (x, y) -> x + y -print "The sum is ", sum 10, 20 -``` - -Dan jika Anda perlu return secara eksplisit, Anda bisa menggunakan kata kunci `return`: - -```yuescript -sum = (x, y) -> return x + y -``` - -Seperti di Lua, fungsi dapat mengembalikan beberapa nilai. Pernyataan terakhir harus berupa daftar nilai yang dipisahkan koma: - -```yuescript -mystery = (x, y) -> x + y, x - y -a, b = mystery 10, 20 -``` - -## Panah Tebal - -Karena sudah menjadi idiom di Lua untuk mengirim objek sebagai argumen pertama saat memanggil method, disediakan sintaks khusus untuk membuat fungsi yang otomatis menyertakan argumen `self`. - -```yuescript -func = (num) => @value + num -``` - -## Nilai Default Argumen - -Dimungkinkan untuk menyediakan nilai default bagi argumen fungsi. Argumen dianggap kosong jika nilainya nil. Argumen nil yang memiliki nilai default akan diganti sebelum badan fungsi dijalankan. - -```yuescript -my_function = (name = "something", height = 100) -> - print "Hello I am", name - print "My height is", height -``` - -Ekspresi nilai default argumen dievaluasi di dalam badan fungsi sesuai urutan deklarasi argumen. Karena itu, nilai default dapat mengakses argumen yang dideklarasikan sebelumnya. - -```yuescript -some_args = (x = 100, y = x + 1000) -> - print x + y -``` - -## Pertimbangan - -Karena cara pemanggilan fungsi tanpa tanda kurung yang ekspresif, beberapa pembatasan harus diterapkan untuk menghindari ambiguitas parsing yang melibatkan spasi. - -Tanda minus memiliki dua peran, operator negasi unari dan operator pengurangan biner. Perhatikan bagaimana contoh berikut dikompilasi: - -```yuescript -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -Prioritas argumen pertama pada pemanggilan fungsi dapat dikendalikan menggunakan spasi jika argumennya adalah literal string. Di Lua, sudah umum untuk menghilangkan tanda kurung saat memanggil fungsi dengan satu literal string atau tabel. - -Ketika tidak ada spasi antara variabel dan literal string, pemanggilan fungsi akan memiliki prioritas atas ekspresi yang mengikuti. Tidak ada argumen lain yang dapat diberikan pada fungsi ketika dipanggil dengan cara ini. - -Ketika ada spasi setelah variabel dan literal string, pemanggilan fungsi bertindak seperti yang dijelaskan di atas. Literal string menjadi milik ekspresi berikutnya (jika ada), yang berfungsi sebagai daftar argumen. - -```yuescript -x = func"hello" + 100 -y = func "hello" + 100 -``` - -## Argumen Multi-baris - -Saat memanggil fungsi yang menerima banyak argumen, akan lebih nyaman untuk memecah daftar argumen menjadi beberapa baris. Karena sifat bahasa yang peka terhadap spasi, perlu hati-hati saat memecah daftar argumen. - -Jika daftar argumen akan dilanjutkan ke baris berikutnya, baris saat ini harus diakhiri dengan koma. Dan baris berikutnya harus lebih terindentasi daripada indentasi saat ini. Setelah diindentasi, semua baris argumen lainnya harus berada pada tingkat indentasi yang sama agar menjadi bagian dari daftar argumen. - -```yuescript -my_func 5, 4, 3, - 8, 9, 10 - -cool_func 1, 2, - 3, 4, - 5, 6, - 7, 8 -``` - -Jenis pemanggilan ini dapat dinest. Tingkat indentasi digunakan untuk menentukan argumen milik fungsi yang mana. - -```yuescript -my_func 5, 6, 7, - 6, another_func 6, 7, 8, - 9, 1, 2, - 5, 4 -``` - -Karena tabel juga menggunakan koma sebagai pemisah, sintaks indentasi ini membantu agar nilai menjadi bagian dari daftar argumen, bukan bagian dari tabel. - -```yuescript -x = [ - 1, 2, 3, 4, a_func 4, 5, - 5, 6, - 8, 9, 10 -] -``` - -Meskipun jarang, perhatikan bahwa kita bisa memberikan indentasi yang lebih dalam untuk argumen fungsi jika kita tahu akan menggunakan indentasi yang lebih dangkal di bagian selanjutnya. - -```yuescript -y = [ my_func 1, 2, 3, - 4, 5, - 5, 6, 7 -] -``` - -Hal yang sama juga dapat dilakukan pada pernyataan tingkat blok lainnya seperti kondisional. Kita bisa menggunakan tingkat indentasi untuk menentukan nilai milik pernyataan apa: - -```yuescript -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" - -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" -``` - -## Destrukturisasi Parameter - -YueScript kini mendukung destrukturisasi parameter fungsi ketika argumen berupa objek. Dua bentuk destrukturisasi literal tabel tersedia: - -- **Literal berkurung kurawal/parameter objek**, memungkinkan nilai default opsional ketika field hilang (misalnya, `{:a, :b}`, `{a: a1 = 123}`). - -- **Sintaks tabel sederhana tanpa pembungkus**, dimulai dengan urutan key-value atau binding singkat dan berlanjut sampai ekspresi lain menghentikannya (misalnya, `:a, b: b1, :c`). Bentuk ini mengekstrak beberapa field dari objek yang sama. - -```yuescript -f1 = (:a, :b, :c) -> - print a, b, c - -f1 a: 1, b: "2", c: {} - -f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> - print a1, b, c - -arg1 = {a: 0} -f2 arg1, arg2 -``` - -## Ekspresi Return Berawalan - -Saat bekerja dengan badan fungsi yang sangat bertingkat, menjaga keterbacaan dan konsistensi nilai return bisa terasa melelahkan. Untuk mengatasinya, YueScript memperkenalkan sintaks **Ekspresi Return Berawalan**. Bentuknya sebagai berikut: - -```yuescript -findFirstEven = (list): nil -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub -``` - -Ini setara dengan: - -```yuescript -findFirstEven = (list) -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub - nil -``` - -Satu-satunya perbedaan adalah Anda dapat memindahkan ekspresi return terakhir sebelum token `->` atau `=>` untuk menunjukkan nilai return implisit fungsi sebagai pernyataan terakhir. Dengan cara ini, bahkan pada fungsi dengan banyak loop bertingkat atau cabang kondisional, Anda tidak lagi perlu menulis ekspresi return di akhir badan fungsi, sehingga struktur logika menjadi lebih lurus dan mudah diikuti. - -## Varargs Bernama - -Anda dapat menggunakan sintaks `(...t) ->` untuk otomatis menyimpan varargs ke tabel bernama. Tabel ini berisi semua argumen yang diteruskan (termasuk nilai `nil`), dan field `n` pada tabel menyimpan jumlah argumen yang benar-benar diteruskan (termasuk nilai `nil`). - -```yuescript -f = (...t) -> - print "argument count:", t.n - print "table length:", #t - for i = 1, t.n - print t[i] - -f 1, 2, 3 -f "a", "b", "c", "d" -f! - --- Menangani kasus dengan nilai nil -process = (...args) -> - sum = 0 - for i = 1, args.n - if args[i] != nil and type(args[i]) == "number" - sum += args[i] - sum - -process 1, nil, 3, nil, 5 -``` - -# Spasi Kosong - -YueScript adalah bahasa yang peka terhadap spasi. Anda harus menulis beberapa blok kode dengan indentasi yang sama menggunakan spasi **' '** atau tab **'\t'** seperti badan fungsi, daftar nilai, dan beberapa blok kontrol. Ekspresi yang mengandung spasi berbeda dapat bermakna berbeda. Tab diperlakukan seperti 4 spasi, tetapi sebaiknya jangan mencampur penggunaan spasi dan tab. - -## Pemisah Pernyataan - -Sebuah pernyataan biasanya berakhir pada pergantian baris. Anda juga bisa memakai titik koma `;` untuk mengakhiri pernyataan secara eksplisit, yang memungkinkan menulis beberapa pernyataan pada satu baris: - -```yuescript -a = 1; b = 2; print a + b -``` - -## Rantai Multibaris - -Anda bisa menulis pemanggilan fungsi berantai multi-baris dengan indentasi yang sama. - -```yuescript -Rx.Observable - .fromRange 1, 8 - \filter (x) -> x % 2 == 0 - \concat Rx.Observable.of 'who do we appreciate' - \map (value) -> value .. '!' - \subscribe print -``` - -# Komentar - -```yuescript --- Saya adalah komentar - -str = --[[ -Ini komentar multi-baris. -Tidak masalah. -]] strA \ -- komentar 1 - .. strB \ -- komentar 2 - .. strC - -func --[[port]] 3000, --[[ip]] "192.168.1.1" -``` - -# Atribut - -Dukungan sintaks untuk atribut Lua 5.4. Anda juga masih bisa menggunakan deklarasi `const` dan `close` dan mendapatkan pemeriksaan konstanta serta callback berbatas-scope ketika menargetkan versi Lua di bawah 5.4. - -```yuescript -const a = 123 -close _ = : -> print "Out of scope." -``` - -Anda dapat melakukan destrukturisasi dengan variabel yang diberi atribut sebagai konstanta. - -```yuescript -const {:a, :b, c, d} = tb --- a = 1 -``` - -Anda juga bisa mendeklarasikan variabel global sebagai `const`. - -```yuescript -global const Constant = 123 --- Constant = 1 -``` - -# Operator - -Semua operator biner dan unari Lua tersedia. Selain itu **!=** adalah alias untuk **~=**, dan **\\** atau **::** bisa digunakan untuk menulis pemanggilan fungsi berantai seperti `tb\func!` atau `tb::func!`. YueScript juga menawarkan beberapa operator khusus lain untuk menulis kode yang lebih ekspresif. - -```yuescript -tb\func! if tb ~= nil -tb::func! if tb != nil -``` - -## Perbandingan Berantai - -Perbandingan bisa dirantai secara bebas: - -```yuescript -print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 --- output: true - -a = 5 -print 1 <= a <= 10 --- output: true -``` - -Perhatikan perilaku evaluasi perbandingan berantai: - -```yuescript -v = (x) -> - print x - x - -print v(1) < v(2) <= v(3) ---[[ - output: - 2 - 1 - 3 - true -]] - -print v(1) > v(2) <= v(3) ---[[ - output: - 2 - 1 - false -]] -``` - -Ekspresi tengah hanya dievaluasi sekali, bukan dua kali seperti jika ekspresi ditulis sebagai `v(1) < v(2) and v(2) <= v(3)`. Namun, urutan evaluasi pada perbandingan berantai tidak didefinisikan. Sangat disarankan untuk tidak menggunakan ekspresi dengan efek samping (seperti `print`) di perbandingan berantai. Jika efek samping diperlukan, operator short-circuit `and` sebaiknya digunakan secara eksplisit. - -## Menambahkan ke Tabel - -Operator **[] =** digunakan untuk menambahkan nilai ke tabel. - -```yuescript -tab = [] -tab[] = "Value" -``` - -Anda juga bisa memakai operator spread `...` untuk menambahkan semua elemen dari satu list ke list lain: - -```yuescript -tbA = [1, 2, 3] -tbB = [4, 5, 6] -tbA[] = ...tbB --- tbA sekarang [1, 2, 3, 4, 5, 6] -``` - -## Penyebaran Tabel - -Anda bisa menggabungkan tabel array atau tabel hash menggunakan operator spread `...` sebelum ekspresi di literal tabel. - -Saat melakukan spread ke literal tabel dengan kurung kurawal (misalnya `{...other}`), bagian array dan bagian hash dari tabel Lua akan disalin. - -```yuescript -parts = - * "shoulders" - * "knees" -lyrics = - * "head" - * ...parts - * "and" - * "toes" - -copy = {...other} - -a = {1, 2, 3, x: 1} -b = {4, 5, y: 1} -merge = {...a, ...b} -``` - -### Penyebaran Tabel List - -Saat melakukan spread ke literal tabel dengan kurung siku (misalnya `[...other,]`), hanya bagian array yang disalin. - -```yuescript -source = {1, 2, 3, name: "Yue"} -fullCopy = {...source} -listCopy = [...source,] --- fullCopy => {1, 2, 3, name: "Yue"} --- listCopy => [1, 2, 3] -``` - -## Indeks Balik Tabel - -Anda dapat menggunakan operator **#** untuk mendapatkan elemen terakhir dari tabel. - -```yuescript -last = data.items[#] -second_last = data.items[#-1] -data.items[#] = 1 -``` - -## Metatable - -Operator **<>** dapat digunakan sebagai pintasan untuk manipulasi metatable. - -### Pembuatan Metatable - -Buat tabel normal dengan tanda kurung siku kosong **<>** atau kunci metamethod yang dikelilingi oleh **<>**. - -```yuescript -mt = {} -add = (right) => <>: mt, value: @value + right.value -mt.__add = add - -a = <>: mt, value: 1 - -- set field dengan variabel bernama sama -b = :, value: 2 -c = : mt.__add, value: 3 - -d = a + b + c -print d.value - -close _ = : -> print "out of scope" -``` - -### Mengakses Metatable - -Akses metatable dengan **<>**, nama metamethod yang dikelilingi **<>**, atau menulis ekspresi di dalam **<>**. - -```yuescript --- dibuat dengan metatable yang berisi field "value" -tb = <"value">: 123 -tb. = tb.<> -print tb.value - -tb.<> = __index: {item: "hello"} -print tb.item -``` - -### Destrukturisasi Metatable - -Destrukturisasi metatable dengan kunci metamethod yang dikelilingi **<>**. - -```yuescript -{item, :new, :, : getter} = tb -print item, new, close, getter -``` - -## Keberadaan - -Operator **?** dapat digunakan dalam berbagai konteks untuk memeriksa keberadaan. - -```yuescript -func?! -print abc?["hello world"]?.xyz - -x = tab?.value -len = utf8?.len or string?.len or (o) -> #o - -if print and x? - print x - -with? io.open "test.txt", "w" - \write "hello" - \close! -``` - -## Piping - -Sebagai ganti serangkaian pemanggilan fungsi bersarang, Anda bisa mengalirkan nilai dengan operator **|>**. - -```yuescript -"hello" |> print -1 |> print 2 -- sisipkan nilai pipe sebagai argumen pertama -2 |> print 1, _, 3 -- pipe dengan placeholder - --- ekspresi pipe multi-baris -readFile "example.txt" - |> extract language, {} - |> parse language - |> emit - |> render - |> print -``` - -## Nil Coalescing - -Operator nil-coalescing **??** mengembalikan nilai dari operan kiri jika bukan **nil**; jika tidak, operator mengevaluasi operan kanan dan mengembalikan hasilnya. Operator **??** tidak mengevaluasi operan kanan jika operan kiri bernilai non-nil. - -```yuescript -local a, b, c, d -a = b ?? c ?? d -func a ?? {} - -a ??= false -``` - -## Objek Implisit - -Anda dapat menulis daftar struktur implisit yang diawali simbol **\*** atau **-** di dalam blok tabel. Jika Anda membuat objek implisit, field objek harus berada pada indentasi yang sama. - -```yuescript --- assignment dengan objek implisit -list = - * 1 - * 2 - * 3 - --- pemanggilan fungsi dengan objek implisit -func - * 1 - * 2 - * 3 - --- return dengan objek implisit -f = -> - return - * 1 - * 2 - * 3 - --- tabel dengan objek implisit -tb = - name: "abc" - - values: - - "a" - - "b" - - "c" - - objects: - - name: "a" - value: 1 - func: => @value + 1 - tb: - fieldA: 1 - - - name: "b" - value: 2 - func: => @value + 2 - tb: { } - -``` - -# Literal - -Semua literal primitif di Lua dapat digunakan. Ini berlaku untuk angka, string, boolean, dan **nil**. - -Berbeda dengan Lua, pemisah baris diizinkan di dalam string bertanda kutip tunggal maupun ganda tanpa urutan escape: - -```yuescript -some_string = "Here is a string - that has a line break in it." - --- Anda dapat mencampur ekspresi ke dalam literal string dengan sintaks #{}. --- Interpolasi string hanya tersedia pada string dengan tanda kutip ganda. -print "I am #{math.random! * 100}% sure." -``` - -## Literal Angka - -Anda bisa menggunakan garis bawah pada literal angka untuk meningkatkan keterbacaan. - -```yuescript -integer = 1_000_000 -hex = 0xEF_BB_BF -binary = 0B10011 -``` - -## String Multibaris YAML - -Prefiks `|` memperkenalkan literal string multibaris bergaya YAML: - -```yuescript -str = | - key: value - list: - - item1 - - #{expr} -``` - -Ini memungkinkan penulisan teks multibaris terstruktur dengan mudah. Semua pemisah baris dan indentasi dipertahankan relatif terhadap baris non-kosong pertama, dan ekspresi di dalam `#{...}` diinterpolasi otomatis sebagai `tostring(expr)`. - -String Multibaris YAML secara otomatis mendeteksi prefiks spasi awal yang sama (indentasi minimum di seluruh baris non-kosong) dan menghapusnya dari semua baris. Ini memudahkan untuk mengindentasi kode secara visual tanpa memengaruhi isi string yang dihasilkan. - -```yuescript -fn = -> - str = | - foo: - bar: baz - return str -``` - -Indentasi internal dipertahankan relatif terhadap prefiks umum yang dihapus, sehingga struktur bertingkat tetap rapi. - -Semua karakter khusus seperti tanda kutip (`"`) dan backslash (`\`) di dalam blok YAMLMultiline di-escape secara otomatis agar string Lua yang dihasilkan valid secara sintaks dan berperilaku sebagaimana mestinya. - -```yuescript -str = | - path: "C:\Program Files\App" - note: 'He said: "#{Hello}!"' -``` - -# Modul - -## Import - -Pernyataan `import` adalah sintaks sugar untuk me-require modul atau membantu mengekstrak item dari modul yang diimpor. Item yang diimpor bersifat `const` secara default. - -```yuescript --- digunakan sebagai destrukturisasi tabel -do - import insert, concat from table - -- akan error saat meng-assign ke insert, concat - import C, Ct, Cmt from require "lpeg" - -- shortcut untuk require implisit - import x, y, z from 'mymodule' - -- import gaya Python - from 'module' import a, b, c - --- shortcut untuk require modul -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- require modul dengan aliasing atau destrukturisasi tabel -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - -## Import Global - -Anda dapat mengimpor global tertentu ke variabel local dengan `import`. Saat mengimpor rangkaian akses variabel global, field terakhir akan di-assign ke variabel local. - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - -### Import Variabel Global Otomatis - -Anda dapat menempatkan `import global` di awal blok untuk mengimpor secara otomatis semua nama yang belum dideklarasikan atau di-assign secara eksplisit di scope saat ini sebagai global. Import implisit ini diperlakukan sebagai local const yang mereferensikan global terkait pada posisi pernyataan tersebut. - -Nama yang secara eksplisit dideklarasikan sebagai global di scope yang sama tidak akan diimpor, sehingga Anda masih bisa meng-assign ke mereka. - -```yuescript -do - import global - print "hello" - math.random 3 - -- print = nil -- error: imported globals are const - -do - -- variabel global eksplisit tidak akan diimpor - import global - global FLAG - print FLAG - FLAG = 123 -``` - -## Export - -Pernyataan `export` menawarkan cara ringkas untuk mendefinisikan modul. - -### Export Bernama - -Export bernama akan mendefinisikan variabel local sekaligus menambahkan field di tabel export. - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - -Melakukan export bernama dengan destrukturisasi. - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = 'default'}} = tb -``` - -Export item bernama dari modul tanpa membuat variabel local. - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - -### Export Tanpa Nama - -Export tanpa nama akan menambahkan item target ke bagian array dari tabel export. - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - -### Export Default - -Gunakan kata kunci **default** dalam pernyataan export untuk mengganti tabel export dengan apa pun. - -```yuescript -export default -> - print "hello" - 123 -``` - -# Lisensi: MIT - -Copyright (c) 2017-2026 Li Jin - -Izin dengan ini diberikan, tanpa biaya, kepada siapa pun yang memperoleh salinan -perangkat lunak ini beserta file dokumentasi terkait ("Perangkat Lunak"), untuk -berurusan dengan Perangkat Lunak tanpa pembatasan, termasuk tanpa batasan hak -untuk menggunakan, menyalin, memodifikasi, menggabungkan, menerbitkan, -mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, -dan untuk mengizinkan orang yang menerima Perangkat Lunak untuk melakukannya, -dengan syarat-syarat berikut: - -Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam -semua salinan atau bagian substansial dari Perangkat Lunak. - -PERANGKAT LUNAK DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, BAIK TERSURAT -MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN -DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK MELANGGAR HAK. -DALAM KEADAAN APA PUN, PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB -ATAS KLAIM, KERUSAKAN, ATAU KEWAJIBAN LAINNYA, BAIK DALAM TINDAKAN KONTRAK, -PERBUATAN MELAWAN HUKUM, ATAU LAINNYA, YANG TIMBUL DARI, DI LUAR, ATAU TERKAIT -DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU URUSAN LAIN DALAM PERANGKAT LUNAK. - -# Pustaka YueScript - -Akses dengan `local yue = require("yue")` di Lua. - -## yue - -**Deskripsi:** - -Pustaka bahasa YueScript. - -### version - -**Tipe:** Field. - -**Deskripsi:** - -Versi YueScript. - -**Signature:** - -```lua -version: string -``` - -### dirsep - -**Tipe:** Field. - -**Deskripsi:** - -Pemisah file untuk platform saat ini. - -**Signature:** - -```lua -dirsep: string -``` - -### yue_compiled - -**Tipe:** Field. - -**Deskripsi:** - -Cache kode modul yang telah dikompilasi. - -**Signature:** - -```lua -yue_compiled: {string: string} -``` - -### to_lua - -**Tipe:** Function. - -**Deskripsi:** - -Fungsi kompilasi YueScript. Mengompilasi kode YueScript menjadi kode Lua. - -**Signature:** - -```lua -to_lua: function(code: string, config?: Config): - --[[codes]] string | nil, - --[[error]] string | nil, - --[[globals]] {{string, integer, integer}} | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| code | string | Kode YueScript. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -| string \| nil | Kode Lua hasil kompilasi, atau nil jika kompilasi gagal. | -| string \| nil | Pesan error, atau nil jika kompilasi berhasil. | -| {{string, integer, integer}} \| nil | Variabel global yang muncul dalam kode (dengan nama, baris, dan kolom), atau nil jika opsi kompiler `lint_global` bernilai false. | - -### file_exist - -**Tipe:** Function. - -**Deskripsi:** - -Fungsi untuk memeriksa keberadaan file sumber. Dapat ditimpa untuk menyesuaikan perilaku. - -**Signature:** - -```lua -file_exist: function(filename: string): boolean -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ---------- | -| filename | string | Nama file. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ---------------- | -| boolean | Apakah file ada. | - -### read_file - -**Tipe:** Function. - -**Deskripsi:** - -Fungsi untuk membaca file sumber. Dapat ditimpa untuk menyesuaikan perilaku. - -**Signature:** - -```lua -read_file: function(filename: string): string -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ---------- | -| filename | string | Nama file. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | --------- | -| string | Isi file. | - -### insert_loader - -**Tipe:** Function. - -**Deskripsi:** - -Menyisipkan loader YueScript ke package loaders (searchers). - -**Signature:** - -```lua -insert_loader: function(pos?: integer): boolean -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------- | ------------------------------------------------------------- | -| pos | integer | [Opsional] Posisi untuk menyisipkan loader. Default adalah 3. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | --------------------------------------------------------------------------- | -| boolean | Apakah loader berhasil disisipkan. Akan gagal jika loader sudah disisipkan. | - -### remove_loader - -**Tipe:** Function. - -**Deskripsi:** - -Menghapus loader YueScript dari package loaders (searchers). - -**Signature:** - -```lua -remove_loader: function(): boolean -``` - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------------------------------------------------------------------ | -| boolean | Apakah loader berhasil dihapus. Akan gagal jika loader belum disisipkan. | - -### loadstring - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari string menjadi fungsi. - -**Signature:** - -```lua -loadstring: function(input: string, chunkname: string, env: table, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| input | string | Kode YueScript. | -| chunkname | string | Nama chunk kode. | -| env | table | Tabel environment. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| --------------- | ------------------------------------------------- | -| function \| nil | Fungsi yang dimuat, atau nil jika pemuatan gagal. | -| string \| nil | Pesan error, atau nil jika pemuatan berhasil. | - -### loadstring - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari string menjadi fungsi. - -**Signature:** - -```lua -loadstring: function(input: string, chunkname: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| input | string | Kode YueScript. | -| chunkname | string | Nama chunk kode. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| --------------- | ------------------------------------------------- | -| function \| nil | Fungsi yang dimuat, atau nil jika pemuatan gagal. | -| string \| nil | Pesan error, atau nil jika pemuatan berhasil. | - -### loadstring - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari string menjadi fungsi. - -**Signature:** - -```lua -loadstring: function(input: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| input | string | Kode YueScript. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| --------------- | ------------------------------------------------- | -| function \| nil | Fungsi yang dimuat, atau nil jika pemuatan gagal. | -| string \| nil | Pesan error, atau nil jika pemuatan berhasil. | - -### loadfile - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari file menjadi fungsi. - -**Signature:** - -```lua -loadfile: function(filename: string, env: table, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| filename | string | Nama file. | -| env | table | Tabel environment. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| --------------- | ------------------------------------------------- | -| function \| nil | Fungsi yang dimuat, atau nil jika pemuatan gagal. | -| string \| nil | Pesan error, atau nil jika pemuatan berhasil. | - -### loadfile - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari file menjadi fungsi. - -**Signature:** - -```lua -loadfile: function(filename: string, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| filename | string | Nama file. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| --------------- | ------------------------------------------------- | -| function \| nil | Fungsi yang dimuat, atau nil jika pemuatan gagal. | -| string \| nil | Pesan error, atau nil jika pemuatan berhasil. | - -### dofile - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari file menjadi fungsi dan mengeksekusinya. - -**Signature:** - -```lua -dofile: function(filename: string, env: table, config?: Config): any... -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| filename | string | Nama file. | -| env | table | Tabel environment. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------------------------------- | -| any... | Nilai return dari fungsi yang dimuat. | - -### dofile - -**Tipe:** Function. - -**Deskripsi:** - -Memuat kode YueScript dari file menjadi fungsi dan mengeksekusinya. - -**Signature:** - -```lua -dofile: function(filename: string, config?: Config): any... -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ------------------------- | -| filename | string | Nama file. | -| config | Config | [Opsional] Opsi kompiler. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------------------------------- | -| any... | Nilai return dari fungsi yang dimuat. | - -### find_modulepath - -**Tipe:** Function. - -**Deskripsi:** - -Menguraikan nama modul YueScript menjadi path file. - -**Signature:** - -```lua -find_modulepath: function(name: string): string -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ----------- | -| name | string | Nama modul. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ---------- | -| string | Path file. | - -### pcall - -**Tipe:** Function. - -**Deskripsi:** - -Memanggil fungsi dalam mode terlindungi. -Menangkap error apa pun dan mengembalikan kode status beserta hasil atau objek error. -Menulis ulang nomor baris error ke nomor baris asli di kode YueScript saat error terjadi. - -**Signature:** - -```lua -pcall: function(f: function, ...: any): boolean, any... -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | -------- | ---------------------------------- | -| f | function | Fungsi yang akan dipanggil. | -| ... | any | Argumen yang diteruskan ke fungsi. | - -**Return:** - -| Tipe Return | Deskripsi | -| ------------ | ---------------------------------------------- | -| boolean, ... | Kode status dan hasil fungsi atau objek error. | - -### require - -**Tipe:** Function. - -**Deskripsi:** - -Memuat modul tertentu. Bisa berupa modul Lua atau modul YueScript. -Menulis ulang nomor baris error ke nomor baris asli di kode YueScript jika modul adalah modul YueScript dan pemuatan gagal. - -**Signature:** - -```lua -require: function(name: string): any... -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ---------------------------- | -| modname | string | Nama modul yang akan dimuat. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| any | Nilai yang disimpan di package.loaded[modname] jika modul sudah dimuat. Jika belum, mencoba mencari loader dan mengembalikan nilai akhir package.loaded[modname] serta data loader sebagai hasil kedua. | - -### p - -**Tipe:** Function. - -**Deskripsi:** - -Memeriksa struktur nilai yang diteruskan dan mencetak representasi string. - -**Signature:** - -```lua -p: function(...: any) -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ---- | -------------------------- | -| ... | any | Nilai yang akan diperiksa. | - -### options - -**Tipe:** Field. - -**Deskripsi:** - -Opsi kompiler saat ini. - -**Signature:** - -```lua -options: Config.Options -``` - -### traceback - -**Tipe:** Function. - -**Deskripsi:** - -Fungsi traceback yang menulis ulang nomor baris stack trace ke nomor baris asli di kode YueScript. - -**Signature:** - -```lua -traceback: function(message: string): string -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ---------------- | -| message | string | Pesan traceback. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ----------------------------------------- | -| string | Pesan traceback yang telah ditulis ulang. | - -### is_ast - -**Tipe:** Function. - -**Deskripsi:** - -Memeriksa apakah kode cocok dengan AST yang ditentukan. - -**Signature:** - -```lua -is_ast: function(astName: string, code: string): boolean -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | --------- | -| astName | string | Nama AST. | -| code | string | Kode. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ----------------------------- | -| boolean | Apakah kode cocok dengan AST. | - -### AST - -**Tipe:** Field. - -**Deskripsi:** - -Definisi tipe AST dengan nama, baris, kolom, dan sub-node. - -**Signature:** - -```lua -type AST = {string, integer, integer, any} -``` - -### to_ast - -**Tipe:** Function. - -**Deskripsi:** - -Mengonversi kode menjadi AST. - -**Signature:** - -```lua -to_ast: function(code: string, flattenLevel?: number, astName?: string, reserveComment?: boolean): - --[[AST]] AST | nil, - --[[error]] nil | string -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| -------------- | ------- | ---------------------------------------------------------------------------------------- | -| code | string | Kode. | -| flattenLevel | integer | [Opsional] Tingkat perataan. Semakin tinggi berarti semakin rata. Default 0. Maksimum 2. | -| astName | string | [Opsional] Nama AST. Default "File". | -| reserveComment | boolean | [Opsional] Apakah akan mempertahankan komentar asli. Default false. | - -**Return:** - -| Tipe Return | Deskripsi | -| ------------- | --------------------------------------------- | -| AST \| nil | AST, atau nil jika konversi gagal. | -| string \| nil | Pesan error, atau nil jika konversi berhasil. | - -### format - -**Tipe:** Function. - -**Deskripsi:** - -Memformat kode YueScript. - -**Signature:** - -```lua -format: function(code: string, tabSize?: number, reserveComment?: boolean): string -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| -------------- | ------- | ------------------------------------------------------------- | -| code | string | Kode. | -| tabSize | integer | [Opsional] Ukuran tab. Default 4. | -| reserveComment | boolean | [Opsional] Apakah mempertahankan komentar asli. Default true. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------------------- | -| string | Kode yang telah diformat. | - -### \_\_call - -**Tipe:** Metamethod. - -**Deskripsi:** - -Me-require modul YueScript. -Menulis ulang nomor baris error ke nomor baris asli di kode YueScript saat pemuatan gagal. - -**Signature:** - -```lua -metamethod __call: function(self: yue, module: string): any... -``` - -**Parameter:** - -| Parameter | Tipe | Deskripsi | -| --------- | ------ | ----------- | -| module | string | Nama modul. | - -**Return:** - -| Tipe Return | Deskripsi | -| ----------- | ------------ | -| any | Nilai modul. | - -## Config - -**Deskripsi:** - -Opsi kompilasi kompiler. - -### lint_global - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus mengumpulkan variabel global yang muncul dalam kode. - -**Signature:** - -```lua -lint_global: boolean -``` - -### implicit_return_root - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus melakukan return implisit untuk blok kode root. - -**Signature:** - -```lua -implicit_return_root: boolean -``` - -### reserve_line_number - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus mempertahankan nomor baris asli di kode hasil kompilasi. - -**Signature:** - -```lua -reserve_line_number: boolean -``` - -### reserve_comment - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus mempertahankan komentar asli di kode hasil kompilasi. - -**Signature:** - -```lua -reserve_comment: boolean -``` - -### space_over_tab - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus menggunakan karakter spasi alih-alih tab di kode hasil kompilasi. - -**Signature:** - -```lua -space_over_tab: boolean -``` - -### same_module - -**Tipe:** Field. - -**Deskripsi:** - -Apakah kompiler harus memperlakukan kode yang akan dikompilasi sebagai modul yang sama dengan modul yang sedang dikompilasi. Untuk penggunaan internal saja. - -**Signature:** - -```lua -same_module: boolean -``` - -### line_offset - -**Tipe:** Field. - -**Deskripsi:** - -Apakah pesan error kompiler harus menyertakan offset nomor baris. Untuk penggunaan internal saja. - -**Signature:** - -```lua -line_offset: integer -``` - -### yue.Config.LuaTarget - -**Tipe:** Enumeration. - -**Deskripsi:** - -Enumerasi versi Lua target. - -**Signature:** - -```lua -enum LuaTarget - "5.1" - "5.2" - "5.3" - "5.4" - "5.5" -end -``` - -### options - -**Tipe:** Field. - -**Deskripsi:** - -Opsi tambahan untuk diteruskan ke fungsi kompilasi. - -**Signature:** - -```lua -options: Options -``` - -## Options - -**Deskripsi:** - -Definisi opsi kompiler tambahan. - -### target - -**Tipe:** Field. - -**Deskripsi:** - -Versi Lua target untuk kompilasi. - -**Signature:** - -```lua -target: LuaTarget -``` - -### path - -**Tipe:** Field. - -**Deskripsi:** - -Path pencarian modul tambahan. - -**Signature:** - -```lua -path: string -``` - -### dump_locals - -**Tipe:** Field. - -**Deskripsi:** - -Apakah akan menampilkan variabel local dalam pesan error traceback. Default false. - -**Signature:** - -```lua -dump_locals: boolean -``` - -### simplified - -**Tipe:** Field. - -**Deskripsi:** - -Apakah akan menyederhanakan pesan error. Default true. - -**Signature:** - -```lua -simplified: boolean -``` diff --git a/doc/yue-pt-br.md b/doc/yue-pt-br.md deleted file mode 100644 index 4e3ca759..00000000 --- a/doc/yue-pt-br.md +++ /dev/null @@ -1,3580 +0,0 @@ -# Documentação do YueScript - -Bem-vindo à documentação oficial do YueScript!
-Aqui você encontra recursos da linguagem, uso, exemplos de referência e materiais úteis.
-Selecione um capítulo na barra lateral para começar a aprender YueScript. - -# Do - -Quando usado como instrução, do funciona exatamente como no Lua. - -```yuescript -do - var = "hello" - print var -print var -- nil aqui -``` - -O **do** do YueScript também pode ser usado como expressão. Permitindo combinar múltiplas linhas em uma. O resultado da expressão do é a última instrução em seu corpo. - -```yuescript -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```yuescript -tbl = { - key: do - print "assigning key!" - 1234 -} -``` - -Expressões `do` suportam usar `break` para interromper o fluxo de execução e retornar múltiplos valores antecipadamente. - -```yuescript -status, value = do - n = 12 - if n > 10 - break "large", n - break "small", n -``` - -# Decoradores de linha - -Por conveniência, o loop for e a instrução if podem ser aplicados a instruções únicas no final da linha: - -```yuescript -print "hello world" if name == "Rob" -``` - -E com loops básicos: - -```yuescript -print "item: ", item for item in *items -``` - -E com loops while: - -```yuescript -game\update! while game\isRunning! - -reader\parse_line! until reader\eof! -``` - -# Macro - -## Uso comum - -A função macro é usada para avaliar uma string em tempo de compilação e inserir os códigos gerados na compilação final. - -```yuescript -macro PI2 = -> math.pi * 2 -area = $PI2 * 5 - -macro HELLO = -> "'hello world'" -print $HELLO - -macro config = (debugging) -> - global debugMode = debugging == "true" - "" - -macro asserts = (cond) -> - debugMode and "assert #{cond}" or "" - -macro assert = (cond) -> - debugMode and "assert #{cond}" or "#{cond}" - -$config true -$asserts item ~= nil - -$config false -value = $assert item - --- as expressões passadas são tratadas como strings -macro and = (...) -> "#{ table.concat {...}, ' and ' }" -if $and f1!, f2!, f3! - print "OK" -``` - -## Inserir códigos brutos - -Uma função macro pode retornar uma string YueScript ou uma tabela de configuração contendo códigos Lua. - -```yuescript -macro yueFunc = (var) -> "local #{var} = ->" -$yueFunc funcA -funcA = -> "fail to assign to the Yue macro defined variable" - -macro luaFunc = (var) -> { - code: "local function #{var}() end" - type: "lua" -} -$luaFunc funcB -funcB = -> "fail to assign to the Lua macro defined variable" - -macro lua = (code) -> { - :code - type: "lua" -} - --- os símbolos inicial e final da string bruta são aparados automaticamente -$lua[==[ --- inserção de códigos Lua brutos -if cond then - print("output") -end -]==] -``` - -## Exportar macro - -Funções macro podem ser exportadas de um módulo e importadas em outro módulo. Você deve colocar funções export macro em um único arquivo para uso, e apenas definição de macro, importação de macro e expansão de macro inline podem ser colocadas no módulo exportador de macro. - -```yuescript --- arquivo: utils.yue -export macro map = (items, action) -> "[#{action} for _ in *#{items}]" -export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" -export macro foreach = (items, action) -> "for _ in *#{items} - #{action}" - --- arquivo main.yue -import "utils" as { - $, -- símbolo para importar todas as macros - $foreach: $each -- renomear macro $foreach para $each -} -[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ -``` - -## Macro embutida - -Existem algumas macros embutidas, mas você pode sobrescrevê-las declarando macros com os mesmos nomes. - -```yuescript -print $FILE -- obtém string do nome do módulo atual -print $LINE -- obtém número 2 -``` - -## Gerando macros com macros - -No YueScript, as funções macro permitem que você gere código em tempo de compilação. Aninhando funções macro, você pode criar padrões de geração mais complexos. Este recurso permite que você defina uma função macro que gera outra função macro, permitindo geração de código mais dinâmica. - -```yuescript -macro Enum = (...) -> - items = {...} - itemSet = {item, true for item in *items} - (item) -> - error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item] - "\"#{item}\"" - -macro BodyType = $Enum( - Static - Dynamic - Kinematic -) - -print "Valid enum type:", $BodyType Static --- print "Compilation error with enum type:", $BodyType Unknown -``` - -## Gerando código em múltiplas linhas - -Quando uma macro retorna código Yue em múltiplas linhas, não é recomendado usar uma string multilinha entre aspas. Prefira `-> |`. - -Uma string entre aspas preserva o texto literal, enquanto uma string multilinha estilo YAML remove a indentação inicial comum. Isso normalmente deixa os blocos Yue gerados mais estáveis, especialmente quando o código gerado contém comentários ou blocos aninhados. - -```yuescript -macro default_conf = (conf) -> " - -- useful; only set once -#{conf}.identity = 'LOVE' -#{conf}.version = \"11.5\" - " - -love.conf = (t) -> - $default_conf t -``` - -```yuescript -macro default_conf = (conf) -> | - -- useful; only set once - #{conf}.identity = 'LOVE' - #{conf}.version = "11.5" - -love.conf = (t) -> - $default_conf t -``` - -## Validação de argumentos - -Você pode declarar os tipos de nós AST esperados na lista de argumentos e verificar se os argumentos da macro recebidos atendem às expectativas em tempo de compilação. - -```yuescript -macro printNumAndStr = (num `Num, str `String) -> | - print( - #{num} - #{str} - ) - -$printNumAndStr 123, "hello" -``` - -Se você precisar de verificação de argumentos mais flexível, pode usar a função macro embutida `$is_ast` para verificar manualmente no lugar apropriado. - -```yuescript -macro printNumAndStr = (num, str) -> - error "expected Num as first argument" unless $is_ast Num, num - error "expected String as second argument" unless $is_ast String, str - "print(#{num}, #{str})" - -$printNumAndStr 123, "hello" -``` - -Para mais detalhes sobre os nós AST disponíveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). - -## Instruções de anotação - -As instruções de anotação aplicam uma macro à instrução logo em seguida. - -Isso equivale a chamar a macro com o código-fonte da instrução seguinte anexado como último argumento. - -```yuescript -macro ShowName = (code) -> | - print "#{code\match '^[%w_]*'}" - -$[ShowName] -myFunc = -> - -return -``` - -Quando a macro de anotação retorna uma tabela de configuração, o campo opcional `before` controla se o resultado gerado será emitido antes ou depois da instrução anotada. - -```yuescript -macro Tag = (tag, code) -> - tableName = code\match "^[%w_]+" - return - type: "text" - before: tag == "before" - code: "-- #{tag}:#{tableName}" - -$[Tag before] -tableA = {} - -$[Tag after] -tableB = {} - -return -``` - -Como a instrução seguinte é passada como um argumento extra para a macro, anotações também podem ser usadas para gerar código de registro a partir de declarações de classe. Você também pode usar as mesmas checagens de AST nos argumentos que macros normais oferecem. - -```yuescript -macro Register = (registry, code`ClassDecl) -> - className = code\match "^class%s+(%w+)" - return | - #{registry}["#{className}"] = #{className} - -registry = {} - -$[Register(registry)] -class Worker - run: => "ok" - -return -``` - -Anotações também podem injetar código de empacotamento em volta de funções: - -```yuescript -macro ValidateNumberArgs = (code) -> - funcName = code\match "^(%w+)%s*=" - return | - local __orig_#{funcName} = #{funcName} - #{funcName} = (...) -> - for i = 1, select "#", ... - assert type(select i, ...) == "number", "expected number for arg \#{i}" - __orig_#{funcName} ... - -$[ValidateNumberArgs] -add = (a, b) -> a + b -``` - -Uma anotação sempre precisa ser seguida por uma instrução, e ela não pode ser aplicada a uma instrução `return`. Se a instrução anotada aparecer no fim de um bloco e você precisar da forma AST bruta dessa instrução, adicione um `return` explícito em seguida para evitar que ela seja envolvida por uma expressão com retorno implícito. - -# Try - -A sintaxe para tratamento de erros do Lua em uma forma comum. - -```yuescript -try - func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try - func 1, 2, 3 -catch err - yue.traceback err - -try func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try func 1, 2, 3 - -try - print "trying" - func 1, 2, 3 - --- funcionando com padrão de atribuição em if -if success, result := try func 1, 2, 3 -catch err - print yue.traceback err - print result -``` - -## Try? - -`try?` é um uso simplificado para sintaxe de tratamento de erros que omite o status booleano da instrução `try`, e retornará o resultado do bloco try quando tiver sucesso, retornando nil em vez do objeto de erro caso contrário. - -```yuescript -a, b, c = try? func! - --- com operador de coalescência de nil -a = (try? func!) ?? "default" - --- como argumento de função -f try? func! - --- com bloco catch -f try? - print 123 - func! -catch e - print e - e -``` - -# Literais de tabela - -Como no Lua, as tabelas são delimitadas por chaves. - -```yuescript -some_values = {1, 2, 3, 4} -``` - -Diferente do Lua, atribuir um valor a uma chave em uma tabela é feito com **:** (em vez de **=**). - -```yuescript -some_values = { - name: "Bill", - age: 200, - ["favorite food"]: "rice" -} -``` - -As chaves podem ser omitidas se uma única tabela de pares chave-valor está sendo atribuída. - -```yuescript -profile = - height: "4 feet", - shoe_size: 13, - favorite_foods: ["ice cream", "donuts"] -``` - -Quebras de linha podem ser usadas para delimitar valores em vez de vírgula (ou ambos): - -```yuescript -values = { - 1, 2, 3, 4 - 5, 6, 7, 8 - name: "superman" - occupation: "crime fighting" -} -``` - -Ao criar um literal de tabela em uma única linha, as chaves também podem ser omitidas: - -```yuescript -my_function dance: "Tango", partner: "none" - -y = type: "dog", legs: 4, tails: 1 -``` - -As chaves de um literal de tabela podem ser palavras-chave da linguagem sem precisar escapar: - -```yuescript -tbl = { - do: "something" - end: "hunger" -} -``` - -Se você está construindo uma tabela a partir de variáveis e deseja que as chaves sejam iguais aos nomes das variáveis, então o operador de prefixo **:** pode ser usado: - -```yuescript -hair = "golden" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -Se você quiser que a chave de um campo na tabela seja o resultado de uma expressão, então pode envolvê-la em **[ ]**, assim como no Lua. Você também pode usar um literal de string diretamente como chave, omitindo os colchetes. Isso é útil se sua chave tiver caracteres especiais. - -```yuescript -t = { - [1 + 2]: "hello" - "hello world": true -} -``` - -As tabelas Lua têm tanto uma parte array quanto uma parte hash, mas às vezes é útil fazer uma distinção semântica entre as duas. Você pode usar **[ ]** em vez de **{ }** para declarar explicitamente uma tabela como um array, fazer isso impedirá que quaisquer pares chave-valor sejam escritos dentro dela. - -```yuescript -some_values = [1, 2, 3, 4] -list_with_one_element = [1, ] -``` - -# Compreensões - -As compreensões fornecem uma sintaxe conveniente para construir uma nova tabela iterando sobre algum objeto existente e aplicando uma expressão a seus valores. Existem dois tipos de compreensões: compreensões de lista e compreensões de tabela. Ambas produzem tabelas Lua; as compreensões de lista acumulam valores em uma tabela semelhante a array, e as compreensões de tabela permitem definir tanto a chave quanto o valor em cada iteração. - -## Compreensões de lista - -O seguinte cria uma cópia da tabela items mas com todos os valores dobrados. - -```yuescript -items = [ 1, 2, 3, 4 ] -doubled = [item * 2 for i, item in ipairs items] -``` - -Os itens incluídos na nova tabela podem ser restringidos com uma cláusula when: - -```yuescript -slice = [item for i, item in ipairs items when i > 1 and i < 3] -``` - -Como é comum iterar sobre os valores de uma tabela indexada numericamente, um operador **\*** é introduzido. O exemplo doubled pode ser reescrito como: - -```yuescript -doubled = [item * 2 for item in *items] -``` - -Nas compreensões de lista, você também pode usar o operador spread `...` para achatar listas aninhadas, alcançando um efeito de flat map: - -```yuescript -data = - a: [1, 2, 3] - b: [4, 5, 6] - -flat = [...v for k,v in pairs data] --- flat agora é [1, 2, 3, 4, 5, 6] -``` - -As cláusulas for e when podem ser encadeadas tanto quanto desejado. O único requisito é que uma compreensão tenha pelo menos uma cláusula for. - -Usar múltiplas cláusulas for é o mesmo que usar loops aninhados: - -```yuescript -x_coords = [4, 5, 6, 7] -y_coords = [9, 2, 3] - -points = [ [x, y] for x in *x_coords \ -for y in *y_coords] -``` - -Loops for numéricos também podem ser usados em compreensões: - -```yuescript -evens = [i for i = 1, 100 when i % 2 == 0] -``` - -## Compreensões de tabela - -A sintaxe para compreensões de tabela é muito semelhante, diferindo apenas por usar **{** e **}** e receber dois valores de cada iteração. - -Este exemplo faz uma cópia da tabela thing: - -```yuescript -thing = { - color: "red" - name: "fast" - width: 123 -} - -thing_copy = {k, v for k, v in pairs thing} -``` - -```yuescript -no_color = {k, v for k, v in pairs thing when k != "color"} -``` - -O operador **\*** também é suportado. Aqui criamos uma tabela de consulta de raiz quadrada para alguns números. - -```yuescript -numbers = [1, 2, 3, 4] -sqrts = {i, math.sqrt i for i in *numbers} -``` - -A tupla chave-valor em uma compreensão de tabela também pode vir de uma única expressão, caso em que a expressão deve retornar dois valores. O primeiro é usado como chave e o segundo é usado como valor: - -Neste exemplo convertemos um array de pares em uma tabela onde o primeiro item do par é a chave e o segundo é o valor. - -```yuescript -tuples = [ ["hello", "world"], ["foo", "bar"]] -tbl = {unpack tuple for tuple in *tuples} -``` - -## Slicing - -Uma sintaxe especial é fornecida para restringir os itens sobre os quais se itera ao usar o operador **\***. Isso é equivalente a definir os limites de iteração e um tamanho de passo em um loop for. - -Aqui podemos definir os limites mínimo e máximo, pegando todos os itens com índices entre 1 e 5 inclusive: - -```yuescript -slice = [item for item in *items[1, 5]] -``` - -Qualquer um dos argumentos do slice pode ser omitido para usar um padrão sensato. Neste exemplo, se o índice máximo for omitido, ele usa como padrão o comprimento da tabela. Isso pegará tudo exceto o primeiro elemento: - -```yuescript -slice = [item for item in *items[2,]] -``` - -Se o limite mínimo for omitido, ele usa como padrão 1. Aqui fornecemos apenas um tamanho de passo e deixamos os outros limites em branco. Isso pega todos os itens com índice ímpar: (1, 3, 5, …) - -```yuescript -slice = [item for item in *items[,,2]] -``` - -Tanto o limite mínimo quanto o máximo podem ser negativos, o que significa que os limites são contados a partir do fim da tabela. - -```yuescript --- pegar os últimos 4 itens -slice = [item for item in *items[-4,-1]] -``` - -O tamanho do passo também pode ser negativo, o que significa que os itens são tomados em ordem reversa. - -```yuescript -reverse_slice = [item for item in *items[-1,1,-1]] -``` - -### Expressão de slicing - -O slicing também pode ser usado como expressão. Isso é útil para obter uma sublista de uma tabela. - -```yuescript --- pegar o 2º e 4º itens como nova lista -sub_list = items[2, 4] - --- pegar os últimos 4 itens -last_four_items = items[-4, -1] -``` - -# Programação orientada a objetos - -Nestes exemplos, o código Lua gerado pode parecer avassalador. É melhor focar primeiro no significado do código YueScript e depois olhar o código Lua se desejar conhecer os detalhes da implementação. - -Uma classe simples: - -```yuescript -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -Uma classe é declarada com uma instrução class seguida de uma declaração semelhante a tabela onde todos os métodos e propriedades são listados. - -A propriedade new é especial pois se tornará o construtor. - -Observe como todos os métodos da classe usam a sintaxe de função seta fat. Ao chamar métodos em uma instância, a própria instância é enviada como primeiro argumento. A seta fat cuida da criação do argumento self. - -O prefixo @ em um nome de variável é abreviação para self.. @items torna-se self.items. - -O bloco da classe também suporta campos de metatable escrevendo chaves de metamétodo entre `<>`, como ``. - -```yuescript -class User - new: (@name) => - : => "User(#{@name})" - -print tostring User "Yue" -``` - -Criar uma instância da classe é feito chamando o nome da classe como uma função. - -```yuescript -inv = Inventory! -inv\add_item "t-shirt" -inv\add_item "pants" -``` - -Como a instância da classe precisa ser enviada aos métodos quando são chamados, o operador \ é usado. - -Todas as propriedades de uma classe são compartilhadas entre as instâncias. Isso é bom para funções, mas para outros tipos de objetos, resultados indesejados podem ocorrer. - -Considere o exemplo abaixo, a propriedade clothes é compartilhada entre todas as instâncias, então modificações nela em uma instância aparecerão em outra: - -```yuescript -class Person - clothes: [] - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "pants" -b\give_item "shirt" - --- vai imprimir tanto pants quanto shirt -print item for item in *a.clothes -``` - -A forma correta de evitar esse problema é criar o estado mutável do objeto no construtor: - -```yuescript -class Person - new: => - @clothes = [] -``` - -## Herança - -A palavra-chave extends pode ser usada em uma declaração de classe para herdar as propriedades e métodos de outra classe. - -```yuescript -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "backpack is full" - super name -``` - -Aqui estendemos nossa classe Inventory e limitamos a quantidade de itens que ela pode carregar. - -Neste exemplo, não definimos um construtor na subclasse, então o construtor da classe pai é chamado quando criamos uma nova instância. Se definirmos um construtor, podemos usar o método super para chamar o construtor pai. - -Sempre que uma classe herda de outra, ela envia uma mensagem à classe pai chamando o método \_\_inherited na classe pai se ele existir. A função recebe dois argumentos: a classe que está sendo herdada e a classe filha. - -```yuescript -class Shelf - @__inherited: (child) => - print @__name, "was inherited by", child.__name - --- vai imprimir: Shelf was inherited by Cupboard -class Cupboard extends Shelf -``` - -## Super - -**super** é uma palavra-chave especial que pode ser usada de duas formas diferentes: pode ser tratado como um objeto, ou pode ser chamado como uma função. Só tem funcionalidade especial quando está dentro de uma classe. - -Quando chamado como função, chamará a função de mesmo nome na classe pai. O self atual será automaticamente passado como primeiro argumento. (Como visto no exemplo de herança acima) - -Quando super é usado como valor normal, é uma referência ao objeto da classe pai. - -Pode ser acessado como qualquer objeto para recuperar valores na classe pai que possam ter sido sombreados pela classe filha. - -Quando o operador de chamada \ é usado com super, self é inserido como primeiro argumento em vez do valor do próprio super. Ao usar . para recuperar uma função, a função bruta é retornada. - -Alguns exemplos de uso de super de diferentes formas: - -```yuescript -class MyClass extends ParentClass - a_method: => - -- os seguintes têm o mesmo efeito: - super "hello", "world" - super\a_method "hello", "world" - super.a_method self, "hello", "world" - - -- super como valor é igual à classe pai: - assert super == ParentClass -``` - -**super** também pode ser usado no lado esquerdo de um Function Stub. A única diferença principal é que, em vez da função resultante estar vinculada ao valor de super, ela está vinculada a self. - -## Tipos - -Cada instância de uma classe carrega seu tipo consigo. Isso é armazenado na propriedade especial \_\_class. Esta propriedade contém o objeto da classe. O objeto da classe é o que chamamos para construir uma nova instância. Também podemos indexar o objeto da classe para recuperar métodos e propriedades da classe. - -```yuescript -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- imprime 10 -``` - -## Objetos de classe - -O objeto da classe é o que criamos quando usamos uma instrução class. O objeto da classe é armazenado em uma variável com o mesmo nome da classe. - -O objeto da classe pode ser chamado como uma função para criar novas instâncias. É assim que criamos instâncias de classes nos exemplos acima. - -Uma classe é composta por duas tabelas. A própria tabela da classe e a tabela base. A base é usada como metatable para todas as instâncias. Todas as propriedades listadas na declaração da classe são colocadas na base. - -A metatable do objeto da classe lê propriedades da base se não existirem no objeto da classe. Isso significa que podemos acessar funções e propriedades diretamente da classe. - -É importante notar que atribuir ao objeto da classe não atribui à base, então não é uma forma válida de adicionar novos métodos às instâncias. Em vez disso, a base deve ser alterada explicitamente. Veja o campo \_\_base abaixo. - -O objeto da classe tem algumas propriedades especiais: - -O nome da classe quando foi declarada é armazenado como string no campo \_\_name do objeto da classe. - -```yuescript -print BackPack.__name -- imprime Backpack -``` - -O objeto base é armazenado em \_\_base. Podemos modificar esta tabela para adicionar funcionalidade a instâncias que já foram criadas e às que ainda serão criadas. - -Se a classe estende de algo, o objeto da classe pai é armazenado em \_\_parent. - -## Variáveis de classe - -Podemos criar variáveis diretamente no objeto da classe em vez da base usando @ na frente do nome da propriedade em uma declaração de classe. - -```yuescript -class Things - @some_func: => print "Hello from", @__name - -Things\some_func! - --- variáveis de classe não visíveis em instâncias -assert Things().some_func == nil -``` - -Em expressões, podemos usar @@ para acessar um valor armazenado no **class de self. Assim, @@hello é abreviação para self.**class.hello. - -```yuescript -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- imprime 2 -``` - -A semântica de chamada de @@ é semelhante a @. Chamar um nome @@ passará a classe como primeiro argumento usando a sintaxe de dois pontos do Lua. - -```yuescript -@@hello 1,2,3,4 -``` - -## Instruções de declaração de classe - -No corpo de uma declaração de classe, podemos ter expressões normais além de pares chave/valor. Neste contexto, self é igual ao objeto da classe. - -Aqui está uma forma alternativa de criar variável de classe comparada ao descrito acima: - -```yuescript -class Things - @class_var = "hello world" -``` - -Estas expressões são executadas após todas as propriedades terem sido adicionadas à base. - -Todas as variáveis declaradas no corpo da classe são locais às propriedades da classe. Isso é conveniente para colocar valores privados ou funções auxiliares que apenas os métodos da classe podem acessar: - -```yuescript -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "hello world: " .. secret -``` - -## Valores @ e @@ - -Quando @ e @@ são prefixados na frente de um nome, eles representam, respectivamente, esse nome acessado em self e self.\_\_class. - -Se forem usados sozinhos, são aliases para self e self.\_\_class. - -```yuescript -assert @ == self -assert @@ == self.__class -``` - -Por exemplo, uma forma rápida de criar uma nova instância da mesma classe a partir de um método de instância usando @@: - -```yuescript -some_instance_method = (...) => @@ ... -``` - -## Promoção de propriedade no construtor - -Para reduzir o código repetitivo na definição de objetos de valor simples. Você pode escrever uma classe simples como: - -```yuescript -class Something - new: (@foo, @bar, @@biz, @@baz) => - --- O que é abreviação para - -class Something - new: (foo, bar, biz, baz) => - @foo = foo - @bar = bar - @@biz = biz - @@baz = baz -``` - -Você também pode usar esta sintaxe para uma função comum para inicializar os campos de um objeto. - -```yuescript -new = (@fieldA, @fieldB) => @ -obj = new {}, 123, "abc" -print obj -``` - -## Expressões de classe - -A sintaxe de classe também pode ser usada como expressão que pode ser atribuída a uma variável ou retornada explicitamente. - -```yuescript -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -## Classes anônimas - -O nome pode ser omitido ao declarar uma classe. O atributo \_\_name será nil, a menos que a expressão da classe esteja em uma atribuição. O nome no lado esquerdo da atribuição é usado em vez de nil. - -```yuescript -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -Você pode até omitir o corpo, significando que pode escrever uma classe anônima em branco assim: - -```yuescript -x = class -``` - -## Mistura de classes - -Você pode fazer mistura com a palavra-chave `using` para copiar funções de uma tabela simples ou de um objeto de classe predefinido para sua nova classe. Ao fazer mistura com uma tabela simples, você pode sobrescrever a função de indexação da classe (metamétodo `__index`) para sua implementação personalizada. Ao fazer mistura com um objeto de classe existente, os metamétodos do objeto da classe não serão copiados. - -```yuescript -MyIndex = __index: var: 1 - -class X using MyIndex - func: => - print 123 - -x = X! -print x.var - -class Y using X - -y = Y! -y\func! - -assert y.__class.__parent ~= X -- X não é pai de Y -``` - -# Instrução With - -Um padrão comum envolvendo a criação de um objeto é chamar uma série de funções e definir uma série de propriedades imediatamente após criá-lo. - -Isso resulta em repetir o nome do objeto várias vezes no código, adicionando ruído desnecessário. Uma solução comum para isso é passar uma tabela como argumento que contém uma coleção de chaves e valores para sobrescrever. O inconveniente é que o construtor desse objeto deve suportar essa forma. - -O bloco with ajuda a aliviar isso. Dentro de um bloco with podemos usar instruções especiais que começam com . ou \ que representam essas operações aplicadas ao objeto com o qual estamos usando with. - -Por exemplo, trabalhamos com um objeto recém-criado: - -```yuescript -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -A instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso. - -```yuescript -file = with File "favorite_foods.txt" - \set_encoding "utf8" -``` - -Expressões `with` suportam `break` com um valor: - -```yuescript -result = with obj - break .value -``` - -Depois que `break value` é usado dentro de `with`, a expressão `with` deixa de retornar seu objeto-alvo e passa a retornar o valor de `break`. - -```yuescript -a = with obj - .x = 1 --- a é obj - -b = with obj - break .x --- b é .x, não obj -``` - -Diferente de `for` / `while` / `repeat` / `do`, `with` suporta apenas um valor de `break`. - -Ou… - -```yuescript -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", [dad, mother, sister] -``` - -Neste uso, with pode ser visto como uma forma especial do combinador K. - -A expressão na instrução with também pode ser uma atribuição, se você quiser dar um nome à expressão. - -```yuescript -with str := "Hello" - print "original:", str - print "upper:", \upper! -``` - -Você pode acessar chaves especiais com `[]` em uma instrução `with`. - -```yuescript -with tb - [1] = 1 - print [2] - with [abc] - [3] = [2]\func! - ["key-name"] = value - [] = "abc" -- anexando a "tb" -``` - -`with?` é uma versão aprimorada da sintaxe `with`, que introduz uma verificação existencial para acessar com segurança objetos que podem ser nil sem verificações explícitas de null. - -```yuescript -with? obj - print .name -``` - -# Atribuição - -A variável é tipada dinamicamente e é definida como local por padrão. Mas você pode alterar o escopo da declaração pelas instruções **local** e **global**. - -```yuescript -hello = "world" -a, b, c = 1, 2, 3 -hello = 123 -- usa a variável existente -``` - -## Atualização - -Você pode realizar atribuição de atualização com muitos operadores binários. - -```yuescript -x = 1 -x += 1 -x -= 1 -x *= 10 -x /= 10 -x %= 10 -s ..= "world" -- adiciona um novo local se a variável local não existir -arg or= "valor padrão" -``` - -## Atribuição encadeada - -Você pode fazer atribuição encadeada para atribuir múltiplos itens ao mesmo valor. - -```yuescript -a = b = c = d = e = 0 -x = y = z = f! -``` - -## Locais explícitos - -```yuescript -do - local a = 1 - local * - print "declarar antecipadamente todas as variáveis como locais" - x = -> 1 + y + z - y, z = 2, 3 - global instance = Item\new! - -do - local X = 1 - local ^ - print "declarar antecipadamente apenas variáveis em maiúsculas" - a = 1 - B = 2 -``` - -## Globais explícitos - -```yuescript -do - global a = 1 - global * - print "declarar todas as variáveis como globais" - x = -> 1 + y + z - y, z = 2, 3 - -do - global X = 1 - global ^ - print "declarar apenas variáveis em maiúsculas como globais" - a = 1 - B = 2 - local Temp = "um valor local" -``` - -# Atribuição de varargs - -Você pode atribuir os resultados retornados de uma função a um símbolo varargs `...`. E então acessar seu conteúdo da forma Lua. - -```yuescript -list = [1, 2, 3, 4, 5] -fn = (ok) -> ok, table.unpack list -ok, ... = fn true -count = select '#', ... -first = select 1, ... -print ok, count, first -``` - -# Atribuição em if - -Os blocos `if` e `elseif` podem receber uma atribuição no lugar de uma expressão condicional. Ao avaliar o condicional, a atribuição será realizada e o valor que foi atribuído será usado como expressão condicional. A variável atribuída está no escopo apenas para o corpo do condicional, ou seja, nunca está disponível se o valor não for truthy. E você precisa usar o "operador walrus" `:=` em vez de `=` para fazer a atribuição. - -```yuescript -if user := database.find_user "moon" - print user.name -``` - -```yuescript -if hello := os.getenv "hello" - print "Você tem hello", hello -elseif world := os.getenv "world" - print "você tem world", world -else - print "nada :(" -``` - -Atribuição em if com múltiplos valores de retorno. Apenas o primeiro valor é verificado, os outros valores estão no escopo. - -```yuescript -if success, result := pcall -> "obter resultado sem problemas" - print result -- variável result está no escopo -print "OK" -``` - -## Atribuição em while - -Você também pode usar atribuição em if em um loop while para obter o valor como condição do loop. - -```yuescript -while byte := stream\read_one! - -- fazer algo com o byte - print byte -``` - -# Atribuição por desestruturação - -A atribuição por desestruturação é uma forma de extrair rapidamente valores de uma tabela por seu nome ou posição em tabelas baseadas em array. - -Tipicamente, quando você vê um literal de tabela, {1,2,3}, ele está no lado direito de uma atribuição porque é um valor. A atribuição por desestruturação troca o papel do literal de tabela e o coloca no lado esquerdo de uma instrução de atribuição. - -Isso é melhor explicado com exemplos. Assim você extrairia os dois primeiros valores de uma tabela: - -```yuescript -thing = [1, 2] - -[a, b] = thing -print a, b -``` - -No literal de tabela de desestruturação, a chave representa a chave para ler do lado direito, e o valor representa o nome ao qual o valor lido será atribuído. - -```yuescript -obj = { - hello: "world" - day: "tuesday" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day - -:day = obj -- OK fazer desestruturação simples sem chaves -``` - -Isso também funciona com estruturas de dados aninhadas: - -```yuescript -obj2 = { - numbers: [1, 2, 3, 4] - properties: { - color: "green" - height: 13.5 - } -} - -{numbers: [first, second], properties: {color: color}} = obj2 -print first, second, color -``` - -Se a instrução de desestruturação for complicada, sinta-se à vontade para espalhá-la em várias linhas. Um exemplo um pouco mais complicado: - -```yuescript -{ - numbers: [first, second] - properties: { - color: color - } -} = obj2 -``` - -É comum extrair valores de uma tabela e atribuí-los a variáveis locais que têm o mesmo nome da chave. Para evitar repetição, podemos usar o operador de prefixo **:**: - -```yuescript -{:concat, :insert} = table -``` - -Isso é efetivamente o mesmo que import, mas podemos renomear campos que queremos extrair misturando a sintaxe: - -```yuescript -{:mix, :max, random: rand} = math -``` - -Você pode escrever valores padrão ao fazer desestruturação: - -```yuescript -{:name = "sem nome", :job = "sem emprego"} = person -``` - -Você pode usar `_` como placeholder ao fazer desestruturação de lista: - -```yuescript -[_, two, _, four] = items -``` - -## Desestruturação por intervalo - -Você pode usar o operador spread `...` na desestruturação de lista para capturar um intervalo de valores. Isso é útil quando você quer extrair elementos específicos do início e do fim de uma lista enquanto coleta o restante entre eles. - -```yuescript -orders = ["first", "second", "third", "fourth", "last"] -[first, ...bulk, last] = orders -print first -- imprime: first -print bulk -- imprime: {"second", "third", "fourth"} -print last -- imprime: last -``` - -O operador spread pode ser usado em diferentes posições para capturar diferentes intervalos, e você pode usar `_` como placeholder para os valores que não quer capturar: - -```yuescript --- Capturar tudo após o primeiro elemento -[first, ...rest] = orders - --- Capturar tudo antes do último elemento -[...start, last] = orders - --- Capturar tudo exceto os elementos do meio -[first, ..._, last] = orders -``` - -## Desestruturação em outros lugares - -A desestruturação também pode aparecer em lugares onde uma atribuição ocorre implicitamente. Um exemplo disso é um loop for: - -```yuescript -tuples = [ - ["hello", "world"] - ["egg", "head"] -] - -for [left, right] in *tuples - print left, right -``` - -Sabemos que cada elemento na tabela array é uma tupla de dois itens, então podemos desempacotá-lo diretamente na cláusula de nomes da instrução for usando desestruturação. - -# A cláusula Using; controlando atribuição destrutiva - -Embora o escopo léxico possa ser uma grande ajuda na redução da complexidade do código que escrevemos, as coisas podem ficar difíceis de gerenciar conforme o tamanho do código aumenta. Considere o seguinte trecho: - -```yuescript -i = 100 - --- muitas linhas de código... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- vai imprimir 0 -``` - -Em my_func, sobrescrevemos o valor de i por engano. Neste exemplo é bem óbvio, mas considere uma base de código grande ou estrangeira onde não está claro quais nomes já foram declarados. - -Seria útil dizer quais variáveis do escopo envolvente pretendemos alterar, para evitar que alteremos outras por acidente. - -A palavra-chave using nos permite fazer isso. using nil garante que nenhuma variável fechada seja sobrescrita na atribuição. A cláusula using é colocada após a lista de argumentos em uma função, ou no lugar dela se não houver argumentos. - -```yuescript -i = 100 - -my_func = (using nil) -> - i = "hello" -- uma nova variável local é criada aqui - -my_func! -print i -- imprime 100, i não é afetado -``` - -Múltiplos nomes podem ser separados por vírgulas. Os valores do closure ainda podem ser acessados, apenas não podem ser modificados: - -```yuescript -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k, i) -> - tmp = tmp + add -- uma nova variável local tmp é criada - i += tmp - k += tmp - -my_func(22) -print i, k -- estes foram atualizados -``` - -# Uso - -## Módulo Lua - -Use o módulo YueScript em Lua: - -- **Caso 1** - - Use require em "your_yuescript_entry.yue" no Lua. - - ```lua - require("yue")("your_yuescript_entry") - ``` - - E esse código continua funcionando quando você compila "your_yuescript_entry.yue" para "your_yuescript_entry.lua" no mesmo caminho. Nos demais arquivos YueScript, use normalmente o **require** ou **import**. Os números de linha nas mensagens de erro também serão tratados corretamente. - -- **Caso 2** - - Requerer o módulo YueScript e reescrever a mensagem manualmente. - - ```lua - local yue = require("yue") - yue.insert_loader() - local success, result = xpcall(function() - return require("yuescript_module_name") - end, function(err) - return yue.traceback(err) - end) - ``` - -- **Caso 3** - - Usar a função compiladora do YueScript em Lua. - - ```lua - local yue = require("yue") - local codes, err, globals = yue.to_lua([[ - f = -> - print "hello world" - f! - ]],{ - implicit_return_root = true, - reserve_line_number = true, - lint_global = true, - space_over_tab = false, - options = { - target = "5.4", - path = "/script" - } - }) - ``` - -## Ferramenta YueScript - -Use a ferramenta YueScript com: - -```shell -> yue -h -Usage: yue - [options] [] ... - yue -e [args...] - yue -w [] [options] - yue - - -Notas: - - '-' / '--' deve ser o primeiro e único argumento. - - '-o/--output' não pode ser usado com múltiplos arquivos de entrada. - - '-w/--watch' não pode ser usado com entrada de arquivo (apenas diretório). - - com '-e/--execute', os tokens restantes são tratados como argumentos do script. - -Opções: - -h, --help Mostrar esta mensagem de ajuda e sair. - -e , --execute Executar um arquivo ou código bruto - -m, --minify Gerar código minificado - -r, --rewrite Reescrever saída para corresponder aos números de linha originais - -t , --output-to - Especificar onde colocar os arquivos compilados - -o , --output Escrever saída em arquivo - -p, --print Escrever saída na saída padrão - -b, --benchmark Mostrar tempo de compilação (não grava saída) - -g, --globals Listar variáveis globais usadas em NOME LINHA COLUNA - -s, --spaces Usar espaços no código gerado em vez de tabulações - -l, --line-numbers Escrever números de linha do código fonte - -j, --no-implicit-return Desabilitar retorno implícito no final do arquivo - -c, --reserve-comments Preservar comentários antes de instruções do código fonte - -w [], --watch [] - Observar alterações e compilar cada arquivo no diretório - -v, --version Imprimir versão - - Ler da entrada padrão, imprimir na saída padrão - (Deve ser o primeiro e único argumento) - -- Igual a '-' (mantido para compatibilidade retroativa) - - --target Especificar a versão do Lua para a qual o código será gerado - (a versão pode ser apenas 5.1 a 5.5) - --path Adicionar um caminho de busca Lua extra ao package.path - --= Passar opção do compilador no formato key=value (comportamento existente) - - Execute sem opções para entrar no REPL, digite o símbolo '$' - em uma única linha para iniciar/parar o modo multilinha -``` - -Casos de uso: - -Compilar recursivamente todos os arquivos YueScript com extensão **.yue** no caminho atual: **yue .** - -Compilar e salvar resultados em um caminho de destino: **yue -t /target/path/ .** - -Compilar e preservar informações de debug: **yue -l .** - -Compilar e gerar código minificado: **yue -m .** - -Executar código bruto: **yue -e 'print 123'** - -Executar um arquivo YueScript: **yue -e main.yue** - -# Introdução - -YueScript é uma linguagem dinâmica que compila para Lua. É um dialeto do [MoonScript](https://github.com/leafo/moonscript). O código escrito em YueScript é expressivo e extremamente conciso. É adequado para escrever lógica de aplicação variável com código mais manutenível e roda em ambientes Lua embutidos, como jogos ou servidores web. - -Yue (月) é o nome da lua em chinês e é pronunciado como [jyɛ]. - -## Uma visão geral do YueScript - -```yuescript --- sintaxe de importação -import p, to_lua from "yue" - --- literais de objeto -inventory = - equipment: - - "sword" - - "shield" - items: - - name: "potion" - count: 10 - - name: "bread" - count: 3 - --- compreensão de lista -map = (arr, action) -> - [action item for item in *arr] - -filter = (arr, cond) -> - [item for item in *arr when cond item] - -reduce = (arr, init, action): init -> - init = action init, item for item in *arr - --- operador pipe -[1, 2, 3] - |> map (x) -> x * 2 - |> filter (x) -> x > 4 - |> reduce 0, (a, b) -> a + b - |> print - --- manipulação de metatable -apple = - size: 15 - : - color: 0x00ffff - -with apple - p .size, .color, . if .<>? - --- sintaxe de exportação estilo js -export 🌛 = "Script da Lua" -``` - -## Sobre o Dora SSR - -O YueScript está sendo desenvolvido e mantido em conjunto com o motor de jogo open-source [Dora SSR](https://github.com/IppClub/Dora-SSR). Tem sido usado para criar ferramentas do motor, demonstrações de jogos e protótipos, validando suas capacidades em cenários do mundo real e aprimorando a experiência de desenvolvimento do Dora SSR. - -# Instalação - -## Módulo Lua - -Instale o [luarocks](https://luarocks.org), um gerenciador de pacotes para módulos Lua. Em seguida, instale-o como módulo Lua e executável com: - -```shell -luarocks install yuescript -``` - -Ou você pode compilar o arquivo `yue.so` com: - -```shell -make shared LUAI=/usr/local/include/lua LUAL=/usr/local/lib/lua -``` - -Depois, obtenha o arquivo binário no caminho **bin/shared/yue.so**. - -## Compilar ferramenta binária - -Clone este repositório e compile e instale o executável com: - -```shell -make install -``` - -Compilar a ferramenta YueScript sem o recurso de macro: - -```shell -make install NO_MACRO=true -``` - -Compilar a ferramenta YueScript sem o binário Lua embutido: - -```shell -make install NO_LUA=true -``` - -## Baixar binário pré-compilado - -Você pode baixar arquivos binários pré-compilados, incluindo executáveis compatíveis com diferentes versões do Lua e arquivos de biblioteca. - -Baixe os arquivos binários pré-compilados [aqui](https://github.com/IppClub/YueScript/releases). - -# Condicionais - -```yuescript -have_coins = false -if have_coins - print "Tem moedas" -else - print "Sem moedas" -``` - -Uma sintaxe curta para instruções únicas também pode ser usada: - -```yuescript -have_coins = false -if have_coins then print "Tem moedas" else print "Sem moedas" -``` - -Como instruções if podem ser usadas como expressões, isso também pode ser escrito como: - -```yuescript -have_coins = false -print if have_coins then "Tem moedas" else "Sem moedas" -``` - -Condicionais também podem ser usados em instruções de retorno e atribuições: - -```yuescript -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "Sou muito alto" -else - "Não sou tão alto" - -print message -- imprime: Sou muito alto -``` - -O oposto de if é unless: - -```yuescript -unless os.date("%A") == "Monday" - print "não é segunda-feira!" -``` - -```yuescript -print "Você tem sorte!" unless math.random! > 0.1 -``` - -## Em expressão - -Você pode escrever código de verificação de intervalo com uma `in-expression`. - -```yuescript -a = 5 - -if a in [1, 3, 5, 7] - print "verificando igualdade com valores discretos" - -if a in list - print "verificando se `a` está na lista" -``` - -O operador `in` também pode ser usado com tabelas e suporta a variante `not in` para negação: - -```yuescript -has = "foo" in {"bar", "foo"} - -if a in {1, 2, 3} - print "a está na tabela" - -not_exist = item not in list - -check = -> value not in table -``` - -Uma lista ou tabela de único elemento verifica igualdade com esse elemento: - -```yuescript --- [1,] verifica se valor == 1 -c = a in [1,] - --- {1} também verifica se valor == 1 -c = a in {1} - --- Sem vírgula, [1] é acesso por índice (tb[1]) -with tb - c = a in [1] -``` - -# Loop For - -Existem duas formas de loop for, assim como no Lua. Uma numérica e uma genérica: - -```yuescript -for i = 10, 20 - print i - -for k = 1, 15, 2 -- um passo opcional fornecido - print k - -for key, value in pairs object - print key, value -``` - -Os operadores de slicing e **\*** podem ser usados, assim como com compreensões: - -```yuescript -for item in *items[2, 4] - print item -``` - -Uma sintaxe mais curta também está disponível para todas as variações quando o corpo é apenas uma linha: - -```yuescript -for item in *items do print item - -for j = 1, 10, 3 do print j -``` - -Um loop for também pode ser usado como expressão. A última instrução no corpo do loop for é convertida em expressão e anexada a uma tabela array acumuladora. - -Dobrando cada número par: - -```yuescript -doubled_evens = for i = 1, 20 - if i % 2 == 0 - i * 2 - else - i -``` - -Além disso, os loops for suportam break com valores de retorno, permitindo que o próprio loop seja usado como expressão que sai antecipadamente com um resultado significativo. Expressões `for` suportam `break` com múltiplos valores. - -Por exemplo, para encontrar o primeiro número maior que 10: - -```yuescript -first_large = for n in *numbers - break n if n > 10 -``` - -Esta sintaxe de break-com-valor permite padrões concisos e expressivos de busca ou saída antecipada diretamente em expressões de loop. - -```yuescript -key, score = for k, v in pairs data - break k, v * 10 if k == "target" -``` - -Você também pode filtrar valores combinando a expressão do loop for com a instrução continue. - -Loops for no final do corpo de uma função não são acumulados em uma tabela para valor de retorno (em vez disso, a função retornará nil). Uma instrução return explícita pode ser usada, ou o loop pode ser convertido em compreensão de lista. - -```yuescript -func_a = -> for i = 1, 10 do print i -func_b = -> return for i = 1, 10 do i - -print func_a! -- imprime nil -print func_b! -- imprime objeto table -``` - -Isso é feito para evitar a criação desnecessária de tabelas para funções que não precisam retornar os resultados do loop. - -# Continue - -Uma instrução continue pode ser usada para pular a iteração atual em um loop. - -```yuescript -i = 0 -while i < 10 - i += 1 - continue if i % 2 == 0 - print i -``` - -continue também pode ser usado com expressões de loop para impedir que essa iteração seja acumulada no resultado. Este exemplo filtra a tabela array para apenas números pares: - -```yuescript -my_numbers = [1, 2, 3, 4, 5, 6] -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -# Switch - -A instrução switch é uma forma abreviada de escrever uma série de instruções if que verificam o mesmo valor. Observe que o valor é avaliado apenas uma vez. Como as instruções if, os switches podem ter um bloco else para tratar ausência de correspondências. A comparação é feita com o operador ==. Na instrução switch, você também pode usar expressão de atribuição para armazenar valor de variável temporária. - -```yuescript -switch name := "Dan" - when "Robert" - print "Você é Robert" - when "Dan", "Daniel" - print "Seu nome é Dan" - else - print "Não sei quem você é com o nome #{name}" -``` - -Uma cláusula when de um switch pode corresponder a múltiplos valores listando-os separados por vírgula. - -Os switches também podem ser usados como expressões; aqui podemos atribuir o resultado do switch a uma variável: - -```yuescript -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "não consigo contar tão alto!" -``` - -Podemos usar a palavra-chave then para escrever o bloco when de um switch em uma única linha. Nenhuma palavra-chave extra é necessária para escrever o bloco else em uma única linha. - -```yuescript -msg = switch math.random(1, 5) - when 1 then "você tem sorte" - when 2 then "você quase tem sorte" - else "não tão sortudo" -``` - -Se você quiser escrever código com uma indentação a menos ao escrever uma instrução switch, pode colocar a primeira cláusula when na linha de início da instrução, e então todas as outras cláusulas podem ser escritas com uma indentação a menos. - -```yuescript -switch math.random(1, 5) - when 1 - print "você tem sorte" -- duas indentações - else - print "não tão sortudo" - -switch math.random(1, 5) when 1 - print "você tem sorte" -- uma indentação -else - print "não tão sortudo" -``` - -Vale notar a ordem da expressão de comparação do case. A expressão do case está no lado esquerdo. Isso pode ser útil se a expressão do case quiser sobrescrever como a comparação é feita definindo um metamétodo eq. - -## Correspondência de tabela - -Você pode fazer correspondência de tabela em uma cláusula when de switch, se a tabela puder ser desestruturada por uma estrutura específica e obter valores não-nil. - -```yuescript -items = - * x: 100 - y: 200 - * width: 300 - height: 400 - -for item in *items - switch item - when :x, :y - print "Vec2 #{x}, #{y}" - when :width, :height - print "tamanho #{width}, #{height}" -``` - -Você pode usar valores padrão para opcionalmente desestruturar a tabela para alguns campos. - -```yuescript -item = {} - -{pos: {:x = 50, :y = 200}} = item -- obtém erro: attempt to index a nil value (field 'pos') - -switch item - when {pos: {:x = 50, :y = 200}} - print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passará -``` - -Você também pode corresponder contra elementos de array, campos de tabela, e até estruturas aninhadas com literais de array ou tabela. - -Corresponder contra elementos de array. - -```yuescript -switch tb - when [1, 2, 3] - print "1, 2, 3" - when [1, b, 3] - print "1, #{b}, 3" - when [1, 2, b = 3] -- b tem valor padrão - print "1, 2, #{b}" -``` - -Corresponder contra campos de tabela com desestruturação. - -```yuescript -switch tb - when success: true, :result - print "sucesso", result - when success: false - print "falhou", result - else - print "inválido" -``` - -Corresponder contra estruturas de tabela aninhadas. - -```yuescript -switch tb - when data: {type: "success", :content} - print "sucesso", content - when data: {type: "error", :content} - print "erro", content - else - print "inválido" -``` - -Corresponder contra array de tabelas. - -```yuescript -switch tb - when [ - {a: 1, b: 2} - {a: 3, b: 4} - {a: 5, b: 6} - fourth - ] - print "correspondido", fourth -``` - -Corresponder contra uma lista e capturar um intervalo de elementos. - -```yuescript -segments = ["admin", "users", "logs", "view"] -switch segments - when [...groups, resource, action] - print "Grupo:", groups -- imprime: {"admin", "users"} - print "Recurso:", resource -- imprime: "logs" - print "Ação:", action -- imprime: "view" -``` - -# Loop While - -O loop while também vem em quatro variações: - -```yuescript -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -```yuescript -i = 10 -until i == 0 - print i - i -= 1 - -until running == false do my_function! -``` - -Como os loops for, o loop while também pode ser usado como expressão. Expressões `while` e `until` suportam `break` com múltiplos valores. - -```yuescript -value, doubled = while true - n = get_next! - break n, n * 2 if n > 10 -``` - -Além disso, para uma função retornar o valor acumulado de um loop while, a instrução deve ser explicitamente retornada. - -## Loop Repeat - -O loop repeat vem do Lua: - -```yuescript -i = 10 -repeat - print i - i -= 1 -until i == 0 -``` - -Expressões `repeat` também suportam `break` com múltiplos valores: - -```yuescript -i = 1 -value, scaled = repeat - break i, i * 100 if i > 3 - i += 1 -until false -``` - -# Stubs de função - -É comum passar uma função de um objeto como valor, por exemplo, passando um método de instância para uma função como callback. Se a função espera o objeto em que está operando como primeiro argumento, então você deve de alguma forma empacotar esse objeto com a função para que ela possa ser chamada corretamente. - -A sintaxe de function stub é uma forma abreviada de criar uma nova função closure que empacota tanto o objeto quanto a função. Esta nova função chama a função empacotada no contexto correto do objeto. - -Sua sintaxe é a mesma que chamar um método de instância com o operador \, mas sem lista de argumentos fornecida. - -```yuescript -my_object = { - value: 1000 - write: => print "the value:", @value -} - -run_callback = (func) -> - print "running callback..." - func! - --- isso não funcionará: --- a função não tem referência a my_object -run_callback my_object.write - --- sintaxe de function stub --- nos permite empacotar o objeto em uma nova função -run_callback my_object\write -``` - -# Backcalls - -Backcalls são usados para desaninhar callbacks. Eles são definidos usando setas apontando para a esquerda como o último parâmetro, preenchendo por padrão uma chamada de função. Toda a sintaxe é basicamente a mesma das funções seta regulares, exceto que apenas aponta para o outro lado e o corpo da função não requer indentação. - -```yuescript -x <- f -print "hello" .. x -``` - -Funções seta "fat" também estão disponíveis. - -```yuescript -<= f -print @value -``` - -Você pode especificar um placeholder para onde deseja que a função backcall vá como parâmetro. - -```yuescript -(x) <- map _, [1, 2, 3] -x * 2 -``` - -Se você desejar ter mais código após seus backcalls, pode colocá-los em uma instrução do. E os parênteses podem ser omitidos com funções seta não-fat. - -```yuescript -result, msg = do - data <- readAsync "filename.txt" - print data - info <- processAsync data - check info -print result, msg -``` - -# Literais de função - -Todas as funções são criadas usando uma expressão de função. Uma função simples é denotada usando a seta: **->**. - -```yuescript -my_function = -> -my_function() -- chama a função vazia -``` - -O corpo da função pode ser uma instrução colocada diretamente após a seta, ou pode ser uma série de instruções indentadas nas linhas seguintes: - -```yuescript -func_a = -> print "hello world" - -func_b = -> - value = 100 - print "The value:", value -``` - -Se uma função não tem argumentos, ela pode ser chamada usando o operador !, em vez de parênteses vazios. A invocação ! é a forma preferida de chamar funções sem argumentos. - -```yuescript -func_a! -func_b() -``` - -Funções com argumentos podem ser criadas precedendo a seta com uma lista de nomes de argumentos entre parênteses: - -```yuescript -sum = (x, y) -> print "sum", x + y -``` - -Funções podem ser chamadas listando os argumentos após o nome de uma expressão que avalia para uma função. Ao encadear chamadas de função, os argumentos são aplicados à função mais próxima à esquerda. - -```yuescript -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -Para evitar ambiguidade ao chamar funções, parênteses também podem ser usados para envolver os argumentos. Isso é necessário aqui para garantir que os argumentos certos sejam enviados às funções certas. - -```yuescript -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -Não deve haver espaço entre o parêntese de abertura e a função. - -As funções convertem a última instrução em seu corpo em uma instrução de retorno, isso é chamado de retorno implícito: - -```yuescript -sum = (x, y) -> x + y -print "The sum is ", sum 10, 20 -``` - -E se você precisar retornar explicitamente, pode usar a palavra-chave return: - -```yuescript -sum = (x, y) -> return x + y -``` - -Assim como no Lua, as funções podem retornar múltiplos valores. A última instrução deve ser uma lista de valores separados por vírgulas: - -```yuescript -mystery = (x, y) -> x + y, x - y -a, b = mystery 10, 20 -``` - -## Setas fat - -Como é um idioma em Lua enviar um objeto como primeiro argumento ao chamar um método, uma sintaxe especial é fornecida para criar funções que incluem automaticamente um argumento self. - -```yuescript -func = (num) => @value + num -``` - -## Valores padrão de argumentos - -É possível fornecer valores padrão para os argumentos de uma função. Um argumento é determinado como vazio se seu valor for nil. Qualquer argumento nil que tenha valor padrão será substituído antes da execução do corpo da função. - -```yuescript -my_function = (name = "something", height = 100) -> - print "Hello I am", name - print "My height is", height -``` - -Uma expressão de valor padrão de argumento é avaliada no corpo da função na ordem das declarações de argumentos. Por esse motivo, os valores padrão têm acesso aos argumentos declarados anteriormente. - -```yuescript -some_args = (x = 100, y = x + 1000) -> - print x + y -``` - -## Considerações - -Devido à forma expressiva de chamar funções sem parênteses, algumas restrições devem ser colocadas para evitar ambiguidade de análise envolvendo espaço em branco. - -O sinal de menos desempenha dois papéis: um operador de negação unário e um operador de subtração binário. Considere como os seguintes exemplos compilam: - -```yuescript -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -A precedência do primeiro argumento de uma chamada de função pode ser controlada usando espaço em branco se o argumento for um literal de string. Em Lua, é comum omitir parênteses ao chamar uma função com uma única string ou literal de tabela. - -Quando não há espaço entre uma variável e um literal de string, a chamada de função tem precedência sobre quaisquer expressões seguintes. Nenhum outro argumento pode ser passado para a função quando ela é chamada dessa forma. - -Quando há um espaço após uma variável e um literal de string, a chamada de função age como mostrado acima. O literal de string pertence a quaisquer expressões seguintes (se existirem), que servem como lista de argumentos. - -```yuescript -x = func"hello" + 100 -y = func "hello" + 100 -``` - -## Argumentos multilinha - -Ao chamar funções que recebem um grande número de argumentos, é conveniente dividir a lista de argumentos em várias linhas. Devido à natureza sensível a espaço em branco da linguagem, deve-se ter cuidado ao dividir a lista de argumentos. - -Se uma lista de argumentos for continuada na próxima linha, a linha atual deve terminar em vírgula. E a linha seguinte deve estar mais indentada que a indentação atual. Uma vez indentada, todas as outras linhas de argumentos devem estar no mesmo nível de indentação para fazer parte da lista de argumentos. - -```yuescript -my_func 5, 4, 3, - 8, 9, 10 - -cool_func 1, 2, - 3, 4, - 5, 6, - 7, 8 -``` - -Este tipo de invocação pode ser aninhado. O nível de indentação é usado para determinar a qual função os argumentos pertencem. - -```yuescript -my_func 5, 6, 7, - 6, another_func 6, 7, 8, - 9, 1, 2, - 5, 4 -``` - -Como as tabelas também usam vírgula como delimitador, esta sintaxe de indentação ajuda a deixar os valores fazerem parte da lista de argumentos em vez de fazerem parte da tabela. - -```yuescript -x = [ - 1, 2, 3, 4, a_func 4, 5, - 5, 6, - 8, 9, 10 -] -``` - -Embora incomum, observe como podemos dar uma indentação mais profunda para argumentos de função se soubermos que usaremos uma indentação menor mais adiante. - -```yuescript -y = [ my_func 1, 2, 3, - 4, 5, - 5, 6, 7 -] -``` - -A mesma coisa pode ser feita com outras instruções em nível de bloco como condicionais. Podemos usar o nível de indentação para determinar a qual instrução um valor pertence: - -```yuescript -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" - -if func 1, 2, 3, - "hello", - "world" - print "hello" - print "I am inside if" -``` - -## Desestruturação de parâmetros - -YueScript agora suporta desestruturação de parâmetros de função quando o argumento é um objeto. Duas formas de literais de tabela de desestruturação estão disponíveis: - -- **Literais/parâmetros de objeto envolvidos em chaves**, permitindo valores padrão opcionais quando os campos estão ausentes (ex.: `{:a, :b}`, `{a: a1 = 123}`). - -- **Sintaxe de tabela simples não envolvida**, começando com uma sequência de ligações chave-valor ou abreviadas e continuando até outra expressão terminá-la (ex.: `:a, b: b1, :c`). Esta forma extrai múltiplos campos do mesmo objeto. - -```yuescript -f1 = (:a, :b, :c) -> - print a, b, c - -f1 a: 1, b: "2", c: {} - -f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> - print a1, b, c - -arg1 = {a: 0} -f2 arg1, arg2 -``` - -## Expressão de retorno prefixada - -Ao trabalhar com corpos de função profundamente aninhados, pode ser tedioso manter a legibilidade e consistência do valor de retorno. Para resolver isso, YueScript introduz a sintaxe **Expressão de Retorno Prefixada**. Sua forma é a seguinte: - -```yuescript -findFirstEven = (list): nil -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub -``` - -Isso é equivalente a: - -```yuescript -findFirstEven = (list) -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub - nil -``` - -A única diferença é que você pode mover a expressão de retorno final antes do token `->` ou `=>` para indicar o valor de retorno implícito da função como última instrução. Dessa forma, mesmo em funções com múltiplos loops aninhados ou ramificações condicionais, você não precisa mais escrever uma expressão de retorno no final do corpo da função, tornando a estrutura lógica mais direta e fácil de seguir. - -## Varargs nomeados - -Você pode usar a sintaxe `(...t) ->` para armazenar automaticamente varargs em uma tabela nomeada. Esta tabela conterá todos os argumentos passados (incluindo valores `nil`), e o campo `n` da tabela armazenará o número real de argumentos passados (incluindo valores `nil`). - -```yuescript -f = (...t) -> - print "contagem de argumentos:", t.n - print "comprimento da tabela:", #t - for i = 1, t.n - print t[i] - -f 1, 2, 3 -f "a", "b", "c", "d" -f! - --- Tratando casos com valores nil -process = (...args) -> - sum = 0 - for i = 1, args.n - if args[i] != nil and type(args[i]) == "number" - sum += args[i] - sum - -process 1, nil, 3, nil, 5 -``` - -# Espaço em branco - -YueScript é uma linguagem sensível a espaço em branco. Você precisa escrever blocos de código na mesma indentação com espaço **' '** ou tabulação **'\t'**, como corpo de função, lista de valores e alguns blocos de controle. E expressões contendo diferentes espaços em branco podem significar coisas diferentes. Tabulação é tratada como 4 espaços, mas é melhor não misturar o uso de espaços e tabulações. - -## Separador de instrução - -Uma instrução normalmente termina em uma quebra de linha. Você também pode usar ponto e vírgula `;` para terminar explicitamente uma instrução, o que permite escrever múltiplas instruções na mesma linha: - -```yuescript -a = 1; b = 2; print a + b -``` - -## Encadeamento multilinha - -Você pode escrever chamadas de função encadeadas em múltiplas linhas com a mesma indentação. - -```yuescript -Rx.Observable - .fromRange 1, 8 - \filter (x) -> x % 2 == 0 - \concat Rx.Observable.of 'who do we appreciate' - \map (value) -> value .. '!' - \subscribe print -``` - -# Comentário - -```yuescript --- Eu sou um comentário - -str = --[[ -Este é um comentário multilinha. -Está OK. -]] strA \ -- comentário 1 - .. strB \ -- comentário 2 - .. strC - -func --[[port]] 3000, --[[ip]] "192.168.1.1" -``` - -# Atributos - -Suporte de sintaxe para atributos do Lua 5.4. E você ainda pode usar tanto a declaração `const` quanto `close` e obter verificação de constante e callback com escopo funcionando ao direcionar para versões do Lua abaixo da 5.4. - -```yuescript -const a = 123 -close _ = : -> print "Fora do escopo." -``` - -Você pode fazer desestruturação com variáveis atribuídas como constante. - -```yuescript -const {:a, :b, c, d} = tb --- a = 1 -``` - -Você também pode declarar uma variável global como `const`. - -```yuescript -global const Constant = 123 --- Constant = 1 -``` - -# Operador - -Todos os operadores binários e unários do Lua estão disponíveis. Além disso, **!=** é um alias para **~=**, e **\\** ou **::** podem ser usados para escrever uma chamada de função encadeada como `tb\func!` ou `tb::func!`. E o YueScript oferece alguns outros operadores especiais para escrever códigos mais expressivos. - -```yuescript -tb\func! if tb ~= nil -tb::func! if tb != nil -``` - -## Comparações encadeadas - -Comparações podem ser encadeadas arbitrariamente: - -```yuescript -print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 --- saída: true - -a = 5 -print 1 <= a <= 10 --- saída: true -``` - -Observe o comportamento de avaliação das comparações encadeadas: - -```yuescript -v = (x) -> - print x - x - -print v(1) < v(2) <= v(3) ---[[ - saída: - 2 - 1 - 3 - true -]] - -print v(1) > v(2) <= v(3) ---[[ - saída: - 2 - 1 - false -]] -``` - -A expressão do meio é avaliada apenas uma vez, em vez de duas vezes como seria se a expressão fosse escrita como `v(1) < v(2) and v(2) <= v(3)`. No entanto, a ordem das avaliações em uma comparação encadeada é indefinida. É fortemente recomendado não usar expressões com efeitos colaterais (como impressão) em comparações encadeadas. Se efeitos colaterais forem necessários, o operador de curto-circuito `and` deve ser usado explicitamente. - -## Anexar à tabela - -O operador **[] =** é usado para anexar valores a tabelas. - -```yuescript -tab = [] -tab[] = "Value" -``` - -Você também pode usar o operador spread `...` para anexar todos os elementos de uma lista a outra: - -```yuescript -tbA = [1, 2, 3] -tbB = [4, 5, 6] -tbA[] = ...tbB --- tbA agora é [1, 2, 3, 4, 5, 6] -``` - -## Spread de tabela - -Você pode concatenar tabelas de array ou tabelas hash usando o operador spread `...` antes de expressões em literais de tabela. - -Ao fazer spread em um literal de tabela com chaves (por exemplo, `{...other}`), tanto a parte de array quanto a parte hash da tabela Lua são copiadas. - -```yuescript -parts = - * "shoulders" - * "knees" -lyrics = - * "head" - * ...parts - * "and" - * "toes" - -copy = {...other} - -a = {1, 2, 3, x: 1} -b = {4, 5, y: 1} -merge = {...a, ...b} -``` - -### Spread de tabela de lista - -Ao fazer spread em um literal de tabela com colchetes (por exemplo, `[...other,]`), apenas a parte de array é copiada. - -```yuescript -source = {1, 2, 3, name: "Yue"} -fullCopy = {...source} -listCopy = [...source,] --- fullCopy => {1, 2, 3, name: "Yue"} --- listCopy => [1, 2, 3] -``` - -## Indexação reversa de tabela - -Você pode usar o operador **#** para obter os últimos elementos de uma tabela. - -```yuescript -last = data.items[#] -second_last = data.items[#-1] -data.items[#] = 1 -``` - -## Metatable - -O operador **<>** pode ser usado como atalho para manipulação de metatable. - -### Criação de metatable - -Crie tabela normal com chaves vazias **<>** ou chave de metamétodo cercada por **<>**. - -```yuescript -mt = {} -add = (right) => <>: mt, value: @value + right.value -mt.__add = add - -a = <>: mt, value: 1 - -- definir campo com variável de mesmo nome -b = :, value: 2 -c = : mt.__add, value: 3 - -d = a + b + c -print d.value - -close _ = : -> print "fora do escopo" -``` - -### Acesso à metatable - -Acesse a metatable com **<>** ou nome do metamétodo cercado por **<>** ou escrevendo alguma expressão em **<>**. - -```yuescript --- criar com metatable contendo campo "value" -tb = <"value">: 123 -tb. = tb.<> -print tb.value - -tb.<> = __index: {item: "hello"} -print tb.item -``` - -### Desestruturação de metatable - -Desestruture a metatable com chave de metamétodo cercada por **<>**. - -```yuescript -{item, :new, :, : getter} = tb -print item, new, close, getter -``` - -## Existência - -O operador **?** pode ser usado em diversos contextos para verificar existência. - -```yuescript -func?! -print abc?["hello world"]?.xyz - -x = tab?.value -len = utf8?.len or string?.len or (o) -> #o - -if print and x? - print x - -with? io.open "test.txt", "w" - \write "hello" - \close! -``` - -## Pipe - -Em vez de uma série de chamadas de função aninhadas, você pode encaminhar valores com o operador **|>**. - -```yuescript -"hello" |> print -1 |> print 2 -- insere o item do pipe como primeiro argumento -2 |> print 1, _, 3 -- pipe com um placeholder - --- expressão pipe em multilinha -readFile "example.txt" - |> extract language, {} - |> parse language - |> emit - |> render - |> print -``` - -## Coalescência de nil - -O operador de coalescência de nil **??** retorna o valor do operando esquerdo se não for **nil**; caso contrário, avalia o operando direito e retorna seu resultado. O operador **??** não avalia seu operando direito se o operando esquerdo avaliar para não-nil. - -```yuescript -local a, b, c, d -a = b ?? c ?? d -func a ?? {} - -a ??= false -``` - -## Objeto implícito - -Você pode escrever uma lista de estruturas implícitas que começa com o símbolo **\*** ou **-** dentro de um bloco de tabela. Se você está criando objeto implícito, os campos do objeto devem estar com a mesma indentação. - -```yuescript --- atribuição com objeto implícito -list = - * 1 - * 2 - * 3 - --- chamada de função com objeto implícito -func - * 1 - * 2 - * 3 - --- retorno com objeto implícito -f = -> - return - * 1 - * 2 - * 3 - --- tabela com objeto implícito -tb = - name: "abc" - - values: - - "a" - - "b" - - "c" - - objects: - - name: "a" - value: 1 - func: => @value + 1 - tb: - fieldA: 1 - - - name: "b" - value: 2 - func: => @value + 2 - tb: { } - -``` - -# Literais - -Todos os literais primitivos do Lua podem ser usados. Isso se aplica a números, strings, booleanos e **nil**. - -Diferente do Lua, quebras de linha são permitidas dentro de strings com aspas simples e duplas sem sequência de escape: - -```yuescript -some_string = "Aqui está uma string - que tem uma quebra de linha." - --- Você pode misturar expressões em literais de string usando a sintaxe #{}. --- Interpolação de string está disponível apenas em strings com aspas duplas. -print "Tenho #{math.random! * 100}% de certeza." -``` - -## Literais numéricos - -Você pode usar underscores em um literal numérico para aumentar a legibilidade. - -```yuescript -integer = 1_000_000 -hex = 0xEF_BB_BF -binary = 0B10011 -``` - -## String multilinha estilo YAML - -O prefixo `|` introduz um literal de string multilinha no estilo YAML: - -```yuescript -str = | - key: value - list: - - item1 - - #{expr} -``` - -Isso permite escrever texto estruturado multilinha convenientemente. Todas as quebras de linha e indentação são preservadas em relação à primeira linha não vazia, e expressões dentro de `#{...}` são interpoladas automaticamente como `tostring(expr)`. - -A string multilinha YAML detecta automaticamente o prefixo comum de espaço em branco à esquerda (indentação mínima em todas as linhas não vazias) e remove-o de todas as linhas. Isso facilita a indentação visual do seu código sem afetar o conteúdo da string resultante. - -```yuescript -fn = -> - str = | - foo: - bar: baz - return str -``` - -A indentação interna é preservada em relação ao prefixo comum removido, permitindo estruturas aninhadas limpas. - -Todos os caracteres especiais como aspas (`"`) e barras invertidas (`\`) no bloco YAML Multiline são escapados automaticamente para que a string Lua gerada seja sintaticamente válida e se comporte como esperado. - -```yuescript -str = | - path: "C:\Program Files\App" - note: 'Ele disse: "#{Hello}!"' -``` - -# Módulo - -## Import - -A instrução import é um açúcar sintático para requerer um módulo ou ajudar a extrair itens de um módulo importado. Os itens importados são const por padrão. - -```yuescript --- usado como desestruturação de tabela -do - import insert, concat from table - -- reporta erro ao atribuir a insert, concat - import C, Ct, Cmt from require "lpeg" - -- atalho para require implícito - import x, y, z from 'mymodule' - -- import com estilo Python - from 'module' import a, b, c - --- atalho para requerer um módulo -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- requerer módulo com aliasing ou desestruturação de tabela -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - -## Import Global - -Você pode importar globais específicos para variáveis locais com `import`. Ao importar uma cadeia de acessos a variáveis globais, o último campo será atribuído à variável local. - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - -### Importação automática de variável global - -Você pode colocar `import global` no topo de um bloco para importar automaticamente todos os nomes que não foram explicitamente declarados ou atribuídos no escopo atual como globais. Essas importações implícitas são tratadas como consts locais que referenciam os globais correspondentes na posição da instrução. - -Nomes que foram explicitamente declarados como globais no mesmo escopo não serão importados, então você ainda pode atribuir a eles. - -```yuescript -do - import global - print "hello" - math.random 3 - -- print = nil -- erro: globais importados são const - -do - -- variável global explícita não será importada - import global - global FLAG - print FLAG - FLAG = 123 -``` - -## Export - -A instrução export oferece uma forma concisa de definir módulos. - -### Export nomeado - -Export nomeado definirá uma variável local e também adicionará um campo na tabela exportada. - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - -Fazendo export nomeado com desestruturação. - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = 'default'}} = tb -``` - -Exportar itens nomeados do módulo sem criar variáveis locais. - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - -### Export sem nome - -Export sem nome adicionará o item alvo na parte array da tabela exportada. - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - -### Export padrão - -Usar a palavra-chave **default** na instrução export para substituir a tabela exportada por qualquer coisa. - -```yuescript -export default -> - print "hello" - 123 -``` - -# Licença: MIT - -Copyright (c) 2017-2026 Li Jin \ - -A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia -deste software e dos arquivos de documentação associados (o "Software"), para negociar -o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, -modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender -cópias do Software, e permitir que pessoas a quem o Software seja fornecido o façam, -sujeito às seguintes condições: - -O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as -cópias ou partes substanciais do Software. - -O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM GARANTIA DE QUALQUER TIPO, -EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, -ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE OS AUTORES OU -DETENTORES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUAISQUER REIVINDICAÇÕES, -DANOS OU OUTRAS RESPONSABILIDADES, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU OUTRA, -DECORRENTES DE, FORA DE OU RELACIONADAS COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES -NO SOFTWARE. - -# A biblioteca YueScript - -Acesse com `local yue = require("yue")` no Lua. - -## yue - -**Descrição:** - -A biblioteca da linguagem YueScript. - -### version - -**Tipo:** Campo. - -**Descrição:** - -A versão do YueScript. - -**Assinatura:** - -```lua -version: string -``` - -### dirsep - -**Tipo:** Campo. - -**Descrição:** - -O separador de arquivos da plataforma atual. - -**Assinatura:** - -```lua -dirsep: string -``` - -### yue_compiled - -**Tipo:** Campo. - -**Descrição:** - -O cache de código de módulo compilado. - -**Assinatura:** - -```lua -yue_compiled: {string: string} -``` - -### to_lua - -**Tipo:** Função. - -**Descrição:** - -A função de compilação do YueScript. Compila o código YueScript para código Lua. - -**Assinatura:** - -```lua -to_lua: function(code: string, config?: Config): - --[[codes]] string | nil, - --[[error]] string | nil, - --[[globals]] {{string, integer, integer}} | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| code | string | O código YueScript. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| string \| nil | O código Lua compilado, ou nil se a compilação falhou. | -| string \| nil | A mensagem de erro, ou nil se a compilação foi bem-sucedida. | -| {{string, integer, integer}} \| nil | As variáveis globais que aparecem no código (com nome, linha e coluna), ou nil se a opção do compilador `lint_global` for false. | - -### file_exist - -**Tipo:** Função. - -**Descrição:** - -Função de verificação de existência do arquivo fonte. Pode ser sobrescrita para personalizar o comportamento. - -**Assinatura:** - -```lua -file_exist: function(filename: string): boolean -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ------------------ | -| filename | string | O nome do arquivo. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------- | -| boolean | Se o arquivo existe. | - -### read_file - -**Tipo:** Função. - -**Descrição:** - -Função de leitura do arquivo fonte. Pode ser sobrescrita para personalizar o comportamento. - -**Assinatura:** - -```lua -read_file: function(filename: string): string -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ------------------ | -| filename | string | O nome do arquivo. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ---------------------- | -| string | O conteúdo do arquivo. | - -### insert_loader - -**Tipo:** Função. - -**Descrição:** - -Insere o carregador YueScript nos carregadores de pacote (searchers). - -**Assinatura:** - -```lua -insert_loader: function(pos?: integer): boolean -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------- | ----------------------------------------------------------- | -| pos | integer | [Opcional] A posição para inserir o carregador. Padrão é 3. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------------------------------- | -| boolean | Se o carregador foi inserido com sucesso. Falhará se o carregador já estiver inserido. | - -### remove_loader - -**Tipo:** Função. - -**Descrição:** - -Remove o carregador YueScript dos carregadores de pacote (searchers). - -**Assinatura:** - -```lua -remove_loader: function(): boolean -``` - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | --------------------------------------------------------------------------------------- | -| boolean | Se o carregador foi removido com sucesso. Falhará se o carregador não estiver inserido. | - -### loadstring - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de uma string em uma função. - -**Assinatura:** - -```lua -loadstring: function(input: string, chunkname: string, env: table, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| input | string | O código YueScript. | -| chunkname | string | O nome do chunk de código. | -| env | table | A tabela de ambiente. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------- | -| function \| nil | A função carregada, ou nil se o carregamento falhou. | -| string \| nil | A mensagem de erro, ou nil se o carregamento foi bem-sucedido. | - -### loadstring - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de uma string em uma função. - -**Assinatura:** - -```lua -loadstring: function(input: string, chunkname: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| input | string | O código YueScript. | -| chunkname | string | O nome do chunk de código. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------- | -| function \| nil | A função carregada, ou nil se o carregamento falhou. | -| string \| nil | A mensagem de erro, ou nil se o carregamento foi bem-sucedido. | - -### loadstring - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de uma string em uma função. - -**Assinatura:** - -```lua -loadstring: function(input: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| input | string | O código YueScript. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------- | -| function \| nil | A função carregada, ou nil se o carregamento falhou. | -| string \| nil | A mensagem de erro, ou nil se o carregamento foi bem-sucedido. | - -### loadfile - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de um arquivo em uma função. - -**Assinatura:** - -```lua -loadfile: function(filename: string, env: table, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| filename | string | O nome do arquivo. | -| env | table | A tabela de ambiente. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------- | -| function \| nil | A função carregada, ou nil se o carregamento falhou. | -| string \| nil | A mensagem de erro, ou nil se o carregamento foi bem-sucedido. | - -### loadfile - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de um arquivo em uma função. - -**Assinatura:** - -```lua -loadfile: function(filename: string, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| filename | string | O nome do arquivo. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | -------------------------------------------------------------- | -| function \| nil | A função carregada, ou nil se o carregamento falhou. | -| string \| nil | A mensagem de erro, ou nil se o carregamento foi bem-sucedido. | - -### dofile - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de um arquivo em uma função e o executa. - -**Assinatura:** - -```lua -dofile: function(filename: string, env: table, config?: Config): any... -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| filename | string | O nome do arquivo. | -| env | table | A tabela de ambiente. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ------------------------------------------ | -| any... | Os valores de retorno da função carregada. | - -### dofile - -**Tipo:** Função. - -**Descrição:** - -Carrega código YueScript de um arquivo em uma função e o executa. - -**Assinatura:** - -```lua -dofile: function(filename: string, config?: Config): any... -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------------------------- | -| filename | string | O nome do arquivo. | -| config | Config | [Opcional] As opções do compilador. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ------------------------------------------ | -| any... | Os valores de retorno da função carregada. | - -### find_modulepath - -**Tipo:** Função. - -**Descrição:** - -Resolve o nome do módulo YueScript para o caminho do arquivo. - -**Assinatura:** - -```lua -find_modulepath: function(name: string): string -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------- | -| name | string | O nome do módulo. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | --------------------- | -| string | O caminho do arquivo. | - -### pcall - -**Tipo:** Função. - -**Descrição:** - -Chama uma função em modo protegido. -Captura quaisquer erros e retorna um código de status e resultados ou objeto de erro. -Reescreve o número da linha do erro para o número da linha original no código YueScript quando ocorrem erros. - -**Assinatura:** - -```lua -pcall: function(f: function, ...: any): boolean, any... -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | -------- | ---------------------------------- | -| f | function | A função a chamar. | -| ... | any | Argumentos a passar para a função. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ---------------------------------------------------------- | -| boolean, ... | Código de status e resultados da função ou objeto de erro. | - -### require - -**Tipo:** Função. - -**Descrição:** - -Carrega um módulo dado. Pode ser um módulo Lua ou um módulo YueScript. -Reescreve o número da linha do erro para o número da linha original no código YueScript se o módulo for um módulo YueScript e o carregamento falhar. - -**Assinatura:** - -```lua -require: function(name: string): any... -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ---------------------------- | -| modname | string | O nome do módulo a carregar. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| any | O valor armazenado em package.loaded[modname] se o módulo já estiver carregado. Caso contrário, tenta encontrar um carregador e retorna o valor final de package.loaded[modname] e os dados do carregador como segundo resultado. | - -### p - -**Tipo:** Função. - -**Descrição:** - -Inspeciona as estruturas dos valores passados e imprime representações em string. - -**Assinatura:** - -```lua -p: function(...: any) -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ---- | ------------------------- | -| ... | any | Os valores a inspecionar. | - -### options - -**Tipo:** Campo. - -**Descrição:** - -As opções atuais do compilador. - -**Assinatura:** - -```lua -options: Config.Options -``` - -### traceback - -**Tipo:** Função. - -**Descrição:** - -A função traceback que reescreve os números das linhas do stack trace para os números das linhas originais no código YueScript. - -**Assinatura:** - -```lua -traceback: function(message: string): string -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ------------------------ | -| message | string | A mensagem de traceback. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ---------------------------------- | -| string | A mensagem de traceback reescrita. | - -### is_ast - -**Tipo:** Função. - -**Descrição:** - -Verifica se o código corresponde ao AST especificado. - -**Assinatura:** - -```lua -is_ast: function(astName: string, code: string): boolean -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | -------------- | -| astName | string | O nome do AST. | -| code | string | O código. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ------------------------------- | -| boolean | Se o código corresponde ao AST. | - -### AST - -**Tipo:** Campo. - -**Descrição:** - -A definição do tipo AST com nome, linha, coluna e subnós. - -**Assinatura:** - -```lua -type AST = {string, integer, integer, any} -``` - -### to_ast - -**Tipo:** Função. - -**Descrição:** - -Converte o código para o AST. - -**Assinatura:** - -```lua -to_ast: function(code: string, flattenLevel?: number, astName?: string, reserveComment?: boolean): - --[[AST]] AST | nil, - --[[error]] nil | string -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| -------------- | ------- | ------------------------------------------------------------------------------------------------------ | -| code | string | O código. | -| flattenLevel | integer | [Opcional] O nível de achatamento. Nível mais alto significa mais achatamento. Padrão é 0. Máximo é 2. | -| astName | string | [Opcional] O nome do AST. Padrão é "File". | -| reserveComment | boolean | [Opcional] Se deve preservar os comentários originais. Padrão é false. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ----------------------------------------------------------- | -| AST \| nil | O AST, ou nil se a conversão falhou. | -| string \| nil | A mensagem de erro, ou nil se a conversão foi bem-sucedida. | - -### format - -**Tipo:** Função. - -**Descrição:** - -Formata o código YueScript. - -**Assinatura:** - -```lua -format: function(code: string, tabSize?: number, reserveComment?: boolean): string -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| -------------- | ------- | --------------------------------------------------------------------- | -| code | string | O código. | -| tabSize | integer | [Opcional] O tamanho da tabulação. Padrão é 4. | -| reserveComment | boolean | [Opcional] Se deve preservar os comentários originais. Padrão é true. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ------------------- | -| string | O código formatado. | - -### \_\_call - -**Tipo:** Metamétodo. - -**Descrição:** - -Requer o módulo YueScript. -Reescreve o número da linha do erro para o número da linha original no código YueScript quando o carregamento falha. - -**Assinatura:** - -```lua -metamethod __call: function(self: yue, module: string): any... -``` - -**Parâmetros:** - -| Parâmetro | Tipo | Descrição | -| --------- | ------ | ----------------- | -| module | string | O nome do módulo. | - -**Retorna:** - -| Tipo de Retorno | Descrição | -| --------------- | ------------------ | -| any | O valor do módulo. | - -## Config - -**Descrição:** - -As opções de compilação do compilador. - -### lint_global - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve coletar as variáveis globais que aparecem no código. - -**Assinatura:** - -```lua -lint_global: boolean -``` - -### implicit_return_root - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve fazer retorno implícito para o bloco de código raiz. - -**Assinatura:** - -```lua -implicit_return_root: boolean -``` - -### reserve_line_number - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve preservar o número da linha original no código compilado. - -**Assinatura:** - -```lua -reserve_line_number: boolean -``` - -### reserve_comment - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve preservar os comentários originais no código compilado. - -**Assinatura:** - -```lua -reserve_comment: boolean -``` - -### space_over_tab - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve usar o caractere de espaço em vez do caractere de tabulação no código compilado. - -**Assinatura:** - -```lua -space_over_tab: boolean -``` - -### same_module - -**Tipo:** Campo. - -**Descrição:** - -Se o compilador deve tratar o código a ser compilado como o mesmo módulo que está sendo compilado atualmente. Apenas para uso interno. - -**Assinatura:** - -```lua -same_module: boolean -``` - -### line_offset - -**Tipo:** Campo. - -**Descrição:** - -Se a mensagem de erro do compilador deve incluir o deslocamento do número da linha. Apenas para uso interno. - -**Assinatura:** - -```lua -line_offset: integer -``` - -### yue.Config.LuaTarget - -**Tipo:** Enumeração. - -**Descrição:** - -A enumeração da versão alvo do Lua. - -**Assinatura:** - -```lua -enum LuaTarget - "5.1" - "5.2" - "5.3" - "5.4" - "5.5" -end -``` - -### options - -**Tipo:** Campo. - -**Descrição:** - -As opções extras a serem passadas para a função de compilação. - -**Assinatura:** - -```lua -options: Options -``` - -## Options - -**Descrição:** - -A definição das opções extras do compilador. - -### target - -**Tipo:** Campo. - -**Descrição:** - -A versão alvo do Lua para a compilação. - -**Assinatura:** - -```lua -target: LuaTarget -``` - -### path - -**Tipo:** Campo. - -**Descrição:** - -O caminho de busca de módulo extra. - -**Assinatura:** - -```lua -path: string -``` - -### dump_locals - -**Tipo:** Campo. - -**Descrição:** - -Se deve incluir as variáveis locais na mensagem de erro do traceback. Padrão é false. - -**Assinatura:** - -```lua -dump_locals: boolean -``` - -### simplified - -**Tipo:** Campo. - -**Descrição:** - -Se deve simplificar a mensagem de erro. Padrão é true. - -**Assinatura:** - -```lua -simplified: boolean -``` diff --git a/doc/yue-zh.md b/doc/yue-zh.md deleted file mode 100644 index e254ac54..00000000 --- a/doc/yue-zh.md +++ /dev/null @@ -1,3555 +0,0 @@ -# 月之脚本文档 - -欢迎来到 月之脚本(YueScript) 官方文档!
-这里收录了语言特性、用法、参考示例和资源。
-请选择左侧的章节索引或目录,开启你的月之脚本之旅 ☽ - -# do 语句 - -  当用作语句时,do 语句的作用就像在 Lua 中差不多。 - -```yuescript -do - var = "hello" - print var -print var -- 这里是nil -``` - -  月之脚本的 **do** 也可以用作表达式。允许你将多行代码的处理合并为一个表达式,并将 do 语句代码块的最后一个语句作为表达式返回的结果。 - -```yuescript -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```yuescript -tbl = { - key: do - print "分配键值!" - 1234 -} -``` - -  `do` 表达式支持通过 `break` 打断执行流并提前返回多个值。 - -```yuescript -status, value = do - n = 12 - if n > 10 - break "large", n - break "small", n -``` - -# 代码行修饰 - -  为了方便编写代码,循环语句和 if 语句可以应用于单行代码语句的末尾: - -```yuescript -print "你好,世界" if name == "Rob" -``` - -  修饰 for 循环的示例: - -```yuescript -print "项目: ", item for item in *items -``` - -  修饰 while 循环的示例: - -```yuescript -game\update! while game\isRunning! - -reader\parse_line! until reader\eof! -``` - -# 宏 - -## 常见用法 - -  宏函数用于在编译时执行一段代码来生成新的代码,并将生成的代码插入到最终编译结果中。 - -```yuescript -macro PI2 = -> math.pi * 2 -area = $PI2 * 5 - -macro HELLO = -> "'你好 世界'" -print $HELLO - -macro config = (debugging) -> - global debugMode = debugging == "true" - "" - -macro asserts = (cond) -> - debugMode and "assert #{cond}" or "" - -macro assert = (cond) -> - debugMode and "assert #{cond}" or "#{cond}" - -$config true -$asserts item ~= nil - -$config false -value = $assert item - --- 宏函数参数传递的表达式会被转换为字符串 -macro and = (...) -> "#{ table.concat {...}, ' and ' }" -if $and f1!, f2!, f3! - print "OK" -``` - -## 直接插入代码 - -  宏函数可以返回一个包含月之脚本代码的字符串,或是一个包含 Lua 代码字符串的配置表。 - -```yuescript -macro yueFunc = (var) -> "local #{var} = ->" -$yueFunc funcA -funcA = -> "无法访问宏生成月之脚本里定义的变量" - -macro luaFunc = (var) -> { - code: "local function #{var}() end" - type: "lua" -} -$luaFunc funcB -funcB = -> "无法访问宏生成 Lua 代码里定义的变量" - -macro lua = (code) -> { - :code - type: "lua" -} - --- raw字符串的开始和结束符号会自动被去除了再传入宏函数 -$lua[==[ --- 插入原始Lua代码 -if cond then - print("输出") -end -]==] -``` - -## 导出宏 - -  宏函数可以从一个模块中导出,并在另一个模块中导入。你必须将导出的宏函数放在一个单独的文件中使用,而且只有宏定义、宏导入和宏展开可以放入这个宏导出模块中。 - -```yuescript --- 文件: utils.yue -export macro map = (items, action) -> "[#{action} for _ in *#{items}]" -export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" -export macro foreach = (items, action) -> "for _ in *#{items} - #{action}" - --- 文件 main.yue -import "utils" as { - $, -- 表示导入所有宏的符号 - $foreach: $each -- 重命名宏 $foreach 为 $each -} -[1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ -``` - -## 内置宏 - -  月之脚本中有一些内置可以直接使用的宏,但你可以通过声明相同名称的宏来覆盖它们。 - -```yuescript -print $FILE -- 获取当前模块名称的字符串 -print $LINE -- 获取当前代码行数:2 -``` - -## 用宏生成宏 - -  在月之脚本中,宏函数允许你在编译时生成代码。通过嵌套的宏函数,你可以创建更复杂的生成模式。这个特性允许你定义一个宏函数,用它来生成另一个宏函数,从而实现更加动态的代码生成。 - -```yuescript -macro Enum = (...) -> - items = {...} - itemSet = {item, true for item in *items} - (item) -> - error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item] - "\"#{item}\"" - -macro BodyType = $Enum( - Static - Dynamic - Kinematic -) - -print "有效的枚举类型:", $BodyType Static --- print "编译报错的枚举类型:", $BodyType Unknown -``` - -## 生成多行代码 - -  当宏返回多行 Yue 代码时,不推荐使用带引号的多行字符串,建议优先使用 `-> |`。 - -  带引号的字符串会按字面保留文本;而 YAML 风格多行字符串会移除公共前导缩进。对宏生成的 Yue 代码来说,这通常能让代码块结构更稳定,尤其是在生成代码里包含注释或嵌套块时。 - -```yuescript -macro default_conf = (conf) -> " - -- useful; only set once -#{conf}.identity = 'LOVE' -#{conf}.version = \"11.5\" - " - -love.conf = (t) -> - $default_conf t -``` - -```yuescript -macro default_conf = (conf) -> | - -- useful; only set once - #{conf}.identity = 'LOVE' - #{conf}.version = "11.5" - -love.conf = (t) -> - $default_conf t -``` - -## 宏参数检查 - -  可以直接在参数列表中声明期望的 AST 节点类型,并在编译时检查传入的宏参数是否符合预期。 - -```yuescript -macro printNumAndStr = (num `Num, str `String) -> | - print( - #{num} - #{str} - ) - -$printNumAndStr 123, "hello" -``` - -  如果需要做更加灵活的参数检查操作,可以使用内置的 `$is_ast` 宏函数在合适的位置进行手动检查。 - -```yuescript -macro printNumAndStr = (num, str) -> - error "expected Num as first argument" unless $is_ast Num, num - error "expected String as second argument" unless $is_ast String, str - "print(#{num}, #{str})" - -$printNumAndStr 123, "hello" -``` - -  更多关于可用 AST 节点的详细信息,请参考 [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp) 中大写的规则定义。 - -## 注解语句 - -  注解语句会把一个宏应用到它后面的那条语句上。 - -  这等价于调用该宏,并把后面那条语句的源码作为最后一个参数附加进去。 - -```yuescript -macro ShowName = (code) -> | - print "#{code\match '^[%w_]*'}" - -$[ShowName] -myFunc = -> - -return -``` - -  如果注解宏返回的是配置表,可选字段 `before` 可以控制生成结果插入到被注解语句之前还是之后。 - -```yuescript -macro Tag = (tag, code) -> - tableName = code\match "^[%w_]+" - return - type: "text" - before: tag == "before" - code: "-- #{tag}:#{tableName}" - -$[Tag before] -tableA = {} - -$[Tag after] -tableB = {} - -return -``` - -  由于后面的语句会作为额外的宏参数传入,注解也可以从类声明生成注册代码。它同样可以使用普通宏支持的 AST 参数检查。 - -```yuescript -macro Register = (registry, code`ClassDecl) -> - className = code\match "^class%s+(%w+)" - return | - #{registry}["#{className}"] = #{className} - -registry = {} - -$[Register(registry)] -class Worker - run: => "ok" - -return -``` - -  注解也可以用来给函数注入包装代码。 - -```yuescript -macro ValidateNumberArgs = (code) -> - funcName = code\match "^(%w+)%s*=" - return | - local __orig_#{funcName} = #{funcName} - #{funcName} = (...) -> - for i = 1, select "#", ... - assert type(select i, ...) == "number", "expected number for arg \#{i}" - __orig_#{funcName} ... - -$[ValidateNumberArgs] -add = (a, b) -> a + b -``` - -  注解后面必须紧跟一条语句,而且不能作用在 `return` 语句上。如果被注解的语句正好位于代码块末尾,而你又需要拿到原始的语句 AST 形态,就需要额外补一个显式的 `return`,避免它被隐式返回表达式包起来。 - -# 错误处理 - -  用于统一进行 Lua 错误处理的便捷语法。 - -```yuescript -try - func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try - func 1, 2, 3 -catch err - yue.traceback err - -try func 1, 2, 3 -catch err - print yue.traceback err - -success, result = try func 1, 2, 3 - -try - print "尝试中" - func 1, 2, 3 - --- 使用if赋值模式 -if success, result := try func 1, 2, 3 -catch err - print yue.traceback err - print result -``` - -## 错误处理简化 - -  `try?` 是 `try` 的功能简化语法,它不再返回 `try` 语句的布尔状态,并在成功时直接返回 `try` 代码块的结果,失败时返回 `nil` 值而非错误对象。 - -```yuescript -a, b, c = try? func! - --- 与空值合并运算符一起使用 -a = (try? func!) ?? "default" - --- 作为函数参数 -f try? func! - --- 带 catch 块的 try! -f try? - print 123 - func! -catch e - print e - e -``` - -# 表格字面量 - -  和 Lua 一样,表格可以通过花括号进行定义。 - -```yuescript -some_values = {1, 2, 3, 4} -``` - -  但与Lua不同的是,给表格中的键赋值是用 **:**(而不是 **=**)。 - -```yuescript -some_values = { - name: "Bill", - age: 200, - ["favorite food"]: "rice" -} -``` - -  如果只分配一个键值对的表格,可以省略花括号。 - -```yuescript -profile = - height: "4英尺", - shoe_size: 13, - favorite_foods: ["冰淇淋", "甜甜圈"] -``` - -  可以使用换行符而不使用逗号(或两者都用)来分隔表格中的值: - -```yuescript -values = { - 1, 2, 3, 4 - 5, 6, 7, 8 - name: "超人" - occupation: "打击犯罪" -} -``` - -  创建单行表格字面量时,也可以省略花括号: - -```yuescript -my_function dance: "探戈", partner: "无" - -y = type: "狗", legs: 4, tails: 1 -``` - -  表格字面量的键可以使用 Lua 语言的关键字,而无需转义: - -```yuescript -tbl = { - do: "某事" - end: "饥饿" -} -``` - -  如果你要构造一个由变量组成的表,并希望键与变量名相同,那么可以使用 **:** 前缀操作符: - -```yuescript -hair = "金色" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -  如果你希望表中字段的键是某个表达式的结果,那么可以用 **[ ]** 包裹它,就像在 Lua 中一样。如果键中有任何特殊字符,也可以直接使用字符串字面量作为键,省略方括号。 - -```yuescript -t = { - [1 + 2]: "你好" - "你好 世界": true -} -``` - -  Lua 的表同时具有数组部分和哈希部分,但有时候你会希望在书写 Lua 表时,对 Lua 表做数组和哈希不同用法的语义区分。然后你可以用 **[ ]** 而不是 **{ }** 来编写表示数组的 Lua 表,并且不允许在数组 Lua 表中写入任何键值对。 - -```yuescript -some_values = [ 1, 2, 3, 4 ] -list_with_one_element = [ 1, ] -``` - -# 推导式 - -  推导式为我们提供了一种便捷的语法,通过遍历现有对象并对其值应用表达式来构造出新的表格。月之脚本有两种推导式:列表推导式和表格推导式。它们最终都是产生 Lua 表格;列表推导式将值累积到类似数组的表格中,而表格推导式允许你在每次遍历时设置新表格的键和值。 - -## 列表推导式 - -  以下操作创建了一个 items 表的副本,但所有包含的值都翻倍了。 - -```yuescript -items = [1, 2, 3, 4] -doubled = [item * 2 for i, item in ipairs items] -``` - -  可以使用 `when` 子句筛选新表中包含的项目: - -```yuescript -slice = [item for i, item in ipairs items when i > 1 and i < 3] -``` - -  因为我们常常需要迭代数值索引表的值,所以引入了 **\*** 操作符来做语法简化。doubled 示例可以重写为: - -```yuescript -doubled = [item * 2 for item in *items] -``` - -  在列表推导式中,你还可以使用展开操作符 `...` 来实现对列表嵌套层级进行扁平化的处理: - -```yuescript -data = - a: [1, 2, 3] - b: [4, 5, 6] - -flat = [...v for k,v in pairs data] --- flat 现在为 [1, 2, 3, 4, 5, 6] -``` - -  for 和 when 子句可以根据需要进行链式操作。唯一的要求是推导式中至少要有一个 for 子句。 - -  使用多个 for 子句与使用多重循环的效果相同: - -```yuescript -x_coords = [4, 5, 6, 7] -y_coords = [9, 2, 3] - -points = [ [x, y] for x in *x_coords \ -for y in *y_coords] -``` - -  在推导式中也可以使用简单的数值 for 循环: - -```yuescript -evens = [i for i = 1, 100 when i % 2 == 0] -``` - -## 表格推导式 - -  表格推导式和列表推导式的语法非常相似,只是要使用 **{** 和 **}** 并从每次迭代中取两个值。 - -  以下示例生成了表格 thing 的副本: - -```yuescript -thing = { - color: "red" - name: "fast" - width: 123 -} - -thing_copy = {k, v for k, v in pairs thing} -``` - -```yuescript -no_color = {k, v for k, v in pairs thing when k != "color"} -``` - -  **\*** 操作符在表格推导式中能使用。在下面的例子里,我们为几个数字创建了一个平方根查找表。 - -```yuescript -numbers = [1, 2, 3, 4] -sqrts = {i, math.sqrt i for i in *numbers} -``` - -  表格推导式中的键值元组也可以来自单个表达式,在这种情况下,表达式在计算后应返回两个值。第一个用作键,第二个用作值: - -  在下面的示例中,我们将一些数组转换为一个表,其中每个数组里的第一项是键,第二项是值。 - -```yuescript -tuples = [ ["hello", "world"], ["foo", "bar"]] -tbl = {unpack tuple for tuple in *tuples} -``` - -## 切片 - -  当使用 **\*** 操作符时,月之脚本还提供了一种特殊的语法来限制要遍历的列表范围。这个语法也相当于在 for 循环中设置迭代边界和步长。 - -  下面的案例中,我们在切片中设置最小和最大边界,取索引在 1 到 5 之间(包括 1 和 5)的所有项目: - -```yuescript -slice = [item for item in *items[1, 5]] -``` - -  切片的任意参数都可以省略,并会使用默认值。在如下示例中,如果省略了最大索引边界,它默认为表的长度。使下面的代码取除第一个元素之外的所有元素: - -```yuescript -slice = [item for item in *items[2,]] -``` - -  如果省略了最小边界,便默认会设置为 1。这里我们只提供一个步长,并留下其他边界为空。这样会使得代码取出所有奇数索引的项目:(1, 3, 5, …) - -```yuescript -slice = [item for item in *items[,,2]] -``` - -  最小和最大边界都可以是负数,使用负数意味着边界是从表的末尾开始计算的。 - -```yuescript --- 取最后4个元素 -slice = [item for item in *items[-4,-1]] -``` - -  切片的步长也可以是负数,这意味着元素会以相反的顺序被取出。 - -```yuescript -reverse_slice = [item for item in *items[-1,1,-1]] -``` - -### 切片表达式 - -  切片也可以作为表达式来使用。可以用于获取一个表包含的子列表。 - -```yuescript --- 取第2和第4个元素作为新的列表 -sub_list = items[2, 4] - --- 取最后4个元素作为新的列表 -last_four_items = items[-4, -1] -``` - -# 面向对象编程 - -  在以下的示例中,月之脚本生成的 Lua 代码可能看起来会很复杂。所以最好主要关注月之脚本代码层面的意义,然后如果你想知道关于面向对象功能的实现细节,再查看 Lua 代码。 - -  一个简单的类: - -```yuescript -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -  在月之脚本中采用面向对象的编程方式时,通常会使用类声明语句结合 Lua 表格字面量来做类定义。这个类的定义包含了它的所有方法和属性。在这种结构中,键名为 “new” 的成员扮演了一个重要的角色,是作为构造函数来使用。 - -  值得注意的是,类中的方法都采用了粗箭头函数语法。当在类的实例上调用方法时,该实例会自动作为第一个参数被传入,因此粗箭头函数用于生成一个名为 “self” 的参数。 - -  此外,“@” 前缀在变量名上起到了简化作用,代表 “self”。例如,`@items` 就等同于 `self.items`。 - -  类定义块中也支持通过尖括号写元方法字段,例如 ``。 - -```yuescript -class User - new: (@name) => - : => "User(#{@name})" - -print tostring User "Yue" -``` - -  为了创建类的一个新实例,可以将类名当作一个函数来调用,这样就可以生成并返回一个新的实例。 - -```yuescript -inv = Inventory! -inv\add_item "t-shirt" -inv\add_item "pants" -``` - -  在月之脚本的类中,由于需要将类的实例作为参数传入到调用的方法中,因此使用了 **\\** 操作符做类的成员函数调用。 - -  需要特别注意的是,类的所有属性在其实例之间是共享的。这对于函数类型的成员属性通常不会造成问题,但对于其他类型的属性,可能会导致意外的结果。 - -  例如,在下面的示例中,clothes 属性在所有实例之间共享。因此,对这个属性在一个实例中的修改,将会影响到其他所有实例。 - -```yuescript -class Person - clothes: [] - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "pants" -b\give_item "shirt" - --- 会同时打印出裤子和衬衫 -print item for item in *a.clothes -``` - -  避免这个问题的正确方法是在构造函数中创建对象的可变状态: - -```yuescript -class Person - new: => - @clothes = [] -``` - -## 继承 - -  `extends` 关键字可以在类声明中使用,以继承另一个类的属性和方法。 - -```yuescript -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "背包已满" - super name -``` - -  在这一部分,我们对月之脚本中的 `Inventory` 类进行了扩展,加入了对可以携带物品数量的限制。 - -  在这个特定的例子中,子类并没有定义自己的构造函数。因此,当创建一个新的实例时,系统会默认调用父类的构造函数。但如果我们在子类中定义了构造函数,我们可以利用 `super` 方法来调用并执行父类的构造函数。 - -  此外,当一个类继承自另一个类时,它会尝试调用父类上的 `__inherited` 方法(如果这个方法存在的话),以此来向父类发送通知。这个 `__inherited` 函数接受两个参数:被继承的父类和继承的子类。 - -```yuescript -class Shelf - @__inherited: (child) => - print @__name, "被", child.__name, "继承" - --- 将打印: Shelf 被 Cupboard 继承 -class Cupboard extends Shelf -``` - -## super 关键字 - -  `super` 是一个特别的关键字,它有两种不同的使用方式:既可以当作一个对象来看待,也可以像调用函数那样使用。它仅在类的内部使用时具有特殊的功能。 - -  当 `super` 被作为一个函数调用时,它将调用父类中与之同名的函数。此时,当前的 `self` 会自动作为第一个参数传递,正如上面提到的继承示例所展示的那样。 - -  在将 `super` 当作普通值使用时,它实际上是对父类对象的引用。通过这种方式,我们可以访问父类中可能被子类覆盖的值,就像访问任何普通对象一样。 - -  此外,当使用 `\` 操作符与 `super` 一起使用时,`self`将被插入为第一个参数,而不是使用 `super` 本身的值。而在使用`.`操作符来检索函数时,则会返回父类中的原始函数。 - -  下面是一些使用 `super` 的不同方法的示例: - -```yuescript -class MyClass extends ParentClass - a_method: => - -- 以下效果相同: - super "你好", "世界" - super\a_method "你好", "世界" - super.a_method self, "你好", "世界" - - -- super 作为值等于父类: - assert super == ParentClass -``` - -  **super** 也可以用在函数存根的左侧。唯一的主要区别是,生成的函数不是绑定到 super 的值,而是绑定到 self。 - -## 类型 - -  每个类的实例都带有它的类型。这存储在特殊的 \_\_class 属性中。此属性会保存类对象。类对象是我们用来构建新实例的对象。我们还可以索引类对象以检索类方法和属性。 - -```yuescript -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- 打印 10 -``` - -## 类对象 - -  在月之脚本中,当我们编写类的定义语句时,实际上是在创建一个类对象。这个类对象被保存在一个与该类同名的变量中。 - -  类对象具有函数的特性,可以被调用来创建新的实例。这正是我们在之前示例中所展示的创建类实例的方式。 - -  一个类由两个表构成:类表本身和一个基表。基表作为所有实例的元表。在类声明中列出的所有属性都存放在基表中。 - -  如果在类对象的元表中找不到某个属性,系统会从基表中检索该属性。这就意味着我们可以直接从类本身访问到其方法和属性。 - -  需要特别注意的是,对类对象的赋值并不会影响到基表,因此这不是向实例添加新方法的正确方式。相反,需要直接修改基表。关于这点,可以参考下面的 “\_\_base” 字段。 - -  此外,类对象包含几个特殊的属性:当类被声明时,类的名称会作为一个字符串存储在类对象的 “\_\_name” 字段中。 - -```yuescript -print BackPack.__name -- 打印 Backpack -``` - -  基础对象被保存在一个名为 `__base` 的特殊表中。我们可以编辑这个表,以便为那些已经创建出来的实例和还未创建的实例增加新的功能。 - -  另外,如果一个类是从另一个类派生而来的,那么其父类对象则会被存储在名为 `__parent` 的地方。这种机制允许在类之间实现继承和功能扩展。 - -## 类变量 - -  我们可以直接在类对象中创建变量,而不是在类的基对象中,通过在类声明中的属性名前使用 @。 - -```yuescript -class Things - @some_func: => print "Hello from", @__name - -Things\some_func! - --- 类变量在实例中不可见 -assert Things().some_func == nil -``` - -  在表达式中,我们可以使用 @@ 来访问存储在 `self.__class` 中的值。因此,`@@hello` 是 `self.__class.hello` 的简写。 - -```yuescript -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- 输出 2 -``` - -  @@ 的调用语义与 @ 类似。调用 @@ 时,会使用 Lua 的冒号语法将类作为第一个参数传入。 - -```yuescript -@@hello 1,2,3,4 -``` - -## 类声明语句 - -  在类声明的主体中,除了键/值对外,我们还可以编写普通的表达式。在这种类声明体中的普通代码的上下文中,self 等于类对象,而不是实例对象。 - -  以下是创建类变量的另一种方法: - -```yuescript -class Things - @class_var = "hello world" -``` - -  这些表达式会在所有属性被添加到类的基对象后执行。 - -  在类的主体中声明的所有变量都会限制作用域只在类声明的范围。这对于放置只有类方法可以访问的私有值或辅助函数很方便: - -```yuescript -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "hello world: " .. secret -``` - -## @ 和 @@ 值 - -  当 @ 和 @@ 前缀在一个名字前时,它们分别代表在 self 和 self.\_\_class 中访问的那个名字。 - -  如果它们单独使用,它们是 self 和 self.\_\_class 的别名。 - -```yuescript -assert @ == self -assert @@ == self.__class -``` - -  例如,使用 @@ 从实例方法快速创建同一类的新实例的方法: - -```yuescript -some_instance_method = (...) => @@ ... -``` - -## 构造属性提升 - -  为了减少编写简单值对象定义的代码。你可以这样简单写一个类: - -```yuescript -class Something - new: (@foo, @bar, @@biz, @@baz) => - --- 这是以下声明的简写形式 - -class Something - new: (foo, bar, biz, baz) => - @foo = foo - @bar = bar - @@biz = biz - @@baz = baz -``` - -  你也可以使用这种语法为一个函数初始化传入对象的字段。 - -```yuescript -new = (@fieldA, @fieldB) => @ -obj = new {}, 123, "abc" -print obj -``` - -## 类表达式 - -  类声明的语法也可以作为一个表达式使用,可以赋值给一个变量或者被返回语句返回。 - -```yuescript -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -## 匿名类 - -  声明类时可以省略名称。如果类的表达式不在赋值语句中,\_\_name 属性将为 nil。如果出现在赋值语句中,赋值操作左侧的名称将代替 nil。 - -```yuescript -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -  你甚至可以省略掉主体,这意味着你可以这样写一个空白的匿名类: - -```yuescript -x = class -``` - -## 类混合 - -  你可以通过使用 `using` 关键字来实现类混合。这意味着你可以从一个普通 Lua 表格或已定义的类对象中,复制函数到你创建的新类中。当你使用普通 Lua 表格进行类混合时,你有机会用自己的实现来重写类的索引方法(例如元方法 `__index`)。然而,当你从一个类对象做混合时,需要注意的是该类对象的元方法将不会被复制到新类。 - -```yuescript -MyIndex = __index: var: 1 - -class X using MyIndex - func: => - print 123 - -x = X! -print x.var - -class Y using X - -y = Y! -y\func! - -assert y.__class.__parent ~= X -- X 不是 Y 的父类 -``` - -# with 语句 - -在编写 Lua 代码时,我们在创建对象后的常见操作是立即调用这个对象一系列操作函数并设置一系列属性。 - -这导致在代码中多次重复引用对象的名称,增加了不必要的文本噪音。一个常见的解决方案是在创建对象时,在构造函数传入一个表,该表包含要覆盖设置的键和值的集合。这样做的缺点是该对象的构造函数必须支持这种初始化形式。 - -with 块有助于简化编写这样的代码。在 with 块内,我们可以使用以 . 或 \ 开头的特殊语句,这些语句代表我们正在使用的对象的操作。 - -例如,我们可以这样处理一个新创建的对象: - -```yuescript -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -with 语句也可以用作一个表达式,并返回它的代码块正在处理的对象。 - -```yuescript -file = with File "favorite_foods.txt" - \set_encoding "utf8" -``` - -`with` 表达式支持 `break` 返回一个值: - -```yuescript -result = with obj - break .value -``` - -在 `with` 中使用 `break value` 后,`with` 表达式将不再返回其目标对象,而是返回 `break` 给出的值。 - -```yuescript -a = with obj - .x = 1 --- a 是 obj - -b = with obj - break .x --- b 是 .x,不是 obj -``` - -与 `for` / `while` / `repeat` / `do` 不同,`with` 只支持一个 break 返回值。 - -或者… - -```yuescript -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", [dad, mother, sister] -``` - -在此用法中,with 可以被视为K组合子(k-combinator)的一种特殊形式。 - -如果你想给表达式另外起一个名称的话,with 语句中的表达式也可以是一个赋值语句。 - -```yuescript -with str := "你好" - print "原始:", str - print "大写:", \upper! -``` - -你可以在 `with` 语句中使用 `[]` 访问特殊键。 - -```yuescript -with tb - [1] = 1 - print [2] - with [abc] - [3] = [2]\func! - ["key-name"] = value - [] = "abc" -- 追加到 "tb" -``` - -`with?` 是 `with` 语法的一个增强版本,引入了存在性检查,用于在不显式判空的情况下安全访问可能为 nil 的对象。 - -```yuescript -with? obj - print .name -``` - -# 赋值 - -  月之脚本中定义的变量是动态类型的,并默认为局部变量。但你可以通过 **local** 和 **global** 声明来改变声明变量的作用范围。 - -```yuescript -hello = "world" -a, b, c = 1, 2, 3 -hello = 123 -- 访问现有的变量 -``` - -## 执行更新 - -  你可以使用各式二进制运算符执行更新赋值。 - -```yuescript -x = 1 -x += 1 -x -= 1 -x *= 10 -x /= 10 -x %= 10 -s ..= "world" -- 如果执行更新的局部变量不存在,将新建一个局部变量 -arg or= "默认值" -``` - -## 链式赋值 - -  你可以进行链式赋值,将多个项目赋予相同的值。 - -```yuescript -a = b = c = d = e = 0 -x = y = z = f! -``` - -## 显式声明局部变量 - -```yuescript -do - local a = 1 - local * - print "预先声明后续所有变量为局部变量" - x = -> 1 + y + z - y, z = 2, 3 - global instance = Item\new! - -do - local X = 1 - local ^ - print "只预先声明后续大写的变量为局部变量" - a = 1 - B = 2 -``` - -## 显式声明全局变量 - -```yuescript -do - global a = 1 - global * - print "预先声明所有变量为全局变量" - x = -> 1 + y + z - y, z = 2, 3 - -do - global x = 1 - global ^ - print "只预先声明大写的变量为全局变量" - a = 1 - B = 2 - local Temp = "一个局部值" -``` - -# 可变参数赋值 - -  你可以将函数返回的结果赋值给一个可变参数符号 `...`。然后使用 Lua 的方式访问其内容。 - -```yuescript -list = [1, 2, 3, 4, 5] -fn = (ok) -> ok, table.unpack list -ok, ... = fn true -count = select '#', ... -first = select 1, ... -print ok, count, first -``` - -# If 赋值 - -  `if` 和 `elseif` 代码块可以在条件表达式的位置进行赋值。在代码执行到要计算条件时,会首先进行赋值计算,并使用赋与的值作为分支判断的条件。赋值的变量仅在条件分支的代码块内有效,这意味着如果值不是真值,那么它就不会被用到。注意,你必须使用“海象运算符” `:=` 而不是 `=` 来做赋值。 - -```yuescript -if user := database.find_user "moon" - print user.name -``` - -```yuescript -if hello := os.getenv "hello" - print "你有 hello", hello -elseif world := os.getenv "world" - print "你有 world", world -else - print "什么都没有 :(" -``` - -  使用多个返回值的 If 赋值。只有第一个值会被检查,其他值都有同样的作用域。 - -```yuescript -if success, result := pcall -> "无报错地获取结果" - print result -- 变量 result 是有作用域的 -print "好的" -``` - -## While 赋值 - -  你可以在 while 循环中同样使用赋值来获取循环条件的值。 - -```yuescript -while byte := stream\read_one! - -- 对 byte 做一些操作 - print byte -``` - -# 解构赋值 - -  解构赋值是一种快速从 Lua 表中按名称或基于数组中的位置提取值的方法。 - -  通常当你看到一个字面量的 Lua 表,比如 `{1,2,3}`,它位于赋值的右侧,因为它是一个值。解构赋值语句的写法就是交换了字面量 Lua 表的角色,并将其放在赋值语句的左侧。 - -  最好是通过示例来解释。以下是如何从表格中解包前两个值的方法: - -```yuescript -thing = [1, 2] - -[a, b] = thing -print a, b -``` - -  在解构表格字面量中,键代表从右侧读取的键,值代表读取的值将被赋予的名称。 - -```yuescript -obj = { - hello: "world" - day: "tuesday" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day - -:day = obj -- 可以不带大括号进行简单的解构 -``` - -  这也适用于嵌套的数据结构: - -```yuescript -obj2 = { - numbers: [1,2,3,4] - properties: { - color: "green" - height: 13.5 - } -} - -{numbers: [first, second], properties: {color: color}} = obj2 -print first, second, color -``` - -  如果解构语句很复杂,也可以任意将其分散在几行中。稍微复杂一些的示例: - -```yuescript -{ - numbers: [first, second] - properties: { - color: color - } -} = obj2 -``` - -  有时候我们会需要从 Lua 表中提取值并将它们赋给与键同名的局部变量。为了避免编写重复代码,我们可以使用 **:** 前缀操作符: - -```yuescript -{:concat, :insert} = table -``` - -  这样的用法与导入语法有些相似。但我们可以通过混合语法重命名我们想要提取的字段: - -```yuescript -{:mix, :max, random: rand} = math -``` - -  在进行解构时,你可以指定默认值,如: - -```yuescript -{:name = "nameless", :job = "jobless"} = person -``` - -  在进行列表解构时,你可以使用`_`作为占位符: - -```yuescript -[_, two, _, four] = items -``` - -## 范围解构 - -  你可以使用展开运算符 `...` 在列表解构中来捕获一个范围的值到子列表中。这在当你想要从列表的开头和结尾提取特定元素,同时收集中间的元素时非常有用。 - -```yuescript -orders = ["first", "second", "third", "fourth", "last"] -[first, ...bulk, last] = orders -print first -- 打印: first -print bulk -- 打印: {"second", "third", "fourth"} -print last -- 打印: last -``` - -  展开运算符可以用在不同的位置来捕获不同的范围,并且你可以使用 `_` 作为占位符来表示你想跳过对应范围的捕获: - -```yuescript --- 捕获第一个元素之后的所有元素 -[first, ...rest] = orders - --- 捕获最后一个元素之前的所有元素 -[...start, last] = orders - --- 跳过中间的元素,只捕获第一个和最后一个元素 -[first, ..._, last] = orders -``` - -## 在其它地方的解构赋值 - -  解构赋值也可以出现在其它隐式进行赋值的地方。一个例子是用在 for 循环中: - -```yuescript -tuples = [ - ["hello", "world"] - ["egg", "head"] -] - -for [left, right] in *tuples - print left, right -``` - -  我们知道数组表中的每个元素都是一个两项的元组,所以我们可以直接在 for 语句的名称子句中使用解构来解包它。 - -# 使用 using 语句:防止破坏性赋值 - -  Lua 的变量作用域是降低代码复杂度的重要工具。然而,随着代码量的增加,维护这些变量可能变得更加困难。比如,看看下面的代码片段: - -```yuescript -i = 100 - --- 许多代码行... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- 将打印 0 -``` - -  在 `my_func` 中,我们不小心覆盖了变量 `i` 的值。虽然在这个例子中这个问题很明显,但在一个庞大的或者是由多人共同维护的代码库中,很难追踪每个变量的声明情况。 - -  如果我们可以明确指出哪些变量是我们想在当前作用域内修改的,并且防止我们不小心更改了其他作用域中同名的变量,那将大有裨益。 - -  `using` 语句就是为此而生。`using nil` 确保函数内部的赋值不会意外地影响到外部作用域的变量。我们只需将 `using` 子句放在函数的参数列表之后;若函数没有参数,则直接放在括号内即可。 - -```yuescript -i = 100 - -my_func = (using nil) -> - i = "hello" -- 这里创建了一个新的局部变量 - -my_func! -print i -- 打印 100,i 没有受到影响 -``` - -  using子句中可以填写多个用逗号分隔名称。指定可以访问和修改的外部变量的名称: - -```yuescript -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k, i) -> - tmp = tmp + add -- 创建了一个新的局部tmp - i += tmp - k += tmp - -my_func(22) -print i, k -- 这些已经被更新 -``` - -# 使用方法 - -## Lua 模块 - -  在 Lua 中使用月之脚本模块: - -- **用法 1** - -   在 Lua 中引入 "你的脚本入口文件.yue"。 - - ```lua - require("yue")("你的脚本入口文件") - ``` - -   当你在同一路径下把 "你的脚本入口文件.yue" 编译成了 "你的脚本入口文件.lua" 时,仍然可以使用这个代码加载 .lua 代码文件。在其余的月之脚本文件中,只需正常使用 **require** 或 **import** 进行脚本引用即可。错误消息中的代码行号也会被正确处理。 - -- **用法 2** - -   手动引入月之脚本模块并重写错误消息来帮助调试。 - - ```lua - local yue = require("yue") - yue.insert_loaders() - local success, result = xpcall(function() - return require("yuescript_module_name") - end, function(err) - return yue.traceback(err) - end) - ``` - -- **用法 3** - -   在 Lua 中使用月之脚本编译器功能。 - - ```lua - local yue = require("yue") - local codes, err, globals = yue.to_lua([[ - f = -> - print "hello world" - f! - ]],{ - implicit_return_root = true, - reserve_line_number = true, - lint_global = true, - space_over_tab = false, - options = { - target = "5.4", - path = "/script" - } - }) - ``` - -## 月之脚本编译工具 - -  使用月之脚本编译工具: - -```shell -> yue -h -命令行用法: yue - [选项] [<文件/目录>] ... - yue -e <代码或文件> [参数...] - yue -w [<目录>] [选项] - yue - - -说明: - - '-' 或 '--' 必须作为唯一且第一个参数,用于读取标准输入。 - - '-o/--output' 不能与多个输入文件一起使用。 - - '-w/--watch' 仅能用于目录,不能用于单个文件。 - - 使用 '-e/--execute' 时,后续的参数将作为脚本参数传递。 - -选项: - -h, --help 显示帮助信息并退出 - -e <字符串>, --execute <字符串> 执行文件或原始代码 - -m, --minify 生成压缩(最小化)代码 - -r, --rewrite 重写输出以匹配原始代码行号 - -t <目标路径>, --output-to <目标路径> - 指定编译后文件的输出路径 - -o <文件>, --output <文件> 将输出写入文件 - -p, --print 输出到标准输出 - -b, --benchmark 输出编译耗时(不写入文件) - -g, --globals 显示用到的全局变量及其所在的名称、行号、列号 - -s, --spaces 用空格代替制表符(tab)输出代码 - -l, --line-numbers 输出源代码的行号 - -j, --no-implicit-return 禁用文件末尾的隐式返回 - -c, --reserve-comments 保留源代码中的注释 - -w [<目录>], --watch [<目录>] - 监视目录变化并自动编译 - -v, --version 显示版本信息 - - 从标准输入读取,输出到标准输出(仅能作为唯一参数) - -- 等同于 '-',为兼容旧版本保留 - - --target <版本> 指定生成代码的 Lua 版本 (只能为 5.1 ~ 5.5) - --path <路径字符串> 附加一个 Lua 搜索路径到 package.path - --<键>=<值> 以 key=value 形式传递编译器选项(保持已有用法) - - 不带选项直接运行可进入交互模式(REPL),在交互模式里输入单独的符号 '$' - 可用于开始或结束多行模式。 -``` - -  使用案例: - -  递归编译当前路径下扩展名为 **.yue** 的每个月之脚本文件: **yue .** - -  编译并将结果保存到目标路径: **yue -t /target/path/ .** - -  编译并保留调试信息: **yue -l .** - -  编译并生成压缩代码: **yue -m .** - -  直接执行代码: **yue -e 'print 123'** - -  执行一个月之脚本文件: **yue -e main.yue** - -# 介绍 - -月之脚本(YueScript)是一种动态语言,可以编译为 Lua。它是 [MoonScript](https://github.com/leafo/moonscript) 的方言。用月之脚本编写的代码既有表现力又非常简洁。它适合编写一些更易于维护的代码,并在嵌入 Lua 的环境中运行,如游戏或网站服务器。 - -Yue(月)是中文中“月亮”的名称。 - -## 月之脚本概览 - -```yuescript --- 导入语法 -import p, to_lua from "yue" - --- 隐式对象 -inventory = - equipment: - - "sword" - - "shield" - items: - - name: "potion" - count: 10 - - name: "bread" - count: 3 - --- 列表推导 -map = (arr, action) -> - [action item for item in *arr] - -filter = (arr, cond) -> - [item for item in *arr when cond item] - -reduce = (arr, init, action): init -> - init = action init, item for item in *arr - --- 管道操作符 -[1, 2, 3] - |> map (x) -> x * 2 - |> filter (x) -> x > 4 - |> reduce 0, (a, b) -> a + b - |> print - --- 元表操作 -apple = - size: 15 - : - color: 0x00ffff - -with apple - p .size, .color, . if .<>? - --- 类似js的导出语法 -export 🌛 = "月之脚本" -``` - -## 关于 Dora SSR - -月之脚本是与开源游戏引擎 [Dora SSR](https://github.com/IppClub/Dora-SSR) 一起开发和维护的。它已被用于创建引擎工具、游戏原型和演示,在实际的游戏项目中验证其能力,同时它也帮助增强了 Dora SSR 游戏引擎的开发体验。 - -# 安装 - -## Lua 模块 - - 安装 [luarocks](https://luarocks.org),一个 Lua 模块的包管理器。然后作为 Lua 模块和可执行文件安装它: - -```shell -luarocks install yuescript -``` - - 或者你可以自己构建 `yue.so` 文件: - -```shell -make shared LUAI=/usr/local/include/lua LUAL=/usr/local/lib/lua -``` - - 然后从路径 **bin/shared/yue.so** 获取二进制文件。 - -## 构建二进制工具 - - 克隆项目仓库,然后构建并安装可执行文件: - -```shell -make install -``` - - 构建不带宏功能的月之脚本编译工具: - -```shell -make install NO_MACRO=true -``` - - 构建不带内置Lua二进制文件的月之脚本编译工具: - -```shell -make install NO_LUA=true -``` - -## 下载预编译的二进制程序 - - 你可以下载预编译的二进制程序,包括兼容不同 Lua 版本的二进制可执行文件和库文件。 - - 在[这里](https://github.com/IppClub/YueScript/releases)下载预编译的二进制程序。 - -# 条件语句 - -```yuescript -have_coins = false -if have_coins - print "有硬币" -else - print "没有硬币" -``` - -  对于简单的语句,也可以使用简短的语法: - -```yuescript -have_coins = false -if have_coins then print "有硬币" else print "没有硬币" -``` - -  因为 if 语句可以用作表达式,所以也可以这样写: - -```yuescript -have_coins = false -print if have_coins then "有硬币" else "没有硬币" -``` - -  条件语句也可以作为表达式用在返回语句和赋值语句中: - -```yuescript -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "我很高" -else - "我不是很高" - -print message -- 打印: 我很高 -``` - -  if 的反义词是 unless(相当于 if not,正如“如果”对应“除非”): - -```yuescript -unless os.date("%A") == "Monday" - print "今天不是星期一!" -``` - -```yuescript -print "你真幸运!" unless math.random! > 0.1 -``` - -## 范围表达式 - -  你可以使用范围表达式来编写进行范围检查的代码。 - -```yuescript -a = 5 - -if a in [1, 3, 5, 7] - print "检查离散值的相等性" - -if a in list - print "检查`a`是否在列表中" -``` - -`in` 运算符也可以用于表,并支持 `not in` 变体来进行否定检查: - -```yuescript -has = "foo" in {"bar", "foo"} - -if a in {1, 2, 3} - print "a 在表中" - -not_exist = item not in list - -check = -> value not in table -``` - -单元素列表或表会检查与该元素的相等性: - -```yuescript --- [1,] 检查 value == 1 -c = a in [1,] - --- {1} 也是检查 value == 1 -c = a in {1} - --- 没有逗号,[1] 是索引访问(tb[1]) -with tb - c = a in [1] -``` - -# for 循环 - -  Lua 中有两种 for 循环形式,数字型和通用型: - -```yuescript -for i = 10, 20 - print i - -for k = 1, 15, 2 -- 提供了一个遍历的步长 - print k - -for key, value in pairs object - print key, value -``` - -  可以使用切片和 **\*** 操作符,就像在列表推导中一样: - -```yuescript -for item in *items[2, 4] - print item -``` - -  当代码语句只有一行时,循环语句也都可以写作更短的语法: - -```yuescript -for item in *items do print item - -for j = 1, 10, 3 do print j -``` - -  for 循环也可以用作表达式。for 循环主体中的最后一条语句会被强制转换为一个返回值的表达式,并会将表达式计算结果的值追加到一个作为结果的数组表中。 - -  将每个偶数加倍: - -```yuescript -doubled_evens = for i = 1, 20 - if i % 2 == 0 - i * 2 - else - i -``` - -  此外,for 循环还支持带返回值的 break 语句,这样循环本身就可以作为一个表达式,在满足条件时提前退出并返回有意义的结果。for 循环表达式支持 `break` 返回多个值。 - -  例如,查找第一个大于 10 的数字: - -```yuescript -first_large = for n in *numbers - break n if n > 10 -``` - -```yuescript -key, score = for k, v in pairs data - break k, v * 10 if k == "target" -``` - -  你还可以结合 for 循环表达式与 continue 语句来过滤值。 - -  注意出现在函数体末尾的 for 循环,不会被当作是一个表达式并将循环结果累积到一个列表中作为返回值(相反,函数将返回 nil)。如果要函数末尾的循环转换为列表表达式,可以显式地使用返回语句加 for 循环表达式。 - -```yuescript -func_a = -> for i = 1, 10 do print i -func_b = -> return for i = 1, 10 do i - -print func_a! -- 打印 nil -print func_b! -- 打印 table 对象 -``` - -  这样做是为了避免在不需要返回循环结果的函数,创建无效的返回值表格。 - -# continue 语句 - -  继续语句可以用来跳出当前的循环迭代。 - -```yuescript -i = 0 -while i < 10 - i += 1 - continue if i % 2 == 0 - print i -``` - -  继续语句也可以与各种循环表达式一起使用,以防止当前的循环迭代结果累积到结果列表中。以下示例将数组表过滤为仅包含偶数的数组: - -```yuescript -my_numbers = [1, 2, 3, 4, 5, 6] -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -# switch 语句 - -  switch 语句是为了简化检查一系列相同值的if语句而提供的简写语法。要注意用于比较检查的目标值只会计算一次。和 if 语句一样,switch 语句在最后可以接一个 else 代码块来处理没有匹配的情况。在生成的 Lua 代码中,进行比较是使用 == 操作符完成的。switch 语句中也可以使用赋值表达式来储存临时变量值。 - -```yuescript -switch name := "Dan" - when "Robert" - print "你是Robert" - when "Dan", "Daniel" - print "你的名字是Dan" - else - print "我不认识你,你的名字是#{name}" -``` - -  switch 语句的 when 子句中可以通过使用逗号分隔的列表来匹配多个值。 - -  switch 语句也可以作为表达式使用,下面我们可以将 switch 语句返回的结果分配给一个变量: - -```yuescript -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "数字数得太大了!" -``` - -  我们可以使用 then 关键字在 when 子句的同一行上编写处理代码。else 代码块的后续代码中要写在同一行上不需要额外的关键字。 - -```yuescript -msg = switch math.random(1, 5) - when 1 then "你很幸运" - when 2 then "你差点很幸运" - else "不太幸运" -``` - -  如果在编写 switch 语句时希望少写一个缩进,那么你可以把第一个 when 子句放在 switch 开始语句的第一行,然后后续的子语句就都可以都少写一个缩进。 - -```yuescript -switch math.random(1, 5) - when 1 - print "你很幸运" -- 两个缩进级别 - else - print "不太幸运" - -switch math.random(1, 5) when 1 - print "你很幸运" -- 一个缩进级别 -else - print "不太幸运" -``` - -  值得注意的是,在生成 Lua 代码时,我们要做检查的目标变量会放在 == 表达式的右侧。当你希望给 when 子句的比较对象定义一个 \_\_eq 元方法来重载判断逻辑时,可能会有用。 - -## 表格匹配 - -  在 switch 的 when 子句中,如果期待检查目标是一个表格,且可以通过特定的结构进行解构并获得非 nil 值,那么你可以尝试使用表格匹配的语法。 - -```yuescript -items = - * x: 100 - y: 200 - * width: 300 - height: 400 - -for item in *items - switch item - when :x, :y - print "Vec2 #{x}, #{y}" - when :width, :height - print "尺寸 #{width}, #{height}" -``` - -  你可以使用默认值来选择性地解构表格的某些字段。 - -```yuescript -item = {} - -{pos: {:x = 50, :y = 200}} = item -- 获取错误:尝试索引nil值(字段'pos') - -switch item - when {pos: {:x = 50, :y = 200}} - print "Vec2 #{x}, #{y}" -- 表格解构仍然会通过 -``` - -  你也可以匹配数组元素、表格字段,甚至使用数组或表格字面量来匹配嵌套的结构。 - -  匹配数组元素。 - -```yuescript -switch tb - when [1, 2, 3] - print "1, 2, 3" - when [1, b, 3] - print "1, #{b}, 3" - when [1, 2, b = 3] -- 变量b有默认值 - print "1, 2, #{b}" -``` - -  匹配表格字段。 - -```yuescript -switch tb - when success: true, :result - print "成功", result - when success: false - print "失败", result - else - print "无效值" -``` - -  匹配嵌套的表格结构。 - -```yuescript -switch tb - when data: {type: "success", :content} - print "成功", content - when data: {type: "error", :content} - print "失败", content - else - print "无效值" -``` - -  匹配表格数组。 - -```yuescript -switch tb - when [ - {a: 1, b: 2} - {a: 3, b: 4} - {a: 5, b: 6} - fourth - ] - print "匹配成功", fourth -``` - -  匹配一个列表并捕获特定范围内的元素。 - -```yuescript -segments = ["admin", "users", "logs", "view"] -switch segments - when [...groups, resource, action] - print "Group:", groups -- 打印: {"admin", "users"} - print "Resource:", resource -- 打印: "logs" - print "Action:", action -- 打印: "view" -``` - -# while 循环 - -  在月之脚本中的 while 循环支持几种不同的写法: - -```yuescript -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -```yuescript -i = 10 -until i == 0 - print i - i -= 1 - -until running == false do my_function! -``` - -  像 for 循环的语法一样,while 循环也可以作为一个表达式使用。while / until 循环表达式支持 `break` 返回多个值。 - -```yuescript -value, doubled = while true - n = get_next! - break n, n * 2 if n > 10 -``` - -  为了使函数返回 while 循环的累积列表值,必须明确使用返回语句返回 while 循环表达式。 - -## repeat 循环 - -  repeat 循环是从 Lua 语言中搬过来的相似语法: - -```yuescript -i = 10 -repeat - print i - i -= 1 -until i == 0 -``` - -  repeat 循环表达式同样支持 `break` 返回多个值: - -```yuescript -i = 1 -value, scaled = repeat - break i, i * 100 if i > 3 - i += 1 -until false -``` - -# 函数存根 - -  在编程中,将对象的方法作为函数类型的值进行传递是一种常见做法,尤其是在将实例方法作为回调函数传递给其他函数的情形中。当目标函数需要将该对象作为其第一个参数时,我们需要找到一种方式将对象和函数绑定在一起,以便能够正确地调用该函数。 - -  函数存根(stub)语法提供了一种便捷的方法来创建一个新的闭包函数,这个函数将对象和原函数绑定在一起。这样,当调用这个新创建的函数时,它会在正确的对象上下文中执行原有的函数。 - -  这种语法类似于使用 \ 操作符调用实例方法的方式,区别在于,这里不需要在 \ 操作符后面附加参数列表。 - -```yuescript -my_object = { - value: 1000 - write: => print "值为:", @value -} - -run_callback = (func) -> - print "运行回调..." - func! - --- 这样写不起作用: --- 函数没有引用my_object -run_callback my_object.write - --- 函数存根语法 --- 让我们把对象捆绑到一个新函数中 -run_callback my_object\write -``` - -# 反向回调 - -  反向回调用于减少函数回调的嵌套。它们使用指向左侧的箭头,并且默认会被定义为传入后续函数调用的最后一个参数。它的语法大部分与常规箭头函数相同,只是它指向另一方向,并且后续的函数体不需要进行缩进。 - -```yuescript -x <- f -print "hello" .. x -``` - -  月之脚本也提供了粗箭头反向回调函数。 - -```yuescript -<= f -print @value -``` - -  你可以通过一个占位符指定回调函数的传参位置。 - -```yuescript -(x) <- map _, [1, 2, 3] -x * 2 -``` - -  如果你希望在反向回调处理后继续编写更多其它的代码,可以使用 do 语句将不属于反向回调的代码分隔开。对于非粗箭头函数的反向回调,回调返回值的括号也是可以省略的。 - -```yuescript -result, msg = do - data <- readAsync "文件名.txt" - print data - info <- processAsync data - check info -print result, msg -``` - -# 函数字面量 - -  所有函数都是使用月之脚本的函数表达式创建的。一个简单的函数可以用箭头表示为:**->**。 - -```yuescript -my_function = -> -my_function() -- 调用空函数 -``` - -  函数体可以是紧跟在箭头后的一个语句,或者是在后面的行上使用同样缩进的一系列语句: - -```yuescript -func_a = -> print "你好,世界" - -func_b = -> - value = 100 - print "这个值是:", value -``` - -  如果一个函数没有参数,可以使用 **\!** 操作符调用它,而不是空括号。使用 **\!** 调用没有参数的函数是推荐的写法。 - -```yuescript -func_a! -func_b() -``` - -  带有参数的函数可以通过在箭头前加上括号中的参数名列表来进行创建: - -```yuescript -sum = (x, y) -> print "数字的和", x + y -``` - -  函数可以通过在函数名后列出参数来调用。当对函数做嵌套的调用时,后面列出的参数会应用于左侧最近的函数。 - -```yuescript -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -  为了避免在调用函数时产生歧义,也可以使用括号将参数括起来。比如在以下的例子中是必需的,这样才能确保参数被传入到正确的函数。 - -```yuescript -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -  注意:函数名与开始括号之间不能有任何空格。 - -  函数会将函数体中的最后一个语句强制转换为返回语句,这被称作隐式返回: - -```yuescript -sum = (x, y) -> x + y -print "数字的和是", sum 10, 20 -``` - -  如果你需要做显式返回,可以使用 return 关键字: - -```yuescript -sum = (x, y) -> return x + y -``` - -  就像在Lua中一样,函数可以返回多个值。最后一个语句必须是由逗号分隔的值列表: - -```yuescript -mystery = (x, y) -> x + y, x - y -a, b = mystery 10, 20 -``` - -## 粗箭头 - -  因为在 Lua 中调用方法时,经常习惯将对象作为第一个参数传入,所以月之脚本提供了一种特殊的语法来创建自动包含 self 参数的函数。 - -```yuescript -func = (num) => @value + num -``` - -## 参数默认值 - -  可以为函数的参数提供默认值。如果参数的值为 nil,则确定该参数为空。任何具有默认值的 nil 参数在函数体运行之前都会被替换。 - -```yuescript -my_function = (name = "某物", height = 100) -> - print "你好,我是", name - print "我的高度是", height -``` - -  函数参数的默认值表达式在函数体中会按参数声明的顺序进行计算。因此,在默认值的表达式中可以访问先前声明的参数。 - -```yuescript -some_args = (x = 100, y = x + 1000) -> - print x + y -``` - -## 注意事项 - -  由于月之脚本支持无需括号的表达式式函数调用,因此为了避免因空白字符造成的解析歧义,需要进行一些限制。 - -  减号(-)在表达式中既可以作为一元取反操作符,也可以作为二元减法操作符。请注意下面这些示例的编译方式: - -```yuescript -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -  当函数调用的第一个参数是字符串字面量时,可以通过空白控制其优先级。在 Lua 中,常见的写法是调用仅有一个字符串或表字面量参数的函数时省略括号。 - -  当变量名和字符串字面量之间没有空格时,函数的调用优先级高于后续表达式,因此此时无法再传入其他参数。 - -  当变量名和字符串字面量之间有空格时,字符串字面量会作为后续表达式(如果存在)的参数,这样可以传递参数列表。 - -```yuescript -x = func"hello" + 100 -y = func "hello" + 100 -``` - -## 多行参数 - -  当调用接收大量参数的函数时,将参数列表分成多行是很方便的。由于月之脚本语言对空白字符的敏感性,做参数列表的分割时务必要小心。 - -  如果要将参数列表写到下一行,那么当前行必须以逗号结束。并且下一行的缩进必须比当前的缩进多。一旦做了参数的缩进,所有其他参数列表的行必须保持相同的缩进级别,以成为参数列表的一部分。 - -```yuescript -my_func 5, 4, 3, - 8, 9, 10 - -cool_func 1, 2, - 3, 4, - 5, 6, - 7, 8 -``` - -  这种调用方式可以做嵌套。并通过缩进级别来确定参数属于哪一个函数。 - -```yuescript -my_func 5, 6, 7, - 6, another_func 6, 7, 8, - 9, 1, 2, - 5, 4 -``` - -  因为 Lua 表也使用逗号作为分隔符,这种缩进语法有助于让值成为参数列表的一部分,而不是 Lua 表的一部分。 - -```yuescript -x = [ - 1, 2, 3, 4, a_func 4, 5, - 5, 6, - 8, 9, 10 -] -``` - -  有个不常见的写法可以注意一下,如果我们将在后面使用较低的缩进,我们可以为函数参数提供更深的缩进来区分列表的归属。 - -```yuescript -y = [ my_func 1, 2, 3, - 4, 5, - 5, 6, 7 -] -``` - -  对于其它有代码块跟随的语句,比如条件语句,也可以通过小心安排缩进来做类似的事。比如我们可以通过调整缩进级别来控制一些值归属于哪个语句: - -```yuescript -if func 1, 2, 3, - "你好", - "世界" - print "你好" - print "我在if内部" - -if func 1, 2, 3, - "你好", - "世界" - print "hello" - print "我在if内部" -``` - -## 参数解构 - -  月之脚本支持在函数形参位置对传入对象进行解构。适用两类解构表子面量: - -- 使用 {} 包裹的字面量/对象形参,支持提供获得空字段时的默认值(例如 {:a, :b}、{a: a1 = 123})。 - -- 无 {} 包裹、以键值/简写键序列开头,直至遇到其它表达式终止(例如 :a, b: b1, :c),表示从同一个对象中解构多个字段。 - -```yuescript -f1 = (:a, :b, :c) -> - print a, b, c - -f1 a: 1, b: "2", c: {} - -f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> - print a1, b, c - -arg1 = {a: 0} -f2 arg1, arg2 -``` - -## 前置返回表达式 - -  在深度嵌套的函数体中,为了提升返回值的可读性及编写便利性,我们新增了 “前置返回表达式” 语法。其形式如下: - -```yuescript -findFirstEven = (list): nil -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub -``` - -  这个写法等价于: - -```yuescript -findFirstEven = (list) -> - for item in *list - if type(item) == "table" - for sub in *item - if sub % 2 == 0 - return sub - nil -``` - -  唯一的区别在于:你可以将函数的返回值表达式提前写在 `->` 或 `=>` 前,用以指示该函数应隐式返回该表达式的值。这样即使在多层循环或条件判断的场景下,也无需编写尾行悬挂的返回表达式,逻辑结构会更加直观清晰。 - -## 命名变长参数 - -  你可以使用 `(...t) ->` 语法来将变长参数自动存储到一个命名表中。这个表会包含所有传入的参数(包括 `nil` 值),并且会在表的 `n` 字段中存储实际传入的参数个数(包括 `nil` 值在内的个数)。 - -```yuescript -f = (...t) -> - print "参数个数:", t.n - print "表长度:", #t - for i = 1, t.n - print t[i] - -f 1, 2, 3 -f "a", "b", "c", "d" -f! - --- 处理包含 nil 的情况 -process = (...args) -> - sum = 0 - for i = 1, args.n - if args[i] != nil and type(args[i]) == "number" - sum += args[i] - sum - -process 1, nil, 3, nil, 5 -``` - -# 空白 - -  月之脚本是一个对空白敏感的语言。你必须在相同的缩进中使用空格 **' '** 或制表符 **'\t'** 来编写一些代码块,如函数体、值列表和一些控制块。包含不同空白的表达式可能意味着不同的事情。制表符被视为4个空格,但最好不要混合使用空格和制表符。 - -## 语句分隔符 - -  一条语句通常以换行结束。你也可以使用分号 `;` 显式结束一条语句,从而在同一行中编写多条语句: - -```yuescript -a = 1; b = 2; print a + b -``` - -## 多行链式调用 - -  你可以使用相同的缩进来编写多行链式函数调用。 - -```yuescript -Rx.Observable - .fromRange 1, 8 - \filter (x) -> x % 2 == 0 - \concat Rx.Observable.of 'who do we appreciate' - \map (value) -> value .. '!' - \subscribe print -``` - -# 注释 - -```yuescript --- 我是一个注释 - -str = --[[ -这是一个多行注释。 -没问题。 -]] strA \ -- 注释 1 - .. strB \ -- 注释 2 - .. strC - -func --[[端口]] 3000, --[[ip]] "192.168.1.1" -``` - -# 属性 - -  月之脚本现在提供了 Lua 5.4 新增的叫做属性的语法支持。在月之脚本编译到的 Lua 目标版本低于 5.4 时,你仍然可以同时使用`const` 和 `close` 的属性声明语法,并获得常量检查和作用域回调的功能。 - -```yuescript -const a = 123 -close _ = : -> print "超出范围。" -``` - -  你可以对进行解构得到的变量标记为常量。 - -```yuescript -const {:a, :b, c, d} = tb --- a = 1 -``` - -  你也可以声明全局变量为常量。 - -```yuescript -global const Constant = 123 --- Constant = 1 -``` - -# 操作符 - -  Lua 的所有二元和一元操作符在月之脚本中都是可用的。此外,**!=** 符号是 **~=** 的别名,而 **\\** 或 **::** 均可用于编写链式函数调用,如写作 `tb\func!` 或 `tb::func!`。此外月之脚本还提供了一些其他特殊的操作符,以编写更具表达力的代码。 - -```yuescript -tb\func! if tb ~= nil -tb::func! if tb != nil -``` - -## 链式比较 - -  你可以在月之脚本中进行比较表达式的链式书写: - -```yuescript -print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 --- 输出:true - -a = 5 -print 1 <= a <= 10 --- 输出:true -``` - -  可以注意一下链式比较表达式的求值行为: - -```yuescript -v = (x) -> - print x - x - -print v(1) < v(2) <= v(3) ---[[ - 输出: - 2 - 1 - 3 - true -]] - -print v(1) > v(2) <= v(3) ---[[ - 输出: - 2 - 1 - false -]] -``` - -  在上面的例子里,中间的表达式 `v(2)` 仅被计算一次,如果把表达式写成 `v(1) < v(2) and v(2) <= v(3)` 的方式,中间的 `v(2)` 才会被计算两次。在链式比较中,求值的顺序往往是未定义的。所以强烈建议不要在链式比较中使用具有副作用(比如做打印操作)的表达式。如果需要使用有副作用的函数,应明确使用短路 `and` 运算符来做连接。 - -## 表追加 - -  **[] =** 操作符用于向 Lua 表的最后插入值。 - -```yuescript -tab = [] -tab[] = "Value" -``` - -  你还可以使用展开操作符 `...` 来将一个列表中的所有元素追加到另一个列表中: - -```yuescript -tbA = [1, 2, 3] -tbB = [4, 5, 6] -tbA[] = ...tbB --- tbA 现在为 [1, 2, 3, 4, 5, 6] -``` - -## 表扩展 - -  你可以使用前置 `...` 操作符在 Lua 表中插入数组表或哈希表。 - -  使用花括号字面量做表扩展(例如 `{...other}`)时,会复制 Lua 表中的数组部分和哈希部分。 - -```yuescript -parts = - * "shoulders" - * "knees" -lyrics = - * "head" - * ...parts - * "and" - * "toes" - -copy = {...other} - -a = {1, 2, 3, x: 1} -b = {4, 5, y: 1} -merge = {...a, ...b} -``` - -### 列表表扩展 - -  使用中括号字面量做表扩展(例如 `[...other,]`)时,只会复制 Lua 表中的数组部分。 - -```yuescript -source = {1, 2, 3, name: "Yue"} -fullCopy = {...source} -listCopy = [...source,] --- fullCopy => {1, 2, 3, name: "Yue"} --- listCopy => [1, 2, 3] -``` - -## 表反向索引 - -  你可以使用 **#** 操作符来反向索引表中的元素。 - -```yuescript -last = data.items[#] -second_last = data.items[#-1] -data.items[#] = 1 -``` - -## 元表 - -  **<>** 操作符可提供元表操作的快捷方式。 - -### 元表创建 - -  使用空括号 **<>** 或被 **<>** 包围的元方法键创建普通的 Lua 表。 - -```yuescript -mt = {} -add = (right) => <>: mt, value: @value + right.value -mt.__add = add - -a = <>: mt, value: 1 --- 使用与临时变量名相同的字段名,将临时变量赋值给元表 -b = :, value: 2 -c = : mt.__add, value: 3 - -d = a + b + c -print d.value - -close _ = : -> print "超出范围" -``` - -### 元表访问 - -  使用 **<>** 或被 **<>** 包围的元方法名或在 **<>** 中编写某些表达式来访问元表。 - -```yuescript --- 使用包含字段 "value" 的元表创建 -tb = <"value">: 123 -tb. = tb.<> -print tb.value - -tb.<> = __index: {item: "hello"} -print tb.item -``` - -### 元表解构 - -  使用被 **<>** 包围的元方法键解构元表。 - -```yuescript -{item, :new, :, : getter} = tb -print item, new, close, getter -``` - -## 存在性 - -  **?** 运算符可以在多种上下文中用来检查存在性。 - -```yuescript -func?! -print abc?["你好 世界"]?.xyz - -x = tab?.value -len = utf8?.len or string?.len or (o) -> #o - -if print and x? - print x - -with? io.open "test.txt", "w" - \write "你好" - \close! -``` - -## 管道 - -  与其使用一系列嵌套的函数调用,你还可以考虑使用运算符 **|>** 来传递值。 - -```yuescript -"你好" |> print -1 |> print 2 -- 将管道项作为第一个参数插入 -2 |> print 1, _, 3 -- 带有占位符的管道 - --- 多行的管道表达式 -readFile "example.txt" - |> extract language, {} - |> parse language - |> emit - |> render - |> print -``` - -## 空值合并 - -  如果其左操作数不是 **nil**,则nil合并运算符 **??** 返回其左操作数的值;否则,它将计算右操作数并返回其结果。如果左操作数计算结果为非 nil 的值,**??** 运算符将不再计算其右操作数。 - -```yuescript -local a, b, c, d -a = b ?? c ?? d -func a ?? {} - -a ??= false -``` - -## 隐式对象 - -  你可以在表格块内使用符号 **\*** 或是 **-** 开始编写一系列隐式结构。如果你正在创建隐式对象,对象的字段必须具有相同的缩进。 - -```yuescript --- 赋值时使用隐式对象 -list = - * 1 - * 2 - * 3 - --- 函数调用时使用隐式对象 -func - * 1 - * 2 - * 3 - --- 返回时使用隐式对象 -f = -> - return - * 1 - * 2 - * 3 - --- 表格时使用隐式对象 -tb = - name: "abc" - - values: - - "a" - - "b" - - "c" - - objects: - - name: "a" - value: 1 - func: => @value + 1 - tb: - fieldA: 1 - - - name: "b" - value: 2 - func: => @value + 2 - tb: { } -``` - -# 字面量 - -  Lua 中的所有基本字面量都可以在月之脚本中使用。包括数字、字符串、布尔值和 **nil**。 - -  但与 Lua 不同的是,单引号和双引号字符串内部允许有换行: - -```yuescript -some_string = "这是一个字符串 - 并包括一个换行。" - --- 使用#{}语法可以将表达式插入到字符串字面量中。 --- 字符串插值只在双引号字符串中可用。 -print "我有#{math.random! * 100}%的把握。" -``` - -## 数字字面量 - -  你可以在数字字面量中使用下划线来增加可读性。 - -```yuescript -integer = 1_000_000 -hex = 0xEF_BB_BF -binary = 0B10011 -``` - -## YAML 风格字符串 - -  使用 `|` 前缀标记一个多行 YAML 风格字符串: - -```yuescript -str = | - key: value - list: - - item1 - - #{expr} -``` - -  其效果类似于原生 Lua 的多行拼接,所有文本(含换行)将被保留下来,并支持 `#{...}` 语法,通过 `tostring(expr)` 插入表达式结果。 - -  YAML 风格的多行字符串会自动检测首行后最小的公共缩进,并从所有行中删除该前缀空白字符。这让你可以在代码中对齐文本,但输出字符串不会带多余缩进。 - -```yuescript -fn = -> - str = | - foo: - bar: baz - return str -``` - -  输出字符串中的 foo: 对齐到行首,不会带有函数缩进空格。保留内部缩进的相对结构,适合书写结构化嵌套样式的内容。 - -  支持自动处理字符中的引号、反斜杠等特殊符号,无需手动转义: - -```yuescript -str = | - path: "C:\Program Files\App" - note: 'He said: "#{Hello}!"' -``` - -# 模块 - -## 导入 - -  导入语句是一个语法糖,用于需要引入一个模块或者从已导入的模块中提取子项目。从模块导入的变量默认为不可修改的常量。 - -```yuescript --- 用作表解构 -do - import insert, concat from table - -- 当给 insert, concat 变量赋值时,编译器会报告错误 - import C, Ct, Cmt from require "lpeg" - -- 快捷写法引入模块的子项 - import x, y, z from 'mymodule' - -- 使用Python风格的导入 - from 'module' import a, b, c - --- 快捷地导入一个模块 -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- 导入模块后起一个别名使用,或是进行导入模块表的解构 -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - -## 导入全局变量 - -  你可以使用 `import` 将指定的全局变量导入到本地变量中。当导入一系列对全局变量的链式访问时,最后一个访问的字段将被赋值给本地变量。 - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - -### 自动全局变量导入 - -  在一个代码块的顶部写 `import global`,会将当前作用域中尚未显式声明或赋值过的变量名,自动导入为本地常量,并在该语句的位置绑定到同名的全局变量。 - -  但是在同一作用域中被显式声明为全局的变量不会被自动导入,因此可以继续进行赋值操作。 - -```yuescript -do - import global - print "hello" - math.random 3 - -- print = nil -- 报错:自动导入的全局变量为常量 - -do - -- 被显式声明为全局的变量不会被自动导入 - import global - global FLAG - print FLAG - FLAG = 123 -``` - -## 导出 - -  导出语句提供了一种简洁的方式来定义当前的模块。 - -### 命名导出 - -  带命名的导出将定义一个局部变量,并在导出的表中添加一个同名的字段。 - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - -  使用解构进行命名导出。 - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = '默认值'}} = tb -``` - -  从模块导出命名项目时,可以不用创建局部变量。 - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - -### 未命名导出 - -  未命名导出会将要导出的目标项目添加到导出表的数组部分。 - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - -### 默认导出 - -  在导出语句中使用 **default** 关键字,来替换导出的表为一个目标的对象。 - -```yuescript -export default -> - print "你好" - 123 -``` - -# MIT 许可证 - -版权 (c) 2017-2026 李瑾 \ - -特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利,须在下列条件下: -上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。 -本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。 - -# 月之脚本语言库 - -在 Lua 中使用 `local yue = require("yue")` 来访问。 - -## yue - -**描述:** - -月之脚本语言库。 - -### version - -**类型:** 成员变量。 - -**描述:** - -月之脚本版本。 - -**签名:** - -```lua -version: string -``` - -### dirsep - -**类型:** 成员变量。 - -**描述:** - -当前平台的文件分隔符。 - -**签名:** - -```lua -dirsep: string -``` - -### yue_compiled - -**类型:** 成员变量。 - -**描述:** - -编译模块代码缓存。 - -**签名:** - -```lua -yue_compiled: {string: string} -``` - -### to_lua - -**类型:** 函数。 - -**描述:** - -月之脚本的编译函数。它将 YueScript 代码编译为 Lua 代码。 - -**签名:** - -```lua -to_lua: function(code: string, config?: Config): - --[[codes]] string | nil, - --[[error]] string | nil, - --[[globals]] {{string, integer, integer}} | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ------ | ------------------- | -| code | string | YueScript 代码。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| ----------------------------------- | ------------------------------------------------------------------------------------------ | -| string \| nil | 编译后的 Lua 代码,如果编译失败则为 nil。 | -| string \| nil | 错误消息,如果编译成功则为 nil。 | -| {{string, integer, integer}} \| nil | 代码中出现的全局变量(带有名称、行和列),如果编译器选项 `lint_global` 为 false 则为 nil。 | - -### file_exist - -**类型:** 函数。 - -**描述:** - -检查源文件是否存在的函数。可以覆盖该函数以自定义行为。 - -**签名:** - -```lua -file_exist: function(filename: string): boolean -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | -------- | -| filename | string | 文件名。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | -------------- | -| boolean | 文件是否存在。 | - -### read_file - -**类型:** 函数。 - -**描述:** - -读取源文件的函数。可以覆盖该函数以自定义行为。 - -**签名:** - -```lua -read_file: function(filename: string): string -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | -------- | -| filename | string | 文件名。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------- | -| string | 文件内容。 | - -### insert_loader - -**类型:** 函数。 - -**描述:** - -将 YueScript 加载器插入到 Lua 包加载器(搜索器)中。 - -**签名:** - -```lua -insert_loader: function(pos?: integer): boolean -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ------- | ------------------------------------- | -| pos | integer | [可选] 要插入加载器的位置。默认为 3。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------------------------------------------------- | -| boolean | 是否成功插入加载器。如果加载器已经插入,则返回失败。 | - -### remove_loader - -**类型:** 函数。 - -**描述:** - -从 Lua 包加载器(搜索器)中移除 YueScript 加载器。 - -**签名:** - -```lua -remove_loader: function(): boolean -``` - -**返回值:** - -| 返回类型 | 描述 | -| -------- | -------------------------------------------------- | -| boolean | 是否成功移除加载器。如果加载器未插入,则返回失败。 | - -### loadstring - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码字符串加载为一个函数。 - -**签名:** - -```lua -loadstring: function(input: string, chunkname: string, env: table, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| --------- | ------ | ------------------- | -| input | string | YueScript 代码。 | -| chunkname | string | 代码块的名称。 | -| env | table | 环境表。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| --------------- | ---------------------------------- | -| function \| nil | 加载的函数,如果加载失败则为 nil。 | -| string \| nil | 错误消息,如果加载成功则为 nil。 | - -### loadstring - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码字符串加载为一个函数。 - -**签名:** - -```lua -loadstring: function(input: string, chunkname: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| --------- | ------ | ------------------- | -| input | string | YueScript 代码。 | -| chunkname | string | 代码块的名称。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| --------------- | ---------------------------------- | -| function \| nil | 加载的函数,如果加载失败则为 nil。 | -| string \| nil | 错误消息,如果加载成功则为 nil。 | - -### loadstring - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码字符串加载为一个函数。 - -**签名:** - -```lua -loadstring: function(input: string, config?: Config): - --[[loaded function]] nil | function(...: any): (any...), - --[[error]] string | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ------ | ------------------- | -| input | string | YueScript 代码。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| --------------- | ---------------------------------- | -| function \| nil | 加载的函数,如果加载失败则为 nil。 | -| string \| nil | 错误消息,如果加载成功则为 nil。 | - -### loadfile - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码文件加载为一个函数。 - -**签名:** - -```lua -loadfile: function(filename: string, env: table, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | ------------------- | -| filename | string | 文件名。 | -| env | table | 环境表。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| --------------- | ---------------------------------- | -| function \| nil | 加载的函数,如果加载失败则为 nil。 | -| string \| nil | 错误消息,如果加载成功则为 nil。 | - -### loadfile - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码文件加载为一个函数。 - -**签名:** - -```lua -loadfile: function(filename: string, config?: Config): - nil | function(...: any): (any...), - string | nil -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | ------------------- | -| filename | string | 文件名。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| --------------- | ---------------------------------- | -| function \| nil | 加载的函数,如果加载失败则为 nil。 | -| string \| nil | 错误消息,如果加载成功则为 nil。 | - -### dofile - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码文件加载为一个函数并执行。 - -**签名:** - -```lua -dofile: function(filename: string, env: table, config?: Config): any... -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | ------------------- | -| filename | string | 文件名。 | -| env | table | 环境表。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | -------------------------- | -| any... | 加载的函数执行后的返回值。 | - -### dofile - -**类型:** 函数。 - -**描述:** - -将 YueScript 代码文件加载为一个函数并执行。 - -**签名:** - -```lua -dofile: function(filename: string, config?: Config): any... -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------- | ------ | ------------------- | -| filename | string | 文件名。 | -| config | Config | [可选] 编译器选项。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | -------------------------- | -| any... | 加载的函数执行后的返回值。 | - -### find_modulepath - -**类型:** 函数。 - -**描述:** - -将 YueScript 模块名解析为文件路径。 - -**签名:** - -```lua -find_modulepath: function(name: string): string -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ------ | -------- | -| name | string | 模块名。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------- | -| string | 文件路径。 | - -### pcall - -**类型:** 函数。 - -**描述:** - -在保护模式下调用一个函数。 -会捕获任何错误,执行成功则返回成功状态和结果,否则为失败状态和错误信息。 -当发生错误时,将错误信息中的代码行号重写为 YueScript 代码中的原始行号。 - -**签名:** - -```lua -pcall: function(f: function, ...: any): boolean, any... -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | -------- | -------------------- | -| f | function | 要调用的函数。 | -| ... | any | 要传递给函数的参数。 | - -**返回值:** - -| 返回类型 | 描述 | -| ------------ | ---------------------------- | -| boolean, ... | 状态码和函数结果或错误信息。 | - -### require - -**类型:** 函数。 - -**描述:** - -加载给定的模块。可以是 Lua 模块或 YueScript 模块。 -如果模块是 YueScript 模块且加载失败,则将错误信息中的代码行号重写为 YueScript 代码中的原始行号。 - -**签名:** - -```lua -require: function(name: string): any... -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------- | ------ | ---------------- | -| modname | string | 要加载的模块名。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| any | 如果模块已经加载,则返回 package.loaded[modname] 中存储的值。否则,尝试查找加载器并返回 package.loaded[modname] 的最终值和加载器数据作为第二个结果。 | - -### p - -**类型:** 函数。 - -**描述:** - -检查传递的值的内部结构,并打印值出它的字符串表示。 - -**签名:** - -```lua -p: function(...: any) -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ---- | ------------ | -| ... | any | 要检查的值。 | - -### options - -**类型:** 成员变量。 - -**描述:** - -当前编译器选项。 - -**签名:** - -```lua -options: Config.Options -``` - -### traceback - -**类型:** 函数。 - -**描述:** - -重写堆栈跟踪中的行号为 YueScript 代码中的原始行号的 traceback 函数。 - -**签名:** - -```lua -traceback: function(message: string): string -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------- | ------ | -------------- | -| message | string | 堆栈跟踪消息。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------------------- | -| string | 重写后的堆栈跟踪消息。 | - -### is_ast - -**类型:** 函数。 - -**描述:** - -检查代码是否匹配指定的 AST。 - -**签名:** - -```lua -is_ast: function(astName: string, code: string): boolean -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------- | ------ | ---------- | -| astName | string | AST 名称。 | -| code | string | 代码。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ------------------ | -| boolean | 代码是否匹配 AST。 | - -### AST - -**类型:** 成员变量。 - -**描述:** - -AST 类型定义,带有名称、行、列和子节点。 - -**签名:** - -```lua -type AST = {string, integer, integer, any} -``` - -### to_ast - -**类型:** 函数。 - -**描述:** - -将代码转换为 AST。 - -**签名:** - -```lua -to_ast: function(code: string, flattenLevel?: number, astName?: string, reserveComment?: boolean): - --[[AST]] AST | nil, - --[[error]] nil | string -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------------- | ------- | ------------------------------------------------------------------------------ | -| code | string | 代码。 | -| flattenLevel | integer | [可选] 扁平化级别。级别越高,会消除更多的 AST 结构的嵌套。默认为 0。最大为 2。 | -| astName | string | [可选] AST 名称。默认为 "File"。 | -| reserveComment | boolean | [可选] 是否保留原始注释。默认为 false。 | - -**返回值:** - -| 返回类型 | 描述 | -| ------------- | -------------------------------- | -| AST \| nil | AST,如果转换失败则为 nil。 | -| string \| nil | 错误消息,如果转换成功则为 nil。 | - -### format - -**类型:** 函数。 - -**描述:** - -格式化 YueScript 代码。 - -**签名:** - -```lua -format: function(code: string, tabSize?: number, reserveComment?: boolean): string -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| -------------- | ------- | -------------------------------------- | -| code | string | 代码。 | -| tabSize | integer | [可选] 制表符大小。默认为 4。 | -| reserveComment | boolean | [可选] 是否保留原始注释。默认为 true。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | ---------------- | -| string | 格式化后的代码。 | - -### \_\_call - -**类型:** 元方法。 - -**描述:** - -导入 YueScript 模块。 -如果发生加载失败,则将错误信息中的代码行号重写为 YueScript 代码中的原始行号。 - -**签名:** - -```lua -metamethod __call: function(self: yue, module: string): any... -``` - -**参数:** - -| 参数名 | 类型 | 描述 | -| ------ | ------ | -------- | -| module | string | 模块名。 | - -**返回值:** - -| 返回类型 | 描述 | -| -------- | -------- | -| any | 模块值。 | - -## Config - -**描述:** - -编译器编译选项。 - -### lint_global - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该收集代码中出现的全局变量。 - -**签名:** - -```lua -lint_global: boolean -``` - -### implicit_return_root - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该对根层级的代码块进行隐式的表达式返回。 - -**签名:** - -```lua -implicit_return_root: boolean -``` - -### reserve_line_number - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该在编译后的代码中保留原始行号。 - -**签名:** - -```lua -reserve_line_number: boolean -``` - -### reserve_comment - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该在编译后的代码中保留原始注释。 - -**签名:** - -```lua -reserve_comment: boolean -``` - -### space_over_tab - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该在编译后的代码中使用空格字符而不是制表符字符。 - -**签名:** - -```lua -space_over_tab: boolean -``` - -### same_module - -**类型:** 成员变量。 - -**描述:** - -编译器是否应该将要编译的代码视为当前正在编译的模块。仅供编译器内部使用。 - -**签名:** - -```lua -same_module: boolean -``` - -### line_offset - -**类型:** 成员变量。 - -**描述:** - -编译器错误消息是否应该包含行号偏移量。仅供编译器内部使用。 - -**签名:** - -```lua -line_offset: integer -``` - -### yue.Config.LuaTarget - -**类型:** 枚举。 - -**描述:** - -目标 Lua 版本枚举。 - -**签名:** - -```lua -enum LuaTarget - "5.1" - "5.2" - "5.3" - "5.4" - "5.5" -end -``` - -### options - -**类型:** 成员变量。 - -**描述:** - -要传递给编译函数的额外选项。 - -**签名:** - -```lua -options: Options -``` - -## Options - -**描述:** - -额外编译器选项定义。 - -### target - -**类型:** 成员变量。 - -**描述:** - -编译目标 Lua 版本。 - -**签名:** - -```lua -target: LuaTarget -``` - -### path - -**类型:** 成员变量。 - -**描述:** - -额外模块搜索路径。 - -**签名:** - -```lua -path: string -``` - -### dump_locals - -**类型:** 成员变量。 - -**描述:** - -是否在回溯错误消息中输出代码块的局部变量。默认为 false。 - -**签名:** - -```lua -dump_locals: boolean -``` - -### simplified - -**类型:** 成员变量。 - -**描述:** - -是否简化输出的错误消息。默认为 true。 - -**签名:** - -```lua -simplified: boolean -``` diff --git a/makefile b/makefile index 860fef3e..e9f30be5 100644 --- a/makefile +++ b/makefile @@ -353,7 +353,7 @@ wasm-node: clean .PHONY: wasm wasm: clean @$(MAKE) generic CC='emcc' AR='emar rcu' RANLIB='emranlib' -C $(SRC_PATH)/3rdParty/lua - @mkdir -p doc/docs/.vitepress/public/js + @mkdir -p doc/public/js @em++ $(SRC_PATH)/yue_wasm.cpp \ $(SRC_PATH)/yuescript/ast.cpp \ $(SRC_PATH)/yuescript/yue_ast.cpp \ @@ -363,7 +363,7 @@ wasm: clean $(SRC_PATH)/yuescript/yuescript.cpp \ $(SRC_PATH)/3rdParty/lua/liblua.a \ -O2 \ - -o doc/docs/.vitepress/public/js/yuescript.js \ + -o doc/public/js/yuescript.js \ -I $(SRC_PATH) \ -I $(SRC_PATH)/3rdParty/ \ -I $(SRC_PATH)/3rdParty/lua \ diff --git a/spec/inputs/compile_doc.yue b/spec/inputs/compile_doc.yue index c26fced7..9a632915 100644 --- a/spec/inputs/compile_doc.yue +++ b/spec/inputs/compile_doc.yue @@ -1,51 +1,49 @@ -[outputFolder, docFolder] = {...} +outputFolder = ... getFiles = (locale) -> locale = if locale == "en" then "" else "#{locale}/" [ - "doc/docs/#{locale}doc/index.md" - "doc/docs/#{locale}doc/advanced/do.md" - "doc/docs/#{locale}doc/advanced/line-decorators.md" - "doc/docs/#{locale}doc/advanced/macro.md" - "doc/docs/#{locale}doc/advanced/try.md" - "doc/docs/#{locale}doc/data-structures/table-literals.md" - "doc/docs/#{locale}doc/data-structures/comprehensions.md" - "doc/docs/#{locale}doc/objects/object-oriented-programming.md" - "doc/docs/#{locale}doc/objects/with-statement.md" - "doc/docs/#{locale}doc/assignment/assignment.md" - "doc/docs/#{locale}doc/assignment/varargs-assignment.md" - "doc/docs/#{locale}doc/assignment/if-assignment.md" - "doc/docs/#{locale}doc/assignment/destructuring-assignment.md" - "doc/docs/#{locale}doc/assignment/the-using-clause-controlling-destructive-assignment.md" - "doc/docs/#{locale}doc/getting-started/usage.md" - "doc/docs/#{locale}doc/getting-started/introduction.md" - "doc/docs/#{locale}doc/getting-started/installation.md" - "doc/docs/#{locale}doc/control-flow/conditionals.md" - "doc/docs/#{locale}doc/control-flow/for-loop.md" - "doc/docs/#{locale}doc/control-flow/continue.md" - "doc/docs/#{locale}doc/control-flow/switch.md" - "doc/docs/#{locale}doc/control-flow/while-loop.md" - "doc/docs/#{locale}doc/functions/function-stubs.md" - "doc/docs/#{locale}doc/functions/backcalls.md" - "doc/docs/#{locale}doc/functions/function-literals.md" - "doc/docs/#{locale}doc/language-basics/whitespace.md" - "doc/docs/#{locale}doc/language-basics/comment.md" - "doc/docs/#{locale}doc/language-basics/attributes.md" - "doc/docs/#{locale}doc/language-basics/operator.md" - "doc/docs/#{locale}doc/language-basics/literals.md" - "doc/docs/#{locale}doc/language-basics/module.md" - "doc/docs/#{locale}doc/extras/license-mit.md" - "doc/docs/#{locale}doc/advanced/the-yuescript-library.md" + "doc/src/content/docs/#{locale}doc/index.md" + "doc/src/content/docs/#{locale}doc/advanced/do.md" + "doc/src/content/docs/#{locale}doc/advanced/line-decorators.md" + "doc/src/content/docs/#{locale}doc/advanced/macro.md" + "doc/src/content/docs/#{locale}doc/advanced/try.md" + "doc/src/content/docs/#{locale}doc/data-structures/table-literals.md" + "doc/src/content/docs/#{locale}doc/data-structures/comprehensions.md" + "doc/src/content/docs/#{locale}doc/objects/object-oriented-programming.md" + "doc/src/content/docs/#{locale}doc/objects/with-statement.md" + "doc/src/content/docs/#{locale}doc/assignment/assignment.md" + "doc/src/content/docs/#{locale}doc/assignment/varargs-assignment.md" + "doc/src/content/docs/#{locale}doc/assignment/if-assignment.md" + "doc/src/content/docs/#{locale}doc/assignment/destructuring-assignment.md" + "doc/src/content/docs/#{locale}doc/assignment/the-using-clause-controlling-destructive-assignment.md" + "doc/src/content/docs/#{locale}doc/getting-started/usage.md" + "doc/src/content/docs/#{locale}doc/getting-started/introduction.md" + "doc/src/content/docs/#{locale}doc/getting-started/installation.md" + "doc/src/content/docs/#{locale}doc/control-flow/conditionals.md" + "doc/src/content/docs/#{locale}doc/control-flow/for-loop.md" + "doc/src/content/docs/#{locale}doc/control-flow/continue.md" + "doc/src/content/docs/#{locale}doc/control-flow/switch.md" + "doc/src/content/docs/#{locale}doc/control-flow/while-loop.md" + "doc/src/content/docs/#{locale}doc/functions/function-stubs.md" + "doc/src/content/docs/#{locale}doc/functions/backcalls.md" + "doc/src/content/docs/#{locale}doc/functions/function-literals.md" + "doc/src/content/docs/#{locale}doc/language-basics/whitespace.md" + "doc/src/content/docs/#{locale}doc/language-basics/comment.md" + "doc/src/content/docs/#{locale}doc/language-basics/attributes.md" + "doc/src/content/docs/#{locale}doc/language-basics/operator.md" + "doc/src/content/docs/#{locale}doc/language-basics/literals.md" + "doc/src/content/docs/#{locale}doc/language-basics/module.md" + "doc/src/content/docs/#{locale}doc/extras/license-mit.md" + "doc/src/content/docs/#{locale}doc/advanced/the-yuescript-library.md" ] -docs = [ ["codes_from_doc_#{locale}.lua", "yue-#{locale}.md", getFiles locale] for locale in *["en", "zh", "pt-br", "de", "id-id"]] -for [compiledFile, docFile, docFiles] in *docs +docs = [ ["codes_from_doc_#{locale}.lua", getFiles locale] for locale in *["en", "zh", "pt-br", "de", "id-id"]] +for [compiledFile, docFiles] in *docs codes = [] - docTexts = [] for docFile in *docFiles close input = with? io.open docFile import "yue" as :to_lua text = \read "*a" - docTexts[] = text for code in text\gmatch "```yuescript[\r\n]+(.-)```[^%w]" if result, err := to_lua code, implicit_return_root: false, reserve_line_number: false codes[] = result @@ -60,10 +58,3 @@ for [compiledFile, docFile, docFiles] in *docs os.exit 1 close output = with io.open "#{outputFolder}/#{compiledFile}", "w+" \write table.concat codes - close output2 = with io.open "#{docFolder}/#{docFile}", "w+" - \write (table - .concat docTexts, "\n" - \gsub "\n\n", "" - \gsub "%-%-%-.-%-%-%-\n\n", "" - \gsub ".-\n\n", "") - diff --git a/spec/outputs/compile_doc.lua b/spec/outputs/compile_doc.lua index e8fd7192..63798ff3 100644 --- a/spec/outputs/compile_doc.lua +++ b/spec/outputs/compile_doc.lua @@ -1,10 +1,4 @@ -local outputFolder, docFolder -do - local _obj_0 = { - ... - } - outputFolder, docFolder = _obj_0[1], _obj_0[2] -end +local outputFolder = ... local getFiles getFiles = function(locale) if locale == "en" then @@ -13,39 +7,39 @@ getFiles = function(locale) locale = tostring(locale) .. "/" end return { - "doc/docs/" .. tostring(locale) .. "doc/index.md", - "doc/docs/" .. tostring(locale) .. "doc/advanced/do.md", - "doc/docs/" .. tostring(locale) .. "doc/advanced/line-decorators.md", - "doc/docs/" .. tostring(locale) .. "doc/advanced/macro.md", - "doc/docs/" .. tostring(locale) .. "doc/advanced/try.md", - "doc/docs/" .. tostring(locale) .. "doc/data-structures/table-literals.md", - "doc/docs/" .. tostring(locale) .. "doc/data-structures/comprehensions.md", - "doc/docs/" .. tostring(locale) .. "doc/objects/object-oriented-programming.md", - "doc/docs/" .. tostring(locale) .. "doc/objects/with-statement.md", - "doc/docs/" .. tostring(locale) .. "doc/assignment/assignment.md", - "doc/docs/" .. tostring(locale) .. "doc/assignment/varargs-assignment.md", - "doc/docs/" .. tostring(locale) .. "doc/assignment/if-assignment.md", - "doc/docs/" .. tostring(locale) .. "doc/assignment/destructuring-assignment.md", - "doc/docs/" .. tostring(locale) .. "doc/assignment/the-using-clause-controlling-destructive-assignment.md", - "doc/docs/" .. tostring(locale) .. "doc/getting-started/usage.md", - "doc/docs/" .. tostring(locale) .. "doc/getting-started/introduction.md", - "doc/docs/" .. tostring(locale) .. "doc/getting-started/installation.md", - "doc/docs/" .. tostring(locale) .. "doc/control-flow/conditionals.md", - "doc/docs/" .. tostring(locale) .. "doc/control-flow/for-loop.md", - "doc/docs/" .. tostring(locale) .. "doc/control-flow/continue.md", - "doc/docs/" .. tostring(locale) .. "doc/control-flow/switch.md", - "doc/docs/" .. tostring(locale) .. "doc/control-flow/while-loop.md", - "doc/docs/" .. tostring(locale) .. "doc/functions/function-stubs.md", - "doc/docs/" .. tostring(locale) .. "doc/functions/backcalls.md", - "doc/docs/" .. tostring(locale) .. "doc/functions/function-literals.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/whitespace.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/comment.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/attributes.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/operator.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/literals.md", - "doc/docs/" .. tostring(locale) .. "doc/language-basics/module.md", - "doc/docs/" .. tostring(locale) .. "doc/extras/license-mit.md", - "doc/docs/" .. tostring(locale) .. "doc/advanced/the-yuescript-library.md" + "doc/src/content/docs/" .. tostring(locale) .. "doc/index.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/advanced/do.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/advanced/line-decorators.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/advanced/macro.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/advanced/try.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/data-structures/table-literals.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/data-structures/comprehensions.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/objects/object-oriented-programming.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/objects/with-statement.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/assignment/assignment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/assignment/varargs-assignment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/assignment/if-assignment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/assignment/destructuring-assignment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/assignment/the-using-clause-controlling-destructive-assignment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/getting-started/usage.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/getting-started/introduction.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/getting-started/installation.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/control-flow/conditionals.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/control-flow/for-loop.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/control-flow/continue.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/control-flow/switch.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/control-flow/while-loop.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/functions/function-stubs.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/functions/backcalls.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/functions/function-literals.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/whitespace.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/comment.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/attributes.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/operator.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/literals.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/language-basics/module.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/extras/license-mit.md", + "doc/src/content/docs/" .. tostring(locale) .. "doc/advanced/the-yuescript-library.md" } end local docs @@ -63,7 +57,6 @@ do local locale = _list_0[_index_0] _accum_0[_len_0] = { "codes_from_doc_" .. tostring(locale) .. ".lua", - "yue-" .. tostring(locale) .. ".md", getFiles(locale) } _len_0 = _len_0 + 1 @@ -72,9 +65,8 @@ do end for _index_0 = 1, #docs do local _des_0 = docs[_index_0] - local compiledFile, docFile, docFiles = _des_0[1], _des_0[2], _des_0[3] + local compiledFile, docFiles = _des_0[1], _des_0[2] local codes = { } - local docTexts = { } for _index_1 = 1, #docFiles do local docFile = docFiles[_index_1] local input @@ -82,7 +74,6 @@ for _index_0 = 1, #docs do if _with_0 ~= nil then local to_lua = require("yue").to_lua local text = _with_0:read("*a") - docTexts[#docTexts + 1] = text for code in text:gmatch("```yuescript[\r\n]+(.-)```[^%w]") do local result, err = to_lua(code, { implicit_return_root = false, @@ -112,15 +103,8 @@ for _index_0 = 1, #docs do local _close_0 = input end local output - do - local _with_0 = io.open(tostring(outputFolder) .. "/" .. tostring(compiledFile), "w+") - _with_0:write(table.concat(codes)) - output = _with_0 - end + local _with_0 = io.open(tostring(outputFolder) .. "/" .. tostring(compiledFile), "w+") + _with_0:write(table.concat(codes)) + output = _with_0 local _close_0 = output - local output2 - local _with_0 = io.open(tostring(docFolder) .. "/" .. tostring(docFile), "w+") - _with_0:write((table.concat(docTexts, "\n"):gsub("\n\n", ""):gsub("%-%-%-.-%-%-%-\n\n", ""):gsub(".-\n\n", ""))) - output2 = _with_0 - local _close_1 = output2 end From 12356dd29d9041b9ded2ed3c8bf5e70950ede66d Mon Sep 17 00:00:00 2001 From: Dania Rifki Date: Tue, 6 Oct 2026 15:58:15 +0700 Subject: [PATCH 02/20] feat(docs): localize compiler UI and add a 404 page --- doc/astro.config.mjs | 11 ++- doc/scripts/check-docs.mjs | 41 +++++++++- doc/src/components/CompilerFooter.astro | 52 ++++++++---- doc/src/components/HeaderLinks.astro | 2 +- doc/src/components/MarkdownContent.astro | 5 ++ doc/src/components/YueCompiler.vue | 20 +++-- doc/src/content.config.ts | 29 ++++++- doc/src/content/i18n/de-DE.json | 19 +++++ doc/src/content/i18n/en-US.json | 19 +++++ doc/src/content/i18n/id-ID.json | 19 +++++ doc/src/content/i18n/pt-BR.json | 19 +++++ doc/src/content/i18n/zh-CN.json | 19 +++++ doc/src/locales.mjs | 8 -- doc/src/pages/404.astro | 92 ++++++++++++++++++++++ doc/src/pages/[...locale]/all-in-one.astro | 6 +- 15 files changed, 323 insertions(+), 38 deletions(-) create mode 100644 doc/src/content/i18n/de-DE.json create mode 100644 doc/src/content/i18n/en-US.json create mode 100644 doc/src/content/i18n/id-ID.json create mode 100644 doc/src/content/i18n/pt-BR.json create mode 100644 doc/src/content/i18n/zh-CN.json create mode 100644 doc/src/pages/404.astro diff --git a/doc/astro.config.mjs b/doc/astro.config.mjs index a8e33166..dfa04d24 100644 --- a/doc/astro.config.mjs +++ b/doc/astro.config.mjs @@ -2,7 +2,15 @@ import { readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs"; import { defineConfig } from "astro/config"; import starlight from "@astrojs/starlight"; import vue from "@astrojs/vue"; -import { locales, allInOneLabels } from "./src/locales.mjs"; +import { locales } from "./src/locales.mjs"; + +// The sidebar config runs before Astro loads content collections. +const allInOneLabels = Object.fromEntries( + Object.values(locales).map(({ lang }) => [ + lang, + JSON.parse(readFileSync(new URL(`./src/content/i18n/${lang}.json`, import.meta.url), "utf8"))["yue.allInOne"], + ]), +); const grammar = JSON.parse( readFileSync( @@ -47,6 +55,7 @@ export default defineConfig({ }, vue(), starlight({ + disable404Route: true, title: "YueScript", logo: { src: "./public/image/yuescript.svg", alt: "" }, description: "A delightful language that compiles to Lua", diff --git a/doc/scripts/check-docs.mjs b/doc/scripts/check-docs.mjs index 3bedce2b..a537b311 100644 --- a/doc/scripts/check-docs.mjs +++ b/doc/scripts/check-docs.mjs @@ -2,6 +2,20 @@ import assert from "node:assert/strict"; import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; import { locales } from "../src/locales.mjs"; +const translations = Object.fromEntries( + Object.values(locales).map(({ lang }) => [ + lang, + JSON.parse(readFileSync(`src/content/i18n/${lang}.json`, "utf8")), + ]), +); +const englishKeys = Object.keys(translations[locales.root.lang]).sort(); +for (const [lang, dictionary] of Object.entries(translations)) { + assert.deepEqual(Object.keys(dictionary).sort(), englishKeys, `Incomplete UI translations: ${lang}`); + for (const [key, value] of Object.entries(dictionary)) { + assert.ok(typeof value === "string" && value.trim(), `Empty UI translation: ${lang} ${key}`); + } +} + const decodeHtml = (text) => text.replace(/&(#x[\da-f]+|#\d+|amp|quot|lt|gt|apos);/gi, (_, entity) => { if (entity[0] === "#") @@ -34,6 +48,21 @@ const docs = files const localeFor = (file) => Object.keys(locales).find((locale) => file.startsWith(`${locale}/`)) ?? "root"; +function checkTranslations(html, lang, route) { + const dictionary = translations[lang]; + const messages = JSON.parse(decodeHtml(html.match(/data-yue-messages="([^"]+)"/)?.[1] ?? "")); + for (const [key, value] of Object.entries(dictionary)) { + if (key.startsWith("yue.compiler.")) { + assert.equal(messages[key.slice("yue.compiler.".length)], value, `Wrong compiler translation: ${route} ${key}`); + } + } + assert.ok(decodeHtml(html).includes(`>${dictionary["yue.try"]}`), `Wrong Try link translation: ${route}`); + assert.ok(decodeHtml(html).includes(`aria-label="${dictionary["yue.compiler.close"]}"`), `Wrong compiler close label: ${route}`); + for (const [, label] of html.matchAll(/]*\bdata-yue-compile(?=[\s>])[^>]*>([^<]*)<\/button>/g)) { + assert.equal(decodeHtml(label), dictionary["yue.compiler.compile"], `Wrong Compile button translation: ${route}`); + } +} + function checkInterface(html, route) { for (const [image] of html.matchAll(/]*>/g)) { assert.match(image, /\salt(?:="[^"]*"|(?=\s|>))/, `Image needs alternative text: ${route}`); @@ -52,6 +81,8 @@ for (const [locale, { lang }] of Object.entries(locales)) { const route = locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; const aggregate = readFileSync(`dist${route}index.html`, "utf8"); checkInterface(aggregate, route); + checkTranslations(aggregate, lang, route); + assert.equal(decodeHtml(aggregate.match(/]*>([^<]*)<\/h1>/)?.[1] ?? ""), translations[lang]["yue.allInOne"], `Wrong aggregate title: ${route}`); const localeDocs = docs.filter(({ file, splash }) => !splash && localeFor(file) === locale); const sections = [...aggregate.matchAll(/
match[1], @@ -95,6 +126,7 @@ for (const { file, source, slug, splash } of docs) { const html = readFileSync(output, "utf8"); checkInterface(html, `/${slug}/`); const locale = localeFor(file); + checkTranslations(html, locales[locale].lang, `/${slug}/`); const aggregateRoute = locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; // Splash pages have no sidebar; all documentation pages link to their own language. if (!splash) { @@ -131,10 +163,17 @@ for (const { file, source, slug, splash } of docs) { ); } } +const notFound = readFileSync("dist/404.html", "utf8"); +checkInterface(notFound, "/404.html"); +assert.match(notFound, /]*>404<\/h1>/, "404.html must render the error page"); +assert.ok(notFound.includes("Page not found. Check the URL or try using the search bar."), "Missing 404 message"); +assert.doesNotMatch(notFound, /http-equiv="refresh"/, "404.html must not redirect"); +assert.ok(!notFound.includes("data-pagefind-body"), "404 must stay out of search results"); + assert.ok( !readdirSync(".").some((file) => /^yue-.*\.md$/.test(file)), "Standalone yue-*.md manuals must be removed", ); console.log( - `Verified ${docs.length} routes, legacy HTML redirects, ${Object.keys(locales).length} language aggregates, ordering and anchors, and ${controls} compiler controls.`, + `Verified ${docs.length} routes, legacy HTML redirects, ${Object.keys(locales).length} language aggregates, localized UI, ordering and anchors, and ${controls} compiler controls.`, ); diff --git a/doc/src/components/CompilerFooter.astro b/doc/src/components/CompilerFooter.astro index ad31d95d..152290fc 100644 --- a/doc/src/components/CompilerFooter.astro +++ b/doc/src/components/CompilerFooter.astro @@ -1,20 +1,45 @@ --- import Footer from '@astrojs/starlight/components/Footer.astro'; import { Icon } from '@astrojs/starlight/components'; + +const { t } = Astro.locals; +const messages = { + title: t('yue.compiler.title'), + close: t('yue.compiler.close'), + loading: t('yue.compiler.loading'), + loadError: t('yue.compiler.loadError'), + modalLoadError: t('yue.compiler.modalLoadError'), + buildRuntime: t('yue.compiler.buildRuntime'), + compile: t('yue.compiler.compile'), + run: t('yue.compiler.run'), + programOutput: t('yue.compiler.programOutput'), + source: t('yue.compiler.source'), + luaOutput: t('yue.compiler.luaOutput'), + finished: t('yue.compiler.finished'), + complete: t('yue.compiler.complete'), + failed: t('yue.compiler.failed'), +}; ---
- +
-

YueScript Compiler

- +

YueScript {messages.title}

+
-
Loading compiler…
+
{messages.loading}
@@ -148,10 +173,8 @@ const messages = { align-items: center; justify-content: space-between; flex-shrink: 0; - padding: - max(0.6rem, env(safe-area-inset-top)) - max(1rem, env(safe-area-inset-right)) - 0.6rem + padding: max(0.6rem, env(safe-area-inset-top)) + max(1rem, env(safe-area-inset-right)) 0.6rem max(1rem, env(safe-area-inset-left)); background: var(--sl-color-bg-nav); border-bottom: 1px solid var(--sl-color-hairline); @@ -162,7 +185,7 @@ const messages = { #yue-compiler-title { margin: 0; font-size: 1rem; - font-family: var(--font-serif, "Merriweather", "Noto Serif SC", serif); + font-family: var(--font-serif, "Noto Serif", "Noto Serif SC", serif); font-weight: 700; color: var(--sl-color-white); } @@ -179,7 +202,9 @@ const messages = { place-items: center; min-width: 2.75rem; min-height: 2.75rem; - transition: color 0.15s ease, background-color 0.15s ease; + transition: + color 0.15s ease, + background-color 0.15s ease; } [data-yue-close]:hover { color: var(--sl-color-white); diff --git a/doc/src/components/Head.astro b/doc/src/components/Head.astro index f2342394..329b861c 100644 --- a/doc/src/components/Head.astro +++ b/doc/src/components/Head.astro @@ -1,31 +1,57 @@ --- -import Head from '@astrojs/starlight/components/Head.astro'; -import headingFont from '@fontsource/merriweather/files/merriweather-latin-700-normal.woff2?url'; -import heroFont from '@fontsource/merriweather/files/merriweather-latin-900-normal.woff2?url'; +import Head from "@astrojs/starlight/components/Head.astro"; +import headingFont from "@fontsource/noto-serif/files/noto-serif-latin-700-normal.woff2?url"; +import heroFont from "@fontsource/noto-serif/files/noto-serif-latin-900-normal.woff2?url"; --- - -{Astro.locals.starlightRoute.entry.data.template === 'splash' && ( - -)} + +{ + Astro.locals.starlightRoute.entry.data.template === "splash" && ( + + ) +} diff --git a/doc/src/components/YueCompiler.vue b/doc/src/components/YueCompiler.vue index b77296c6..2bff15e7 100644 --- a/doc/src/components/YueCompiler.vue +++ b/doc/src/components/YueCompiler.vue @@ -766,7 +766,7 @@ export default { .childTitle { width: 100%; font-size: 1.1em; - font-family: "Merriweather", "Noto Serif SC", serif; + font-family: "Noto Serif", "Noto Serif SC", serif; color: var(--sl-color-white); font-weight: bold; text-align: center; diff --git a/doc/src/styles/custom.css b/doc/src/styles/custom.css index 09a03a86..8a0a4490 100644 --- a/doc/src/styles/custom.css +++ b/doc/src/styles/custom.css @@ -1,11 +1,11 @@ -@import "@fontsource/merriweather/400.css"; -@import "@fontsource/merriweather/600.css"; -@import "@fontsource/merriweather/700.css"; -@import "@fontsource/merriweather/900.css"; -@import "@fontsource/merriweather/400-italic.css"; -@import "@fontsource/merriweather/600-italic.css"; -@import "@fontsource/merriweather/700-italic.css"; -@import "@fontsource/merriweather/900-italic.css"; +@import "@fontsource/noto-serif/400.css"; +@import "@fontsource/noto-serif/600.css"; +@import "@fontsource/noto-serif/700.css"; +@import "@fontsource/noto-serif/900.css"; +@import "@fontsource/noto-serif/400-italic.css"; +@import "@fontsource/noto-serif/600-italic.css"; +@import "@fontsource/noto-serif/700-italic.css"; +@import "@fontsource/noto-serif/900-italic.css"; @import "@fontsource/noto-serif-sc/400.css"; @import "@fontsource/noto-serif-sc/700.css"; @@ -18,7 +18,7 @@ --sl-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --font-serif: "Merriweather", "Noto Serif SC", serif; + --font-serif: "Noto Serif", "Noto Serif SC", serif; /* --- BRAND COLORS (Original Moon Gold) --- */ --vp-c-brand-1: #b4ac8f; @@ -231,7 +231,7 @@ h6, .site-title, .hero h1, .hero [data-page-title] { - font-family: "Merriweather", "Noto Serif SC", serif !important; + font-family: "Noto Serif", "Noto Serif SC", serif !important; letter-spacing: -0.02em; text-wrap: balance; } @@ -541,7 +541,7 @@ button[data-yue-compile]:hover { margin-bottom: 0.5rem !important; font-size: 1.2rem !important; color: var(--sl-color-white); - font-family: "Merriweather", "Noto Serif SC", serif !important; + font-family: "Noto Serif", "Noto Serif SC", serif !important; letter-spacing: -0.02em; } From 053c9db0ee76293eb49275a544a17d8aaf901c98 Mon Sep 17 00:00:00 2001 From: Dania Rifki Date: Wed, 7 Oct 2026 02:48:06 +0700 Subject: [PATCH 11/20] fmt(docs): add prettier and format code --- doc/.prettierrc | 12 + doc/astro.config.mjs | 7 +- doc/hints.txt | 26 + doc/package.json | 2 + doc/pnpm-lock.yaml | 5875 +++++++++++++------- doc/scripts/check-docs.mjs | 161 +- doc/src/components/AggregateContent.astro | 2 +- doc/src/components/CompilerFooter.astro | 10 +- doc/src/components/Head.astro | 26 +- doc/src/components/HeaderLinks.astro | 6 +- doc/src/components/MarkdownContent.astro | 22 +- doc/src/components/YueCompiler.vue | 172 +- doc/src/content/docs/de/index.md | 3 +- doc/src/content/docs/id-id/index.md | 3 +- doc/src/content/docs/pt-br/index.md | 3 +- doc/src/content/docs/zh/index.md | 3 +- doc/src/pages/404.astro | 24 +- doc/src/pages/[...locale]/404.astro | 8 +- doc/src/pages/[...locale]/all-in-one.astro | 35 +- 19 files changed, 4274 insertions(+), 2126 deletions(-) create mode 100644 doc/.prettierrc create mode 100644 doc/hints.txt diff --git a/doc/.prettierrc b/doc/.prettierrc new file mode 100644 index 00000000..17d3ffce --- /dev/null +++ b/doc/.prettierrc @@ -0,0 +1,12 @@ +{ + "plugins": ["prettier-plugin-astro"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ], + "experimentalTernaries": true +} diff --git a/doc/astro.config.mjs b/doc/astro.config.mjs index dfa04d24..6a4ae6e6 100644 --- a/doc/astro.config.mjs +++ b/doc/astro.config.mjs @@ -8,7 +8,12 @@ import { locales } from "./src/locales.mjs"; const allInOneLabels = Object.fromEntries( Object.values(locales).map(({ lang }) => [ lang, - JSON.parse(readFileSync(new URL(`./src/content/i18n/${lang}.json`, import.meta.url), "utf8"))["yue.allInOne"], + JSON.parse( + readFileSync( + new URL(`./src/content/i18n/${lang}.json`, import.meta.url), + "utf8", + ), + )["yue.allInOne"], ]), ); diff --git a/doc/hints.txt b/doc/hints.txt new file mode 100644 index 00000000..b8f1734d --- /dev/null +++ b/doc/hints.txt @@ -0,0 +1,26 @@ +02:40:15 [content] Syncing content +02:40:15 [content] Synced content +02:40:15 [types] Generated 355ms +02:40:15 [check] Getting diagnostics for Astro files in /Volumes/kalX9 Pro/Code/YueScript/doc... +public/js/yuescript.js:1:87578 - warning ts(2568): Property 'preloadFile' may not exist on type '{ root: null; mounts: never[]; devices: {}; streams: never[]; nextInode: number; nameTable: null; currentPath: string; initialized: boolean; ignorePermissions: boolean; filesystems: null; syncFSRequests: number; ... 103 more ...; createLazyFile(parent: any, name: any, url: any, canRead: any, canWrite: any): any; }'. Did you mean 'readFile'? + +1 var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}programArgs=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var isFileURI=filename=>filename.startsWith("file://");class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}class CppException extends EmscriptenEH{constructor(excPtr){super();this.excPtr=excPtr}}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){var preRun=Module["preRun"];if(preRun){if(typeof preRun=="function")preRun=[preRun];onPreRuns.push(...preRun)}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function postRun(){var postRun=Module["postRun"];if(postRun){if(typeof postRun=="function")postRun=[postRun];onPostRuns.push(...postRun)}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("yuescript.wasm")}function getBinarySync(file){if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={env:wasmImports,wasi_snapshot_preview1:wasmImports};return imports}async function createWasm(){function receiveInstance(instance){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();var instantiateWasm=Module["instantiateWasm"];if(instantiateWasm){return new Promise(resolve=>{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var HEAPU8;var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var exceptionCaught=[];var uncaughtExceptionCount=0;var HEAP8;var HEAPU32;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var ___cxa_begin_catch=ptr=>{var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);return ___cxa_get_exception_ptr(ptr)};var exceptionLast=null;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=null};var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast?.excPtr;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(!caughtType||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var ___cxa_find_matching_catch_3=arg0=>findMatchingCatch([arg0]);var ___cxa_find_matching_catch_4=(arg0,arg1)=>findMatchingCatch([arg0,arg1]);var __Unwind_RaiseException=ex=>{throw ex};var ___cxa_rethrow=()=>{if(!exceptionCaught.length){abort("no exception to throw")}var info=exceptionCaught.at(-1);var ptr=info.excPtr;info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++;___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);__Unwind_RaiseException(ptr)};var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);uncaughtExceptionCount++;__Unwind_RaiseException(ptr)};var ___cxa_uncaught_exceptions=()=>uncaughtExceptionCount;var __Unwind_Resume=ex=>{throw ex};var ___resumeException=ptr=>{ptr=exceptionLast??=new CppException(ptr);__Unwind_Resume(ptr)};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>(nodeCrypto.randomFillSync(view),0)}return view=>(crypto.getRandomValues(view),0)};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(!node.usedBytes&&!position){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var dependenciesPromise=null;var resolveRunDependencies=async()=>dependenciesPromise;var runDependencies=0;var dependenciesPromiseResolve=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(!runDependencies){dependenciesPromiseResolve()}};var addRunDependency=id=>{if(!runDependencies){dependenciesPromise=new Promise(resolve=>dependenciesPromiseResolve=resolve)}runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}addListener(cb,exclusive=false){var entry={cb,exclusive};var listeners=this.listeners??=new Set;listeners.add(entry);return{listeners,entry}}notifyListeners(flags){if(!this.listeners)return;var excl;for(var entry of this.listeners){if(entry.exclusive)(excl||=[]).push(entry);else entry.cb(flags)}if(excl){var i=(this.exclTurn||0)%excl.length;this.exclTurn=i+1;excl[i].cb(flags)}}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);try{setattr(arg,attr)}catch(e){if(e instanceof RangeError){throw new FS.ErrnoError(22)}throw e}},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},link(oldpath,newpath,flags){var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.link){throw new FS.ErrnoError(34)}return parent.node_ops.link(parent,newname,oldpath,flags)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});FS.doSetAttr(null,lookup.node,{atime,mtime,dontFollow})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;stream.node?.notifyListeners(32);try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if(prot&2&&!(flags&2)&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags??0;opts.encoding=opts.encoding??"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags??577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(!randomLeft){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort(`invalid range (${from}, ${to}) or no bytes requested!`);if(to>datalength-1)abort(`only ${datalength} bytes available! programmer error!`);var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range",`bytes=${from}-${to}`);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText??"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var HEAP32;var HEAP64;var SYSCALLS={currentUmask:18,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.subarray(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_dup3(fd,newfd,flags){try{if(fd===newfd)return-28;if(flags&~524288)return-28;var old=SYSCALLS.getStreamFromFD(fd);if(newfd<0||newfd>=FS.MAX_OPEN_FDS)return-8;var existing=FS.getStream(newfd);if(existing)FS.close(existing);var stream=FS.dupStream(old,newfd);if(flags&524288){stream.flags|=524288}return stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var HEAP16;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();var mask=289792;stream.flags=stream.flags&~mask|arg&mask;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;if(flags&64){mode&=~SYSCALLS.currentUmask}return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var tupleRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}}var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}}if(0===unregisteredTypes.length){onComplete(typeConverters)}};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var __embind_finalize_value_array=rawTupleType=>{var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(elt=>elt.getterReturnType).concat(elements.map(elt=>elt.setterArgumentType));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var valueSize=reg.valueSize;var isTrivial=reg.isTrivial;whenDependentTypesAreResolved([rawTupleType],elementTypes,elementTypes=>{for(const[i,elt]of elements.entries()){const getterReturnType=elementTypes[i];const getter=elt.getter;const getterContext=elt.getterContext;const setterArgumentType=elementTypes[i+elementsLength];const setter=elt.setter;const setterContext=elt.setterContext;elt.read=ptr=>getterReturnType.fromWireType(getter(getterContext,ptr));if(setterArgumentType.destructorFunction===null&&!setterArgumentType.argStackAlloc){elt.write=(ptr,o)=>setter(setterContext,ptr,setterArgumentType.toWireType(null,o))}else{elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType.toWireType(destructors,o));runDestructors(destructors)}}}return[{name:reg.name,fromWireType:ptr=>{var rv=new Array(elementsLength);for(var i=0;i{if(elementsLength!==o.length){throw new TypeError(`Incorrect number of tuple elements for ${reg.name}: expected=${elementsLength}, actual=${o.length}`)}var ptr;if(isTrivial&&!destructors){ptr=stackAlloc(valueSize);zeroMemory(ptr,valueSize)}else{ptr=rawConstructor();if(destructors){destructors.push(rawDestructor,ptr)}}for(var i=0;i{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch)}};class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}}var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var HEAPU16;var HEAPU64;var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0n;let fromWireType=value=>value;if(isUnsignedType){const bitSize=size*8;fromWireType=value=>BigInt.asUintN(bitSize,value);maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>{if(typeof value=="number"){value=BigInt(value)}return value},readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},readValueFromPointer:function(pointer){return this.fromWireType(HEAPU8[pointer])},destructorFunction:null})};var emval_freelist=[];var emval_handles=[0,1,,1,null,1,true,1,false,1];var emval_exception_decrefs=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){var value=emval_handles[handle];emval_handles[handle]=undefined;var destructor=emval_exception_decrefs[handle];if(destructor){emval_exception_decrefs[handle]=undefined;destructor(value)}emval_freelist.push(handle)}};var Emval={toValue:handle=>{if(!handle){throwBindingError(`Cannot use deleted val. handle = ${handle}`)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var HEAPF32;var HEAPF64;var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this.fromWireType(HEAPF32[pointer>>2])};case 8:return function(pointer){return this.fromWireType(HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var createNamedFunction=(name,func)=>Object.defineProperty(func,"name",{value:name});function usesDestructorStack(argTypes){for(var i=1;i{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module[name].overloadTable.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var embind__requireFunction=(signature,rawFunction,isAsync=false)=>{signature=AsciiToString(signature);function makeDynCaller(){var rtn=getWasmTableEntry(rawFunction);return rtn}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};class UnboundTypeError extends Error{}var getTypeName=type=>{var ptr=___getTypeName(type);var rv=AsciiToString(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex===-1)return signature;return signature.slice(0,argsIndex)};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=AsciiToString(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker,isAsync);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0;let fromWireType=value=>value;if(isUnsignedType){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift;maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>value,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=AsciiToString(name);registerType(rawType,{name,fromWireType:decodeMemoryView,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var __embind_register_std_string=(rawType,name)=>{name=AsciiToString(name);var stdStringIsUTF8=true;registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){str=UTF8ToString(payload,length,true)}else{str="";for(var i=0;i>2]=length;if(valueIsOfTypeString){if(stdStringIsUTF8){stringToUTF8(value,ptr,length+1)}else{for(var i=0;i255){_free(base);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}}else{HEAPU8.set(value,ptr)}if(destructors!==null){destructors.push(_free,base)}return base},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=globalThis.TextDecoder?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead,ignoreNul)=>{var idx=ptr>>1;var endIdx=findStringEnd(HEAPU16,idx,maxBytesToRead/2,ignoreNul);if(endIdx-idx>16&&UTF16Decoder)return UTF16Decoder.decode(HEAPU16.subarray(idx,endIdx));var str="";for(var i=idx;i{if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead,ignoreNul)=>{var str="";var startIdx=ptr>>2;for(var i=0;!(i>=maxBytesToRead/4);i++){var utf32=HEAPU32[startIdx+i];if(!utf32&&!ignoreNul)break;str+=String.fromCodePoint(utf32)}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i65535){i++}HEAP32[outPtr>>2]=codePoint;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i65535){i++}len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=AsciiToString(name);var decodeString,encodeString,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16}else{decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str=decodeString(value+4,length*charSize,true);_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_array=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor,valueSize,isTrivial)=>{tupleRegistrations[rawType]={name:AsciiToString(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),valueSize,isTrivial:!!isTrivial,elements:[]}};var __embind_register_value_array_element=(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{tupleRegistrations[rawTupleType].elements.push({getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext,setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext})};var __embind_register_void=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{isVoid:true,name,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("node:child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};var __emscripten_throw_longjmp=()=>{throw new EmscriptenSjLj};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return 0}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;return 0}var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);if(isNaN(date.getTime())){return-1}var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){dst=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4);if(isNaN(date.getTime())){return-1}}HEAP32[tmPtr+32>>2]=dst;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3})();return BigInt(ret)};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;try{var curr=FS.read(stream,HEAP8,ptr,len,offset)}catch(e){if(ret>0&&e instanceof FS.ErrnoError&&(e.errno==6||e.errno==6)){break}throw e}if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 22;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&!offset&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{if(iovcnt==1){return FS.write(stream,HEAP8,HEAPU32[iov>>2],HEAPU32[iov+4>>2],offset)}var total=0;for(var i=0,p=iov;i>2]}var view=new Uint8Array(total);var voff=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];view.set(HEAPU8.subarray(ptr,ptr+len),voff);voff+=len}return FS.write(stream,view,0,total,offset)};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _llvm_eh_typeid_for=type=>type;FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}var _malloc,_free,___getTypeName,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_decrement_exception_refcount,___cxa_increment_exception_refcount,___cxa_can_catch,___cxa_get_exception_ptr,memory,__indirect_function_table,wasmMemory,wasmTable;function assignWasmExports(wasmExports){_malloc=wasmExports["malloc"];_free=wasmExports["free"];___getTypeName=wasmExports["__getTypeName"];_setThrew=wasmExports["setThrew"];__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"];__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];___cxa_decrement_exception_refcount=wasmExports["__cxa_decrement_exception_refcount"];___cxa_increment_exception_refcount=wasmExports["__cxa_increment_exception_refcount"];___cxa_can_catch=wasmExports["__cxa_can_catch"];___cxa_get_exception_ptr=wasmExports["__cxa_get_exception_ptr"];memory=wasmMemory=wasmExports["memory"];__indirect_function_table=wasmTable=wasmExports["__indirect_function_table"]}var wasmImports={__assert_fail:___assert_fail,__cxa_begin_catch:___cxa_begin_catch,__cxa_end_catch:___cxa_end_catch,__cxa_find_matching_catch_2:___cxa_find_matching_catch_2,__cxa_find_matching_catch_3:___cxa_find_matching_catch_3,__cxa_find_matching_catch_4:___cxa_find_matching_catch_4,__cxa_rethrow:___cxa_rethrow,__cxa_throw:___cxa_throw,__cxa_uncaught_exceptions:___cxa_uncaught_exceptions,__resumeException:___resumeException,__syscall_dup3:___syscall_dup3,__syscall_fcntl64:___syscall_fcntl64,__syscall_ioctl:___syscall_ioctl,__syscall_openat:___syscall_openat,__syscall_readlinkat:___syscall_readlinkat,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_unlinkat:___syscall_unlinkat,_abort_js:__abort_js,_embind_finalize_value_array:__embind_finalize_value_array,_embind_register_bigint:__embind_register_bigint,_embind_register_bool:__embind_register_bool,_embind_register_emval:__embind_register_emval,_embind_register_float:__embind_register_float,_embind_register_function:__embind_register_function,_embind_register_integer:__embind_register_integer,_embind_register_memory_view:__embind_register_memory_view,_embind_register_std_string:__embind_register_std_string,_embind_register_std_wstring:__embind_register_std_wstring,_embind_register_value_array:__embind_register_value_array,_embind_register_value_array_element:__embind_register_value_array_element,_embind_register_void:__embind_register_void,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_date_now:_emscripten_date_now,emscripten_resize_heap:_emscripten_resize_heap,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,invoke_diii,invoke_fiii,invoke_i,invoke_ii,invoke_iid,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiid,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiiiiii,invoke_iiiiiiiiiiiii,invoke_iiij,invoke_jii,invoke_jiii,invoke_v,invoke_vi,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiii,invoke_viiiiiiiiiiiiiii,invoke_viij,invoke_vij,llvm_eh_typeid_for:_llvm_eh_typeid_for};function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_iiij(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_vij(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iid(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}async function run(){preRun();if(runDependencies){await resolveRunDependencies()}var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;createWasm().then(()=>run()); +   ~~~~~~~~~~~ +public/js/yuescript.js:1:79731 - warning ts(80008): Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers. + +1 var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}programArgs=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var isFileURI=filename=>filename.startsWith("file://");class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}class CppException extends EmscriptenEH{constructor(excPtr){super();this.excPtr=excPtr}}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){var preRun=Module["preRun"];if(preRun){if(typeof preRun=="function")preRun=[preRun];onPreRuns.push(...preRun)}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function postRun(){var postRun=Module["postRun"];if(postRun){if(typeof postRun=="function")postRun=[postRun];onPostRuns.push(...postRun)}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("yuescript.wasm")}function getBinarySync(file){if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={env:wasmImports,wasi_snapshot_preview1:wasmImports};return imports}async function createWasm(){function receiveInstance(instance){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();var instantiateWasm=Module["instantiateWasm"];if(instantiateWasm){return new Promise(resolve=>{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var HEAPU8;var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var exceptionCaught=[];var uncaughtExceptionCount=0;var HEAP8;var HEAPU32;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var ___cxa_begin_catch=ptr=>{var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);return ___cxa_get_exception_ptr(ptr)};var exceptionLast=null;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=null};var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast?.excPtr;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(!caughtType||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var ___cxa_find_matching_catch_3=arg0=>findMatchingCatch([arg0]);var ___cxa_find_matching_catch_4=(arg0,arg1)=>findMatchingCatch([arg0,arg1]);var __Unwind_RaiseException=ex=>{throw ex};var ___cxa_rethrow=()=>{if(!exceptionCaught.length){abort("no exception to throw")}var info=exceptionCaught.at(-1);var ptr=info.excPtr;info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++;___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);__Unwind_RaiseException(ptr)};var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);uncaughtExceptionCount++;__Unwind_RaiseException(ptr)};var ___cxa_uncaught_exceptions=()=>uncaughtExceptionCount;var __Unwind_Resume=ex=>{throw ex};var ___resumeException=ptr=>{ptr=exceptionLast??=new CppException(ptr);__Unwind_Resume(ptr)};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>(nodeCrypto.randomFillSync(view),0)}return view=>(crypto.getRandomValues(view),0)};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(!node.usedBytes&&!position){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var dependenciesPromise=null;var resolveRunDependencies=async()=>dependenciesPromise;var runDependencies=0;var dependenciesPromiseResolve=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(!runDependencies){dependenciesPromiseResolve()}};var addRunDependency=id=>{if(!runDependencies){dependenciesPromise=new Promise(resolve=>dependenciesPromiseResolve=resolve)}runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}addListener(cb,exclusive=false){var entry={cb,exclusive};var listeners=this.listeners??=new Set;listeners.add(entry);return{listeners,entry}}notifyListeners(flags){if(!this.listeners)return;var excl;for(var entry of this.listeners){if(entry.exclusive)(excl||=[]).push(entry);else entry.cb(flags)}if(excl){var i=(this.exclTurn||0)%excl.length;this.exclTurn=i+1;excl[i].cb(flags)}}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);try{setattr(arg,attr)}catch(e){if(e instanceof RangeError){throw new FS.ErrnoError(22)}throw e}},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},link(oldpath,newpath,flags){var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.link){throw new FS.ErrnoError(34)}return parent.node_ops.link(parent,newname,oldpath,flags)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});FS.doSetAttr(null,lookup.node,{atime,mtime,dontFollow})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;stream.node?.notifyListeners(32);try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if(prot&2&&!(flags&2)&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags??0;opts.encoding=opts.encoding??"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags??577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(!randomLeft){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort(`invalid range (${from}, ${to}) or no bytes requested!`);if(to>datalength-1)abort(`only ${datalength} bytes available! programmer error!`);var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range",`bytes=${from}-${to}`);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText??"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var HEAP32;var HEAP64;var SYSCALLS={currentUmask:18,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.subarray(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_dup3(fd,newfd,flags){try{if(fd===newfd)return-28;if(flags&~524288)return-28;var old=SYSCALLS.getStreamFromFD(fd);if(newfd<0||newfd>=FS.MAX_OPEN_FDS)return-8;var existing=FS.getStream(newfd);if(existing)FS.close(existing);var stream=FS.dupStream(old,newfd);if(flags&524288){stream.flags|=524288}return stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var HEAP16;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();var mask=289792;stream.flags=stream.flags&~mask|arg&mask;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;if(flags&64){mode&=~SYSCALLS.currentUmask}return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var tupleRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}}var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}}if(0===unregisteredTypes.length){onComplete(typeConverters)}};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var __embind_finalize_value_array=rawTupleType=>{var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(elt=>elt.getterReturnType).concat(elements.map(elt=>elt.setterArgumentType));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var valueSize=reg.valueSize;var isTrivial=reg.isTrivial;whenDependentTypesAreResolved([rawTupleType],elementTypes,elementTypes=>{for(const[i,elt]of elements.entries()){const getterReturnType=elementTypes[i];const getter=elt.getter;const getterContext=elt.getterContext;const setterArgumentType=elementTypes[i+elementsLength];const setter=elt.setter;const setterContext=elt.setterContext;elt.read=ptr=>getterReturnType.fromWireType(getter(getterContext,ptr));if(setterArgumentType.destructorFunction===null&&!setterArgumentType.argStackAlloc){elt.write=(ptr,o)=>setter(setterContext,ptr,setterArgumentType.toWireType(null,o))}else{elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType.toWireType(destructors,o));runDestructors(destructors)}}}return[{name:reg.name,fromWireType:ptr=>{var rv=new Array(elementsLength);for(var i=0;i{if(elementsLength!==o.length){throw new TypeError(`Incorrect number of tuple elements for ${reg.name}: expected=${elementsLength}, actual=${o.length}`)}var ptr;if(isTrivial&&!destructors){ptr=stackAlloc(valueSize);zeroMemory(ptr,valueSize)}else{ptr=rawConstructor();if(destructors){destructors.push(rawDestructor,ptr)}}for(var i=0;i{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch)}};class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}}var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var HEAPU16;var HEAPU64;var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0n;let fromWireType=value=>value;if(isUnsignedType){const bitSize=size*8;fromWireType=value=>BigInt.asUintN(bitSize,value);maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>{if(typeof value=="number"){value=BigInt(value)}return value},readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},readValueFromPointer:function(pointer){return this.fromWireType(HEAPU8[pointer])},destructorFunction:null})};var emval_freelist=[];var emval_handles=[0,1,,1,null,1,true,1,false,1];var emval_exception_decrefs=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){var value=emval_handles[handle];emval_handles[handle]=undefined;var destructor=emval_exception_decrefs[handle];if(destructor){emval_exception_decrefs[handle]=undefined;destructor(value)}emval_freelist.push(handle)}};var Emval={toValue:handle=>{if(!handle){throwBindingError(`Cannot use deleted val. handle = ${handle}`)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var HEAPF32;var HEAPF64;var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this.fromWireType(HEAPF32[pointer>>2])};case 8:return function(pointer){return this.fromWireType(HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var createNamedFunction=(name,func)=>Object.defineProperty(func,"name",{value:name});function usesDestructorStack(argTypes){for(var i=1;i{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module[name].overloadTable.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var embind__requireFunction=(signature,rawFunction,isAsync=false)=>{signature=AsciiToString(signature);function makeDynCaller(){var rtn=getWasmTableEntry(rawFunction);return rtn}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};class UnboundTypeError extends Error{}var getTypeName=type=>{var ptr=___getTypeName(type);var rv=AsciiToString(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex===-1)return signature;return signature.slice(0,argsIndex)};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=AsciiToString(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker,isAsync);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0;let fromWireType=value=>value;if(isUnsignedType){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift;maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>value,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=AsciiToString(name);registerType(rawType,{name,fromWireType:decodeMemoryView,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var __embind_register_std_string=(rawType,name)=>{name=AsciiToString(name);var stdStringIsUTF8=true;registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){str=UTF8ToString(payload,length,true)}else{str="";for(var i=0;i>2]=length;if(valueIsOfTypeString){if(stdStringIsUTF8){stringToUTF8(value,ptr,length+1)}else{for(var i=0;i255){_free(base);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}}else{HEAPU8.set(value,ptr)}if(destructors!==null){destructors.push(_free,base)}return base},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=globalThis.TextDecoder?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead,ignoreNul)=>{var idx=ptr>>1;var endIdx=findStringEnd(HEAPU16,idx,maxBytesToRead/2,ignoreNul);if(endIdx-idx>16&&UTF16Decoder)return UTF16Decoder.decode(HEAPU16.subarray(idx,endIdx));var str="";for(var i=idx;i{if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead,ignoreNul)=>{var str="";var startIdx=ptr>>2;for(var i=0;!(i>=maxBytesToRead/4);i++){var utf32=HEAPU32[startIdx+i];if(!utf32&&!ignoreNul)break;str+=String.fromCodePoint(utf32)}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i65535){i++}HEAP32[outPtr>>2]=codePoint;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i65535){i++}len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=AsciiToString(name);var decodeString,encodeString,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16}else{decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str=decodeString(value+4,length*charSize,true);_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_array=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor,valueSize,isTrivial)=>{tupleRegistrations[rawType]={name:AsciiToString(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),valueSize,isTrivial:!!isTrivial,elements:[]}};var __embind_register_value_array_element=(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{tupleRegistrations[rawTupleType].elements.push({getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext,setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext})};var __embind_register_void=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{isVoid:true,name,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("node:child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};var __emscripten_throw_longjmp=()=>{throw new EmscriptenSjLj};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return 0}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;return 0}var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);if(isNaN(date.getTime())){return-1}var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){dst=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4);if(isNaN(date.getTime())){return-1}}HEAP32[tmPtr+32>>2]=dst;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3})();return BigInt(ret)};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;try{var curr=FS.read(stream,HEAP8,ptr,len,offset)}catch(e){if(ret>0&&e instanceof FS.ErrnoError&&(e.errno==6||e.errno==6)){break}throw e}if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 22;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&!offset&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{if(iovcnt==1){return FS.write(stream,HEAP8,HEAPU32[iov>>2],HEAPU32[iov+4>>2],offset)}var total=0;for(var i=0,p=iov;i>2]}var view=new Uint8Array(total);var voff=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];view.set(HEAPU8.subarray(ptr,ptr+len),voff);voff+=len}return FS.write(stream,view,0,total,offset)};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _llvm_eh_typeid_for=type=>type;FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}var _malloc,_free,___getTypeName,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_decrement_exception_refcount,___cxa_increment_exception_refcount,___cxa_can_catch,___cxa_get_exception_ptr,memory,__indirect_function_table,wasmMemory,wasmTable;function assignWasmExports(wasmExports){_malloc=wasmExports["malloc"];_free=wasmExports["free"];___getTypeName=wasmExports["__getTypeName"];_setThrew=wasmExports["setThrew"];__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"];__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];___cxa_decrement_exception_refcount=wasmExports["__cxa_decrement_exception_refcount"];___cxa_increment_exception_refcount=wasmExports["__cxa_increment_exception_refcount"];___cxa_can_catch=wasmExports["__cxa_can_catch"];___cxa_get_exception_ptr=wasmExports["__cxa_get_exception_ptr"];memory=wasmMemory=wasmExports["memory"];__indirect_function_table=wasmTable=wasmExports["__indirect_function_table"]}var wasmImports={__assert_fail:___assert_fail,__cxa_begin_catch:___cxa_begin_catch,__cxa_end_catch:___cxa_end_catch,__cxa_find_matching_catch_2:___cxa_find_matching_catch_2,__cxa_find_matching_catch_3:___cxa_find_matching_catch_3,__cxa_find_matching_catch_4:___cxa_find_matching_catch_4,__cxa_rethrow:___cxa_rethrow,__cxa_throw:___cxa_throw,__cxa_uncaught_exceptions:___cxa_uncaught_exceptions,__resumeException:___resumeException,__syscall_dup3:___syscall_dup3,__syscall_fcntl64:___syscall_fcntl64,__syscall_ioctl:___syscall_ioctl,__syscall_openat:___syscall_openat,__syscall_readlinkat:___syscall_readlinkat,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_unlinkat:___syscall_unlinkat,_abort_js:__abort_js,_embind_finalize_value_array:__embind_finalize_value_array,_embind_register_bigint:__embind_register_bigint,_embind_register_bool:__embind_register_bool,_embind_register_emval:__embind_register_emval,_embind_register_float:__embind_register_float,_embind_register_function:__embind_register_function,_embind_register_integer:__embind_register_integer,_embind_register_memory_view:__embind_register_memory_view,_embind_register_std_string:__embind_register_std_string,_embind_register_std_wstring:__embind_register_std_wstring,_embind_register_value_array:__embind_register_value_array,_embind_register_value_array_element:__embind_register_value_array_element,_embind_register_void:__embind_register_void,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_date_now:_emscripten_date_now,emscripten_resize_heap:_emscripten_resize_heap,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,invoke_diii,invoke_fiii,invoke_i,invoke_ii,invoke_iid,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiid,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiiiiii,invoke_iiiiiiiiiiiii,invoke_iiij,invoke_jii,invoke_jiii,invoke_v,invoke_vi,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiii,invoke_viiiiiiiiiiiiiii,invoke_viij,invoke_vij,llvm_eh_typeid_for:_llvm_eh_typeid_for};function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_iiij(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_vij(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iid(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}async function run(){preRun();if(runDependencies){await resolveRunDependencies()}var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;createWasm().then(()=>run()); +   ~~~~~~~~~~~~~~~~ +public/js/yuescript.js:1:79699 - warning ts(80008): Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers. + +1 var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}programArgs=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var isFileURI=filename=>filename.startsWith("file://");class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}class CppException extends EmscriptenEH{constructor(excPtr){super();this.excPtr=excPtr}}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){var preRun=Module["preRun"];if(preRun){if(typeof preRun=="function")preRun=[preRun];onPreRuns.push(...preRun)}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function postRun(){var postRun=Module["postRun"];if(postRun){if(typeof postRun=="function")postRun=[postRun];onPostRuns.push(...postRun)}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("yuescript.wasm")}function getBinarySync(file){if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={env:wasmImports,wasi_snapshot_preview1:wasmImports};return imports}async function createWasm(){function receiveInstance(instance){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();var instantiateWasm=Module["instantiateWasm"];if(instantiateWasm){return new Promise(resolve=>{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var HEAPU8;var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var exceptionCaught=[];var uncaughtExceptionCount=0;var HEAP8;var HEAPU32;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var ___cxa_begin_catch=ptr=>{var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);return ___cxa_get_exception_ptr(ptr)};var exceptionLast=null;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=null};var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast?.excPtr;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(!caughtType||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var ___cxa_find_matching_catch_3=arg0=>findMatchingCatch([arg0]);var ___cxa_find_matching_catch_4=(arg0,arg1)=>findMatchingCatch([arg0,arg1]);var __Unwind_RaiseException=ex=>{throw ex};var ___cxa_rethrow=()=>{if(!exceptionCaught.length){abort("no exception to throw")}var info=exceptionCaught.at(-1);var ptr=info.excPtr;info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++;___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);__Unwind_RaiseException(ptr)};var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);uncaughtExceptionCount++;__Unwind_RaiseException(ptr)};var ___cxa_uncaught_exceptions=()=>uncaughtExceptionCount;var __Unwind_Resume=ex=>{throw ex};var ___resumeException=ptr=>{ptr=exceptionLast??=new CppException(ptr);__Unwind_Resume(ptr)};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>(nodeCrypto.randomFillSync(view),0)}return view=>(crypto.getRandomValues(view),0)};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(!node.usedBytes&&!position){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var dependenciesPromise=null;var resolveRunDependencies=async()=>dependenciesPromise;var runDependencies=0;var dependenciesPromiseResolve=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(!runDependencies){dependenciesPromiseResolve()}};var addRunDependency=id=>{if(!runDependencies){dependenciesPromise=new Promise(resolve=>dependenciesPromiseResolve=resolve)}runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}addListener(cb,exclusive=false){var entry={cb,exclusive};var listeners=this.listeners??=new Set;listeners.add(entry);return{listeners,entry}}notifyListeners(flags){if(!this.listeners)return;var excl;for(var entry of this.listeners){if(entry.exclusive)(excl||=[]).push(entry);else entry.cb(flags)}if(excl){var i=(this.exclTurn||0)%excl.length;this.exclTurn=i+1;excl[i].cb(flags)}}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);try{setattr(arg,attr)}catch(e){if(e instanceof RangeError){throw new FS.ErrnoError(22)}throw e}},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},link(oldpath,newpath,flags){var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.link){throw new FS.ErrnoError(34)}return parent.node_ops.link(parent,newname,oldpath,flags)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});FS.doSetAttr(null,lookup.node,{atime,mtime,dontFollow})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;stream.node?.notifyListeners(32);try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if(prot&2&&!(flags&2)&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags??0;opts.encoding=opts.encoding??"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags??577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(!randomLeft){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort(`invalid range (${from}, ${to}) or no bytes requested!`);if(to>datalength-1)abort(`only ${datalength} bytes available! programmer error!`);var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range",`bytes=${from}-${to}`);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText??"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var HEAP32;var HEAP64;var SYSCALLS={currentUmask:18,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.subarray(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_dup3(fd,newfd,flags){try{if(fd===newfd)return-28;if(flags&~524288)return-28;var old=SYSCALLS.getStreamFromFD(fd);if(newfd<0||newfd>=FS.MAX_OPEN_FDS)return-8;var existing=FS.getStream(newfd);if(existing)FS.close(existing);var stream=FS.dupStream(old,newfd);if(flags&524288){stream.flags|=524288}return stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var HEAP16;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();var mask=289792;stream.flags=stream.flags&~mask|arg&mask;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;if(flags&64){mode&=~SYSCALLS.currentUmask}return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var tupleRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}}var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}}if(0===unregisteredTypes.length){onComplete(typeConverters)}};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var __embind_finalize_value_array=rawTupleType=>{var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(elt=>elt.getterReturnType).concat(elements.map(elt=>elt.setterArgumentType));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var valueSize=reg.valueSize;var isTrivial=reg.isTrivial;whenDependentTypesAreResolved([rawTupleType],elementTypes,elementTypes=>{for(const[i,elt]of elements.entries()){const getterReturnType=elementTypes[i];const getter=elt.getter;const getterContext=elt.getterContext;const setterArgumentType=elementTypes[i+elementsLength];const setter=elt.setter;const setterContext=elt.setterContext;elt.read=ptr=>getterReturnType.fromWireType(getter(getterContext,ptr));if(setterArgumentType.destructorFunction===null&&!setterArgumentType.argStackAlloc){elt.write=(ptr,o)=>setter(setterContext,ptr,setterArgumentType.toWireType(null,o))}else{elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType.toWireType(destructors,o));runDestructors(destructors)}}}return[{name:reg.name,fromWireType:ptr=>{var rv=new Array(elementsLength);for(var i=0;i{if(elementsLength!==o.length){throw new TypeError(`Incorrect number of tuple elements for ${reg.name}: expected=${elementsLength}, actual=${o.length}`)}var ptr;if(isTrivial&&!destructors){ptr=stackAlloc(valueSize);zeroMemory(ptr,valueSize)}else{ptr=rawConstructor();if(destructors){destructors.push(rawDestructor,ptr)}}for(var i=0;i{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch)}};class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}}var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var HEAPU16;var HEAPU64;var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0n;let fromWireType=value=>value;if(isUnsignedType){const bitSize=size*8;fromWireType=value=>BigInt.asUintN(bitSize,value);maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>{if(typeof value=="number"){value=BigInt(value)}return value},readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},readValueFromPointer:function(pointer){return this.fromWireType(HEAPU8[pointer])},destructorFunction:null})};var emval_freelist=[];var emval_handles=[0,1,,1,null,1,true,1,false,1];var emval_exception_decrefs=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){var value=emval_handles[handle];emval_handles[handle]=undefined;var destructor=emval_exception_decrefs[handle];if(destructor){emval_exception_decrefs[handle]=undefined;destructor(value)}emval_freelist.push(handle)}};var Emval={toValue:handle=>{if(!handle){throwBindingError(`Cannot use deleted val. handle = ${handle}`)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var HEAPF32;var HEAPF64;var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this.fromWireType(HEAPF32[pointer>>2])};case 8:return function(pointer){return this.fromWireType(HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var createNamedFunction=(name,func)=>Object.defineProperty(func,"name",{value:name});function usesDestructorStack(argTypes){for(var i=1;i{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module[name].overloadTable.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var embind__requireFunction=(signature,rawFunction,isAsync=false)=>{signature=AsciiToString(signature);function makeDynCaller(){var rtn=getWasmTableEntry(rawFunction);return rtn}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};class UnboundTypeError extends Error{}var getTypeName=type=>{var ptr=___getTypeName(type);var rv=AsciiToString(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex===-1)return signature;return signature.slice(0,argsIndex)};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=AsciiToString(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker,isAsync);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0;let fromWireType=value=>value;if(isUnsignedType){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift;maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>value,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=AsciiToString(name);registerType(rawType,{name,fromWireType:decodeMemoryView,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var __embind_register_std_string=(rawType,name)=>{name=AsciiToString(name);var stdStringIsUTF8=true;registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){str=UTF8ToString(payload,length,true)}else{str="";for(var i=0;i>2]=length;if(valueIsOfTypeString){if(stdStringIsUTF8){stringToUTF8(value,ptr,length+1)}else{for(var i=0;i255){_free(base);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}}else{HEAPU8.set(value,ptr)}if(destructors!==null){destructors.push(_free,base)}return base},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=globalThis.TextDecoder?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead,ignoreNul)=>{var idx=ptr>>1;var endIdx=findStringEnd(HEAPU16,idx,maxBytesToRead/2,ignoreNul);if(endIdx-idx>16&&UTF16Decoder)return UTF16Decoder.decode(HEAPU16.subarray(idx,endIdx));var str="";for(var i=idx;i{if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead,ignoreNul)=>{var str="";var startIdx=ptr>>2;for(var i=0;!(i>=maxBytesToRead/4);i++){var utf32=HEAPU32[startIdx+i];if(!utf32&&!ignoreNul)break;str+=String.fromCodePoint(utf32)}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i65535){i++}HEAP32[outPtr>>2]=codePoint;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i65535){i++}len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=AsciiToString(name);var decodeString,encodeString,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16}else{decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str=decodeString(value+4,length*charSize,true);_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_array=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor,valueSize,isTrivial)=>{tupleRegistrations[rawType]={name:AsciiToString(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),valueSize,isTrivial:!!isTrivial,elements:[]}};var __embind_register_value_array_element=(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{tupleRegistrations[rawTupleType].elements.push({getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext,setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext})};var __embind_register_void=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{isVoid:true,name,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("node:child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};var __emscripten_throw_longjmp=()=>{throw new EmscriptenSjLj};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return 0}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;return 0}var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);if(isNaN(date.getTime())){return-1}var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){dst=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4);if(isNaN(date.getTime())){return-1}}HEAP32[tmPtr+32>>2]=dst;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3})();return BigInt(ret)};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;try{var curr=FS.read(stream,HEAP8,ptr,len,offset)}catch(e){if(ret>0&&e instanceof FS.ErrnoError&&(e.errno==6||e.errno==6)){break}throw e}if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 22;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&!offset&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{if(iovcnt==1){return FS.write(stream,HEAP8,HEAPU32[iov>>2],HEAPU32[iov+4>>2],offset)}var total=0;for(var i=0,p=iov;i>2]}var view=new Uint8Array(total);var voff=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];view.set(HEAPU8.subarray(ptr,ptr+len),voff);voff+=len}return FS.write(stream,view,0,total,offset)};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _llvm_eh_typeid_for=type=>type;FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}var _malloc,_free,___getTypeName,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_decrement_exception_refcount,___cxa_increment_exception_refcount,___cxa_can_catch,___cxa_get_exception_ptr,memory,__indirect_function_table,wasmMemory,wasmTable;function assignWasmExports(wasmExports){_malloc=wasmExports["malloc"];_free=wasmExports["free"];___getTypeName=wasmExports["__getTypeName"];_setThrew=wasmExports["setThrew"];__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"];__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];___cxa_decrement_exception_refcount=wasmExports["__cxa_decrement_exception_refcount"];___cxa_increment_exception_refcount=wasmExports["__cxa_increment_exception_refcount"];___cxa_can_catch=wasmExports["__cxa_can_catch"];___cxa_get_exception_ptr=wasmExports["__cxa_get_exception_ptr"];memory=wasmMemory=wasmExports["memory"];__indirect_function_table=wasmTable=wasmExports["__indirect_function_table"]}var wasmImports={__assert_fail:___assert_fail,__cxa_begin_catch:___cxa_begin_catch,__cxa_end_catch:___cxa_end_catch,__cxa_find_matching_catch_2:___cxa_find_matching_catch_2,__cxa_find_matching_catch_3:___cxa_find_matching_catch_3,__cxa_find_matching_catch_4:___cxa_find_matching_catch_4,__cxa_rethrow:___cxa_rethrow,__cxa_throw:___cxa_throw,__cxa_uncaught_exceptions:___cxa_uncaught_exceptions,__resumeException:___resumeException,__syscall_dup3:___syscall_dup3,__syscall_fcntl64:___syscall_fcntl64,__syscall_ioctl:___syscall_ioctl,__syscall_openat:___syscall_openat,__syscall_readlinkat:___syscall_readlinkat,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_unlinkat:___syscall_unlinkat,_abort_js:__abort_js,_embind_finalize_value_array:__embind_finalize_value_array,_embind_register_bigint:__embind_register_bigint,_embind_register_bool:__embind_register_bool,_embind_register_emval:__embind_register_emval,_embind_register_float:__embind_register_float,_embind_register_function:__embind_register_function,_embind_register_integer:__embind_register_integer,_embind_register_memory_view:__embind_register_memory_view,_embind_register_std_string:__embind_register_std_string,_embind_register_std_wstring:__embind_register_std_wstring,_embind_register_value_array:__embind_register_value_array,_embind_register_value_array_element:__embind_register_value_array_element,_embind_register_void:__embind_register_void,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_date_now:_emscripten_date_now,emscripten_resize_heap:_emscripten_resize_heap,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,invoke_diii,invoke_fiii,invoke_i,invoke_ii,invoke_iid,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiid,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiiiiii,invoke_iiiiiiiiiiiii,invoke_iiij,invoke_jii,invoke_jiii,invoke_v,invoke_vi,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiii,invoke_viiiiiiiiiiiiiii,invoke_viij,invoke_vij,llvm_eh_typeid_for:_llvm_eh_typeid_for};function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_iiij(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_vij(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iid(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}async function run(){preRun();if(runDependencies){await resolveRunDependencies()}var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;createWasm().then(()=>run()); +   ~~~~~~~~~~~~~~~~ +public/js/yuescript.js:1:13482 - warning ts(6387): The signature '(start?: number | undefined, end?: number | undefined): Buffer' of 'buf.slice' is deprecated. + +1 var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}programArgs=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var isFileURI=filename=>filename.startsWith("file://");class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}class CppException extends EmscriptenEH{constructor(excPtr){super();this.excPtr=excPtr}}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){var preRun=Module["preRun"];if(preRun){if(typeof preRun=="function")preRun=[preRun];onPreRuns.push(...preRun)}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function postRun(){var postRun=Module["postRun"];if(postRun){if(typeof postRun=="function")postRun=[postRun];onPostRuns.push(...postRun)}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("yuescript.wasm")}function getBinarySync(file){if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={env:wasmImports,wasi_snapshot_preview1:wasmImports};return imports}async function createWasm(){function receiveInstance(instance){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();var instantiateWasm=Module["instantiateWasm"];if(instantiateWasm){return new Promise(resolve=>{instantiateWasm(info,inst=>resolve(receiveInstance(inst)))})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var onPreRuns=[];var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var HEAPU8;var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var exceptionCaught=[];var uncaughtExceptionCount=0;var HEAP8;var HEAPU32;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var ___cxa_begin_catch=ptr=>{var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);return ___cxa_get_exception_ptr(ptr)};var exceptionLast=null;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=null};var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast?.excPtr;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(!caughtType||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var ___cxa_find_matching_catch_3=arg0=>findMatchingCatch([arg0]);var ___cxa_find_matching_catch_4=(arg0,arg1)=>findMatchingCatch([arg0,arg1]);var __Unwind_RaiseException=ex=>{throw ex};var ___cxa_rethrow=()=>{if(!exceptionCaught.length){abort("no exception to throw")}var info=exceptionCaught.at(-1);var ptr=info.excPtr;info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++;___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);__Unwind_RaiseException(ptr)};var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);___cxa_increment_exception_refcount(ptr);ptr=exceptionLast=new CppException(ptr);uncaughtExceptionCount++;__Unwind_RaiseException(ptr)};var ___cxa_uncaught_exceptions=()=>uncaughtExceptionCount;var __Unwind_Resume=ex=>{throw ex};var ___resumeException=ptr=>{ptr=exceptionLast??=new CppException(ptr);__Unwind_Resume(ptr)};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>(nodeCrypto.randomFillSync(view),0)}return view=>(crypto.getRandomValues(view),0)};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(!node.usedBytes&&!position){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var dependenciesPromise=null;var resolveRunDependencies=async()=>dependenciesPromise;var runDependencies=0;var dependenciesPromiseResolve=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(!runDependencies){dependenciesPromiseResolve()}};var addRunDependency=id=>{if(!runDependencies){dependenciesPromise=new Promise(resolve=>dependenciesPromiseResolve=resolve)}runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}addListener(cb,exclusive=false){var entry={cb,exclusive};var listeners=this.listeners??=new Set;listeners.add(entry);return{listeners,entry}}notifyListeners(flags){if(!this.listeners)return;var excl;for(var entry of this.listeners){if(entry.exclusive)(excl||=[]).push(entry);else entry.cb(flags)}if(excl){var i=(this.exclTurn||0)%excl.length;this.exclTurn=i+1;excl[i].cb(flags)}}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);try{setattr(arg,attr)}catch(e){if(e instanceof RangeError){throw new FS.ErrnoError(22)}throw e}},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},link(oldpath,newpath,flags){var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.link){throw new FS.ErrnoError(34)}return parent.node_ops.link(parent,newname,oldpath,flags)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});FS.doSetAttr(null,lookup.node,{atime,mtime,dontFollow})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;stream.node?.notifyListeners(32);try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if(prot&2&&!(flags&2)&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags??0;opts.encoding=opts.encoding??"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags??577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(!randomLeft){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort(`invalid range (${from}, ${to}) or no bytes requested!`);if(to>datalength-1)abort(`only ${datalength} bytes available! programmer error!`);var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range",`bytes=${from}-${to}`);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort(`Couldn't load ${url}. Status: ${xhr.status}`);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText??"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var HEAP32;var HEAP64;var SYSCALLS={currentUmask:18,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.subarray(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_dup3(fd,newfd,flags){try{if(fd===newfd)return-28;if(flags&~524288)return-28;var old=SYSCALLS.getStreamFromFD(fd);if(newfd<0||newfd>=FS.MAX_OPEN_FDS)return-8;var existing=FS.getStream(newfd);if(existing)FS.close(existing);var stream=FS.dupStream(old,newfd);if(flags&524288){stream.flags|=524288}return stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var HEAP16;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();var mask=289792;stream.flags=stream.flags&~mask|arg&mask;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;if(flags&64){mode&=~SYSCALLS.currentUmask}return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var tupleRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}}var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}}if(0===unregisteredTypes.length){onComplete(typeConverters)}};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var __embind_finalize_value_array=rawTupleType=>{var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(elt=>elt.getterReturnType).concat(elements.map(elt=>elt.setterArgumentType));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var valueSize=reg.valueSize;var isTrivial=reg.isTrivial;whenDependentTypesAreResolved([rawTupleType],elementTypes,elementTypes=>{for(const[i,elt]of elements.entries()){const getterReturnType=elementTypes[i];const getter=elt.getter;const getterContext=elt.getterContext;const setterArgumentType=elementTypes[i+elementsLength];const setter=elt.setter;const setterContext=elt.setterContext;elt.read=ptr=>getterReturnType.fromWireType(getter(getterContext,ptr));if(setterArgumentType.destructorFunction===null&&!setterArgumentType.argStackAlloc){elt.write=(ptr,o)=>setter(setterContext,ptr,setterArgumentType.toWireType(null,o))}else{elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType.toWireType(destructors,o));runDestructors(destructors)}}}return[{name:reg.name,fromWireType:ptr=>{var rv=new Array(elementsLength);for(var i=0;i{if(elementsLength!==o.length){throw new TypeError(`Incorrect number of tuple elements for ${reg.name}: expected=${elementsLength}, actual=${o.length}`)}var ptr;if(isTrivial&&!destructors){ptr=stackAlloc(valueSize);zeroMemory(ptr,valueSize)}else{ptr=rawConstructor();if(destructors){destructors.push(rawDestructor,ptr)}}for(var i=0;i{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch)}};class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}}var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var HEAPU16;var HEAPU64;var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0n;let fromWireType=value=>value;if(isUnsignedType){const bitSize=size*8;fromWireType=value=>BigInt.asUintN(bitSize,value);maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>{if(typeof value=="number"){value=BigInt(value)}return value},readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null})};var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},readValueFromPointer:function(pointer){return this.fromWireType(HEAPU8[pointer])},destructorFunction:null})};var emval_freelist=[];var emval_handles=[0,1,,1,null,1,true,1,false,1];var emval_exception_decrefs=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){var value=emval_handles[handle];emval_handles[handle]=undefined;var destructor=emval_exception_decrefs[handle];if(destructor){emval_exception_decrefs[handle]=undefined;destructor(value)}emval_freelist.push(handle)}};var Emval={toValue:handle=>{if(!handle){throwBindingError(`Cannot use deleted val. handle = ${handle}`)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var HEAPF32;var HEAPF64;var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this.fromWireType(HEAPF32[pointer>>2])};case 8:return function(pointer){return this.fromWireType(HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var createNamedFunction=(name,func)=>Object.defineProperty(func,"name",{value:name});function usesDestructorStack(argTypes){for(var i=1;i{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module[name].overloadTable.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var embind__requireFunction=(signature,rawFunction,isAsync=false)=>{signature=AsciiToString(signature);function makeDynCaller(){var rtn=getWasmTableEntry(rawFunction);return rtn}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};class UnboundTypeError extends Error{}var getTypeName=type=>{var ptr=___getTypeName(type);var rv=AsciiToString(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex===-1)return signature;return signature.slice(0,argsIndex)};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=AsciiToString(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker,isAsync);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0;let fromWireType=value=>value;if(isUnsignedType){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift;maxRange=fromWireType(maxRange)}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>value,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=AsciiToString(name);registerType(rawType,{name,fromWireType:decodeMemoryView,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var __embind_register_std_string=(rawType,name)=>{name=AsciiToString(name);var stdStringIsUTF8=true;registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){str=UTF8ToString(payload,length,true)}else{str="";for(var i=0;i>2]=length;if(valueIsOfTypeString){if(stdStringIsUTF8){stringToUTF8(value,ptr,length+1)}else{for(var i=0;i255){_free(base);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}}else{HEAPU8.set(value,ptr)}if(destructors!==null){destructors.push(_free,base)}return base},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=globalThis.TextDecoder?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead,ignoreNul)=>{var idx=ptr>>1;var endIdx=findStringEnd(HEAPU16,idx,maxBytesToRead/2,ignoreNul);if(endIdx-idx>16&&UTF16Decoder)return UTF16Decoder.decode(HEAPU16.subarray(idx,endIdx));var str="";for(var i=idx;i{if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead,ignoreNul)=>{var str="";var startIdx=ptr>>2;for(var i=0;!(i>=maxBytesToRead/4);i++){var utf32=HEAPU32[startIdx+i];if(!utf32&&!ignoreNul)break;str+=String.fromCodePoint(utf32)}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i65535){i++}HEAP32[outPtr>>2]=codePoint;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i65535){i++}len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=AsciiToString(name);var decodeString,encodeString,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16}else{decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str=decodeString(value+4,length*charSize,true);_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_array=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor,valueSize,isTrivial)=>{tupleRegistrations[rawType]={name:AsciiToString(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),valueSize,isTrivial:!!isTrivial,elements:[]}};var __embind_register_value_array_element=(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{tupleRegistrations[rawTupleType].elements.push({getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext,setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext})};var __embind_register_void=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{isVoid:true,name,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("node:child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};var __emscripten_throw_longjmp=()=>{throw new EmscriptenSjLj};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return 0}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);if(isNaN(date.getTime())){return 1}HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;return 0}var __mktime_js=function(tmPtr){var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);if(isNaN(date.getTime())){return-1}var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){dst=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4);if(isNaN(date.getTime())){return-1}}HEAP32[tmPtr+32>>2]=dst;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3})();return BigInt(ret)};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;try{var curr=FS.read(stream,HEAP8,ptr,len,offset)}catch(e){if(ret>0&&e instanceof FS.ErrnoError&&(e.errno==6||e.errno==6)){break}throw e}if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 22;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&!offset&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{if(iovcnt==1){return FS.write(stream,HEAP8,HEAPU32[iov>>2],HEAPU32[iov+4>>2],offset)}var total=0;for(var i=0,p=iov;i>2]}var view=new Uint8Array(total);var voff=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];view.set(HEAPU8.subarray(ptr,ptr+len),voff);voff+=len}return FS.write(stream,view,0,total,offset)};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _llvm_eh_typeid_for=type=>type;FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["arguments"])programArgs=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()()}}}var _malloc,_free,___getTypeName,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_decrement_exception_refcount,___cxa_increment_exception_refcount,___cxa_can_catch,___cxa_get_exception_ptr,memory,__indirect_function_table,wasmMemory,wasmTable;function assignWasmExports(wasmExports){_malloc=wasmExports["malloc"];_free=wasmExports["free"];___getTypeName=wasmExports["__getTypeName"];_setThrew=wasmExports["setThrew"];__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"];__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];___cxa_decrement_exception_refcount=wasmExports["__cxa_decrement_exception_refcount"];___cxa_increment_exception_refcount=wasmExports["__cxa_increment_exception_refcount"];___cxa_can_catch=wasmExports["__cxa_can_catch"];___cxa_get_exception_ptr=wasmExports["__cxa_get_exception_ptr"];memory=wasmMemory=wasmExports["memory"];__indirect_function_table=wasmTable=wasmExports["__indirect_function_table"]}var wasmImports={__assert_fail:___assert_fail,__cxa_begin_catch:___cxa_begin_catch,__cxa_end_catch:___cxa_end_catch,__cxa_find_matching_catch_2:___cxa_find_matching_catch_2,__cxa_find_matching_catch_3:___cxa_find_matching_catch_3,__cxa_find_matching_catch_4:___cxa_find_matching_catch_4,__cxa_rethrow:___cxa_rethrow,__cxa_throw:___cxa_throw,__cxa_uncaught_exceptions:___cxa_uncaught_exceptions,__resumeException:___resumeException,__syscall_dup3:___syscall_dup3,__syscall_fcntl64:___syscall_fcntl64,__syscall_ioctl:___syscall_ioctl,__syscall_openat:___syscall_openat,__syscall_readlinkat:___syscall_readlinkat,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_unlinkat:___syscall_unlinkat,_abort_js:__abort_js,_embind_finalize_value_array:__embind_finalize_value_array,_embind_register_bigint:__embind_register_bigint,_embind_register_bool:__embind_register_bool,_embind_register_emval:__embind_register_emval,_embind_register_float:__embind_register_float,_embind_register_function:__embind_register_function,_embind_register_integer:__embind_register_integer,_embind_register_memory_view:__embind_register_memory_view,_embind_register_std_string:__embind_register_std_string,_embind_register_std_wstring:__embind_register_std_wstring,_embind_register_value_array:__embind_register_value_array,_embind_register_value_array_element:__embind_register_value_array_element,_embind_register_void:__embind_register_void,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_date_now:_emscripten_date_now,emscripten_resize_heap:_emscripten_resize_heap,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,invoke_diii,invoke_fiii,invoke_i,invoke_ii,invoke_iid,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiid,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiiiiii,invoke_iiiiiiiiiiiii,invoke_iiij,invoke_jii,invoke_jiii,invoke_v,invoke_vi,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiii,invoke_viiiiiiiiiiiiiii,invoke_viij,invoke_vij,llvm_eh_typeid_for:_llvm_eh_typeid_for};function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_iiij(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0);return 0n}}function invoke_vij(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iid(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)}catch(e){stackRestore(sp);if(!(e instanceof EmscriptenEH))throw e;_setThrew(1,0)}}async function run(){preRun();if(runDependencies){await resolveRunDependencies()}var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"")}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}var wasmExports;createWasm().then(()=>run()); +   ~~~~~ + +Result (14 files): +- 0 errors +- 0 warnings +- 4 hints + diff --git a/doc/package.json b/doc/package.json index ddb09092..6249bf6a 100755 --- a/doc/package.json +++ b/doc/package.json @@ -18,6 +18,8 @@ "license": "MIT", "devDependencies": { "@astrojs/check": "^0.9.10", + "prettier": "3.9.9", + "prettier-plugin-astro": "1.1.0", "typescript": "^6.0.3" }, "dependencies": { diff --git a/doc/pnpm-lock.yaml b/doc/pnpm-lock.yaml index 08dc2c3b..68f160dd 100644 --- a/doc/pnpm-lock.yaml +++ b/doc/pnpm-lock.yaml @@ -1,41 +1,40 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: - .: dependencies: - '@astrojs/starlight': + "@astrojs/starlight": specifier: ^0.42.5 version: 0.42.5(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(typescript@6.0.3) - '@astrojs/vue': + "@astrojs/vue": specifier: ^7.0.3 version: 7.0.3(@types/node@24.19.1)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(esbuild@0.28.2)(vue@3.5.43(typescript@6.0.3))(yaml@2.9.1) - '@codemirror/commands': + "@codemirror/commands": specifier: ^6.10.3 version: 6.11.1 - '@codemirror/language': + "@codemirror/language": specifier: ^6.12.3 version: 6.12.4 - '@codemirror/legacy-modes': + "@codemirror/legacy-modes": specifier: ^6.5.4 version: 6.5.4 - '@codemirror/state': + "@codemirror/state": specifier: ^6.6.0 version: 6.7.6 - '@codemirror/view': + "@codemirror/view": specifier: ^6.40.0 version: 6.43.13 - '@fontsource/noto-serif': + "@fontsource/noto-serif": specifier: ^5.3.0 version: 5.3.0 - '@fontsource/noto-serif-sc': + "@fontsource/noto-serif-sc": specifier: ^5.3.0 version: 5.3.0 - '@lezer/highlight': + "@lezer/highlight": specifier: ^1.2.5 version: 1.2.5 astro: @@ -45,1135 +44,1952 @@ importers: specifier: ^3.5.31 version: 3.5.43(typescript@6.0.3) devDependencies: - '@astrojs/check': + "@astrojs/check": specifier: ^0.9.10 - version: 0.9.10(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3) + version: 0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3) + prettier: + specifier: 3.9.9 + version: 3.9.9 + prettier-plugin-astro: + specifier: 1.1.0 + version: 1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9) typescript: specifier: ^6.0.3 version: 6.0.3 packages: - - '@astrojs/astro2tsx@0.1.2': - resolution: {integrity: sha512-Uj/M9zbrhu5cIZEvWAGTbQJRKSxXWJ/E59BZwt7F+chrKhbfttW+9rkS/l+1QxoJP1KU3UnpM62M7yszfAI0WA==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@astrojs/check@0.9.10': - resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==} + "@astrojs/astro2tsx@0.1.2": + resolution: + { + integrity: sha512-Uj/M9zbrhu5cIZEvWAGTbQJRKSxXWJ/E59BZwt7F+chrKhbfttW+9rkS/l+1QxoJP1KU3UnpM62M7yszfAI0WA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + + "@astrojs/check@0.9.10": + resolution: + { + integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==, + } hasBin: true peerDependencies: typescript: ^5.0.0 || ^6.0.0 - '@astrojs/compiler-binding-android-arm64@0.5.1': - resolution: {integrity: sha512-nMb2nMIJtcWLNH+fV75Enmi+jp4tIOYOfsv4XtpgdOWkqc9P4uSSdK5u1xb340AzrXo5V18SxLl/nc3vcqtamQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-android-arm64@0.4.1": + resolution: + { + integrity: sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [android] - '@astrojs/compiler-binding-darwin-arm64@0.5.1': - resolution: {integrity: sha512-5k4+nZ/WRt+dcVow4z7rBuI7iv9A58h/uQ91YJe1PrTivbcCkq3u2Ynx/AZJwII4CsZawBCeGpojkFjutZBhBQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-android-arm64@0.5.1": + resolution: + { + integrity: sha512-nMb2nMIJtcWLNH+fV75Enmi+jp4tIOYOfsv4XtpgdOWkqc9P4uSSdK5u1xb340AzrXo5V18SxLl/nc3vcqtamQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [android] + + "@astrojs/compiler-binding-darwin-arm64@0.4.1": + resolution: + { + integrity: sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [darwin] + + "@astrojs/compiler-binding-darwin-arm64@0.5.1": + resolution: + { + integrity: sha512-5k4+nZ/WRt+dcVow4z7rBuI7iv9A58h/uQ91YJe1PrTivbcCkq3u2Ynx/AZJwII4CsZawBCeGpojkFjutZBhBQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [darwin] - '@astrojs/compiler-binding-darwin-x64@0.5.1': - resolution: {integrity: sha512-0Buw+YST9Ff2EqQyhRMQujuFq/dijLw3zXWhsvI0dJ2pGrT38iVoxTEca2eBX/PfhlwkVWSRJEKO5gMqKHyeHg==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-darwin-x64@0.4.1": + resolution: + { + integrity: sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [darwin] - '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': - resolution: {integrity: sha512-x5LRpyCoMKuu3INr18cn42YhwSOaRpp9b5Ny3eJJ/sWVeejC16Zeshu1JlvlSmEZACLeWxU5JM0RX6T6nI+YyA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-darwin-x64@0.5.1": + resolution: + { + integrity: sha512-0Buw+YST9Ff2EqQyhRMQujuFq/dijLw3zXWhsvI0dJ2pGrT38iVoxTEca2eBX/PfhlwkVWSRJEKO5gMqKHyeHg==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [darwin] + + "@astrojs/compiler-binding-linux-arm64-gnu@0.4.1": + resolution: + { + integrity: sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@astrojs/compiler-binding-linux-arm64-gnu@0.5.1": + resolution: + { + integrity: sha512-x5LRpyCoMKuu3INr18cn42YhwSOaRpp9b5Ny3eJJ/sWVeejC16Zeshu1JlvlSmEZACLeWxU5JM0RX6T6nI+YyA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] libc: [glibc] - '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': - resolution: {integrity: sha512-mL7tQEuDk3rGfaKmrO63nw6WBy1TPVioQGmVyjcAr+C+a/k3SVMYBytNSMqH9mZPT/Swj30JaZ2N842Z1NnOEQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-linux-arm64-musl@0.4.1": + resolution: + { + integrity: sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@astrojs/compiler-binding-linux-arm64-musl@0.5.1": + resolution: + { + integrity: sha512-mL7tQEuDk3rGfaKmrO63nw6WBy1TPVioQGmVyjcAr+C+a/k3SVMYBytNSMqH9mZPT/Swj30JaZ2N842Z1NnOEQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] libc: [musl] - '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': - resolution: {integrity: sha512-uLGc9jtxwiDe4cQyhNPQim4ECiB/YzbWlXssfLAv8r374kArfTwBHjwR2+j+XVyF71yCx5mF9YNRclRqdNBgeg==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-linux-x64-gnu@0.4.1": + resolution: + { + integrity: sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@astrojs/compiler-binding-linux-x64-gnu@0.5.1": + resolution: + { + integrity: sha512-uLGc9jtxwiDe4cQyhNPQim4ECiB/YzbWlXssfLAv8r374kArfTwBHjwR2+j+XVyF71yCx5mF9YNRclRqdNBgeg==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] libc: [glibc] - '@astrojs/compiler-binding-linux-x64-musl@0.5.1': - resolution: {integrity: sha512-G0cywinaQUc8v1MrytvYKUX7svTDMmYtOCZfxjwKPbJi59zIqM+Ll0rWgO0GQWLZH3XoPYo19ZwlP3Xt9ep9YA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-linux-x64-musl@0.4.1": + resolution: + { + integrity: sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] libc: [musl] - '@astrojs/compiler-binding-wasm32-wasi@0.5.1': - resolution: {integrity: sha512-yMhLL8asmLydoAdnEZxAw6eLfNDs3YJl6jqn0pjPt6zrb2U5qIDLnii4/twThpIFODKkQ6YDpBRTOz/vSfZCxw==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-linux-x64-musl@0.5.1": + resolution: + { + integrity: sha512-G0cywinaQUc8v1MrytvYKUX7svTDMmYtOCZfxjwKPbJi59zIqM+Ll0rWgO0GQWLZH3XoPYo19ZwlP3Xt9ep9YA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [linux] + libc: [musl] + + "@astrojs/compiler-binding-wasm32-wasi@0.4.1": + resolution: + { + integrity: sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + + "@astrojs/compiler-binding-wasm32-wasi@0.5.1": + resolution: + { + integrity: sha512-yMhLL8asmLydoAdnEZxAw6eLfNDs3YJl6jqn0pjPt6zrb2U5qIDLnii4/twThpIFODKkQ6YDpBRTOz/vSfZCxw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [wasm32] - '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': - resolution: {integrity: sha512-aClIG6poFt3Wf/bZykrEAX2nAnKvBHW6RXiKUa69QjBtWH0/FOlOAjnFcxRNlhej2AMWNYFx0o+LGjwMcH8P7Q==} - engines: {node: ^20.19.0 || >=22.12.0} + "@astrojs/compiler-binding-win32-arm64-msvc@0.4.1": + resolution: + { + integrity: sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [win32] - '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': - resolution: {integrity: sha512-/E6uBCagY70YpWqssBC+/FuniNSloeQPRgj7l3LDWiqjxIyTLnIgX1sTt18FU7jrigetpSnC9cHAM6b6IxSgPw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] + "@astrojs/compiler-binding-win32-arm64-msvc@0.5.1": + resolution: + { + integrity: sha512-aClIG6poFt3Wf/bZykrEAX2nAnKvBHW6RXiKUa69QjBtWH0/FOlOAjnFcxRNlhej2AMWNYFx0o+LGjwMcH8P7Q==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] os: [win32] - '@astrojs/compiler-binding@0.5.1': - resolution: {integrity: sha512-oczyolLUl9mNrtuBuNjuvn5thpHrFLXAHAWGTRg0JDHQ8cGVsVeFekOu2uSoQGgainJIi+A3/9m0DyYwz3Nlnw==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@astrojs/compiler-rs@0.5.1': - resolution: {integrity: sha512-1k1acnX7DepIiea9U9/Y+d1hdAFfylu1ZQQkkYgRSwBOBAsXInolyZuh/2tax+83vu/A+hOYP6P3+265RvMTvw==} - engines: {node: '>=22.12.0'} + "@astrojs/compiler-binding-win32-x64-msvc@0.4.1": + resolution: + { + integrity: sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [win32] - '@astrojs/internal-helpers@0.11.0': - resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==} + "@astrojs/compiler-binding-win32-x64-msvc@0.5.1": + resolution: + { + integrity: sha512-/E6uBCagY70YpWqssBC+/FuniNSloeQPRgj7l3LDWiqjxIyTLnIgX1sTt18FU7jrigetpSnC9cHAM6b6IxSgPw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [win32] - '@astrojs/language-server@2.17.1': - resolution: {integrity: sha512-gG7bvMVNIXgoSe1pM9dI1HsSDLU1EIc/dSAYQ0DuReLyLkOBjsiqvaRYgQltWaldLxh0bNEqjgreLfjd9OnUxQ==} + "@astrojs/compiler-binding@0.4.1": + resolution: + { + integrity: sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + + "@astrojs/compiler-binding@0.5.1": + resolution: + { + integrity: sha512-oczyolLUl9mNrtuBuNjuvn5thpHrFLXAHAWGTRg0JDHQ8cGVsVeFekOu2uSoQGgainJIi+A3/9m0DyYwz3Nlnw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + + "@astrojs/compiler-rs@0.4.1": + resolution: + { + integrity: sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==, + } + engines: { node: ">=22.12.0" } + + "@astrojs/compiler-rs@0.5.1": + resolution: + { + integrity: sha512-1k1acnX7DepIiea9U9/Y+d1hdAFfylu1ZQQkkYgRSwBOBAsXInolyZuh/2tax+83vu/A+hOYP6P3+265RvMTvw==, + } + engines: { node: ">=22.12.0" } + + "@astrojs/internal-helpers@0.11.0": + resolution: + { + integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==, + } + + "@astrojs/language-server@2.17.1": + resolution: + { + integrity: sha512-gG7bvMVNIXgoSe1pM9dI1HsSDLU1EIc/dSAYQ0DuReLyLkOBjsiqvaRYgQltWaldLxh0bNEqjgreLfjd9OnUxQ==, + } hasBin: true peerDependencies: prettier: ^3.0.0 - prettier-plugin-astro: '>=0.11.0' + prettier-plugin-astro: ">=0.11.0" peerDependenciesMeta: prettier: optional: true prettier-plugin-astro: optional: true - '@astrojs/markdown-satteri@0.4.2': - resolution: {integrity: sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==} - - '@astrojs/mdx@8.0.2': - resolution: {integrity: sha512-WedIVP2Bu8fXSzxb3ZYZ8xDrWWjf2SRKCneh52Llhoa+O3lcpHPhoZVP3FerlivUaH/0LJz2yVaCNvMdg0u8Bw==} - engines: {node: '>=22.12.0'} + "@astrojs/markdown-satteri@0.4.2": + resolution: + { + integrity: sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==, + } + + "@astrojs/mdx@8.0.2": + resolution: + { + integrity: sha512-WedIVP2Bu8fXSzxb3ZYZ8xDrWWjf2SRKCneh52Llhoa+O3lcpHPhoZVP3FerlivUaH/0LJz2yVaCNvMdg0u8Bw==, + } + engines: { node: ">=22.12.0" } peerDependencies: - '@astrojs/markdown-remark': ^7.3.0 - '@astrojs/markdown-satteri': ^0.4.0 + "@astrojs/markdown-remark": ^7.3.0 + "@astrojs/markdown-satteri": ^0.4.0 astro: ^7.2.10 peerDependenciesMeta: - '@astrojs/markdown-remark': + "@astrojs/markdown-remark": optional: true - '@astrojs/prism@4.0.2': - resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} - engines: {node: '>=22.12.0'} - - '@astrojs/sitemap@3.7.4': - resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} - - '@astrojs/starlight@0.42.5': - resolution: {integrity: sha512-S6hjUexk9rrKtjJF3WR8T9dM1woNR7X2XU8e3wj4OpRT4X15AXk/mzPjWe/Qd5+P8whHj2+ves+k06qirBzimg==} + "@astrojs/prism@4.0.2": + resolution: + { + integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==, + } + engines: { node: ">=22.12.0" } + + "@astrojs/sitemap@3.7.4": + resolution: + { + integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==, + } + + "@astrojs/starlight@0.42.5": + resolution: + { + integrity: sha512-S6hjUexk9rrKtjJF3WR8T9dM1woNR7X2XU8e3wj4OpRT4X15AXk/mzPjWe/Qd5+P8whHj2+ves+k06qirBzimg==, + } peerDependencies: - '@astrojs/markdown-remark': ^7.3.0 + "@astrojs/markdown-remark": ^7.3.0 astro: ^7.2.10 peerDependenciesMeta: - '@astrojs/markdown-remark': + "@astrojs/markdown-remark": optional: true - '@astrojs/telemetry@3.3.3': - resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - - '@astrojs/vue@7.0.3': - resolution: {integrity: sha512-g0qr+UxDAHDHQ2zc5+IY2SG4aLIiS6lWfekEYk61DGNVRb2h8PIxMi87aPR75lId7Wk+zUNZB1+VEVDBwAAzBw==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + "@astrojs/telemetry@3.3.3": + resolution: + { + integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==, + } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + + "@astrojs/vue@7.0.3": + resolution: + { + integrity: sha512-g0qr+UxDAHDHQ2zc5+IY2SG4aLIiS6lWfekEYk61DGNVRb2h8PIxMi87aPR75lId7Wk+zUNZB1+VEVDBwAAzBw==, + } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } peerDependencies: astro: ^7.0.0 vue: ^3.5.24 - '@astrojs/yaml2ts@0.2.4': - resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.8': - resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.29.7': - resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.29.7': - resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} - engines: {node: '>=6.9.0'} + "@astrojs/yaml2ts@0.2.4": + resolution: + { + integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==, + } + + "@babel/code-frame@7.29.7": + resolution: + { + integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.29.7": + resolution: + { + integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.29.7": + resolution: + { + integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.29.8": + resolution: + { + integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.29.7": + resolution: + { + integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.29.7": + resolution: + { + integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.29.7": + resolution: + { + integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.29.7': - resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-globals@7.29.7": + resolution: + { + integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-member-expression-to-functions@7.29.7": + resolution: + { + integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.29.7": + resolution: + { + integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.29.7": + resolution: + { + integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.29.7': - resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.29.7': - resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.29.7": + resolution: + { + integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.29.7": + resolution: + { + integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-replace-supers@7.29.7": + resolution: + { + integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.9': - resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} - engines: {node: '>=6.0.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-skip-transparent-expression-wrappers@7.29.7": + resolution: + { + integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.29.7": + resolution: + { + integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.29.7": + resolution: + { + integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.29.7": + resolution: + { + integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.29.7": + resolution: + { + integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.29.9": + resolution: + { + integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/plugin-proposal-decorators@7.29.7': - resolution: {integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-proposal-decorators@7.29.7": + resolution: + { + integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-decorators@7.29.7': - resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-decorators@7.29.7": + resolution: + { + integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.29.7': - resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-attributes@7.29.7": + resolution: + { + integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + "@babel/plugin-syntax-import-meta@7.10.4": + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.29.7': - resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-jsx@7.29.7": + resolution: + { + integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.29.7': - resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.29.7": + resolution: + { + integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.29.9': - resolution: {integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-typescript@7.29.9": + resolution: + { + integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.8': - resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.8': - resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} - engines: {node: '>=6.9.0'} - - '@bruits/satteri-darwin-arm64@0.10.5': - resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + "@babel/core": ^7.0.0-0 + + "@babel/template@7.29.7": + resolution: + { + integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.29.8": + resolution: + { + integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.29.8": + resolution: + { + integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==, + } + engines: { node: ">=6.9.0" } + + "@bruits/satteri-darwin-arm64@0.10.5": + resolution: + { + integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==, + } cpu: [arm64] os: [darwin] - '@bruits/satteri-darwin-x64@0.10.5': - resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + "@bruits/satteri-darwin-x64@0.10.5": + resolution: + { + integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==, + } cpu: [x64] os: [darwin] - '@bruits/satteri-linux-arm64-gnu@0.10.5': - resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + "@bruits/satteri-linux-arm64-gnu@0.10.5": + resolution: + { + integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==, + } cpu: [arm64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-arm64-musl@0.10.5': - resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + "@bruits/satteri-linux-arm64-musl@0.10.5": + resolution: + { + integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==, + } cpu: [arm64] os: [linux] libc: [musl] - '@bruits/satteri-linux-x64-gnu@0.10.5': - resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + "@bruits/satteri-linux-x64-gnu@0.10.5": + resolution: + { + integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==, + } cpu: [x64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-x64-musl@0.10.5': - resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + "@bruits/satteri-linux-x64-musl@0.10.5": + resolution: + { + integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==, + } cpu: [x64] os: [linux] libc: [musl] - '@bruits/satteri-wasm32-wasi@0.10.5': - resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} - engines: {node: '>=14.0.0'} + "@bruits/satteri-wasm32-wasi@0.10.5": + resolution: + { + integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==, + } + engines: { node: ">=14.0.0" } cpu: [wasm32] - '@bruits/satteri-win32-arm64-msvc@0.10.5': - resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + "@bruits/satteri-win32-arm64-msvc@0.10.5": + resolution: + { + integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==, + } cpu: [arm64] os: [win32] - '@bruits/satteri-win32-x64-msvc@0.10.5': - resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + "@bruits/satteri-win32-x64-msvc@0.10.5": + resolution: + { + integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==, + } cpu: [x64] os: [win32] - '@capsizecss/unpack@4.0.1': - resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} - engines: {node: '>=18'} - - '@clack/core@1.5.1': - resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} - engines: {node: '>= 20.12.0'} - - '@clack/prompts@1.8.1': - resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} - engines: {node: '>= 20.12.0'} - - '@codemirror/commands@6.11.1': - resolution: {integrity: sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==} - - '@codemirror/language@6.12.4': - resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} - - '@codemirror/legacy-modes@6.5.4': - resolution: {integrity: sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==} - - '@codemirror/state@6.7.6': - resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==} - - '@codemirror/view@6.43.13': - resolution: {integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==} - - '@ctrl/tinycolor@4.2.1': - resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==} - engines: {node: '>=14'} - - '@emmetio/abbreviation@2.3.3': - resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} - - '@emmetio/css-abbreviation@2.1.8': - resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} - - '@emmetio/css-parser@0.4.1': - resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} - - '@emmetio/html-matcher@1.3.0': - resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} - - '@emmetio/scanner@1.0.4': - resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} - - '@emmetio/stream-reader-utils@0.1.0': - resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} - - '@emmetio/stream-reader@2.2.0': - resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - - '@emnapi/core@1.11.3': - resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} - - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - - '@emnapi/runtime@1.11.3': - resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - - '@emnapi/wasi-threads@1.2.3': - resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} - - '@esbuild/aix-ppc64@0.28.2': - resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} - engines: {node: '>=18'} + "@capsizecss/unpack@4.0.1": + resolution: + { + integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==, + } + engines: { node: ">=18" } + + "@clack/core@1.5.1": + resolution: + { + integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==, + } + engines: { node: ">= 20.12.0" } + + "@clack/prompts@1.8.1": + resolution: + { + integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==, + } + engines: { node: ">= 20.12.0" } + + "@codemirror/commands@6.11.1": + resolution: + { + integrity: sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==, + } + + "@codemirror/language@6.12.4": + resolution: + { + integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==, + } + + "@codemirror/legacy-modes@6.5.4": + resolution: + { + integrity: sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==, + } + + "@codemirror/state@6.7.6": + resolution: + { + integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==, + } + + "@codemirror/view@6.43.13": + resolution: + { + integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==, + } + + "@ctrl/tinycolor@4.2.1": + resolution: + { + integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==, + } + engines: { node: ">=14" } + + "@emmetio/abbreviation@2.3.3": + resolution: + { + integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==, + } + + "@emmetio/css-abbreviation@2.1.8": + resolution: + { + integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==, + } + + "@emmetio/css-parser@0.4.1": + resolution: + { + integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==, + } + + "@emmetio/html-matcher@1.3.0": + resolution: + { + integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==, + } + + "@emmetio/scanner@1.0.4": + resolution: + { + integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==, + } + + "@emmetio/stream-reader-utils@0.1.0": + resolution: + { + integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==, + } + + "@emmetio/stream-reader@2.2.0": + resolution: + { + integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==, + } + + "@emnapi/core@1.11.1": + resolution: + { + integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==, + } + + "@emnapi/core@1.11.3": + resolution: + { + integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==, + } + + "@emnapi/runtime@1.11.1": + resolution: + { + integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==, + } + + "@emnapi/runtime@1.11.3": + resolution: + { + integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==, + } + + "@emnapi/wasi-threads@1.2.2": + resolution: + { + integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==, + } + + "@emnapi/wasi-threads@1.2.3": + resolution: + { + integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==, + } + + "@esbuild/aix-ppc64@0.28.2": + resolution: + { + integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.2': - resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.28.2": + resolution: + { + integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.2': - resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.28.2": + resolution: + { + integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.2': - resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.28.2": + resolution: + { + integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.2': - resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.28.2": + resolution: + { + integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.2': - resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.28.2": + resolution: + { + integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.2': - resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.28.2": + resolution: + { + integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.2': - resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.28.2": + resolution: + { + integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.2': - resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.28.2": + resolution: + { + integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.2': - resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.28.2": + resolution: + { + integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.2': - resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.28.2": + resolution: + { + integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.2': - resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.28.2": + resolution: + { + integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.2': - resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.28.2": + resolution: + { + integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.2': - resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.28.2": + resolution: + { + integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.2': - resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.28.2": + resolution: + { + integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.2': - resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.28.2": + resolution: + { + integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.2': - resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.28.2": + resolution: + { + integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.2': - resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.28.2": + resolution: + { + integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.2': - resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.28.2": + resolution: + { + integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.2': - resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.28.2": + resolution: + { + integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.2': - resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.28.2": + resolution: + { + integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.2': - resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.28.2": + resolution: + { + integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.2': - resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.28.2": + resolution: + { + integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.2': - resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.28.2": + resolution: + { + integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.2': - resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.28.2": + resolution: + { + integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.2': - resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.28.2": + resolution: + { + integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@expressive-code/core@0.44.2': - resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==} - - '@expressive-code/plugin-frames@0.44.2': - resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==} - - '@expressive-code/plugin-shiki@0.44.2': - resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==} - - '@expressive-code/plugin-text-markers@0.44.2': - resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==} - - '@fontsource/noto-serif-sc@5.3.0': - resolution: {integrity: sha512-0/zaEFkidiWldE62rTeD74x8ygUsQvejiSNtO0LQxQk3qpaHnlMZ3w4C7yH80B4KTIg8VKeFP4oSgwWMchY9+g==} - - '@fontsource/noto-serif@5.3.0': - resolution: {integrity: sha512-ZrMzjuQlBIcw+qma1slZQdU3YDJvrjLG+9CWU1bxSf3YTkucwqd3EYa/Kfo4Ts19w8IMTGAmtOE3d6wWlgnBtA==} - - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.35.5': - resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} - engines: {node: '>=20.9.0'} + "@expressive-code/core@0.44.2": + resolution: + { + integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==, + } + + "@expressive-code/plugin-frames@0.44.2": + resolution: + { + integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==, + } + + "@expressive-code/plugin-shiki@0.44.2": + resolution: + { + integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==, + } + + "@expressive-code/plugin-text-markers@0.44.2": + resolution: + { + integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==, + } + + "@fontsource/noto-serif-sc@5.3.0": + resolution: + { + integrity: sha512-0/zaEFkidiWldE62rTeD74x8ygUsQvejiSNtO0LQxQk3qpaHnlMZ3w4C7yH80B4KTIg8VKeFP4oSgwWMchY9+g==, + } + + "@fontsource/noto-serif@5.3.0": + resolution: + { + integrity: sha512-ZrMzjuQlBIcw+qma1slZQdU3YDJvrjLG+9CWU1bxSf3YTkucwqd3EYa/Kfo4Ts19w8IMTGAmtOE3d6wWlgnBtA==, + } + + "@img/colour@1.1.0": + resolution: + { + integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==, + } + engines: { node: ">=18" } + + "@img/sharp-darwin-arm64@0.35.5": + resolution: + { + integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==, + } + engines: { node: ">=20.9.0" } cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.5': - resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} - engines: {node: '>=20.9.0'} + "@img/sharp-darwin-x64@0.35.5": + resolution: + { + integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==, + } + engines: { node: ">=20.9.0" } cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.5': - resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} - engines: {node: '>=20.9.0'} + "@img/sharp-freebsd-wasm32@0.35.5": + resolution: + { + integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==, + } + engines: { node: ">=20.9.0" } os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.4': - resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} + "@img/sharp-libvips-darwin-arm64@1.3.4": + resolution: + { + integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==, + } cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.4': - resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} + "@img/sharp-libvips-darwin-x64@1.3.4": + resolution: + { + integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==, + } cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.4': - resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} + "@img/sharp-libvips-linux-arm64@1.3.4": + resolution: + { + integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==, + } cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.4': - resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} + "@img/sharp-libvips-linux-arm@1.3.4": + resolution: + { + integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==, + } cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.4': - resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} + "@img/sharp-libvips-linux-ppc64@1.3.4": + resolution: + { + integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==, + } cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.4': - resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} + "@img/sharp-libvips-linux-riscv64@1.3.4": + resolution: + { + integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==, + } cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.4': - resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} + "@img/sharp-libvips-linux-s390x@1.3.4": + resolution: + { + integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==, + } cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.4': - resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} + "@img/sharp-libvips-linux-x64@1.3.4": + resolution: + { + integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==, + } cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.4': - resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} + "@img/sharp-libvips-linuxmusl-arm64@1.3.4": + resolution: + { + integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==, + } cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.4': - resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} + "@img/sharp-libvips-linuxmusl-x64@1.3.4": + resolution: + { + integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==, + } cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.5': - resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-arm64@0.35.5": + resolution: + { + integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==, + } + engines: { node: ">=20.9.0" } cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.5': - resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-arm@0.35.5": + resolution: + { + integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==, + } + engines: { node: ">=20.9.0" } cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.5': - resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-ppc64@0.35.5": + resolution: + { + integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==, + } + engines: { node: ">=20.9.0" } cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.5': - resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-riscv64@0.35.5": + resolution: + { + integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==, + } + engines: { node: ">=20.9.0" } cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.5': - resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-s390x@0.35.5": + resolution: + { + integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==, + } + engines: { node: ">=20.9.0" } cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.5': - resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} - engines: {node: '>=20.9.0'} + "@img/sharp-linux-x64@0.35.5": + resolution: + { + integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==, + } + engines: { node: ">=20.9.0" } cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.5': - resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} - engines: {node: '>=20.9.0'} + "@img/sharp-linuxmusl-arm64@0.35.5": + resolution: + { + integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==, + } + engines: { node: ">=20.9.0" } cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.5': - resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} - engines: {node: '>=20.9.0'} + "@img/sharp-linuxmusl-x64@0.35.5": + resolution: + { + integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==, + } + engines: { node: ">=20.9.0" } cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.5': - resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} - engines: {node: '>=20.9.0'} - - '@img/sharp-webcontainers-wasm32@0.35.5': - resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} - engines: {node: '>=20.9.0'} + "@img/sharp-wasm32@0.35.5": + resolution: + { + integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==, + } + engines: { node: ">=20.9.0" } + + "@img/sharp-webcontainers-wasm32@0.35.5": + resolution: + { + integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==, + } + engines: { node: ">=20.9.0" } cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.5': - resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} - engines: {node: '>=20.9.0'} + "@img/sharp-win32-arm64@0.35.5": + resolution: + { + integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==, + } + engines: { node: ">=20.9.0" } cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.5': - resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} - engines: {node: ^20.9.0} + "@img/sharp-win32-ia32@0.35.5": + resolution: + { + integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==, + } + engines: { node: ^20.9.0 } cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.5': - resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} - engines: {node: '>=20.9.0'} + "@img/sharp-win32-x64@0.35.5": + resolution: + { + integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==, + } + engines: { node: ">=20.9.0" } cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.6.0': - resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@lezer/common@1.5.1': - resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} - - '@lezer/highlight@1.2.3': - resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} - - '@lezer/highlight@1.2.5': - resolution: {integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==} - - '@lezer/lr@1.4.8': - resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} - - '@marijn/find-cluster-break@1.0.2': - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - - '@napi-rs/wasm-runtime@1.2.4': - resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + "@jridgewell/gen-mapping@0.3.13": + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } + + "@jridgewell/remapping@2.3.5": + resolution: + { + integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, + } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.6.0": + resolution: + { + integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==, + } + + "@jridgewell/trace-mapping@0.3.31": + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, + } + + "@lezer/common@1.5.1": + resolution: + { + integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==, + } + + "@lezer/highlight@1.2.3": + resolution: + { + integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==, + } + + "@lezer/highlight@1.2.5": + resolution: + { + integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==, + } + + "@lezer/lr@1.4.8": + resolution: + { + integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==, + } + + "@marijn/find-cluster-break@1.0.2": + resolution: + { + integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==, + } + + "@napi-rs/wasm-runtime@1.2.4": + resolution: + { + integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=23.5.0 } peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - - '@oslojs/encoding@1.1.0': - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - - '@oxc-project/types@0.152.0': - resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} - - '@pagefind/darwin-arm64@1.5.2': - resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + "@emnapi/core": ^1.7.1 || ^2.0.0-alpha.4 + "@emnapi/runtime": ^1.7.1 || ^2.0.0-alpha.4 + + "@oslojs/encoding@1.1.0": + resolution: + { + integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==, + } + + "@oxc-project/types@0.152.0": + resolution: + { + integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==, + } + + "@pagefind/darwin-arm64@1.5.2": + resolution: + { + integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==, + } cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.5.2': - resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + "@pagefind/darwin-x64@1.5.2": + resolution: + { + integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==, + } cpu: [x64] os: [darwin] - '@pagefind/default-ui@1.5.2': - resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} - - '@pagefind/freebsd-x64@1.5.2': - resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + "@pagefind/default-ui@1.5.2": + resolution: + { + integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==, + } + + "@pagefind/freebsd-x64@1.5.2": + resolution: + { + integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==, + } cpu: [x64] os: [freebsd] - '@pagefind/linux-arm64@1.5.2': - resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + "@pagefind/linux-arm64@1.5.2": + resolution: + { + integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==, + } cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.5.2': - resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + "@pagefind/linux-x64@1.5.2": + resolution: + { + integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==, + } cpu: [x64] os: [linux] - '@pagefind/windows-arm64@1.5.2': - resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + "@pagefind/windows-arm64@1.5.2": + resolution: + { + integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==, + } cpu: [arm64] os: [win32] - '@pagefind/windows-x64@1.5.2': - resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + "@pagefind/windows-x64@1.5.2": + resolution: + { + integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==, + } cpu: [x64] os: [win32] - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - - '@rolldown/binding-android-arm-eabi@1.2.12': - resolution: {integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==} - engines: {node: ^20.19.0 || >=22.12.0} + "@polka/url@1.0.0-next.29": + resolution: + { + integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==, + } + + "@prettier/parse-srcset@3.1.0": + resolution: + { + integrity: sha512-FIRv2rZotO9NP/r66taYqD1zICpPiBbrECqjKV/xqNotqDxF7fLzzUeK+1RSRx9Tenk0DajR/GcRmTJ2qtHaKQ==, + } + + "@rolldown/binding-android-arm-eabi@1.2.12": + resolution: + { + integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.12': - resolution: {integrity: sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-android-arm64@1.2.12": + resolution: + { + integrity: sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.12': - resolution: {integrity: sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-darwin-arm64@1.2.12": + resolution: + { + integrity: sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.12': - resolution: {integrity: sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-darwin-x64@1.2.12": + resolution: + { + integrity: sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.12': - resolution: {integrity: sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-freebsd-x64@1.2.12": + resolution: + { + integrity: sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.12': - resolution: {integrity: sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-arm-gnueabihf@1.2.12": + resolution: + { + integrity: sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.12': - resolution: {integrity: sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-arm64-gnu@1.2.12": + resolution: + { + integrity: sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.12': - resolution: {integrity: sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-arm64-musl@1.2.12": + resolution: + { + integrity: sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.12': - resolution: {integrity: sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-ppc64-gnu@1.2.12": + resolution: + { + integrity: sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.12': - resolution: {integrity: sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-s390x-gnu@1.2.12": + resolution: + { + integrity: sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.12': - resolution: {integrity: sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-x64-gnu@1.2.12": + resolution: + { + integrity: sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.12': - resolution: {integrity: sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-linux-x64-musl@1.2.12": + resolution: + { + integrity: sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.12': - resolution: {integrity: sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-openharmony-arm64@1.2.12": + resolution: + { + integrity: sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.12': - resolution: {integrity: sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-win32-arm64-msvc@1.2.12": + resolution: + { + integrity: sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.12': - resolution: {integrity: sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==} - engines: {node: ^20.19.0 || >=22.12.0} + "@rolldown/binding-win32-x64-msvc@1.2.12": + resolution: + { + integrity: sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.1': - resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - - '@shikijs/core@4.5.0': - resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} - engines: {node: '>=20'} - - '@shikijs/engine-javascript@4.5.0': - resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} - engines: {node: '>=20'} - - '@shikijs/engine-oniguruma@4.5.0': - resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} - engines: {node: '>=20'} - - '@shikijs/langs@4.5.0': - resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} - engines: {node: '>=20'} - - '@shikijs/primitive@4.5.0': - resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} - engines: {node: '>=20'} - - '@shikijs/themes@4.5.0': - resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} - engines: {node: '>=20'} - - '@shikijs/types@4.5.0': - resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} - engines: {node: '>=20'} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@tybys/wasm-util@0.10.4': - resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} - - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/hast@3.0.5': - resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/nlcst@2.0.3': - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - - '@types/node@24.19.1': - resolution: {integrity: sha512-aS3/DG0oM05K0RIXXP+hKjinGG5IgSSVGzswZxW3O0sS3pH4/fycXundUC9XsszgKCk4gHXylTEK6hyFxVxnoQ==} - - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + "@rolldown/pluginutils@1.0.1": + resolution: + { + integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==, + } + + "@shikijs/core@4.5.0": + resolution: + { + integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==, + } + engines: { node: ">=20" } + + "@shikijs/engine-javascript@4.5.0": + resolution: + { + integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==, + } + engines: { node: ">=20" } + + "@shikijs/engine-oniguruma@4.5.0": + resolution: + { + integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==, + } + engines: { node: ">=20" } + + "@shikijs/langs@4.5.0": + resolution: + { + integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==, + } + engines: { node: ">=20" } + + "@shikijs/primitive@4.5.0": + resolution: + { + integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==, + } + engines: { node: ">=20" } + + "@shikijs/themes@4.5.0": + resolution: + { + integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==, + } + engines: { node: ">=20" } + + "@shikijs/types@4.5.0": + resolution: + { + integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==, + } + engines: { node: ">=20" } + + "@shikijs/vscode-textmate@10.0.2": + resolution: + { + integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, + } + + "@tybys/wasm-util@0.10.4": + resolution: + { + integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==, + } + + "@types/debug@4.1.13": + resolution: + { + integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==, + } + + "@types/estree-jsx@1.0.5": + resolution: + { + integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, + } + + "@types/estree@1.0.8": + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + + "@types/hast@3.0.5": + resolution: + { + integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==, + } + + "@types/js-yaml@4.0.9": + resolution: + { + integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==, + } + + "@types/mdast@4.0.4": + resolution: + { + integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, + } + + "@types/ms@2.1.0": + resolution: + { + integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, + } + + "@types/nlcst@2.0.3": + resolution: + { + integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==, + } + + "@types/node@24.19.1": + resolution: + { + integrity: sha512-aS3/DG0oM05K0RIXXP+hKjinGG5IgSSVGzswZxW3O0sS3pH4/fycXundUC9XsszgKCk4gHXylTEK6hyFxVxnoQ==, + } + + "@types/sax@1.2.7": + resolution: + { + integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, + } + + "@types/unist@2.0.11": + resolution: + { + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, + } + + "@types/unist@3.0.3": + resolution: + { + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, + } + + "@ungap/structured-clone@1.3.0": + resolution: + { + integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, + } deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@vitejs/plugin-vue-jsx@5.1.6': - resolution: {integrity: sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@vitejs/plugin-vue-jsx@5.1.6": + resolution: + { + integrity: sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@6.0.9': - resolution: {integrity: sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==} - engines: {node: ^20.19.0 || >=22.12.0} + "@vitejs/plugin-vue@6.0.9": + resolution: + { + integrity: sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@volar/kit@2.4.28': - resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + "@volar/kit@2.4.28": + resolution: + { + integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==, + } peerDependencies: - typescript: '*' - - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - - '@volar/language-server@2.4.28': - resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + typescript: "*" + + "@volar/language-core@2.4.28": + resolution: + { + integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==, + } + + "@volar/language-server@2.4.28": + resolution: + { + integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@volar/language-service@2.4.28': - resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + "@volar/language-service@2.4.28": + resolution: + { + integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - - '@volar/typescript@2.4.28': - resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + "@volar/source-map@2.4.28": + resolution: + { + integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==, + } + + "@volar/typescript@2.4.28": + resolution: + { + integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@vscode/emmet-helper@2.11.0': - resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} - - '@vscode/l10n@0.0.18': - resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - - '@vue/babel-helper-vue-transform-on@1.5.0': - resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} - - '@vue/babel-helper-vue-transform-on@2.0.1': - resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} - - '@vue/babel-plugin-jsx@1.5.0': - resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + "@vscode/emmet-helper@2.11.0": + resolution: + { + integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==, + } + + "@vscode/l10n@0.0.18": + resolution: + { + integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==, + } + + "@vue/babel-helper-vue-transform-on@1.5.0": + resolution: + { + integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==, + } + + "@vue/babel-helper-vue-transform-on@2.0.1": + resolution: + { + integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==, + } + + "@vue/babel-plugin-jsx@1.5.0": + resolution: + { + integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==, + } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 peerDependenciesMeta: - '@babel/core': + "@babel/core": optional: true - '@vue/babel-plugin-jsx@2.0.1': - resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + "@vue/babel-plugin-jsx@2.0.1": + resolution: + { + integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==, + } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 peerDependenciesMeta: - '@babel/core': + "@babel/core": optional: true - '@vue/babel-plugin-resolve-type@1.5.0': - resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + "@vue/babel-plugin-resolve-type@1.5.0": + resolution: + { + integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==, + } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@vue/babel-plugin-resolve-type@2.0.1': - resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + "@vue/babel-plugin-resolve-type@2.0.1": + resolution: + { + integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==, + } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/compiler-core@3.5.43': - resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} - - '@vue/compiler-dom@3.5.43': - resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} - - '@vue/compiler-sfc@3.5.43': - resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} - - '@vue/compiler-ssr@3.5.43': - resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} - - '@vue/devtools-core@8.2.1': - resolution: {integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==} + "@babel/core": ^7.0.0-0 + + "@vue/compiler-core@3.5.43": + resolution: + { + integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==, + } + + "@vue/compiler-dom@3.5.43": + resolution: + { + integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==, + } + + "@vue/compiler-sfc@3.5.43": + resolution: + { + integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==, + } + + "@vue/compiler-ssr@3.5.43": + resolution: + { + integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==, + } + + "@vue/devtools-core@8.2.1": + resolution: + { + integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==, + } peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@8.2.1': - resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} - - '@vue/devtools-shared@8.2.1': - resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} - - '@vue/reactivity@3.5.43': - resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} - - '@vue/runtime-core@3.5.43': - resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} - - '@vue/runtime-dom@3.5.43': - resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} - - '@vue/server-renderer@3.5.43': - resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} - - '@vue/shared@3.5.43': - resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} + "@vue/devtools-kit@8.2.1": + resolution: + { + integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==, + } + + "@vue/devtools-shared@8.2.1": + resolution: + { + integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==, + } + + "@vue/reactivity@3.5.43": + resolution: + { + integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==, + } + + "@vue/runtime-core@3.5.43": + resolution: + { + integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==, + } + + "@vue/runtime-dom@3.5.43": + resolution: + { + integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==, + } + + "@vue/server-renderer@3.5.43": + resolution: + { + integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==, + } + + "@vue/shared@3.5.43": + resolution: + { + integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==, + } ajv-draft-04@1.0.0: - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + resolution: + { + integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, + } peerDependencies: ajv: ^8.5.0 peerDependenciesMeta: @@ -1181,320 +1997,578 @@ packages: optional: true ajv-i18n@4.2.0: - resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} + resolution: + { + integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==, + } peerDependencies: ajv: ^8.0.0-beta.0 ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + resolution: + { + integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==, + } am-i-vibing@0.4.0: - resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==} + resolution: + { + integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==, + } hasBin: true ansi-regex@6.4.0: - resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==, + } + engines: { node: ">=12" } ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, + } + engines: { node: ">=12" } ansis@4.4.0: - resolution: {integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==, + } + engines: { node: ">=14" } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: ">= 0.4" } astro-expressive-code@0.44.2: - resolution: {integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==} + resolution: + { + integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==, + } peerDependencies: astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0 astro@7.3.5: - resolution: {integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==} - engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + resolution: + { + integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==, + } + engines: { node: ">=22.12.0", npm: ">=9.6.5", pnpm: ">=7.1.0" } hasBin: true peerDependencies: - '@astrojs/markdown-remark': ^7.3.0 + "@astrojs/markdown-remark": ^7.3.0 peerDependenciesMeta: - '@astrojs/markdown-remark': + "@astrojs/markdown-remark": optional: true axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + } + engines: { node: ">= 0.4" } bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } baseline-browser-mapping@2.11.27: - resolution: {integrity: sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ==, + } + engines: { node: ">=6.0.0" } hasBin: true bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + resolution: + { + integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==, + } bcp-47@2.1.1: - resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==} + resolution: + { + integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==, + } birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + resolution: + { + integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==, + } birpc@4.2.0: - resolution: {integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==} + resolution: + { + integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==, + } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } browserslist@4.29.3: - resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true bundle-name@4.1.1: - resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==, + } + engines: { node: ">=18" } caniuse-lite@1.0.30001814: - resolution: {integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==} + resolution: + { + integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==, + } ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: ">= 14.16.0" } chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} + resolution: + { + integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==, + } + engines: { node: ">= 20.19.0" } ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==, + } + engines: { node: ">=8" } cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==, + } + engines: { node: ">=20" } clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: ">=6" } comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==, + } + engines: { node: ">=16" } common-ancestor-path@2.0.0: - resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==, + } + engines: { node: ">= 18" } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-es@1.2.3: - resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + resolution: + { + integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==, + } cookie@2.0.1: - resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} - engines: {node: '>=22'} + resolution: + { + integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==, + } + engines: { node: ">=22" } crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + resolution: + { + integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, + } crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + resolution: + { + integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==, + } css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + resolution: + { + integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==, + } css-selector-parser@3.3.0: - resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + resolution: + { + integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==, + } css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { + integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + resolution: + { + integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==, + } + engines: { node: ">= 6" } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } hasBin: true csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { + integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + resolution: + { + integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, + } debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + resolution: + { + integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==, + } default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==, + } + engines: { node: ">=18" } default-browser@5.5.1: - resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==, + } + engines: { node: ">=18" } define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, + } + engines: { node: ">=12" } defu@6.1.7: - resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + resolution: + { + integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==, + } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + resolution: + { + integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, + } detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, + } + engines: { node: ">=8" } devalue@5.9.4: - resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + resolution: + { + integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==, + } devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } diff@9.0.0: - resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==, + } + engines: { node: ">=0.3.1" } direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + resolution: + { + integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==, + } hasBin: true dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + resolution: + { + integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, + } dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==, + } + engines: { node: ">=4" } electron-to-chromium@1.5.444: - resolution: {integrity: sha512-5ss/uJfoDYDHT0lfJzT6FbcskIzROIOPf0BbbFkGcvDzoJU7i//9GDrwwIHQVmIsrAGiF3ihpADBRIsrEFt1rQ==} + resolution: + { + integrity: sha512-5ss/uJfoDYDHT0lfJzT6FbcskIzROIOPf0BbbFkGcvDzoJU7i//9GDrwwIHQVmIsrAGiF3ihpADBRIsrEFt1rQ==, + } emmet@2.4.11: - resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + resolution: + { + integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==, + } emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + resolution: + { + integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, + } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==, + } + engines: { node: ">=0.12" } error-stack-parser-es@1.0.5: - resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + resolution: + { + integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, + } es-module-lexer@2.3.2: - resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + resolution: + { + integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==, + } esbuild@0.28.2: - resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==, + } + engines: { node: ">=18" } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + resolution: + { + integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==, + } expressive-code@0.44.2: - resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==} + resolution: + { + integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==, + } extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + resolution: + { + integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==, + } fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + resolution: + { + integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==, + } fast-uri@3.1.8: - resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + resolution: + { + integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==, + } fast-wrap-ansi@0.2.2: - resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + resolution: + { + integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==, + } fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1502,106 +2576,199 @@ packages: optional: true find-proc@0.2.0: - resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { + integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==, + } + engines: { node: ^20.19.0 || >=22.12.0 } flattie@1.1.1: - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==, + } + engines: { node: ">=8" } fontace@0.4.1: - resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + resolution: + { + integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==, + } fontkitten@1.0.3: - resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==, + } + engines: { node: ">=20" } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-east-asian-width@1.7.0: - resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==, + } + engines: { node: ">=18" } get-tsconfig@5.0.0-beta.4: - resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} - engines: {node: '>=20.20.0'} + resolution: + { + integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==, + } + engines: { node: ">=20.20.0" } github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } h3@1.15.11: - resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + resolution: + { + integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==, + } hast-util-embedded@3.0.0: - resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + resolution: + { + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, + } hast-util-format@1.1.0: - resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + resolution: + { + integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==, + } hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + resolution: + { + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, + } hast-util-is-body-ok-link@3.0.1: - resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + resolution: + { + integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==, + } hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } hast-util-minify-whitespace@1.0.1: - resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + resolution: + { + integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==, + } hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } hast-util-phrasing@3.0.1: - resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + resolution: + { + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, + } hast-util-select@6.0.4: - resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + resolution: + { + integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==, + } hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + resolution: + { + integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, + } hast-util-to-string@3.0.1: - resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + resolution: + { + integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==, + } hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + resolution: + { + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, + } hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + resolution: + { + integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==, + } hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + resolution: + { + integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, + } html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + resolution: + { + integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, + } html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } html-whitespace-sensitive-tag-names@3.0.1: - resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + resolution: + { + integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==, + } http-cache-semantics@4.3.0: - resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + resolution: + { + integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==, + } i18next@26.4.2: - resolution: {integrity: sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==} + resolution: + { + integrity: sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==, + } peerDependencies: typescript: ^5 || ^6 || ^7 peerDependenciesMeta: @@ -1609,671 +2776,1203 @@ packages: optional: true iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + resolution: + { + integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, + } is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } hasBin: true is-docker@4.0.0: - resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==, + } + engines: { node: ">=20" } hasBin: true is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==, + } + engines: { node: ">=20" } is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: ">=14.16" } hasBin: true is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==, + } + engines: { node: ">=16" } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + resolution: + { + integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==, + } hasBin: true jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: ">=6" } hasBin: true json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } hasBin: true jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + resolution: + { + integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==, + } jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + resolution: + { + integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + } kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, + } + engines: { node: ">= 8" } kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: + { + integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, + } lightningcss-android-arm64@1.33.0: - resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.33.0: - resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.33.0: - resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.33.0: - resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.33.0: - resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==, + } + engines: { node: ">= 12.0.0" } cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.33.0: - resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: - resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.33.0: - resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.33.0: - resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: - resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.33.0: - resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [win32] lightningcss@1.33.0: - resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==, + } + engines: { node: ">= 12.0.0" } longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } lru-cache@11.5.3: - resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==, + } + engines: { node: 20 || >=22 } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } magic-string@1.4.2: - resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} + resolution: + { + integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==, + } magicast@0.5.5: - resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + resolution: + { + integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==, + } mdast-util-directive@3.1.1: - resolution: {integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==} + resolution: + { + integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==, + } mdast-util-from-markdown@2.1.0: - resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} + resolution: + { + integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==, + } mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + resolution: + { + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, + } mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + resolution: + { + integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==, + } mdast-util-to-markdown@2.2.0: - resolution: {integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==} + resolution: + { + integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==, + } mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + resolution: + { + integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, + } mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + resolution: + { + integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==, + } micromark-core-commonmark@2.0.4: - resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} + resolution: + { + integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==, + } micromark-extension-directive@4.0.0: - resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + resolution: + { + integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==, + } micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + resolution: + { + integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, + } micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + resolution: + { + integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, + } micromark-factory-space@2.1.0: - resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} + resolution: + { + integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==, + } micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + resolution: + { + integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, + } micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + resolution: + { + integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, + } micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + resolution: + { + integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, + } micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + resolution: + { + integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, + } micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + resolution: + { + integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, + } micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + resolution: + { + integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, + } micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + resolution: + { + integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, + } micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + resolution: + { + integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, + } micromark-util-edit-map@1.0.0: - resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + resolution: + { + integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==, + } micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + resolution: + { + integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, + } micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + resolution: + { + integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, + } micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + resolution: + { + integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, + } micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + resolution: + { + integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, + } micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + resolution: + { + integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, + } micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + resolution: + { + integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, + } micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + resolution: + { + integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, + } micromark-util-types@2.0.3: - resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + resolution: + { + integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==, + } micromark@4.0.3: - resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + resolution: + { + integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==, + } mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, + } + engines: { node: ">=10" } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + resolution: + { + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, + } nanoid@3.3.19: - resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true neotraverse@1.0.1: - resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==, + } + engines: { node: ">= 10" } nlcst-to-string@4.0.0: - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + resolution: + { + integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==, + } node-fetch-native@1.6.7: - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + resolution: + { + integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==, + } node-mock-http@1.0.5: - resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + resolution: + { + integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==, + } node-releases@2.0.57: - resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==, + } + engines: { node: ">=18" } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } obug@2.2.1: - resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==, + } + engines: { node: ">=12.20.0" } obug@3.0.0: - resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==, + } + engines: { node: ">=12.20.0" } ofetch@1.5.1: - resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + resolution: + { + integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==, + } ohash@2.0.12: - resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + resolution: + { + integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==, + } oniguruma-parser@0.12.2: - resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + resolution: + { + integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==, + } oniguruma-to-es@4.3.6: - resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + resolution: + { + integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==, + } open@11.0.4: - resolution: {integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==, + } + engines: { node: ">=20" } p-limit@7.3.3: - resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==, + } + engines: { node: ">=20" } p-queue@9.3.3: - resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==, + } + engines: { node: ">=20" } p-timeout@7.0.2: - resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==, + } + engines: { node: ">=20" } package-manager-detector@1.8.0: - resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + resolution: + { + integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==, + } pagefind@1.5.2: - resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + resolution: + { + integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==, + } hasBin: true parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + resolution: + { + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, + } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } perfect-debounce@2.1.0: - resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + resolution: + { + integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==, + } piccolore@0.1.3: - resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + resolution: + { + integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==, + } + engines: { node: ">=8.6" } picomatch@4.0.7: - resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==, + } + engines: { node: ">=12" } postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: ">=12.0" } peerDependencies: postcss: ^8.2.14 postcss-selector-parser@6.1.4: - resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==, + } + engines: { node: ">=4" } postcss@8.5.28: - resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==, + } + engines: { node: ^10 || ^12 || >=14 } powershell-utils@0.2.1: - resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==, + } + engines: { node: ">=20" } + + prettier-plugin-astro@1.1.0: + resolution: + { + integrity: sha512-ujJ1VX+iin4eYJPHVCEbmXHzrEVsi1SaVehHtbAteTZv8VTrZyBiZPmYc6Ud6+fkr/UBMXuEu3N3+d49h7YfKw==, + } + engines: { node: ">=22.12.0" } + peerDependencies: + prettier: ^3.5.3 prettier@3.9.9: - resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==, + } + engines: { node: ">=14" } hasBin: true prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==, + } + engines: { node: ">=6" } process-ancestry@0.1.0: - resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==, + } + engines: { node: ">=18.0.0" } property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + resolution: + { + integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, + } radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + resolution: + { + integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, + } readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: ">= 14.18.0" } readdirp@5.1.1: - resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} - engines: {node: '>= 20.19.0'} + resolution: + { + integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==, + } + engines: { node: ">= 20.19.0" } regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + resolution: + { + integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==, + } regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + resolution: + { + integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==, + } regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + resolution: + { + integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==, + } rehype-expressive-code@0.44.2: - resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==} + resolution: + { + integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==, + } remark-directive@4.0.0: - resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + resolution: + { + integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==, + } request-light@0.5.8: - resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + resolution: + { + integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==, + } request-light@0.7.0: - resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + resolution: + { + integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==, + } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } retext-smartypants@6.2.0: - resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + resolution: + { + integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==, + } rolldown@1.2.12: - resolution: {integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { + integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==, + } + engines: { node: ">=18" } + + s.color@0.0.15: + resolution: + { + integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==, + } + + sass-formatter@0.8.0: + resolution: + { + integrity: sha512-Nf4eMGE2O5vnJG7KPCRyksWS9gVKSYoUWtPeMXRRxwZSPVQhSGtL602xVYS65LvMkHmkvKa7xpauF0+/5pPwrg==, + } + hasBin: true satteri@0.10.5: - resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + resolution: + { + integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==, + } sax@1.6.1: - resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} - engines: {node: '>=11.0.0'} + resolution: + { + integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==, + } + engines: { node: ">=11.0.0" } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, + } + engines: { node: ">=10" } hasBin: true sharp@0.35.5: - resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} - engines: {node: '>=20.9.0'} + resolution: + { + integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==, + } + engines: { node: ">=20.9.0" } peerDependencies: - '@types/node': '*' + "@types/node": "*" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true shiki@4.5.0: - resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==, + } + engines: { node: ">=20" } sirv@3.0.2: - resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==, + } + engines: { node: ">=18" } sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } sitemap@9.0.1: - resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} - engines: {node: '>=20.19.5', npm: '>=10.8.2'} + resolution: + { + integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==, + } + engines: { node: ">=20.19.5", npm: ">=10.8.2" } hasBin: true smol-toml@1.9.0: - resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==, + } + engines: { node: ">= 18" } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } string-width@8.3.0: - resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==, + } + engines: { node: ">=20" } stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + resolution: + { + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, + } strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==, + } + engines: { node: ">=12" } style-mod@4.1.3: - resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + resolution: + { + integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==, + } + + suf-log@2.5.3: + resolution: + { + integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==, + } svgo@4.1.0: - resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==, + } + engines: { node: ">=16" } hasBin: true tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + resolution: + { + integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, + } tinyclip@1.0.3: - resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} - engines: {node: ^16.14.0 || >= 17.3.0} + resolution: + { + integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==, + } + engines: { node: ^16.14.0 || >= 17.3.0 } tinyexec@1.3.1: - resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==, + } + engines: { node: ">=18" } tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, + } + engines: { node: ">=12.0.0" } totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, + } + engines: { node: ">=6" } trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + resolution: + { + integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==, + } typescript-auto-import-cache@0.3.6: - resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + resolution: + { + integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==, + } typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==, + } + engines: { node: ">=14.17" } hasBin: true ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + resolution: + { + integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==, + } ultrahtml@1.7.0: - resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + resolution: + { + integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==, + } uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + resolution: + { + integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==, + } undici@8.11.2: - resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} - engines: {node: '>=22.19.0'} + resolution: + { + integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==, + } + engines: { node: ">=22.19.0" } unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + resolution: + { + integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, + } unifont@0.7.5: - resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==} + resolution: + { + integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==, + } unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + resolution: + { + integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==, + } unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + resolution: + { + integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==, + } unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + resolution: + { + integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==, + } unplugin-utils@0.3.2: - resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} - engines: {node: '>=20.19.0'} + resolution: + { + integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==, + } + engines: { node: ">=20.19.0" } unstorage@1.17.5: - resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + resolution: + { + integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==, + } peerDependencies: - '@azure/app-configuration': ^1.8.0 - '@azure/cosmos': ^4.2.0 - '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.6.0 - '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6 || ^7 || ^8 - '@deno/kv': '>=0.9.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.1' - '@vercel/functions': ^2.2.12 || ^3.0.0 - '@vercel/kv': ^1 || ^2 || ^3 + "@azure/app-configuration": ^1.8.0 + "@azure/cosmos": ^4.2.0 + "@azure/data-tables": ^13.3.0 + "@azure/identity": ^4.6.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.26.0 + "@capacitor/preferences": ^6 || ^7 || ^8 + "@deno/kv": ">=0.9.0" + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.1" + "@vercel/functions": ^2.2.12 || ^3.0.0 + "@vercel/kv": ^1 || ^2 || ^3 aws4fetch: ^1.0.20 - db0: '>=0.2.1' + db0: ">=0.2.1" idb-keyval: ^6.2.1 ioredis: ^5.4.2 uploadthing: ^7.4.4 peerDependenciesMeta: - '@azure/app-configuration': + "@azure/app-configuration": optional: true - '@azure/cosmos': + "@azure/cosmos": optional: true - '@azure/data-tables': + "@azure/data-tables": optional: true - '@azure/identity': + "@azure/identity": optional: true - '@azure/keyvault-secrets': + "@azure/keyvault-secrets": optional: true - '@azure/storage-blob': + "@azure/storage-blob": optional: true - '@capacitor/preferences': + "@capacitor/preferences": optional: true - '@deno/kv': + "@deno/kv": optional: true - '@netlify/blobs': + "@netlify/blobs": optional: true - '@planetscale/database': + "@planetscale/database": optional: true - '@upstash/redis': + "@upstash/redis": optional: true - '@vercel/blob': + "@vercel/blob": optional: true - '@vercel/functions': + "@vercel/functions": optional: true - '@vercel/kv': + "@vercel/kv": optional: true aws4fetch: optional: true @@ -2287,81 +3986,117 @@ packages: optional: true update-browserslist-db@1.3.3: - resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} + resolution: + { + integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==, + } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" url-extras@0.1.0: - resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==, + } + engines: { node: ">=20" } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } verkit@0.4.1: - resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==, + } + engines: { node: ">=18.12.0" } vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + resolution: + { + integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==, + } vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + resolution: + { + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, + } vite-dev-rpc@2.0.0: - resolution: {integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==} + resolution: + { + integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==, + } peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0 vite-hot-client@2.2.0: - resolution: {integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==} + resolution: + { + integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==, + } peerDependencies: vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0 vite-plugin-inspect@11.4.1: - resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==, + } + engines: { node: ">=14" } peerDependencies: - '@nuxt/kit': '*' + "@nuxt/kit": "*" vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 peerDependenciesMeta: - '@nuxt/kit': + "@nuxt/kit": optional: true vite-plugin-vue-devtools@8.2.1: - resolution: {integrity: sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==} - engines: {node: '>=v14.21.3'} + resolution: + { + integrity: sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==, + } + engines: { node: ">=v14.21.3" } peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - vue: '*' + vue: "*" vite-plugin-vue-inspector@6.0.0: - resolution: {integrity: sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==} + resolution: + { + integrity: sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==, + } peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vite@8.3.2: - resolution: {integrity: sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { + integrity: sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==, + } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.7.1 + "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.7.1 esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' + jiti: ">=1.21.0" less: ^4.0.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: '>=0.54.8' + stylus: ">=0.54.8" sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@vitejs/devtools': + "@vitejs/devtools": optional: true esbuild: optional: true @@ -2385,7 +4120,10 @@ packages: optional: true vitefu@1.1.3: - resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + resolution: + { + integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==, + } peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: @@ -2393,250 +4131,412 @@ packages: optional: true volar-service-css@0.0.71: - resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==} + resolution: + { + integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==, + } peerDependencies: - '@volar/language-service': ~2.4.0 + "@volar/language-service": ~2.4.0 peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true volar-service-emmet@0.0.71: - resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==} + resolution: + { + integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==, + } peerDependencies: - '@volar/language-service': ~2.4.0 + "@volar/language-service": ~2.4.0 peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true volar-service-html@0.0.71: - resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==} + resolution: + { + integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==, + } peerDependencies: - '@volar/language-service': ~2.4.0 + "@volar/language-service": ~2.4.0 peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true volar-service-prettier@0.0.71: - resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==} + resolution: + { + integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==, + } peerDependencies: - '@volar/language-service': ~2.4.0 + "@volar/language-service": ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true prettier: optional: true volar-service-typescript-twoslash-queries@0.0.71: - resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==} + resolution: + { + integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==, + } peerDependencies: - '@volar/language-service': ~2.4.0 - typescript: '*' + "@volar/language-service": ~2.4.0 + typescript: "*" peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true typescript: optional: true volar-service-typescript@0.0.71: - resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==} + resolution: + { + integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==, + } peerDependencies: - '@volar/language-service': ~2.4.0 - typescript: '*' + "@volar/language-service": ~2.4.0 + typescript: "*" peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true typescript: optional: true volar-service-yaml@0.0.71: - resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==} + resolution: + { + integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==, + } peerDependencies: - '@volar/language-service': ~2.4.0 + "@volar/language-service": ~2.4.0 peerDependenciesMeta: - '@volar/language-service': + "@volar/language-service": optional: true vscode-css-languageservice@6.3.10: - resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + resolution: + { + integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==, + } vscode-html-languageservice@5.6.2: - resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + resolution: + { + integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==, + } vscode-json-languageservice@4.1.8: - resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} - engines: {npm: '>=7.0.0'} + resolution: + { + integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==, + } + engines: { npm: ">=7.0.0" } vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, + } + engines: { node: ">=14.0.0" } vscode-jsonrpc@9.0.3: - resolution: {integrity: sha512-qETYf9PCl1lVfwR+oBmMfc4vP2nqLNA35ABxorw3j06+xlKRgDVxbLgKm4Y/xPL0YWdeDjLoI4ImICIT3nB0zQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-qETYf9PCl1lVfwR+oBmMfc4vP2nqLNA35ABxorw3j06+xlKRgDVxbLgKm4Y/xPL0YWdeDjLoI4ImICIT3nB0zQ==, + } + engines: { node: ">=14.0.0" } vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + resolution: + { + integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, + } vscode-languageserver-protocol@3.18.4: - resolution: {integrity: sha512-CCXbyr99dafRJzJH/0Ryk7ly5T8XPmSR0//OuF2w4m+9JiOin7zcAT5iET8GRE7Z9taFBejb3GbM0a0mbjdbrg==} + resolution: + { + integrity: sha512-CCXbyr99dafRJzJH/0Ryk7ly5T8XPmSR0//OuF2w4m+9JiOin7zcAT5iET8GRE7Z9taFBejb3GbM0a0mbjdbrg==, + } vscode-languageserver-textdocument@1.0.15: - resolution: {integrity: sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==} + resolution: + { + integrity: sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==, + } vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } vscode-languageserver-types@3.18.4: - resolution: {integrity: sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==} + resolution: + { + integrity: sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==, + } vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + resolution: + { + integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, + } hasBin: true vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } vscode-uri@3.2.0: - resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + resolution: + { + integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==, + } vue@3.5.43: - resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} + resolution: + { + integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + resolution: + { + integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, + } wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, + } + engines: { node: ">=18" } wsl-utils@1.0.1: - resolution: {integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==} - engines: {node: '>=20'} + resolution: + { + integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==, + } + engines: { node: ">=20" } xxhash-wasm@1.1.0: - resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + resolution: + { + integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==, + } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yaml-language-server@1.23.0: - resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} + resolution: + { + integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==, + } hasBin: true yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} + resolution: + { + integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==, + } + engines: { node: ">= 14.6" } hasBin: true yaml@2.9.1: - resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} - engines: {node: '>= 14.6'} + resolution: + { + integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==, + } + engines: { node: ">= 14.6" } hasBin: true yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { + integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==, + } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yargs@18.2.0: - resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { + integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==, + } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==, + } + engines: { node: ">=12.20" } zod@4.6.5: - resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + resolution: + { + integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==, + } zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } snapshots: - - '@astrojs/astro2tsx@0.1.2(@emnapi/runtime@1.11.3)': + "@astrojs/astro2tsx@0.1.2(@emnapi/runtime@1.11.3)": dependencies: - '@emnapi/core': 1.11.3 - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + "@emnapi/core": 1.11.3 + "@napi-rs/wasm-runtime": 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - - '@emnapi/runtime' + - "@emnapi/runtime" - '@astrojs/check@0.9.10(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3)': + "@astrojs/check@0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)": dependencies: - '@astrojs/language-server': 2.17.1(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3) + "@astrojs/language-server": 2.17.1(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 6.0.3 yargs: 18.2.0 transitivePeerDependencies: - - '@emnapi/runtime' + - "@emnapi/runtime" - prettier - prettier-plugin-astro - '@astrojs/compiler-binding-android-arm64@0.5.1': + "@astrojs/compiler-binding-android-arm64@0.4.1": + optional: true + + "@astrojs/compiler-binding-android-arm64@0.5.1": + optional: true + + "@astrojs/compiler-binding-darwin-arm64@0.4.1": + optional: true + + "@astrojs/compiler-binding-darwin-arm64@0.5.1": + optional: true + + "@astrojs/compiler-binding-darwin-x64@0.4.1": + optional: true + + "@astrojs/compiler-binding-darwin-x64@0.5.1": + optional: true + + "@astrojs/compiler-binding-linux-arm64-gnu@0.4.1": optional: true - '@astrojs/compiler-binding-darwin-arm64@0.5.1': + "@astrojs/compiler-binding-linux-arm64-gnu@0.5.1": optional: true - '@astrojs/compiler-binding-darwin-x64@0.5.1': + "@astrojs/compiler-binding-linux-arm64-musl@0.4.1": optional: true - '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + "@astrojs/compiler-binding-linux-arm64-musl@0.5.1": optional: true - '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + "@astrojs/compiler-binding-linux-x64-gnu@0.4.1": optional: true - '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + "@astrojs/compiler-binding-linux-x64-gnu@0.5.1": optional: true - '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + "@astrojs/compiler-binding-linux-x64-musl@0.4.1": optional: true - '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + "@astrojs/compiler-binding-linux-x64-musl@0.5.1": + optional: true + + "@astrojs/compiler-binding-wasm32-wasi@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)": + dependencies: + "@napi-rs/wasm-runtime": 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - "@emnapi/core" + - "@emnapi/runtime" + optional: true + + "@astrojs/compiler-binding-wasm32-wasi@0.5.1": dependencies: - '@emnapi/core': 1.11.3 - '@emnapi/runtime': 1.11.3 - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + "@emnapi/core": 1.11.3 + "@emnapi/runtime": 1.11.3 + "@napi-rs/wasm-runtime": 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true - '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + "@astrojs/compiler-binding-win32-arm64-msvc@0.4.1": optional: true - '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + "@astrojs/compiler-binding-win32-arm64-msvc@0.5.1": optional: true - '@astrojs/compiler-binding@0.5.1': + "@astrojs/compiler-binding-win32-x64-msvc@0.4.1": + optional: true + + "@astrojs/compiler-binding-win32-x64-msvc@0.5.1": + optional: true + + "@astrojs/compiler-binding@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)": + optionalDependencies: + "@astrojs/compiler-binding-android-arm64": 0.4.1 + "@astrojs/compiler-binding-darwin-arm64": 0.4.1 + "@astrojs/compiler-binding-darwin-x64": 0.4.1 + "@astrojs/compiler-binding-linux-arm64-gnu": 0.4.1 + "@astrojs/compiler-binding-linux-arm64-musl": 0.4.1 + "@astrojs/compiler-binding-linux-x64-gnu": 0.4.1 + "@astrojs/compiler-binding-linux-x64-musl": 0.4.1 + "@astrojs/compiler-binding-wasm32-wasi": 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + "@astrojs/compiler-binding-win32-arm64-msvc": 0.4.1 + "@astrojs/compiler-binding-win32-x64-msvc": 0.4.1 + transitivePeerDependencies: + - "@emnapi/core" + - "@emnapi/runtime" + + "@astrojs/compiler-binding@0.5.1": optionalDependencies: - '@astrojs/compiler-binding-android-arm64': 0.5.1 - '@astrojs/compiler-binding-darwin-arm64': 0.5.1 - '@astrojs/compiler-binding-darwin-x64': 0.5.1 - '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.1 - '@astrojs/compiler-binding-linux-arm64-musl': 0.5.1 - '@astrojs/compiler-binding-linux-x64-gnu': 0.5.1 - '@astrojs/compiler-binding-linux-x64-musl': 0.5.1 - '@astrojs/compiler-binding-wasm32-wasi': 0.5.1 - '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.1 - '@astrojs/compiler-binding-win32-x64-msvc': 0.5.1 + "@astrojs/compiler-binding-android-arm64": 0.5.1 + "@astrojs/compiler-binding-darwin-arm64": 0.5.1 + "@astrojs/compiler-binding-darwin-x64": 0.5.1 + "@astrojs/compiler-binding-linux-arm64-gnu": 0.5.1 + "@astrojs/compiler-binding-linux-arm64-musl": 0.5.1 + "@astrojs/compiler-binding-linux-x64-gnu": 0.5.1 + "@astrojs/compiler-binding-linux-x64-musl": 0.5.1 + "@astrojs/compiler-binding-wasm32-wasi": 0.5.1 + "@astrojs/compiler-binding-win32-arm64-msvc": 0.5.1 + "@astrojs/compiler-binding-win32-x64-msvc": 0.5.1 + + "@astrojs/compiler-rs@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)": + dependencies: + "@astrojs/compiler-binding": 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - "@emnapi/core" + - "@emnapi/runtime" - '@astrojs/compiler-rs@0.5.1': + "@astrojs/compiler-rs@0.5.1": dependencies: - '@astrojs/compiler-binding': 0.5.1 + "@astrojs/compiler-binding": 0.5.1 - '@astrojs/internal-helpers@0.11.0': + "@astrojs/internal-helpers@0.11.0": dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 + "@types/hast": 3.0.5 + "@types/mdast": 4.0.4 js-yaml: 4.3.2 picomatch: 4.0.7 retext-smartypants: 6.2.0 @@ -2644,14 +4544,14 @@ snapshots: smol-toml: 1.9.0 unified: 11.0.5 - '@astrojs/language-server@2.17.1(@emnapi/runtime@1.11.3)(prettier@3.9.9)(typescript@6.0.3)': + "@astrojs/language-server@2.17.1(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)": dependencies: - '@astrojs/astro2tsx': 0.1.2(@emnapi/runtime@1.11.3) - '@astrojs/yaml2ts': 0.2.4 - '@volar/kit': 2.4.28(typescript@6.0.3) - '@volar/language-core': 2.4.28 - '@volar/language-server': 2.4.28(typescript@6.0.3) - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@astrojs/astro2tsx": 0.1.2(@emnapi/runtime@1.11.3) + "@astrojs/yaml2ts": 0.2.4 + "@volar/kit": 2.4.28(typescript@6.0.3) + "@volar/language-core": 2.4.28 + "@volar/language-server": 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) muggle-string: 0.4.1 tinyglobby: 0.2.17 volar-service-css: 0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)) @@ -2665,42 +4565,43 @@ snapshots: vscode-uri: 3.2.0 optionalDependencies: prettier: 3.9.9 + prettier-plugin-astro: 1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9) transitivePeerDependencies: - - '@emnapi/runtime' + - "@emnapi/runtime" - typescript - '@astrojs/markdown-satteri@0.4.2': + "@astrojs/markdown-satteri@0.4.2": dependencies: - '@astrojs/internal-helpers': 0.11.0 - '@astrojs/prism': 4.0.2 + "@astrojs/internal-helpers": 0.11.0 + "@astrojs/prism": 4.0.2 github-slugger: 2.0.0 satteri: 0.10.5 - '@astrojs/mdx@8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))': + "@astrojs/mdx@8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))": dependencies: - '@astrojs/internal-helpers': 0.11.0 - '@astrojs/markdown-satteri': 0.4.2 + "@astrojs/internal-helpers": 0.11.0 + "@astrojs/markdown-satteri": 0.4.2 astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) es-module-lexer: 2.3.2 - '@astrojs/prism@4.0.2': + "@astrojs/prism@4.0.2": dependencies: prismjs: 1.30.0 - '@astrojs/sitemap@3.7.4': + "@astrojs/sitemap@3.7.4": dependencies: sitemap: 9.0.1 zod: 4.6.5 - '@astrojs/starlight@0.42.5(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(typescript@6.0.3)': + "@astrojs/starlight@0.42.5(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(typescript@6.0.3)": dependencies: - '@astrojs/markdown-satteri': 0.4.2 - '@astrojs/mdx': 8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)) - '@astrojs/sitemap': 3.7.4 - '@pagefind/default-ui': 1.5.2 - '@types/hast': 3.0.5 - '@types/js-yaml': 4.0.9 - '@types/mdast': 4.0.4 + "@astrojs/markdown-satteri": 0.4.2 + "@astrojs/mdx": 8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)) + "@astrojs/sitemap": 3.7.4 + "@pagefind/default-ui": 1.5.2 + "@types/hast": 3.0.5 + "@types/js-yaml": 4.0.9 + "@types/mdast": 4.0.4 astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) astro-expressive-code: 0.44.2(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1)) bcp-47: 2.1.1 @@ -2727,26 +4628,26 @@ snapshots: - supports-color - typescript - '@astrojs/telemetry@3.3.3': + "@astrojs/telemetry@3.3.3": dependencies: ci-info: 4.4.0 dset: 3.1.4 is-docker: 4.0.0 package-manager-detector: 1.8.0 - '@astrojs/vue@7.0.3(@types/node@24.19.1)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(esbuild@0.28.2)(vue@3.5.43(typescript@6.0.3))(yaml@2.9.1)': + "@astrojs/vue@7.0.3(@types/node@24.19.1)(astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1))(esbuild@0.28.2)(vue@3.5.43(typescript@6.0.3))(yaml@2.9.1)": dependencies: - '@vitejs/plugin-vue': 6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) - '@vue/compiler-sfc': 3.5.43 + "@vitejs/plugin-vue": 6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) + "@vitejs/plugin-vue-jsx": 5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) + "@vue/compiler-sfc": 3.5.43 astro: 7.3.5(@types/node@24.19.1)(yaml@2.9.1) vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) vite-plugin-vue-devtools: 8.2.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)) vue: 3.5.43(typescript@6.0.3) transitivePeerDependencies: - - '@nuxt/kit' - - '@types/node' - - '@vitejs/devtools' + - "@nuxt/kit" + - "@types/node" + - "@vitejs/devtools" - esbuild - jiti - less @@ -2759,30 +4660,30 @@ snapshots: - tsx - yaml - '@astrojs/yaml2ts@0.2.4': + "@astrojs/yaml2ts@0.2.4": dependencies: yaml: 2.9.1 - '@babel/code-frame@7.29.7': + "@babel/code-frame@7.29.7": dependencies: - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.7': {} + "@babel/compat-data@7.29.7": {} - '@babel/core@7.29.7': + "@babel/core@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - '@jridgewell/remapping': 2.3.5 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.8 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.29.7) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.9 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -2791,382 +4692,382 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.8': + "@babel/generator@7.29.8": dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@babel/parser": 7.29.9 + "@babel/types": 7.29.8 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.29.7': + "@babel/helper-annotate-as-pure@7.29.7": dependencies: - '@babel/types': 7.29.8 + "@babel/types": 7.29.8 - '@babel/helper-compilation-targets@7.29.7': + "@babel/helper-compilation-targets@7.29.7": dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 + "@babel/compat-data": 7.29.7 + "@babel/helper-validator-option": 7.29.7 browserslist: 4.29.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + "@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.8 + "@babel/core": 7.29.7 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.29.7) + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/traverse": 7.29.8 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.29.7': {} + "@babel/helper-globals@7.29.7": {} - '@babel/helper-member-expression-to-functions@7.29.7': + "@babel/helper-member-expression-to-functions@7.29.7": dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + "@babel/helper-module-imports@7.29.7": dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.29.7': + "@babel/helper-optimise-call-expression@7.29.7": dependencies: - '@babel/types': 7.29.8 + "@babel/types": 7.29.8 - '@babel/helper-plugin-utils@7.29.7': {} + "@babel/helper-plugin-utils@7.29.7": {} - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + "@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.8 + "@babel/core": 7.29.7 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/traverse": 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + "@babel/helper-skip-transparent-expression-wrappers@7.29.7": dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.29.7': {} + "@babel/helper-string-parser@7.29.7": {} - '@babel/helper-validator-identifier@7.29.7': {} + "@babel/helper-validator-identifier@7.29.7": {} - '@babel/helper-validator-option@7.29.7': {} + "@babel/helper-validator-option@7.29.7": {} - '@babel/helpers@7.29.7': + "@babel/helpers@7.29.7": dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 + "@babel/template": 7.29.7 + "@babel/types": 7.29.8 - '@babel/parser@7.29.9': + "@babel/parser@7.29.9": dependencies: - '@babel/types': 7.29.8 + "@babel/types": 7.29.8 - '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7) + "@babel/core": 7.29.7 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.29.7) + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-syntax-decorators": 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7)': + "@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + "@babel/core": 7.29.7 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.29.7) + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/plugin-syntax-typescript": 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/template@7.29.7': + "@babel/template@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 + "@babel/code-frame": 7.29.7 + "@babel/parser": 7.29.9 + "@babel/types": 7.29.8 - '@babel/traverse@7.29.8': + "@babel/traverse@7.29.8": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.8 + "@babel/helper-globals": 7.29.7 + "@babel/parser": 7.29.9 + "@babel/template": 7.29.7 + "@babel/types": 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.8': + "@babel/types@7.29.8": dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-string-parser": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 - '@bruits/satteri-darwin-arm64@0.10.5': + "@bruits/satteri-darwin-arm64@0.10.5": optional: true - '@bruits/satteri-darwin-x64@0.10.5': + "@bruits/satteri-darwin-x64@0.10.5": optional: true - '@bruits/satteri-linux-arm64-gnu@0.10.5': + "@bruits/satteri-linux-arm64-gnu@0.10.5": optional: true - '@bruits/satteri-linux-arm64-musl@0.10.5': + "@bruits/satteri-linux-arm64-musl@0.10.5": optional: true - '@bruits/satteri-linux-x64-gnu@0.10.5': + "@bruits/satteri-linux-x64-gnu@0.10.5": optional: true - '@bruits/satteri-linux-x64-musl@0.10.5': + "@bruits/satteri-linux-x64-musl@0.10.5": optional: true - '@bruits/satteri-wasm32-wasi@0.10.5': + "@bruits/satteri-wasm32-wasi@0.10.5": dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + "@emnapi/core": 1.11.1 + "@emnapi/runtime": 1.11.1 + "@napi-rs/wasm-runtime": 1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@bruits/satteri-win32-arm64-msvc@0.10.5': + "@bruits/satteri-win32-arm64-msvc@0.10.5": optional: true - '@bruits/satteri-win32-x64-msvc@0.10.5': + "@bruits/satteri-win32-x64-msvc@0.10.5": optional: true - '@capsizecss/unpack@4.0.1': + "@capsizecss/unpack@4.0.1": dependencies: fontkitten: 1.0.3 - '@clack/core@1.5.1': + "@clack/core@1.5.1": dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.8.1': + "@clack/prompts@1.8.1": dependencies: - '@clack/core': 1.5.1 + "@clack/core": 1.5.1 fast-string-width: 3.0.2 fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@codemirror/commands@6.11.1': + "@codemirror/commands@6.11.1": dependencies: - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.6 - '@codemirror/view': 6.43.13 - '@lezer/common': 1.5.1 + "@codemirror/language": 6.12.4 + "@codemirror/state": 6.7.6 + "@codemirror/view": 6.43.13 + "@lezer/common": 1.5.1 - '@codemirror/language@6.12.4': + "@codemirror/language@6.12.4": dependencies: - '@codemirror/state': 6.7.6 - '@codemirror/view': 6.43.13 - '@lezer/common': 1.5.1 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + "@codemirror/state": 6.7.6 + "@codemirror/view": 6.43.13 + "@lezer/common": 1.5.1 + "@lezer/highlight": 1.2.3 + "@lezer/lr": 1.4.8 style-mod: 4.1.3 - '@codemirror/legacy-modes@6.5.4': + "@codemirror/legacy-modes@6.5.4": dependencies: - '@codemirror/language': 6.12.4 + "@codemirror/language": 6.12.4 - '@codemirror/state@6.7.6': + "@codemirror/state@6.7.6": dependencies: - '@marijn/find-cluster-break': 1.0.2 + "@marijn/find-cluster-break": 1.0.2 - '@codemirror/view@6.43.13': + "@codemirror/view@6.43.13": dependencies: - '@codemirror/state': 6.7.6 + "@codemirror/state": 6.7.6 crelt: 1.0.6 style-mod: 4.1.3 w3c-keyname: 2.2.8 - '@ctrl/tinycolor@4.2.1': {} + "@ctrl/tinycolor@4.2.1": {} - '@emmetio/abbreviation@2.3.3': + "@emmetio/abbreviation@2.3.3": dependencies: - '@emmetio/scanner': 1.0.4 + "@emmetio/scanner": 1.0.4 - '@emmetio/css-abbreviation@2.1.8': + "@emmetio/css-abbreviation@2.1.8": dependencies: - '@emmetio/scanner': 1.0.4 + "@emmetio/scanner": 1.0.4 - '@emmetio/css-parser@0.4.1': + "@emmetio/css-parser@0.4.1": dependencies: - '@emmetio/stream-reader': 2.2.0 - '@emmetio/stream-reader-utils': 0.1.0 + "@emmetio/stream-reader": 2.2.0 + "@emmetio/stream-reader-utils": 0.1.0 - '@emmetio/html-matcher@1.3.0': + "@emmetio/html-matcher@1.3.0": dependencies: - '@emmetio/scanner': 1.0.4 + "@emmetio/scanner": 1.0.4 - '@emmetio/scanner@1.0.4': {} + "@emmetio/scanner@1.0.4": {} - '@emmetio/stream-reader-utils@0.1.0': {} + "@emmetio/stream-reader-utils@0.1.0": {} - '@emmetio/stream-reader@2.2.0': {} + "@emmetio/stream-reader@2.2.0": {} - '@emnapi/core@1.11.1': + "@emnapi/core@1.11.1": dependencies: - '@emnapi/wasi-threads': 1.2.2 + "@emnapi/wasi-threads": 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/core@1.11.3': + "@emnapi/core@1.11.3": dependencies: - '@emnapi/wasi-threads': 1.2.3 + "@emnapi/wasi-threads": 1.2.3 tslib: 2.8.1 - '@emnapi/runtime@1.11.1': + "@emnapi/runtime@1.11.1": dependencies: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.3': + "@emnapi/runtime@1.11.3": dependencies: tslib: 2.8.1 - '@emnapi/wasi-threads@1.2.2': + "@emnapi/wasi-threads@1.2.2": dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.3': + "@emnapi/wasi-threads@1.2.3": dependencies: tslib: 2.8.1 - '@esbuild/aix-ppc64@0.28.2': + "@esbuild/aix-ppc64@0.28.2": optional: true - '@esbuild/android-arm64@0.28.2': + "@esbuild/android-arm64@0.28.2": optional: true - '@esbuild/android-arm@0.28.2': + "@esbuild/android-arm@0.28.2": optional: true - '@esbuild/android-x64@0.28.2': + "@esbuild/android-x64@0.28.2": optional: true - '@esbuild/darwin-arm64@0.28.2': + "@esbuild/darwin-arm64@0.28.2": optional: true - '@esbuild/darwin-x64@0.28.2': + "@esbuild/darwin-x64@0.28.2": optional: true - '@esbuild/freebsd-arm64@0.28.2': + "@esbuild/freebsd-arm64@0.28.2": optional: true - '@esbuild/freebsd-x64@0.28.2': + "@esbuild/freebsd-x64@0.28.2": optional: true - '@esbuild/linux-arm64@0.28.2': + "@esbuild/linux-arm64@0.28.2": optional: true - '@esbuild/linux-arm@0.28.2': + "@esbuild/linux-arm@0.28.2": optional: true - '@esbuild/linux-ia32@0.28.2': + "@esbuild/linux-ia32@0.28.2": optional: true - '@esbuild/linux-loong64@0.28.2': + "@esbuild/linux-loong64@0.28.2": optional: true - '@esbuild/linux-mips64el@0.28.2': + "@esbuild/linux-mips64el@0.28.2": optional: true - '@esbuild/linux-ppc64@0.28.2': + "@esbuild/linux-ppc64@0.28.2": optional: true - '@esbuild/linux-riscv64@0.28.2': + "@esbuild/linux-riscv64@0.28.2": optional: true - '@esbuild/linux-s390x@0.28.2': + "@esbuild/linux-s390x@0.28.2": optional: true - '@esbuild/linux-x64@0.28.2': + "@esbuild/linux-x64@0.28.2": optional: true - '@esbuild/netbsd-arm64@0.28.2': + "@esbuild/netbsd-arm64@0.28.2": optional: true - '@esbuild/netbsd-x64@0.28.2': + "@esbuild/netbsd-x64@0.28.2": optional: true - '@esbuild/openbsd-arm64@0.28.2': + "@esbuild/openbsd-arm64@0.28.2": optional: true - '@esbuild/openbsd-x64@0.28.2': + "@esbuild/openbsd-x64@0.28.2": optional: true - '@esbuild/openharmony-arm64@0.28.2': + "@esbuild/openharmony-arm64@0.28.2": optional: true - '@esbuild/sunos-x64@0.28.2': + "@esbuild/sunos-x64@0.28.2": optional: true - '@esbuild/win32-arm64@0.28.2': + "@esbuild/win32-arm64@0.28.2": optional: true - '@esbuild/win32-ia32@0.28.2': + "@esbuild/win32-ia32@0.28.2": optional: true - '@esbuild/win32-x64@0.28.2': + "@esbuild/win32-x64@0.28.2": optional: true - '@expressive-code/core@0.44.2': + "@expressive-code/core@0.44.2": dependencies: - '@ctrl/tinycolor': 4.2.1 + "@ctrl/tinycolor": 4.2.1 hast-util-select: 6.0.4 hast-util-to-html: 9.0.5 hast-util-to-text: 4.0.2 @@ -3176,374 +5077,376 @@ snapshots: unist-util-visit: 5.1.0 unist-util-visit-parents: 6.0.2 - '@expressive-code/plugin-frames@0.44.2': + "@expressive-code/plugin-frames@0.44.2": dependencies: - '@expressive-code/core': 0.44.2 + "@expressive-code/core": 0.44.2 - '@expressive-code/plugin-shiki@0.44.2': + "@expressive-code/plugin-shiki@0.44.2": dependencies: - '@expressive-code/core': 0.44.2 + "@expressive-code/core": 0.44.2 shiki: 4.5.0 - '@expressive-code/plugin-text-markers@0.44.2': + "@expressive-code/plugin-text-markers@0.44.2": dependencies: - '@expressive-code/core': 0.44.2 + "@expressive-code/core": 0.44.2 - '@fontsource/noto-serif-sc@5.3.0': {} + "@fontsource/noto-serif-sc@5.3.0": {} - '@fontsource/noto-serif@5.3.0': {} + "@fontsource/noto-serif@5.3.0": {} - '@img/colour@1.1.0': + "@img/colour@1.1.0": optional: true - '@img/sharp-darwin-arm64@0.35.5': + "@img/sharp-darwin-arm64@0.35.5": optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.4 + "@img/sharp-libvips-darwin-arm64": 1.3.4 optional: true - '@img/sharp-darwin-x64@0.35.5': + "@img/sharp-darwin-x64@0.35.5": optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.4 + "@img/sharp-libvips-darwin-x64": 1.3.4 optional: true - '@img/sharp-freebsd-wasm32@0.35.5': + "@img/sharp-freebsd-wasm32@0.35.5": dependencies: - '@img/sharp-wasm32': 0.35.5 + "@img/sharp-wasm32": 0.35.5 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.4': + "@img/sharp-libvips-darwin-arm64@1.3.4": optional: true - '@img/sharp-libvips-darwin-x64@1.3.4': + "@img/sharp-libvips-darwin-x64@1.3.4": optional: true - '@img/sharp-libvips-linux-arm64@1.3.4': + "@img/sharp-libvips-linux-arm64@1.3.4": optional: true - '@img/sharp-libvips-linux-arm@1.3.4': + "@img/sharp-libvips-linux-arm@1.3.4": optional: true - '@img/sharp-libvips-linux-ppc64@1.3.4': + "@img/sharp-libvips-linux-ppc64@1.3.4": optional: true - '@img/sharp-libvips-linux-riscv64@1.3.4': + "@img/sharp-libvips-linux-riscv64@1.3.4": optional: true - '@img/sharp-libvips-linux-s390x@1.3.4': + "@img/sharp-libvips-linux-s390x@1.3.4": optional: true - '@img/sharp-libvips-linux-x64@1.3.4': + "@img/sharp-libvips-linux-x64@1.3.4": optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + "@img/sharp-libvips-linuxmusl-arm64@1.3.4": optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.4': + "@img/sharp-libvips-linuxmusl-x64@1.3.4": optional: true - '@img/sharp-linux-arm64@0.35.5': + "@img/sharp-linux-arm64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.4 + "@img/sharp-libvips-linux-arm64": 1.3.4 optional: true - '@img/sharp-linux-arm@0.35.5': + "@img/sharp-linux-arm@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.4 + "@img/sharp-libvips-linux-arm": 1.3.4 optional: true - '@img/sharp-linux-ppc64@0.35.5': + "@img/sharp-linux-ppc64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.4 + "@img/sharp-libvips-linux-ppc64": 1.3.4 optional: true - '@img/sharp-linux-riscv64@0.35.5': + "@img/sharp-linux-riscv64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.4 + "@img/sharp-libvips-linux-riscv64": 1.3.4 optional: true - '@img/sharp-linux-s390x@0.35.5': + "@img/sharp-linux-s390x@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.4 + "@img/sharp-libvips-linux-s390x": 1.3.4 optional: true - '@img/sharp-linux-x64@0.35.5': + "@img/sharp-linux-x64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.4 + "@img/sharp-libvips-linux-x64": 1.3.4 optional: true - '@img/sharp-linuxmusl-arm64@0.35.5': + "@img/sharp-linuxmusl-arm64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.3.4 optional: true - '@img/sharp-linuxmusl-x64@0.35.5': + "@img/sharp-linuxmusl-x64@0.35.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + "@img/sharp-libvips-linuxmusl-x64": 1.3.4 optional: true - '@img/sharp-wasm32@0.35.5': + "@img/sharp-wasm32@0.35.5": dependencies: - '@emnapi/runtime': 1.11.3 + "@emnapi/runtime": 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.5': + "@img/sharp-webcontainers-wasm32@0.35.5": dependencies: - '@img/sharp-wasm32': 0.35.5 + "@img/sharp-wasm32": 0.35.5 optional: true - '@img/sharp-win32-arm64@0.35.5': + "@img/sharp-win32-arm64@0.35.5": optional: true - '@img/sharp-win32-ia32@0.35.5': + "@img/sharp-win32-ia32@0.35.5": optional: true - '@img/sharp-win32-x64@0.35.5': + "@img/sharp-win32-x64@0.35.5": optional: true - '@jridgewell/gen-mapping@0.3.13': + "@jridgewell/gen-mapping@0.3.13": dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/sourcemap-codec": 1.6.0 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/remapping@2.3.5': + "@jridgewell/remapping@2.3.5": dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/sourcemap-codec@1.6.0': {} + "@jridgewell/sourcemap-codec@1.6.0": {} - '@jridgewell/trace-mapping@0.3.31': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.6.0 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.6.0 - '@lezer/common@1.5.1': {} + "@lezer/common@1.5.1": {} - '@lezer/highlight@1.2.3': + "@lezer/highlight@1.2.3": dependencies: - '@lezer/common': 1.5.1 + "@lezer/common": 1.5.1 - '@lezer/highlight@1.2.5': + "@lezer/highlight@1.2.5": dependencies: - '@lezer/common': 1.5.1 + "@lezer/common": 1.5.1 - '@lezer/lr@1.4.8': + "@lezer/lr@1.4.8": dependencies: - '@lezer/common': 1.5.1 + "@lezer/common": 1.5.1 - '@marijn/find-cluster-break@1.0.2': {} + "@marijn/find-cluster-break@1.0.2": {} - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + "@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)": dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.4 + "@emnapi/core": 1.11.1 + "@emnapi/runtime": 1.11.1 + "@tybys/wasm-util": 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + "@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)": dependencies: - '@emnapi/core': 1.11.3 - '@emnapi/runtime': 1.11.3 - '@tybys/wasm-util': 0.10.4 + "@emnapi/core": 1.11.3 + "@emnapi/runtime": 1.11.3 + "@tybys/wasm-util": 0.10.4 - '@oslojs/encoding@1.1.0': {} + "@oslojs/encoding@1.1.0": {} - '@oxc-project/types@0.152.0': {} + "@oxc-project/types@0.152.0": {} - '@pagefind/darwin-arm64@1.5.2': + "@pagefind/darwin-arm64@1.5.2": optional: true - '@pagefind/darwin-x64@1.5.2': + "@pagefind/darwin-x64@1.5.2": optional: true - '@pagefind/default-ui@1.5.2': {} + "@pagefind/default-ui@1.5.2": {} - '@pagefind/freebsd-x64@1.5.2': + "@pagefind/freebsd-x64@1.5.2": optional: true - '@pagefind/linux-arm64@1.5.2': + "@pagefind/linux-arm64@1.5.2": optional: true - '@pagefind/linux-x64@1.5.2': + "@pagefind/linux-x64@1.5.2": optional: true - '@pagefind/windows-arm64@1.5.2': + "@pagefind/windows-arm64@1.5.2": optional: true - '@pagefind/windows-x64@1.5.2': + "@pagefind/windows-x64@1.5.2": optional: true - '@polka/url@1.0.0-next.29': {} + "@polka/url@1.0.0-next.29": {} + + "@prettier/parse-srcset@3.1.0": {} - '@rolldown/binding-android-arm-eabi@1.2.12': + "@rolldown/binding-android-arm-eabi@1.2.12": optional: true - '@rolldown/binding-android-arm64@1.2.12': + "@rolldown/binding-android-arm64@1.2.12": optional: true - '@rolldown/binding-darwin-arm64@1.2.12': + "@rolldown/binding-darwin-arm64@1.2.12": optional: true - '@rolldown/binding-darwin-x64@1.2.12': + "@rolldown/binding-darwin-x64@1.2.12": optional: true - '@rolldown/binding-freebsd-x64@1.2.12': + "@rolldown/binding-freebsd-x64@1.2.12": optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.12': + "@rolldown/binding-linux-arm-gnueabihf@1.2.12": optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.12': + "@rolldown/binding-linux-arm64-gnu@1.2.12": optional: true - '@rolldown/binding-linux-arm64-musl@1.2.12': + "@rolldown/binding-linux-arm64-musl@1.2.12": optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.12': + "@rolldown/binding-linux-ppc64-gnu@1.2.12": optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.12': + "@rolldown/binding-linux-s390x-gnu@1.2.12": optional: true - '@rolldown/binding-linux-x64-gnu@1.2.12': + "@rolldown/binding-linux-x64-gnu@1.2.12": optional: true - '@rolldown/binding-linux-x64-musl@1.2.12': + "@rolldown/binding-linux-x64-musl@1.2.12": optional: true - '@rolldown/binding-openharmony-arm64@1.2.12': + "@rolldown/binding-openharmony-arm64@1.2.12": optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.12': + "@rolldown/binding-win32-arm64-msvc@1.2.12": optional: true - '@rolldown/binding-win32-x64-msvc@1.2.12': + "@rolldown/binding-win32-x64-msvc@1.2.12": optional: true - '@rolldown/pluginutils@1.0.1': {} + "@rolldown/pluginutils@1.0.1": {} - '@shikijs/core@4.5.0': + "@shikijs/core@4.5.0": dependencies: - '@shikijs/primitive': 4.5.0 - '@shikijs/types': 4.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 + "@shikijs/primitive": 4.5.0 + "@shikijs/types": 4.5.0 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.5 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@4.5.0': + "@shikijs/engine-javascript@4.5.0": dependencies: - '@shikijs/types': 4.5.0 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/types": 4.5.0 + "@shikijs/vscode-textmate": 10.0.2 oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@4.5.0': + "@shikijs/engine-oniguruma@4.5.0": dependencies: - '@shikijs/types': 4.5.0 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/types": 4.5.0 + "@shikijs/vscode-textmate": 10.0.2 - '@shikijs/langs@4.5.0': + "@shikijs/langs@4.5.0": dependencies: - '@shikijs/types': 4.5.0 + "@shikijs/types": 4.5.0 - '@shikijs/primitive@4.5.0': + "@shikijs/primitive@4.5.0": dependencies: - '@shikijs/types': 4.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 + "@shikijs/types": 4.5.0 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.5 - '@shikijs/themes@4.5.0': + "@shikijs/themes@4.5.0": dependencies: - '@shikijs/types': 4.5.0 + "@shikijs/types": 4.5.0 - '@shikijs/types@4.5.0': + "@shikijs/types@4.5.0": dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.5 - '@shikijs/vscode-textmate@10.0.2': {} + "@shikijs/vscode-textmate@10.0.2": {} - '@tybys/wasm-util@0.10.4': + "@tybys/wasm-util@0.10.4": dependencies: tslib: 2.8.1 - '@types/debug@4.1.13': + "@types/debug@4.1.13": dependencies: - '@types/ms': 2.1.0 + "@types/ms": 2.1.0 - '@types/estree-jsx@1.0.5': + "@types/estree-jsx@1.0.5": dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 - '@types/estree@1.0.8': {} + "@types/estree@1.0.8": {} - '@types/hast@3.0.5': + "@types/hast@3.0.5": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - '@types/js-yaml@4.0.9': {} + "@types/js-yaml@4.0.9": {} - '@types/mdast@4.0.4': + "@types/mdast@4.0.4": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - '@types/ms@2.1.0': {} + "@types/ms@2.1.0": {} - '@types/nlcst@2.0.3': + "@types/nlcst@2.0.3": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - '@types/node@24.19.1': + "@types/node@24.19.1": dependencies: undici-types: 7.24.6 - '@types/sax@1.2.7': + "@types/sax@1.2.7": dependencies: - '@types/node': 24.19.1 + "@types/node": 24.19.1 - '@types/unist@2.0.11': {} + "@types/unist@2.0.11": {} - '@types/unist@3.0.3': {} + "@types/unist@3.0.3": {} - '@ungap/structured-clone@1.3.0': {} + "@ungap/structured-clone@1.3.0": {} - '@vitejs/plugin-vue-jsx@5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))': + "@vitejs/plugin-vue-jsx@5.1.6(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))": dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.1 - '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) + "@babel/core": 7.29.7 + "@babel/plugin-syntax-typescript": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-transform-typescript": 7.29.9(@babel/core@7.29.7) + "@rolldown/pluginutils": 1.0.1 + "@vue/babel-plugin-jsx": 2.0.1(@babel/core@7.29.7) vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) vue: 3.5.43(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))': + "@vitejs/plugin-vue@6.0.9(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3))": dependencies: - '@rolldown/pluginutils': 1.0.1 + "@rolldown/pluginutils": 1.0.1 vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) vue: 3.5.43(typescript@6.0.3) - '@volar/kit@2.4.28(typescript@6.0.3)': + "@volar/kit@2.4.28(typescript@6.0.3)": dependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) - '@volar/typescript': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) + "@volar/typescript": 2.4.28(typescript@6.0.3) typesafe-path: 0.2.2 typescript: 6.0.3 vscode-languageserver-textdocument: 1.0.15 vscode-uri: 3.2.0 - '@volar/language-core@2.4.28': + "@volar/language-core@2.4.28": dependencies: - '@volar/source-map': 2.4.28 + "@volar/source-map": 2.4.28 - '@volar/language-server@2.4.28(typescript@6.0.3)': + "@volar/language-server@2.4.28(typescript@6.0.3)": dependencies: - '@volar/language-core': 2.4.28 - '@volar/language-service': 2.4.28(typescript@6.0.3) - '@volar/typescript': 2.4.28(typescript@6.0.3) + "@volar/language-core": 2.4.28 + "@volar/language-service": 2.4.28(typescript@6.0.3) + "@volar/typescript": 2.4.28(typescript@6.0.3) path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -3553,26 +5456,26 @@ snapshots: optionalDependencies: typescript: 6.0.3 - '@volar/language-service@2.4.28(typescript@6.0.3)': + "@volar/language-service@2.4.28(typescript@6.0.3)": dependencies: - '@volar/language-core': 2.4.28 + "@volar/language-core": 2.4.28 vscode-languageserver-protocol: 3.18.4 vscode-languageserver-textdocument: 1.0.15 vscode-uri: 3.2.0 optionalDependencies: typescript: 6.0.3 - '@volar/source-map@2.4.28': {} + "@volar/source-map@2.4.28": {} - '@volar/typescript@2.4.28(typescript@6.0.3)': + "@volar/typescript@2.4.28(typescript@6.0.3)": dependencies: - '@volar/language-core': 2.4.28 + "@volar/language-core": 2.4.28 path-browserify: 1.0.1 vscode-uri: 3.2.0 optionalDependencies: typescript: 6.0.3 - '@vscode/emmet-helper@2.11.0': + "@vscode/emmet-helper@2.11.0": dependencies: emmet: 2.4.11 jsonc-parser: 2.3.1 @@ -3580,134 +5483,134 @@ snapshots: vscode-languageserver-types: 3.18.4 vscode-uri: 3.2.0 - '@vscode/l10n@0.0.18': {} + "@vscode/l10n@0.0.18": {} - '@vue/babel-helper-vue-transform-on@1.5.0': {} + "@vue/babel-helper-vue-transform-on@1.5.0": {} - '@vue/babel-helper-vue-transform-on@2.0.1': {} + "@vue/babel-helper-vue-transform-on@2.0.1": {} - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.7)': + "@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.7)": dependencies: - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - '@vue/babel-helper-vue-transform-on': 1.5.0 - '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.7) - '@vue/shared': 3.5.43 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-syntax-jsx": 7.29.7(@babel/core@7.29.7) + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 + "@vue/babel-helper-vue-transform-on": 1.5.0 + "@vue/babel-plugin-resolve-type": 1.5.0(@babel/core@7.29.7) + "@vue/shared": 3.5.43 optionalDependencies: - '@babel/core': 7.29.7 + "@babel/core": 7.29.7 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)': - dependencies: - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - '@vue/babel-helper-vue-transform-on': 2.0.1 - '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.7) - '@vue/shared': 3.5.43 + "@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)": + dependencies: + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-syntax-jsx": 7.29.7(@babel/core@7.29.7) + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.8 + "@babel/types": 7.29.8 + "@vue/babel-helper-vue-transform-on": 2.0.1 + "@vue/babel-plugin-resolve-type": 2.0.1(@babel/core@7.29.7) + "@vue/shared": 3.5.43 optionalDependencies: - '@babel/core': 7.29.7 + "@babel/core": 7.29.7 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.7)': + "@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.7)": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/parser': 7.29.9 - '@vue/compiler-sfc': 3.5.43 + "@babel/code-frame": 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/parser": 7.29.9 + "@vue/compiler-sfc": 3.5.43 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)': + "@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/parser': 7.29.9 - '@vue/compiler-sfc': 3.5.43 + "@babel/code-frame": 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/parser": 7.29.9 + "@vue/compiler-sfc": 3.5.43 transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.43': + "@vue/compiler-core@3.5.43": dependencies: - '@babel/parser': 7.29.9 - '@vue/shared': 3.5.43 + "@babel/parser": 7.29.9 + "@vue/shared": 3.5.43 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.43': + "@vue/compiler-dom@3.5.43": dependencies: - '@vue/compiler-core': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/compiler-core": 3.5.43 + "@vue/shared": 3.5.43 - '@vue/compiler-sfc@3.5.43': + "@vue/compiler-sfc@3.5.43": dependencies: - '@babel/parser': 7.29.9 - '@vue/compiler-core': 3.5.43 - '@vue/compiler-dom': 3.5.43 - '@vue/compiler-ssr': 3.5.43 - '@vue/shared': 3.5.43 + "@babel/parser": 7.29.9 + "@vue/compiler-core": 3.5.43 + "@vue/compiler-dom": 3.5.43 + "@vue/compiler-ssr": 3.5.43 + "@vue/shared": 3.5.43 estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.28 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.43': + "@vue/compiler-ssr@3.5.43": dependencies: - '@vue/compiler-dom': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/compiler-dom": 3.5.43 + "@vue/shared": 3.5.43 - '@vue/devtools-core@8.2.1(vue@3.5.43(typescript@6.0.3))': + "@vue/devtools-core@8.2.1(vue@3.5.43(typescript@6.0.3))": dependencies: - '@vue/devtools-kit': 8.2.1 - '@vue/devtools-shared': 8.2.1 + "@vue/devtools-kit": 8.2.1 + "@vue/devtools-shared": 8.2.1 vue: 3.5.43(typescript@6.0.3) - '@vue/devtools-kit@8.2.1': + "@vue/devtools-kit@8.2.1": dependencies: - '@vue/devtools-shared': 8.2.1 + "@vue/devtools-shared": 8.2.1 birpc: 2.9.0 hookable: 5.5.3 perfect-debounce: 2.1.0 - '@vue/devtools-shared@8.2.1': {} + "@vue/devtools-shared@8.2.1": {} - '@vue/reactivity@3.5.43': + "@vue/reactivity@3.5.43": dependencies: - '@vue/shared': 3.5.43 + "@vue/shared": 3.5.43 - '@vue/runtime-core@3.5.43': + "@vue/runtime-core@3.5.43": dependencies: - '@vue/reactivity': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/reactivity": 3.5.43 + "@vue/shared": 3.5.43 - '@vue/runtime-dom@3.5.43': + "@vue/runtime-dom@3.5.43": dependencies: - '@vue/reactivity': 3.5.43 - '@vue/runtime-core': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/reactivity": 3.5.43 + "@vue/runtime-core": 3.5.43 + "@vue/shared": 3.5.43 csstype: 3.2.3 - '@vue/server-renderer@3.5.43': + "@vue/server-renderer@3.5.43": dependencies: - '@vue/compiler-ssr': 3.5.43 - '@vue/runtime-dom': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/compiler-ssr": 3.5.43 + "@vue/runtime-dom": 3.5.43 + "@vue/shared": 3.5.43 - '@vue/shared@3.5.43': {} + "@vue/shared@3.5.43": {} ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: @@ -3753,13 +5656,13 @@ snapshots: astro@7.3.5(@types/node@24.19.1)(yaml@2.9.1): dependencies: - '@astrojs/compiler-rs': 0.5.1 - '@astrojs/internal-helpers': 0.11.0 - '@astrojs/markdown-satteri': 0.4.2 - '@astrojs/telemetry': 3.3.3 - '@capsizecss/unpack': 4.0.1 - '@clack/prompts': 1.8.1 - '@oslojs/encoding': 1.1.0 + "@astrojs/compiler-rs": 0.5.1 + "@astrojs/internal-helpers": 0.11.0 + "@astrojs/markdown-satteri": 0.4.2 + "@astrojs/telemetry": 3.3.3 + "@capsizecss/unpack": 4.0.1 + "@clack/prompts": 1.8.1 + "@oslojs/encoding": 1.1.0 am-i-vibing: 0.4.0 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -3809,22 +5712,22 @@ snapshots: optionalDependencies: sharp: 0.35.5(@types/node@24.19.1) transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@types/node' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vitejs/devtools' + - "@azure/app-configuration" + - "@azure/cosmos" + - "@azure/data-tables" + - "@azure/identity" + - "@azure/keyvault-secrets" + - "@azure/storage-blob" + - "@capacitor/preferences" + - "@deno/kv" + - "@netlify/blobs" + - "@planetscale/database" + - "@types/node" + - "@upstash/redis" + - "@vercel/blob" + - "@vercel/functions" + - "@vercel/kv" + - "@vitejs/devtools" - aws4fetch - db0 - idb-keyval @@ -4009,8 +5912,8 @@ snapshots: emmet@2.4.11: dependencies: - '@emmetio/abbreviation': 2.3.3 - '@emmetio/css-abbreviation': 2.1.8 + "@emmetio/abbreviation": 2.3.3 + "@emmetio/css-abbreviation": 2.1.8 emoji-regex@10.6.0: {} @@ -4024,32 +5927,32 @@ snapshots: esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.2 - '@esbuild/android-arm': 0.28.2 - '@esbuild/android-arm64': 0.28.2 - '@esbuild/android-x64': 0.28.2 - '@esbuild/darwin-arm64': 0.28.2 - '@esbuild/darwin-x64': 0.28.2 - '@esbuild/freebsd-arm64': 0.28.2 - '@esbuild/freebsd-x64': 0.28.2 - '@esbuild/linux-arm': 0.28.2 - '@esbuild/linux-arm64': 0.28.2 - '@esbuild/linux-ia32': 0.28.2 - '@esbuild/linux-loong64': 0.28.2 - '@esbuild/linux-mips64el': 0.28.2 - '@esbuild/linux-ppc64': 0.28.2 - '@esbuild/linux-riscv64': 0.28.2 - '@esbuild/linux-s390x': 0.28.2 - '@esbuild/linux-x64': 0.28.2 - '@esbuild/netbsd-arm64': 0.28.2 - '@esbuild/netbsd-x64': 0.28.2 - '@esbuild/openbsd-arm64': 0.28.2 - '@esbuild/openbsd-x64': 0.28.2 - '@esbuild/openharmony-arm64': 0.28.2 - '@esbuild/sunos-x64': 0.28.2 - '@esbuild/win32-arm64': 0.28.2 - '@esbuild/win32-ia32': 0.28.2 - '@esbuild/win32-x64': 0.28.2 + "@esbuild/aix-ppc64": 0.28.2 + "@esbuild/android-arm": 0.28.2 + "@esbuild/android-arm64": 0.28.2 + "@esbuild/android-x64": 0.28.2 + "@esbuild/darwin-arm64": 0.28.2 + "@esbuild/darwin-x64": 0.28.2 + "@esbuild/freebsd-arm64": 0.28.2 + "@esbuild/freebsd-x64": 0.28.2 + "@esbuild/linux-arm": 0.28.2 + "@esbuild/linux-arm64": 0.28.2 + "@esbuild/linux-ia32": 0.28.2 + "@esbuild/linux-loong64": 0.28.2 + "@esbuild/linux-mips64el": 0.28.2 + "@esbuild/linux-ppc64": 0.28.2 + "@esbuild/linux-riscv64": 0.28.2 + "@esbuild/linux-s390x": 0.28.2 + "@esbuild/linux-x64": 0.28.2 + "@esbuild/netbsd-arm64": 0.28.2 + "@esbuild/netbsd-x64": 0.28.2 + "@esbuild/openbsd-arm64": 0.28.2 + "@esbuild/openbsd-x64": 0.28.2 + "@esbuild/openharmony-arm64": 0.28.2 + "@esbuild/sunos-x64": 0.28.2 + "@esbuild/win32-arm64": 0.28.2 + "@esbuild/win32-ia32": 0.28.2 + "@esbuild/win32-x64": 0.28.2 escalade@3.2.0: {} @@ -4059,10 +5962,10 @@ snapshots: expressive-code@0.44.2: dependencies: - '@expressive-code/core': 0.44.2 - '@expressive-code/plugin-frames': 0.44.2 - '@expressive-code/plugin-shiki': 0.44.2 - '@expressive-code/plugin-text-markers': 0.44.2 + "@expressive-code/core": 0.44.2 + "@expressive-code/plugin-frames": 0.44.2 + "@expressive-code/plugin-shiki": 0.44.2 + "@expressive-code/plugin-text-markers": 0.44.2 extend@3.0.2: {} @@ -4125,12 +6028,12 @@ snapshots: hast-util-embedded@3.0.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-is-element: 3.0.0 hast-util-format@1.1.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-embedded: 3.0.0 hast-util-minify-whitespace: 1.0.1 hast-util-phrasing: 3.0.1 @@ -4140,19 +6043,19 @@ snapshots: hast-util-has-property@3.0.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-is-body-ok-link@3.0.1: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-minify-whitespace@1.0.1: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 @@ -4160,11 +6063,11 @@ snapshots: hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-phrasing@3.0.1: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-embedded: 3.0.0 hast-util-has-property: 3.0.0 hast-util-is-body-ok-link: 3.0.1 @@ -4172,8 +6075,8 @@ snapshots: hast-util-select@6.0.4: dependencies: - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 + "@types/hast": 3.0.5 + "@types/unist": 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 css-selector-parser: 3.3.0 @@ -4190,8 +6093,8 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 + "@types/hast": 3.0.5 + "@types/unist": 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 @@ -4204,22 +6107,22 @@ snapshots: hast-util-to-string@3.0.1: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hast-util-to-text@4.0.2: dependencies: - '@types/hast': 3.0.5 - '@types/unist': 3.0.3 + "@types/hast": 3.0.5 + "@types/unist": 3.0.3 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 hastscript@9.0.1: dependencies: - '@types/hast': 3.0.5 + "@types/hast": 3.0.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 7.1.0 @@ -4349,22 +6252,22 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 + "@jridgewell/sourcemap-codec": 1.6.0 magic-string@1.4.2: dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 + "@jridgewell/sourcemap-codec": 1.6.0 magicast@0.5.5: dependencies: - '@babel/parser': 7.29.9 - '@babel/types': 7.29.8 + "@babel/parser": 7.29.9 + "@babel/types": 7.29.8 source-map-js: 1.2.1 mdast-util-directive@3.1.1: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.1.0 @@ -4378,8 +6281,8 @@ snapshots: mdast-util-from-markdown@2.1.0: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -4395,14 +6298,14 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 unist-util-is: 6.0.1 mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + "@types/hast": 3.0.5 + "@types/mdast": 4.0.4 + "@ungap/structured-clone": 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -4412,8 +6315,8 @@ snapshots: mdast-util-to-markdown@2.2.0: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 @@ -4426,7 +6329,7 @@ snapshots: mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdn-data@2.0.28: {} @@ -4560,7 +6463,7 @@ snapshots: micromark@4.0.3: dependencies: - '@types/debug': 4.1.13 + "@types/debug": 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 @@ -4593,7 +6496,7 @@ snapshots: nlcst-to-string@4.0.0: dependencies: - '@types/nlcst': 2.0.3 + "@types/nlcst": 2.0.3 node-fetch-native@1.6.7: {} @@ -4651,17 +6554,17 @@ snapshots: pagefind@1.5.2: optionalDependencies: - '@pagefind/darwin-arm64': 1.5.2 - '@pagefind/darwin-x64': 1.5.2 - '@pagefind/freebsd-x64': 1.5.2 - '@pagefind/linux-arm64': 1.5.2 - '@pagefind/linux-x64': 1.5.2 - '@pagefind/windows-arm64': 1.5.2 - '@pagefind/windows-x64': 1.5.2 + "@pagefind/darwin-arm64": 1.5.2 + "@pagefind/darwin-x64": 1.5.2 + "@pagefind/freebsd-x64": 1.5.2 + "@pagefind/linux-arm64": 1.5.2 + "@pagefind/linux-x64": 1.5.2 + "@pagefind/windows-arm64": 1.5.2 + "@pagefind/windows-x64": 1.5.2 parse-entities@4.0.2: dependencies: - '@types/unist': 2.0.11 + "@types/unist": 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.3.0 @@ -4701,6 +6604,16 @@ snapshots: powershell-utils@0.2.1: {} + prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9): + dependencies: + "@astrojs/compiler-rs": 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + "@prettier/parse-srcset": 3.1.0 + prettier: 3.9.9 + sass-formatter: 0.8.0 + transitivePeerDependencies: + - "@emnapi/core" + - "@emnapi/runtime" + prettier@3.9.9: {} prismjs@1.30.0: {} @@ -4731,7 +6644,7 @@ snapshots: remark-directive@4.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-directive: 3.1.1 micromark-extension-directive: 4.0.0 unified: 11.0.5 @@ -4748,49 +6661,55 @@ snapshots: retext-smartypants@6.2.0: dependencies: - '@types/nlcst': 2.0.3 + "@types/nlcst": 2.0.3 nlcst-to-string: 4.0.0 unist-util-visit: 5.1.0 rolldown@1.2.12: dependencies: - '@oxc-project/types': 0.152.0 - '@rolldown/pluginutils': 1.0.1 + "@oxc-project/types": 0.152.0 + "@rolldown/pluginutils": 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.12 - '@rolldown/binding-android-arm64': 1.2.12 - '@rolldown/binding-darwin-arm64': 1.2.12 - '@rolldown/binding-darwin-x64': 1.2.12 - '@rolldown/binding-freebsd-x64': 1.2.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.12 - '@rolldown/binding-linux-arm64-gnu': 1.2.12 - '@rolldown/binding-linux-arm64-musl': 1.2.12 - '@rolldown/binding-linux-ppc64-gnu': 1.2.12 - '@rolldown/binding-linux-s390x-gnu': 1.2.12 - '@rolldown/binding-linux-x64-gnu': 1.2.12 - '@rolldown/binding-linux-x64-musl': 1.2.12 - '@rolldown/binding-openharmony-arm64': 1.2.12 - '@rolldown/binding-win32-arm64-msvc': 1.2.12 - '@rolldown/binding-win32-x64-msvc': 1.2.12 + "@rolldown/binding-android-arm-eabi": 1.2.12 + "@rolldown/binding-android-arm64": 1.2.12 + "@rolldown/binding-darwin-arm64": 1.2.12 + "@rolldown/binding-darwin-x64": 1.2.12 + "@rolldown/binding-freebsd-x64": 1.2.12 + "@rolldown/binding-linux-arm-gnueabihf": 1.2.12 + "@rolldown/binding-linux-arm64-gnu": 1.2.12 + "@rolldown/binding-linux-arm64-musl": 1.2.12 + "@rolldown/binding-linux-ppc64-gnu": 1.2.12 + "@rolldown/binding-linux-s390x-gnu": 1.2.12 + "@rolldown/binding-linux-x64-gnu": 1.2.12 + "@rolldown/binding-linux-x64-musl": 1.2.12 + "@rolldown/binding-openharmony-arm64": 1.2.12 + "@rolldown/binding-win32-arm64-msvc": 1.2.12 + "@rolldown/binding-win32-x64-msvc": 1.2.12 run-applescript@7.1.0: {} + s.color@0.0.15: {} + + sass-formatter@0.8.0: + dependencies: + suf-log: 2.5.3 + satteri@0.10.5: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.5 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 optionalDependencies: - '@bruits/satteri-darwin-arm64': 0.10.5 - '@bruits/satteri-darwin-x64': 0.10.5 - '@bruits/satteri-linux-arm64-gnu': 0.10.5 - '@bruits/satteri-linux-arm64-musl': 0.10.5 - '@bruits/satteri-linux-x64-gnu': 0.10.5 - '@bruits/satteri-linux-x64-musl': 0.10.5 - '@bruits/satteri-wasm32-wasi': 0.10.5 - '@bruits/satteri-win32-arm64-msvc': 0.10.5 - '@bruits/satteri-win32-x64-msvc': 0.10.5 + "@bruits/satteri-darwin-arm64": 0.10.5 + "@bruits/satteri-darwin-x64": 0.10.5 + "@bruits/satteri-linux-arm64-gnu": 0.10.5 + "@bruits/satteri-linux-arm64-musl": 0.10.5 + "@bruits/satteri-linux-x64-gnu": 0.10.5 + "@bruits/satteri-linux-x64-musl": 0.10.5 + "@bruits/satteri-wasm32-wasi": 0.10.5 + "@bruits/satteri-win32-arm64-msvc": 0.10.5 + "@bruits/satteri-win32-x64-msvc": 0.10.5 sax@1.6.1: {} @@ -4800,52 +6719,52 @@ snapshots: sharp@0.35.5(@types/node@24.19.1): dependencies: - '@img/colour': 1.1.0 + "@img/colour": 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.5 - '@img/sharp-darwin-x64': 0.35.5 - '@img/sharp-freebsd-wasm32': 0.35.5 - '@img/sharp-libvips-darwin-arm64': 1.3.4 - '@img/sharp-libvips-darwin-x64': 1.3.4 - '@img/sharp-libvips-linux-arm': 1.3.4 - '@img/sharp-libvips-linux-arm64': 1.3.4 - '@img/sharp-libvips-linux-ppc64': 1.3.4 - '@img/sharp-libvips-linux-riscv64': 1.3.4 - '@img/sharp-libvips-linux-s390x': 1.3.4 - '@img/sharp-libvips-linux-x64': 1.3.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 - '@img/sharp-libvips-linuxmusl-x64': 1.3.4 - '@img/sharp-linux-arm': 0.35.5 - '@img/sharp-linux-arm64': 0.35.5 - '@img/sharp-linux-ppc64': 0.35.5 - '@img/sharp-linux-riscv64': 0.35.5 - '@img/sharp-linux-s390x': 0.35.5 - '@img/sharp-linux-x64': 0.35.5 - '@img/sharp-linuxmusl-arm64': 0.35.5 - '@img/sharp-linuxmusl-x64': 0.35.5 - '@img/sharp-webcontainers-wasm32': 0.35.5 - '@img/sharp-win32-arm64': 0.35.5 - '@img/sharp-win32-ia32': 0.35.5 - '@img/sharp-win32-x64': 0.35.5 - '@types/node': 24.19.1 + "@img/sharp-darwin-arm64": 0.35.5 + "@img/sharp-darwin-x64": 0.35.5 + "@img/sharp-freebsd-wasm32": 0.35.5 + "@img/sharp-libvips-darwin-arm64": 1.3.4 + "@img/sharp-libvips-darwin-x64": 1.3.4 + "@img/sharp-libvips-linux-arm": 1.3.4 + "@img/sharp-libvips-linux-arm64": 1.3.4 + "@img/sharp-libvips-linux-ppc64": 1.3.4 + "@img/sharp-libvips-linux-riscv64": 1.3.4 + "@img/sharp-libvips-linux-s390x": 1.3.4 + "@img/sharp-libvips-linux-x64": 1.3.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.3.4 + "@img/sharp-libvips-linuxmusl-x64": 1.3.4 + "@img/sharp-linux-arm": 0.35.5 + "@img/sharp-linux-arm64": 0.35.5 + "@img/sharp-linux-ppc64": 0.35.5 + "@img/sharp-linux-riscv64": 0.35.5 + "@img/sharp-linux-s390x": 0.35.5 + "@img/sharp-linux-x64": 0.35.5 + "@img/sharp-linuxmusl-arm64": 0.35.5 + "@img/sharp-linuxmusl-x64": 0.35.5 + "@img/sharp-webcontainers-wasm32": 0.35.5 + "@img/sharp-win32-arm64": 0.35.5 + "@img/sharp-win32-ia32": 0.35.5 + "@img/sharp-win32-x64": 0.35.5 + "@types/node": 24.19.1 optional: true shiki@4.5.0: dependencies: - '@shikijs/core': 4.5.0 - '@shikijs/engine-javascript': 4.5.0 - '@shikijs/engine-oniguruma': 4.5.0 - '@shikijs/langs': 4.5.0 - '@shikijs/themes': 4.5.0 - '@shikijs/types': 4.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 + "@shikijs/core": 4.5.0 + "@shikijs/engine-javascript": 4.5.0 + "@shikijs/engine-oniguruma": 4.5.0 + "@shikijs/langs": 4.5.0 + "@shikijs/themes": 4.5.0 + "@shikijs/types": 4.5.0 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.5 sirv@3.0.2: dependencies: - '@polka/url': 1.0.0-next.29 + "@polka/url": 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 @@ -4853,8 +6772,8 @@ snapshots: sitemap@9.0.1: dependencies: - '@types/node': 24.19.1 - '@types/sax': 1.2.7 + "@types/node": 24.19.1 + "@types/sax": 1.2.7 arg: 5.0.2 sax: 1.6.1 @@ -4886,6 +6805,10 @@ snapshots: style-mod@4.1.3: {} + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + svgo@4.1.0: dependencies: commander: 11.1.0 @@ -4935,7 +6858,7 @@ snapshots: unified@11.0.5: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 @@ -4951,29 +6874,29 @@ snapshots: unist-util-find-after@5.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-is: 6.0.1 unist-util-is@6.0.1: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-visit-parents@6.0.2: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-is: 6.0.1 unist-util-visit@5.1.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 @@ -5007,12 +6930,12 @@ snapshots: vfile-message@4.0.3: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.3: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 vfile-message: 4.0.3 vite-dev-rpc@2.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): @@ -5040,27 +6963,27 @@ snapshots: vite-plugin-vue-devtools@8.2.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1))(vue@3.5.43(typescript@6.0.3)): dependencies: - '@vue/devtools-core': 8.2.1(vue@3.5.43(typescript@6.0.3)) - '@vue/devtools-kit': 8.2.1 - '@vue/devtools-shared': 8.2.1 + "@vue/devtools-core": 8.2.1(vue@3.5.43(typescript@6.0.3)) + "@vue/devtools-kit": 8.2.1 + "@vue/devtools-shared": 8.2.1 sirv: 3.0.2 vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) vite-plugin-inspect: 11.4.1(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) vite-plugin-vue-inspector: 6.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)) vue: 3.5.43(typescript@6.0.3) transitivePeerDependencies: - - '@nuxt/kit' + - "@nuxt/kit" - supports-color vite-plugin-vue-inspector@6.0.0(vite@8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1)): dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.7) - '@vue/compiler-dom': 3.5.43 + "@babel/core": 7.29.7 + "@babel/plugin-proposal-decorators": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-syntax-import-attributes": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.29.7) + "@babel/plugin-transform-typescript": 7.29.9(@babel/core@7.29.7) + "@vue/babel-plugin-jsx": 1.5.0(@babel/core@7.29.7) + "@vue/compiler-dom": 3.5.43 kolorist: 1.8.0 magic-string: 0.30.21 vite: 8.3.2(@types/node@24.19.1)(esbuild@0.28.2)(yaml@2.9.1) @@ -5075,7 +6998,7 @@ snapshots: rolldown: 1.2.12 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.19.1 + "@types/node": 24.19.1 esbuild: 0.28.2 fsevents: 2.3.3 yaml: 2.9.1 @@ -5090,16 +7013,16 @@ snapshots: vscode-languageserver-textdocument: 1.0.15 vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) volar-service-emmet@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: - '@emmetio/css-parser': 0.4.1 - '@emmetio/html-matcher': 1.3.0 - '@vscode/emmet-helper': 2.11.0 + "@emmetio/css-parser": 0.4.1 + "@emmetio/html-matcher": 1.3.0 + "@vscode/emmet-helper": 2.11.0 vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) volar-service-html@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: @@ -5107,20 +7030,20 @@ snapshots: vscode-languageserver-textdocument: 1.0.15 vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) volar-service-prettier@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(prettier@3.9.9): dependencies: vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) prettier: 3.9.9 volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): dependencies: vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) typescript: 6.0.3 volar-service-typescript@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): @@ -5132,7 +7055,7 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) typescript: 6.0.3 volar-service-yaml@0.0.71(@volar/language-service@2.4.28(typescript@6.0.3)): @@ -5140,18 +7063,18 @@ snapshots: vscode-uri: 3.2.0 yaml-language-server: 1.23.0 optionalDependencies: - '@volar/language-service': 2.4.28(typescript@6.0.3) + "@volar/language-service": 2.4.28(typescript@6.0.3) vscode-css-languageservice@6.3.10: dependencies: - '@vscode/l10n': 0.0.18 + "@vscode/l10n": 0.0.18 vscode-languageserver-textdocument: 1.0.15 vscode-languageserver-types: 3.17.5 vscode-uri: 3.2.0 vscode-html-languageservice@5.6.2: dependencies: - '@vscode/l10n': 0.0.18 + "@vscode/l10n": 0.0.18 vscode-languageserver-textdocument: 1.0.15 vscode-languageserver-types: 3.18.4 vscode-uri: 3.2.0 @@ -5194,11 +7117,11 @@ snapshots: vue@3.5.43(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.43 - '@vue/compiler-sfc': 3.5.43 - '@vue/runtime-dom': 3.5.43 - '@vue/server-renderer': 3.5.43 - '@vue/shared': 3.5.43 + "@vue/compiler-dom": 3.5.43 + "@vue/compiler-sfc": 3.5.43 + "@vue/runtime-dom": 3.5.43 + "@vue/server-renderer": 3.5.43 + "@vue/shared": 3.5.43 optionalDependencies: typescript: 6.0.3 @@ -5223,7 +7146,7 @@ snapshots: yaml-language-server@1.23.0: dependencies: - '@vscode/l10n': 0.0.18 + "@vscode/l10n": 0.0.18 ajv: 8.20.0 ajv-draft-04: 1.0.0(ajv@8.20.0) ajv-i18n: 4.2.0(ajv@8.20.0) diff --git a/doc/scripts/check-docs.mjs b/doc/scripts/check-docs.mjs index 0c0a1eb0..96500552 100644 --- a/doc/scripts/check-docs.mjs +++ b/doc/scripts/check-docs.mjs @@ -10,9 +10,16 @@ const translations = Object.fromEntries( ); const englishKeys = Object.keys(translations[locales.root.lang]).sort(); for (const [lang, dictionary] of Object.entries(translations)) { - assert.deepEqual(Object.keys(dictionary).sort(), englishKeys, `Incomplete UI translations: ${lang}`); + assert.deepEqual( + Object.keys(dictionary).sort(), + englishKeys, + `Incomplete UI translations: ${lang}`, + ); for (const [key, value] of Object.entries(dictionary)) { - assert.ok(typeof value === "string" && value.trim(), `Empty UI translation: ${lang} ${key}`); + assert.ok( + typeof value === "string" && value.trim(), + `Empty UI translation: ${lang} ${key}`, + ); } } @@ -20,9 +27,9 @@ const decodeHtml = (text) => text.replace(/&(#x[\da-f]+|#\d+|amp|quot|lt|gt|apos);/gi, (_, entity) => { if (entity[0] === "#") return String.fromCodePoint( - entity[1].toLowerCase() === "x" - ? parseInt(entity.slice(2), 16) - : Number(entity.slice(1)), + entity[1].toLowerCase() === "x" ? + parseInt(entity.slice(2), 16) + : Number(entity.slice(1)), ); return { amp: "&", quot: '"', lt: "<", gt: ">", apos: "'" }[entity]; }); @@ -46,34 +53,75 @@ const docs = files .sort((a, b) => a.order - b.order || a.slug.localeCompare(b.slug)); const localeFor = (file) => - Object.keys(locales).find((locale) => file.startsWith(`${locale}/`)) ?? "root"; + Object.keys(locales).find((locale) => file.startsWith(`${locale}/`)) ?? + "root"; function checkTranslations(html, lang, route) { const dictionary = translations[lang]; - const messages = JSON.parse(decodeHtml(html.match(/data-yue-messages="([^"]+)"/)?.[1] ?? "")); + const messages = JSON.parse( + decodeHtml(html.match(/data-yue-messages="([^"]+)"/)?.[1] ?? ""), + ); for (const [key, value] of Object.entries(dictionary)) { if (key.startsWith("yue.compiler.")) { - assert.equal(messages[key.slice("yue.compiler.".length)], value, `Wrong compiler translation: ${route} ${key}`); + assert.equal( + messages[key.slice("yue.compiler.".length)], + value, + `Wrong compiler translation: ${route} ${key}`, + ); } } - assert.ok(decodeHtml(html).includes(`>${dictionary["yue.try"]}`), `Wrong Try link translation: ${route}`); - assert.ok(decodeHtml(html).includes(`aria-label="${dictionary["yue.compiler.close"]}"`), `Wrong compiler close label: ${route}`); - for (const [, label] of html.matchAll(/]*\bdata-yue-compile(?=[\s>])[^>]*>([^<]*)<\/button>/g)) { - assert.equal(decodeHtml(label), dictionary["yue.compiler.compile"], `Wrong Compile button translation: ${route}`); + assert.ok( + decodeHtml(html).includes(`>${dictionary["yue.try"]}`), + `Wrong Try link translation: ${route}`, + ); + assert.ok( + decodeHtml(html).includes( + `aria-label="${dictionary["yue.compiler.close"]}"`, + ), + `Wrong compiler close label: ${route}`, + ); + for (const [, label] of html.matchAll( + /]*\bdata-yue-compile(?=[\s>])[^>]*>([^<]*)<\/button>/g, + )) { + assert.equal( + decodeHtml(label), + dictionary["yue.compiler.compile"], + `Wrong Compile button translation: ${route}`, + ); } } function checkInterface(html, route) { for (const [image] of html.matchAll(/]*>/g)) { - assert.match(image, /\salt(?:="[^"]*"|(?=\s|>))/, `Image needs alternative text: ${route}`); - assert.match(image, /\bwidth="\d+"/, `Image needs a numeric width: ${route}`); - assert.match(image, /\bheight="\d+"/, `Image needs a numeric height: ${route}`); + assert.match( + image, + /\salt(?:="[^"]*"|(?=\s|>))/, + `Image needs alternative text: ${route}`, + ); + assert.match( + image, + /\bwidth="\d+"/, + `Image needs a numeric width: ${route}`, + ); + assert.match( + image, + /\bheight="\d+"/, + `Image needs a numeric height: ${route}`, + ); } assert.match(html, /class="[^"]*sl-skip-link/, `Missing skip link: ${route}`); assert.match(html, /name="theme-color"/, `Missing theme color: ${route}`); - assert.match(html, /rel="preload"[^>]*as="font"/, `Missing heading font preload: ${route}`); + assert.match( + html, + /rel="preload"[^>]*as="font"/, + `Missing heading font preload: ${route}`, + ); for (const [code] of html.matchAll(/<(?:pre|code)\b[^>]*>/g)) { - assert.match(code, /\btranslate="no"/, `Code must not be auto-translated: ${route}`); + assert.match( + code, + /\btranslate="no"/, + `Code must not be auto-translated: ${route}`, + ); } } @@ -82,8 +130,14 @@ for (const [locale, { lang }] of Object.entries(locales)) { const aggregate = readFileSync(`dist${route}index.html`, "utf8"); checkInterface(aggregate, route); checkTranslations(aggregate, lang, route); - assert.equal(decodeHtml(aggregate.match(/]*>([^<]*)<\/h1>/)?.[1] ?? ""), translations[lang]["yue.allInOne"], `Wrong aggregate title: ${route}`); - const localeDocs = docs.filter(({ file, splash }) => !splash && localeFor(file) === locale); + assert.equal( + decodeHtml(aggregate.match(/]*>([^<]*)<\/h1>/)?.[1] ?? ""), + translations[lang]["yue.allInOne"], + `Wrong aggregate title: ${route}`, + ); + const localeDocs = docs.filter( + ({ file, splash }) => !splash && localeFor(file) === locale, + ); const sections = [...aggregate.matchAll(/
match[1], ); @@ -92,18 +146,29 @@ for (const [locale, { lang }] of Object.entries(locales)) { localeDocs.map(({ slug }) => slug), `${route} must include only its language's docs, excluding splash pages, once in sidebar order`, ); - assert.ok(aggregate.includes(`lang="${lang}"`), `Wrong page language: ${route}`); - const ids = [...aggregate.matchAll(/\sid="([^"]+)"/g)].map((match) => match[1]); + assert.ok( + aggregate.includes(`lang="${lang}"`), + `Wrong page language: ${route}`, + ); + const ids = [...aggregate.matchAll(/\sid="([^"]+)"/g)].map( + (match) => match[1], + ); const anchors = new Set(ids); assert.equal(ids.length, anchors.size, `Duplicate aggregate IDs: ${route}`); for (const [, hash] of aggregate.matchAll(/\shref="#([^"]+)"/g)) { - assert.ok(anchors.has(decodeURIComponent(hash)), `Missing anchor: ${route}#${hash}`); + assert.ok( + anchors.has(decodeURIComponent(hash)), + `Missing anchor: ${route}#${hash}`, + ); } assert.ok(!aggregate.includes("|\s)/g) ?? []).length, - localeDocs.reduce((count, { source }) => - count + (source.match(/data-yue-compile(?:>|\s)/g) ?? []).length, 0), + localeDocs.reduce( + (count, { source }) => + count + (source.match(/data-yue-compile(?:>|\s)/g) ?? []).length, + 0, + ), `Missing aggregate compiler controls: ${route}`, ); } @@ -127,10 +192,14 @@ for (const { file, source, slug, splash } of docs) { checkInterface(html, `/${slug}/`); const locale = localeFor(file); checkTranslations(html, locales[locale].lang, `/${slug}/`); - const aggregateRoute = locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; + const aggregateRoute = + locale === "root" ? "/all-in-one/" : `/${locale}/all-in-one/`; // Splash pages have no sidebar; all documentation pages link to their own language. if (!splash) { - assert.ok(html.includes(`href="${aggregateRoute}"`), `Missing locale aggregate link: ${file}`); + assert.ok( + html.includes(`href="${aggregateRoute}"`), + `Missing locale aggregate link: ${file}`, + ); } const expectedControls = (source.match(/data-yue-compile(?:>|\s)/g) ?? []) .length; @@ -165,10 +234,26 @@ for (const { file, source, slug, splash } of docs) { } const notFound = readFileSync("dist/404.html", "utf8"); checkInterface(notFound, "/404.html"); -assert.match(notFound, /]*>404<\/h1>/, "404.html must render the error page"); -assert.ok(notFound.includes("Page not found. Check the URL or try using the search bar."), "Missing 404 message"); -assert.doesNotMatch(notFound, /http-equiv="refresh"/, "404.html must not redirect"); -assert.ok(!notFound.includes("data-pagefind-body"), "404 must stay out of search results"); +assert.match( + notFound, + /]*>404<\/h1>/, + "404.html must render the error page", +); +assert.ok( + notFound.includes( + "Page not found. Check the URL or try using the search bar.", + ), + "Missing 404 message", +); +assert.doesNotMatch( + notFound, + /http-equiv="refresh"/, + "404.html must not redirect", +); +assert.ok( + !notFound.includes("data-pagefind-body"), + "404 must stay out of search results", +); for (const [locale, { lang }] of Object.entries(locales)) { if (locale === "root") continue; @@ -177,10 +262,20 @@ for (const [locale, { lang }] of Object.entries(locales)) { checkInterface(html, route); checkTranslations(html, lang, route); assert.ok(html.includes(`lang="${lang}"`), `Wrong 404 language: ${route}`); - assert.ok(decodeHtml(html).includes(translations[lang]["404.text"]), `Missing localized 404 message: ${route}`); + assert.ok( + decodeHtml(html).includes(translations[lang]["404.text"]), + `Missing localized 404 message: ${route}`, + ); assert.match(html, /]*>404<\/h1>/, `Missing 404 heading: ${route}`); - assert.ok(html.includes(`href="/${locale}/"`), `Missing localized home link: ${route}`); - assert.doesNotMatch(html, /http-equiv="refresh"|data-pagefind-body/, `404 must not redirect or appear in search: ${route}`); + assert.ok( + html.includes(`href="/${locale}/"`), + `Missing localized home link: ${route}`, + ); + assert.doesNotMatch( + html, + /http-equiv="refresh"|data-pagefind-body/, + `404 must not redirect or appear in search: ${route}`, + ); } assert.ok( diff --git a/doc/src/components/AggregateContent.astro b/doc/src/components/AggregateContent.astro index 3fedffac..ab19ec08 100644 --- a/doc/src/components/AggregateContent.astro +++ b/doc/src/components/AggregateContent.astro @@ -5,7 +5,7 @@ interface Props { const { prefix } = Astro.props; // Each Markdown page can reuse heading IDs. Namespace them in the combined page. -const html = (await Astro.slots.render('default')) +const html = (await Astro.slots.render("default")) .replace(/\bid="([^"]+)"/g, `id="${prefix}--$1"`) .replace(/\bhref="#([^"]+)"/g, `href="#${prefix}--$1"`) .replace(/(<\/?h)([1-5])\b/g, (_, tag, level) => `${tag}${Number(level) + 1}`) diff --git a/doc/src/components/CompilerFooter.astro b/doc/src/components/CompilerFooter.astro index 2bfd8fea..10d5dace 100644 --- a/doc/src/components/CompilerFooter.astro +++ b/doc/src/components/CompilerFooter.astro @@ -21,7 +21,9 @@ const messages = { }; --- -
+
+ +
YueScript {messages.title} - +
{messages.loading}
diff --git a/doc/src/components/Head.astro b/doc/src/components/Head.astro index 329b861c..e392762f 100644 --- a/doc/src/components/Head.astro +++ b/doc/src/components/Head.astro @@ -12,17 +12,15 @@ import heroFont from "@fontsource/noto-serif/files/noto-serif-latin-900-normal.w type="font/woff2" crossorigin="anonymous" /> -{ - Astro.locals.starlightRoute.entry.data.template === "splash" && ( - - ) -} +{Astro.locals.starlightRoute.entry.data.template === "splash" && ( + +)}