From 32c4b250984c3e4362dd6467db09630216859d70 Mon Sep 17 00:00:00 2001 From: Bao Zhiyuan Date: Fri, 13 Dec 2024 17:26:03 +0800 Subject: [PATCH 1/3] add moonbit langauge tour --- .github/workflows/tour-page.yml | 49 + moonbit-tour/.gitignore | 25 + moonbit-tour/.nvmrc | 1 + moonbit-tour/.prettierignore | 4 + moonbit-tour/.prettierrc | 3 + moonbit-tour/README.md | 42 + .../assets/fonts/inter-v18-latin-700.woff2 | Bin 0 -> 24352 bytes .../fonts/inter-v18-latin-700italic.woff2 | Bin 0 -> 25968 bytes .../assets/fonts/inter-v18-latin-italic.woff2 | Bin 0 -> 25080 bytes .../fonts/inter-v18-latin-regular.woff2 | Bin 0 -> 23692 bytes .../assets/syntax/moonbit.tmLanguage.json | 322 +++ moonbit-tour/dev/const.ts | 3 + moonbit-tour/dev/generate-plugin.ts | 68 + moonbit-tour/dev/index-plugin.ts | 34 + moonbit-tour/dev/remark.ts | 16 + moonbit-tour/dev/scan-tour.ts | 82 + moonbit-tour/dev/shiki.ts | 20 + moonbit-tour/index.html | 60 + moonbit-tour/package.json | 35 + moonbit-tour/postcss.config.js | 6 + moonbit-tour/public/favicon.ico | Bin 0 -> 15406 bytes moonbit-tour/src/main.ts | 144 ++ moonbit-tour/src/style.css | 36 + moonbit-tour/src/vite-env.d.ts | 1 + moonbit-tour/tailwind.config.js | 39 + .../chapter1_basic/lesson10_for_in/index.mbt | 13 + .../chapter1_basic/lesson10_for_in/index.md | 20 + .../chapter1_basic/lesson11_struct/index.mbt | 17 + .../chapter1_basic/lesson11_struct/index.md | 18 + .../lesson12_struct_mut_field/index.mbt | 12 + .../lesson12_struct_mut_field/index.md | 10 + .../chapter1_basic/lesson13_enum/index.mbt | 29 + .../chapter1_basic/lesson13_enum/index.md | 12 + .../chapter1_basic/lesson14_test/index.mbt | 25 + .../chapter1_basic/lesson14_test/index.md | 17 + .../chapter1_basic/lesson15_option/index.mbt | 14 + .../chapter1_basic/lesson15_option/index.md | 13 + .../chapter1_basic/lesson16_result/index.mbt | 14 + .../chapter1_basic/lesson16_result/index.md | 9 + .../chapter1_basic/lesson1_variable/index.mbt | 5 + .../chapter1_basic/lesson1_variable/index.md | 8 + .../lesson2_mutable-variable/index.mbt | 9 + .../lesson2_mutable-variable/index.md | 9 + .../chapter1_basic/lesson3_numbers/index.mbt | 11 + .../chapter1_basic/lesson3_numbers/index.md | 10 + .../chapter1_basic/lesson4_function/index.mbt | 12 + .../chapter1_basic/lesson4_function/index.md | 14 + .../chapter1_basic/lesson5_array/index.mbt | 22 + .../chapter1_basic/lesson5_array/index.md | 27 + .../chapter1_basic/lesson6_string/index.mbt | 20 + .../chapter1_basic/lesson6_string/index.md | 11 + .../chapter1_basic/lesson7_tuple/index.mbt | 18 + .../chapter1_basic/lesson7_tuple/index.md | 15 + .../tour/chapter1_basic/lesson8_map/index.mbt | 18 + .../tour/chapter1_basic/lesson8_map/index.md | 16 + .../lesson9_for_while/index.mbt | 20 + .../chapter1_basic/lesson9_for_while/index.md | 33 + .../lesson1_intro/index.mbt | 16 + .../lesson1_intro/index.md | 9 + .../lesson2_let_match/index.mbt | 45 + .../lesson2_let_match/index.md | 22 + .../lesson3_constant_pattern/index.mbt | 39 + .../lesson3_constant_pattern/index.md | 4 + .../lesson4_tuple_pattern/index.mbt | 20 + .../lesson4_tuple_pattern/index.md | 9 + .../lesson5_alias_pattern/index.mbt | 6 + .../lesson5_alias_pattern/index.md | 7 + .../lesson6_array_pattern/index.mbt | 17 + .../lesson6_array_pattern/index.md | 11 + .../lesson7_or_pattern/index.mbt | 23 + .../lesson7_or_pattern/index.md | 6 + moonbit-tour/tour/index.mbt | 3 + moonbit-tour/tour/index.md | 9 + moonbit-tour/tsconfig.json | 29 + moonbit-tour/vite.config.ts | 27 + package.json | 3 +- pnpm-lock.yaml | 1850 +++++++++++++++-- pnpm-workspace.yaml | 1 + 78 files changed, 3453 insertions(+), 194 deletions(-) create mode 100644 .github/workflows/tour-page.yml create mode 100644 moonbit-tour/.gitignore create mode 100644 moonbit-tour/.nvmrc create mode 100644 moonbit-tour/.prettierignore create mode 100644 moonbit-tour/.prettierrc create mode 100644 moonbit-tour/README.md create mode 100644 moonbit-tour/assets/fonts/inter-v18-latin-700.woff2 create mode 100644 moonbit-tour/assets/fonts/inter-v18-latin-700italic.woff2 create mode 100644 moonbit-tour/assets/fonts/inter-v18-latin-italic.woff2 create mode 100644 moonbit-tour/assets/fonts/inter-v18-latin-regular.woff2 create mode 100644 moonbit-tour/assets/syntax/moonbit.tmLanguage.json create mode 100644 moonbit-tour/dev/const.ts create mode 100644 moonbit-tour/dev/generate-plugin.ts create mode 100644 moonbit-tour/dev/index-plugin.ts create mode 100644 moonbit-tour/dev/remark.ts create mode 100644 moonbit-tour/dev/scan-tour.ts create mode 100644 moonbit-tour/dev/shiki.ts create mode 100644 moonbit-tour/index.html create mode 100644 moonbit-tour/package.json create mode 100644 moonbit-tour/postcss.config.js create mode 100644 moonbit-tour/public/favicon.ico create mode 100644 moonbit-tour/src/main.ts create mode 100644 moonbit-tour/src/style.css create mode 100644 moonbit-tour/src/vite-env.d.ts create mode 100644 moonbit-tour/tailwind.config.js create mode 100644 moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson11_struct/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson13_enum/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson13_enum/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson14_test/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson14_test/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson15_option/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson15_option/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson16_result/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson16_result/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson1_variable/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson1_variable/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson4_function/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson4_function/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson5_array/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson5_array/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson6_string/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson6_string/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson8_map/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson8_map/index.md create mode 100644 moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.mbt create mode 100644 moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.md create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.mbt create mode 100644 moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md create mode 100644 moonbit-tour/tour/index.mbt create mode 100644 moonbit-tour/tour/index.md create mode 100644 moonbit-tour/tsconfig.json create mode 100644 moonbit-tour/vite.config.ts diff --git a/.github/workflows/tour-page.yml b/.github/workflows/tour-page.yml new file mode 100644 index 00000000..0ccc53ee --- /dev/null +++ b/.github/workflows/tour-page.yml @@ -0,0 +1,49 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy language tour to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ['main'] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: 'pages' + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - uses: pnpm/action-setup@v4 + with: + version: 9 + - run: | + cd moonbit-tour + pnpm install + pnpm build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: './moonbit-tour/dist' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/moonbit-tour/.gitignore b/moonbit-tour/.gitignore new file mode 100644 index 00000000..2f3a7aa7 --- /dev/null +++ b/moonbit-tour/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +**/target diff --git a/moonbit-tour/.nvmrc b/moonbit-tour/.nvmrc new file mode 100644 index 00000000..e4f846dd --- /dev/null +++ b/moonbit-tour/.nvmrc @@ -0,0 +1 @@ +v22.10.0 diff --git a/moonbit-tour/.prettierignore b/moonbit-tour/.prettierignore new file mode 100644 index 00000000..aef159e2 --- /dev/null +++ b/moonbit-tour/.prettierignore @@ -0,0 +1,4 @@ +assets +public +tour +pnpm-lock.yaml \ No newline at end of file diff --git a/moonbit-tour/.prettierrc b/moonbit-tour/.prettierrc new file mode 100644 index 00000000..490e839f --- /dev/null +++ b/moonbit-tour/.prettierrc @@ -0,0 +1,3 @@ +{ + "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-imports"] +} diff --git a/moonbit-tour/README.md b/moonbit-tour/README.md new file mode 100644 index 00000000..35bd9931 --- /dev/null +++ b/moonbit-tour/README.md @@ -0,0 +1,42 @@ +# MoonBit Language Tour + +An interactive tour to learn the MoonBit programming language. + +## Get started + +```sh +pnpm install +pnpm build +pnpm preview +``` + +open to view the tour. + +## How to add new tour + +### Add new lesson + +1. Create a new folder under the chapter folder following the naming convention `lesson_` (count start from 1). +1. Write the lesson content in `index.md` and lesson code in `index.mbt` under the created folder. + +To see the render result while writing lesson on the fly, follow the instruction below: + +1. Setup development environment. + + ```sh + pnpm install + pnpm dev + ``` + +1. Write the lesson content in `tour/index.md` and lesson code in `tour/index.mbt`. You can see the render result in + +1. After you finish writing the lesson, copy `tour/index.md` and `tour/index.mbt` to the corresponding lesson folder. + +### Add new chapter + +1. Create a new folder under `tour` following the naming convention `chapter_`. +1. Add new lessons following the instruction above. + +## Credit + +This project is highly inspired by [Gleam Language Tour](https://github.com/gleam-lang/language-tour). diff --git a/moonbit-tour/assets/fonts/inter-v18-latin-700.woff2 b/moonbit-tour/assets/fonts/inter-v18-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..12b51d7709cff88edbe49b94412d240b90126ee3 GIT binary patch literal 24352 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 literal 0 HcmV?d00001 diff --git a/moonbit-tour/assets/fonts/inter-v18-latin-italic.woff2 b/moonbit-tour/assets/fonts/inter-v18-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ec07ef7dd6bb53bcbdeeb5da6a9b468d1bb191c5 GIT binary patch literal 25080 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

bzIZl7Y91ASXs>=nfX_!PV zkN40{GLLtn#FMOYn)x|3^@}SA_@q9G!580|GmlqgNGo48TXrm#4+x1N>9K8QSQekY z{(N}Zfj!~93P=_cHP1;kJ&Pv~xo_5o9m}?fZ&_c2-KyO=WFBHE_K=116#3K0yS&T0 ze5#a~8%>-@Oa`w4IGMsK3|oE6pVsamGM=Hu-_AWM(# z?a2{;y*OEW`YV0RGRFY@%rE}P!sgqHBcJcmC>Ud$2_Eu@$2{RF&v5~DhEkXbLlQ4VeCCT?+SVTbke?ACx&593q1v=U7|5Q}u^Kn3n zBNV)s-i|wkIw>yGZi(RBpzltEVhODlt3Q~a?yd1nWhggva*`G{l!qq3xpM71NM8(Y z9ru)x@{g6!j>PdrA!8fw;1MQnix3^Ncv zu32xqgvGdn$3FSCl&k`@CfxdNrcP{8pStHuLx7b%u_lFUj(HF>pzbX_G=<2C0iWzK zOKU_2PXR$>ZPMXHnx>^pxatUgL{C_~dwgpBkJDT+_|!_6!bUUh*F^80gr?E`WGfTNMT_x-ttd3 zz4OGD)3(B(R;fpDM~*}hP#a|x&@Tvf_3$ipE+0mJ;Z6x%DZPVmB>9#rkRt|wJn=q5 z7qoFgB_uv2dv34p`}u3fv(vDxXE7cDxD1DzJledqwmkGJmG}|Q|Lt2h&$)Ve7O(A7 zN97OGms$;TFh3SMd=^Y`nJ=fAF90RXw^%>PX;z7n(1m$qU)pVP-Os1W4h=VSna=D# ze!>N5A3cr9_tG8bq<~&{R_g5A$y|pOi|LI=LMO|f(Je$X>($3sPXC{_%|I4ac#5yU zsQYK?k|4*S;-jyp?sMiyxgCXQJcGto*{R;!oJzd+oQuYMJXPm|Tu)EOSya2$^?}{w zu4T2K5kphEO=rPGCbUduzF;A37eZS%MIF#203bK#t>sVtD_z|x+qTUR%NHG8_+SoU zrFow^+EH)SJNpVe^NtUWFSP$l{WVrhReW$kfqVB1bx`;v^8jbvR^Zj<$Hi zOLCA^UeV*st!s1ox3x$`r}b>Z5ICIvru%2?lAr@_e{?;l`&>OzMxzkt&!E?<>@@Ff zx|8Xnr^{;}Pt*CJ+|zUOEIPeb_eZ;4MjhVU#}mD)VOb7=_-fd~h|CORQHr)vSg~rh zvP3SR0J*>vd;|7%m%pmE{CK5zYc?QV%k{mmew}1po7ZT>4|f))xYLb^v+uCQSw7Yjc&M<40cf`4KVvWCQ zrfZMOwD$DP@^$8zwrdXEcq}}aTEjWPep0e}h3{q6&ImdMK9jm~2XRAR#=o0IUFO_ql%{ycC4=PRtz)yevIk@e6_jUz_=Jv(5-dCKOEe;_R$G zoL!zjekiEV;_P^7u8j9$=EDa^dJfqPZEI3kNkJaBF$>1yw)&}|fTLWOuO<$J&8DK` z)q(%6w7$>KHlA0rH-0tkdz7I%4K$B?zGpLUGqGZJzO#MBsp;*dxbEEsR*e8A+)n9VzZwhv_HTup9`eEgk{QKyr^AI04b;y&E;AIFtz z+v~!+>7|q4HUf-KwH#Lin@{-#r)s(1u6KzJ+NO_cVpWFHGkO&|&e{Y9GlPj^RXCO1 zmK59G#3KE!_g*T!hl=R0u$CL$MTeMXtnIwCdCqVgt2y+mT>EzsJ&)fy+PcpP9BWkw z_JI$Cf+OTW9$bKs+h;G$^;feMwprfCQNs3iD=*KNyEb;Ra;q#~%x6%901DAeSQ=|% zKd2434B^lSC!y0W7U^i)S}f9|yQT+j!p*js*f4m{aXbsRAujck>=26=8#-!2R zs_0+tR#0MstX1N?D>?R6e~)alU|E5cC? zQ^PPMhqq*4)X$((lwPO&kr>~>w3xnQf`CPg7%_9^Ow+OJ*LW}ANvmci4uHHIBmjO0 zychTlS-%Ank07GfNlMALjM%5HwcWpetJi- zqJ;^hgTZ$3UnHZadctg4-^H5<843O9@)tx}Gl*TpaY7&dK54_is$TkQyQt89scHid z>inE>+C6vpr@UmK$Tb3usGuppUn>#QlQxr~ z?|W)v>lhd}YD`Ghr_Ol(wakd&$9Hk;bc$VXQ)j!8^o7IT}kh$T~@!bQYNSgd0s zN~GFsW5+D^zAzVUiA5Y(inCjc*f_>1&T(PIIOoS`V>KvvCC!l*#{JR9kQ<+;v`6tB3d-N4u??3GwK}^}S6A!qTGx?X z#o}$+R-)Rp+ux0Py4fukTtq|C;k;hA>g_fWVop-*4kb5ryQWzSWh&U1zM64KDc{^( zP0R&Ov~`5KB0aIB&g>_%%khBjhZfh)AGfK!#%a=XJvl+XaK9~D z4zstVeHQt&j6luEXAZ@-QJ@Q(mjr4FCcr@a!^7XL-OU&1FKcTRLcLA#B!TssSt=0v zgvEkQE?AV;q(EB@za~VhV#72-zs+$-wymA(DK@pPyUBH3{0wK{T2E^5tRUpdLeRu| zFap8}$ifgS6+*r3nFv3znD!7|t9P0J6V&W|@3>t@2kFvBR!GX>k&kfLBL)tjocghma5aj^IyO!rt*fkx zq~dTB;%7_;@Qiiv@W@I-#r4A!g>Qs`gN!ur_vp`!wq)r31kY|ukl8}%oljdHok=*h z8Io0))PDO2J2=`G$z+T#I$trq4(9gIj;^XRh9Z_-SULB1$3u|=PbVD9B%6l&*1O0q zMHEjVjB&^!mt1=pla^RhA{u^iyF4Tj8Ms~k z8Mp7#x>uyo*)v0u9>+$K6Eai39iH!#9iHddt1hSZptaLmB+A~oDJhhxf8rb+{FT$| ztX(P?xkY-nh0M$tg-YQfr7TL@^SnIu=G=_8%9c@fif2br)WLL_sffWyZA=EHN{l>` zNg2CLQh= zdAX8I-ZJjtTE;2~D`QqkSUqRelrT|iffM%IT}$)a^D;Je;W*T~Xt!ton( zx@A5g%S5I<00D<|3mzF42hYHZG!7a}hhB9EoPjRU53|4Nh9QMr1l0O8lQuxWfv(m7 z;)Ef10RSC(1>l{5O5_0T3^El|jexR7eBTKHwNE~k`xfZk}P)&#y z0%+b$OfMG(R)Aa&GVsEJH#?JQUm>iol1NlFe)UCZ8+qk<@YH;|i%~SW;|a3aHI!ML z(a)wvgZn8eo*la^s-;#0*NxE7ub>kcsIsi8n=%mjz;E2E)~mUjAZW^>4UT^x+ud|y zKY>2`(dQxVZE*u7N(BkzFP*o?<90GV4r@+g9M#UU4`NJK-P)u2f@Dj0q%!)l{+?+M zj(Rg=UaH+}=%KzB*vCXuQ;MO2wKtPIpJS9=OeCpvueuvp!%SpF;o}koJ-5ibD}VXp SbaENpE#&w6?BBBanF9b=h?UU* literal 0 HcmV?d00001 diff --git a/moonbit-tour/assets/fonts/inter-v18-latin-regular.woff2 b/moonbit-tour/assets/fonts/inter-v18-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..33002f12853a3d37d7b7eba39623fae3bca94a3b GIT binary patch literal 23692 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" + }, + { + "name": "storage.type.function.arrow.moonbit", + "match": "=>" + }, + { + "name": "keyword.operator.assignment.moonbit", + "match": "=" + }, + { + "name": "keyword.operator.other.moonbit", + "match": "\\|>" + }, + { + "name": "keyword.operator.comparison.moonbit", + "match": "(===|==|!=|>=|<=|(?|<)" + }, + { + "name": "keyword.operator.logical.moonbit", + "match": "(\\bnot\\b|&&|\\|\\|)" + }, + { + "name": "keyword.operator.math.moonbit", + "match": "(\\+|-(?!>)|\\*|%|/)" + } + ] + }, + "comments": { + "patterns": [ + { + "name": "comment.line", + "match": "//.*" + } + ] + }, + "interpolation": { + "patterns": [ + { + "begin": "\\\\{", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.moonbit" + } + }, + "contentName": "source.moonbit", + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.moonbit" + } + }, + "patterns": [ + { + "include": "$self" + } + ], + "name": "meta.embedded.line.moonbit" + } + ] + }, + "escape": { + "patterns": [ + { + "match": "\\\\[0\\\\tnrb\"']", + "name": "constant.character.escape.moonbit" + }, + { + "name": "constant.character.escape.moonbit", + "match": "\\\\x[0-9a-fA-F]{2}" + }, + { + "name": "constant.character.escape.moonbit", + "match": "\\\\o[0-3][0-7]{2}" + }, + { + "match": "\\\\u[0-9a-fA-F]{4}", + "name": "constant.character.escape.unicode.moonbit" + }, + { + "match": "\\\\u{[0-9a-fA-F]*}", + "name": "constant.character.escape.unicode.moonbit" + } + ] + }, + "strings": { + "patterns": [ + { + "name": "string.line", + "match": "(#\\|).*", + "captures": { + "1": { + "name": "keyword.operator.other.moonbit" + } + } + }, + { + "name": "string.line", + "match": "(\\$\\|)(.*)", + "captures": { + "1": { + "name": "keyword.operator.other.moonbit" + }, + "2": { + "patterns": [ + { + "include": "#escape" + }, + { + "include": "#interpolation" + } + ] + } + } + }, + { + "name": "string.quoted.single.moonbit", + "begin": "'", + "end": "'", + "patterns": [ + { + "include": "#escape" + } + ] + }, + { + "name": "string.quoted.double.moonbit", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "include": "#escape" + }, + { + "include": "#interpolation" + } + ] + } + ] + }, + "constants": { + "patterns": [ + { + "name": "constant.numeric.moonbit", + "match": "\\b\\d(\\d|_)*(?!\\.)(U)?(L)?\\b" + }, + { + "name": "constant.numeric.moonbit", + "match": "(?<=\\.)\\d((?=\\.)|\\b)" + }, + { + "name": "constant.numeric.moonbit", + "match": "\\b\\d+(\\.)\\d+\\b" + }, + { + "name": "constant.numeric.moonbit", + "match": "\\b0[XxOoBb][\\dAaBbCcDdEeFf]+(U)?(L)?\\b" + }, + { + "name": "constant.language.moonbit", + "match": "\\b(true|false|\\(\\))\\b" + } + ] + }, + "modules": { + "patterns": [ + { + "name": "entity.name.namespace.moonbit", + "match": "@[A-Za-z][A-Za-z0-9_/]*" + } + ] + }, + "variables": { + "patterns": [ + { + "comment": "variables", + "name": "variable.other.moonbit", + "match": "\\b(? + %TITLE% + + `; + +const generatePlugin = (): vite.Plugin => { + return { + name: "generate-tour", + async generateBundle(options, bundle) { + const template = await fs.readFile("index.html", "utf8"); + const chapters = await scanTour(); + const lessons = chapters.flatMap((c) => c.lessons); + for (const [i, l] of lessons.entries()) { + let res = template + .replace("%HEAD%", head) + .replace("%TITLE%", `${l.lesson} - MoonBit Language Tour`) + .replace("%MARKDOWN%", l.markdown) + .replace("%CODE%", l.code); + if (i === 0) { + res = res.replace("%BACK%", `Back`); + } + if (i - 1 >= 0) { + res = res.replace( + "%BACK%", + `Back`, + ); + } + if (i + 1 < lessons.length) { + res = res.replace( + "%NEXT%", + `Next`, + ); + } + if (i === lessons.length - 1) { + res = res.replace( + "%NEXT%", + `Next`, + ); + } + this.emitFile({ + type: "asset", + fileName: path.join(slug(l), "index.html"), + source: res, + }); + } + const toc = generateTOC(chapters); + this.emitFile({ + type: "asset", + fileName: path.join("table-of-contents", "index.html"), + source: template + .replace("%HEAD%", head) + .replace("%TITLE%", `Table of Contents - MoonBit Language Tour`) + .replace("%MARKDOWN%", toc.markdown) + .replace("%CODE%", toc.code) + .replace("%BACK%", `Back`) + .replace("%NEXT%", `Next`), + }); + }, + }; +}; + +export default generatePlugin; diff --git a/moonbit-tour/dev/index-plugin.ts b/moonbit-tour/dev/index-plugin.ts new file mode 100644 index 00000000..d68896c0 --- /dev/null +++ b/moonbit-tour/dev/index-plugin.ts @@ -0,0 +1,34 @@ +import * as fs from "fs/promises"; +import * as vite from "vite"; +import { BASE } from "./const"; +import * as remark from "./remark"; +import { scanTour, slug } from "./scan-tour"; +import * as shiki from "./shiki"; + +const indexPlugin = (): vite.Plugin => { + return { + name: "dev-index-plugin", + async transformIndexHtml(html) { + const md = await fs.readFile("tour/index.md", "utf8"); + const mbt = await fs.readFile("tour/index.mbt", "utf8"); + const mdHtml = remark.mdToHtml(md); + const mbtHtml = shiki.renderMoonBitCode(mbt); + const lessons = (await scanTour()).flatMap((c) => c.lessons); + return html + .replace( + "%HEAD%", + ` + moonbit tour`, + ) + .replace("%MARKDOWN%", mdHtml) + .replace("%CODE%", mbtHtml) + .replace("%BACK%", `Back`) + .replace( + "%NEXT%", + `Next`, + ); + }, + }; +}; + +export default indexPlugin; diff --git a/moonbit-tour/dev/remark.ts b/moonbit-tour/dev/remark.ts new file mode 100644 index 00000000..0418eacd --- /dev/null +++ b/moonbit-tour/dev/remark.ts @@ -0,0 +1,16 @@ +import rehypeStringify from "rehype-stringify"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import { unified } from "unified"; + +const processor = unified() + .use(remarkParse) + .use(remarkRehype) + .use(rehypeStringify); + +function mdToHtml(md: string): string { + const file = processor.processSync(md); + return String(file); +} + +export { mdToHtml }; diff --git a/moonbit-tour/dev/scan-tour.ts b/moonbit-tour/dev/scan-tour.ts new file mode 100644 index 00000000..c0352e2d --- /dev/null +++ b/moonbit-tour/dev/scan-tour.ts @@ -0,0 +1,82 @@ +import fs from "fs/promises"; +import path from "path"; +import { BASE } from "./const"; +import * as remark from "./remark"; +import * as shiki from "./shiki"; + +type Chapter = { + chapter: string; + lessons: Lesson[]; +}; + +type Lesson = { + chapter: string; + lesson: string; + lessonIndex: number; + lessonsLength: number; + markdown: string; + code: string; +}; + +async function dirs(path: string) { + return (await fs.readdir(path, { withFileTypes: true })) + .filter((i) => i.isDirectory()) + .sort((a, b) => { + const na = +a.name.slice(a.name.search(/\d+/), a.name.search("_")); + const nb = +b.name.slice(b.name.search(/\d+/), b.name.search("_")); + return na - nb; + }); +} + +async function scanTour(): Promise { + const chapterFolders = await dirs("tour"); + const chapters: Chapter[] = []; + for (const c of chapterFolders) { + const chapter = c.name.split("_").slice(1).join(" "); + const ds = await dirs(path.join(c.parentPath, c.name)); + const lessons: Lesson[] = await Promise.all( + ds.map(async (d, i, arr) => { + const lesson = d.name.split("_").slice(1).join(" "); + const mdPath = path.join(d.parentPath, d.name, "index.md"); + const mbtPath = path.join(d.parentPath, d.name, "index.mbt"); + const md = await fs.readFile(mdPath, "utf8"); + const mbt = await fs.readFile(mbtPath, "utf8"); + return { + chapter, + lesson, + lessonIndex: i, + lessonsLength: arr.length, + markdown: remark.mdToHtml(md), + code: shiki.renderMoonBitCode(mbt), + }; + }), + ); + chapters.push({ chapter, lessons }); + } + return chapters; +} + +function slug(lesson: Lesson): string { + return `${lesson.chapter.replaceAll(" ", "-")}/${lesson.lesson.replaceAll(" ", "-")}`; +} + +function generateTOC(chapters: Chapter[]): { markdown: string; code: string } { + const lines: string[] = []; + lines.push(`# Table of Contents`); + for (const c of chapters) { + lines.push(`## ${c.chapter}`); + for (const l of c.lessons) { + lines.push(`- [${l.lesson}](${BASE}/${slug(l)}/index.html)`); + } + } + return { + markdown: remark.mdToHtml(lines.join("\n")), + code: shiki.renderMoonBitCode(`fn main { + println("hello, world") +}`), + }; +} + +generateTOC(await scanTour()); + +export { generateTOC, scanTour, slug }; diff --git a/moonbit-tour/dev/shiki.ts b/moonbit-tour/dev/shiki.ts new file mode 100644 index 00000000..5fdfa814 --- /dev/null +++ b/moonbit-tour/dev/shiki.ts @@ -0,0 +1,20 @@ +import * as fs from "fs"; +import * as shiki from "shiki"; + +const moonbitLang = JSON.parse( + fs.readFileSync("assets/syntax/moonbit.tmLanguage.json", "utf8"), +); + +const highlighter = await shiki.createHighlighter({ + themes: ["light-plus"], + langs: [moonbitLang], +}); + +function renderMoonBitCode(code: string): string { + return highlighter.codeToHtml(code, { + lang: "moonbit", + theme: "light-plus", + }); +} + +export { renderMoonBitCode }; diff --git a/moonbit-tour/index.html b/moonbit-tour/index.html new file mode 100644 index 00000000..ccc2e739 --- /dev/null +++ b/moonbit-tour/index.html @@ -0,0 +1,60 @@ + + + + + + %HEAD% + + +

+ MoonBit Language Tour + MoonBit +
+ + + +
+
+
+
+
%MARKDOWN%
+ +
+
+
+ %CODE% +
+
+

+        
+
+ +
+ + diff --git a/moonbit-tour/package.json b/moonbit-tour/package.json new file mode 100644 index 00000000..f53ec973 --- /dev/null +++ b/moonbit-tour/package.json @@ -0,0 +1,35 @@ +{ + "name": "moonbit-tour", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "format": "prettier --write ." + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.15", + "@types/node": "^22.10.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-tailwindcss": "^0.6.9", + "rehype-stringify": "^10.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "shiki": "^1.24.1", + "tailwindcss": "^3.4.16", + "tsx": "^4.19.2", + "typescript": "~5.6.2", + "unified": "^11.0.5", + "vite": "^6.0.1" + }, + "packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab", + "dependencies": { + "@moonbit/moonpad-monaco": "^0.1.202412060", + "monaco-editor-core": "^0.52.0" + } +} diff --git a/moonbit-tour/postcss.config.js b/moonbit-tour/postcss.config.js new file mode 100644 index 00000000..2aa7205d --- /dev/null +++ b/moonbit-tour/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/moonbit-tour/public/favicon.ico b/moonbit-tour/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3aa86530872f00ed6f0ff0035a5b898bd610ee63 GIT binary patch literal 15406 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 new mooncWorker(), +}); + +// @ts-ignore +self.MonacoEnvironment = { + getWorker() { + return new editorWorker(); + }, +}; + +const sunSvg = ` + + +`; + +const moonSvg = ` + + +`; + +let theme: "light" | "dark" = "light"; + +const themeButton = document.querySelector("#theme")!; + +function toggleTheme() { + if (theme === "light") { + theme = "dark"; + document.querySelector("html")?.classList.add("dark"); + monaco.editor.setTheme("dark-plus"); + themeButton.innerHTML = moonSvg; + } else { + theme = "light"; + document.querySelector("html")?.classList.remove("dark"); + monaco.editor.setTheme("light-plus"); + themeButton.innerHTML = sunSvg; + } +} + +themeButton.addEventListener("click", toggleTheme); + +function debounce

(f: (...args: P) => R, timeout: number) { + let timer: ReturnType | null = null; + return (...args: P) => { + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(() => { + f(...args); + timer = null; + }, timeout); + }; +} + +const codePre = document.querySelector(".shiki")!; + +const model = monaco.editor.createModel(codePre.textContent ?? "", "moonbit"); + +function lineTransformStream() { + let buffer = ""; + return new TransformStream({ + transform(chunk, controller) { + buffer += chunk; + const lines = buffer.split("\n"); + buffer = lines.pop() ?? buffer; + for (const line of lines) { + controller.enqueue(line); + } + }, + flush(controller) { + if (buffer.length > 0) { + controller.enqueue(buffer); + } + controller.terminate(); + }, + }); +} + +const output = document.querySelector("#output")!; + +async function run() { + const content = model.getValue(); + const result = await moon.compile({ libContents: [content] }); + switch (result.kind) { + case "success": { + const wasm = result.wasm; + const stream = await moon.run(wasm); + let buffer = ""; + await stream + .pipeThrough(new TextDecoderStream("utf-16")) + .pipeThrough(lineTransformStream()) + .pipeTo( + new WritableStream({ + write(chunk) { + buffer += `${chunk}\n`; + }, + }), + ); + output.textContent = buffer; + return; + } + case "error": { + console.error(result.diagnostics); + } + } +} + +model.onDidChangeContent(debounce(run, 100)); + +monaco.editor.onDidCreateEditor(() => { + codePre.remove(); +}); + +const editor = document.getElementById("editor")!; +editor.classList.remove("pl-[10px]", "text-[14px]"); +monaco.editor.create(editor, { + model, + lineNumbers: "off", + glyphMargin: false, + minimap: { + enabled: false, + }, + automaticLayout: true, + folding: false, + fontSize: 14, + scrollBeyondLastLine: false, + scrollbar: { + alwaysConsumeMouseWheel: false, + }, + fontFamily: "monospace", + theme: "light-plus", +}); + +run(); diff --git a/moonbit-tour/src/style.css b/moonbit-tour/src/style.css new file mode 100644 index 00000000..874f9bac --- /dev/null +++ b/moonbit-tour/src/style.css @@ -0,0 +1,36 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* inter-regular - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: url("../assets/fonts/inter-v18-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* inter-italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Inter"; + font-style: italic; + font-weight: 400; + src: url("../assets/fonts/inter-v18-latin-italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* inter-700 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Inter"; + font-style: normal; + font-weight: 700; + src: url("../assets/fonts/inter-v18-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* inter-700italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Inter"; + font-style: italic; + font-weight: 700; + src: url("../assets/fonts/inter-v18-latin-700italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} diff --git a/moonbit-tour/src/vite-env.d.ts b/moonbit-tour/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/moonbit-tour/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/moonbit-tour/tailwind.config.js b/moonbit-tour/tailwind.config.js new file mode 100644 index 00000000..62302281 --- /dev/null +++ b/moonbit-tour/tailwind.config.js @@ -0,0 +1,39 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: "selector", + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}", "./dev/*.ts"], + theme: { + fontFamily: { + sans: [ + '"Inter"', + "ui-sans-serif", + "system-ui", + "sans-serif", + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + mono: [ + "ui-monospace", + "SFMono-Regular", + "Menlo", + "Monaco", + "Consolas", + '"Liberation Mono"', + '"Courier New"', + "monospace", + ], + serif: [ + "ui-serif", + "Georgia", + "Cambria", + '"Times New Roman"', + "Times", + "serif", + ], + }, + extend: {}, + }, + plugins: [require("@tailwindcss/typography")], +}; diff --git a/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.mbt new file mode 100644 index 00000000..7cb3f842 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.mbt @@ -0,0 +1,13 @@ +fn main { + println("\nfor-in loop:") + let array = [1, 2, 3] + for element in array { + println("element: \{element}") + } + + println("\nfor-in loop for map:") + let map = { "key1": 1, "key2": 2, "key3": 3 } + for k, v in map { + println("key: \{k}, value: \{v}") + } +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.md b/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.md new file mode 100644 index 00000000..bc645314 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson10_for_in/index.md @@ -0,0 +1,20 @@ +# For-in loop + +It's cumbersome to write a for loop and manually decide the end condition. + +If you want to iterate over a collection, you can use the `for-in` loop. + +In the first for-in loop, we iterate over an array. The loop will bind each +element to the variable `element` in each iteration. + +We can also iterate over a map with key-value pairs. The second loop will bind +the key to the variable `k` and the value to the variable `v`. + +Which collections can be iterated over with a for-in loop? And when does the for-in loop support two variables? The for-in loop functionality actually depends on the API of the collection: + +- If the collection provides an `iter()` method to return a `Iter[V]` iterator, then the for-in loop can iterate over it. + +- If the collections provided `iter2()` methods to return a `Iter2[K,V]` iterator, you can use two variables to iterate over it. + +We will explain more details about the iterator in a later chapter. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.mbt new file mode 100644 index 00000000..1f2d63c6 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.mbt @@ -0,0 +1,17 @@ +struct Point { + x : Int + y : Int +} derive(Show) + +fn main { + // create a point + let point = { x: 3, y: 4 } + println("point: \{point}") + println("point.x: \{point.x}") + println("point.y: \{point.y}") + + // functional update + let point2 = {..point, x: 20} + println(point2) +} + diff --git a/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md new file mode 100644 index 00000000..ae451409 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md @@ -0,0 +1,18 @@ +# Struct + +Structs are new types composed of other types. + +In the example we define a struct `Point` with two fields, `x` and `y`, both of which are integers. + +We can create an instance of `Point` by using the `{ x: 3, y: 4}`. The structs name can be omitted since the compiler can infer it from the labels `x` and `y`. + +We can also add a `Point::` prefix to create an instance explicitly to disambiguate. + +Anologous to tuples, we can access the fields of a struct using the syntax `point.x`. + +The `derive(Show)` after the struct definition means that we can print the struct using the `println` function. + +The fields of a struct are immutable by default; they can't be changed after they are created. There is a syntax called *functional update* that allows you to create a new struct with some fields updated. + +We will learn how to make the fields mutable in the next lesson. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.mbt new file mode 100644 index 00000000..4be05ab2 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.mbt @@ -0,0 +1,12 @@ +struct MutPoint { + mut mx : Int + y : Int +} derive(Show) + +fn main { + let point = { mx: 3, y: 4 } + println("point: \{point}") + point.mx = 10 + println("point: \{point}") +} + diff --git a/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.md b/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.md new file mode 100644 index 00000000..0537b655 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson12_struct_mut_field/index.md @@ -0,0 +1,10 @@ +# Mutable fields in Struct + +Struct fields are immutable by default, but we can make them mutable by using the `mut` keyword in the field declaration. + +In previous lessons, we have learned that collections in MoonBit can be either mutable or immutable. This is achieved by using the `mut` keyword in their type declaration. + +The `MutPoint` struct in the example has two fields, mutable `mx` and immutable `y`. You can change the value of these fields via reassignment. + + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.mbt new file mode 100644 index 00000000..e7d2e8a4 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.mbt @@ -0,0 +1,29 @@ +enum Color { + Red + Green + Blue + RGB(Int, Int, Int) + CMYK(Int, Int, Int, Int) +} + +fn print_color(color : Color) -> Unit { + match color { + Red => println("Red") + Green => println("Green") + Blue => println("Blue") + // Take the three Int values from RGB and print them. + RGB(r, g, b) => println("RGB: \{r}, \{g}, \{b}") + CMYK(c, m, y, k) => println("CMYK: \{c}, \{m}, \{y}, \{k}") + } +} + +fn main { + let red = Red + let green = Color::Green + let blue = RGB(0, 0, 255) + let black = CMYK(0, 0, 0, 100) + print_color(red) + print_color(green) + print_color(blue) + print_color(black) +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.md b/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.md new file mode 100644 index 00000000..631c26ca --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson13_enum/index.md @@ -0,0 +1,12 @@ +# Enum + +Enum used to define a type by enumerating its possible values. Unlike traditional enums, MoonBit enums can have data associated with each enumeration. We call each enumeration a *enum constructor*. + +In this example, we define an enum `Color`, which has five enum constructors: `Red`, `Green`, `Blue`, `RGB`, and `CMYK`. The `Red`, `Green`, and `Blue` directly represent a color it described, while `RGB` and `CMYK` have data associated with them. + +Expressions like `Red` and `RGB(255,255,255)` are both instances of the `Color` type. To create an instance more explicitly, you can use `Color::Red`, similar to creating an instance of a struct. + +We use a bit of *pattern matching* to distinguish different *enum constructors* in `print_color`. It's a control flow similar to switch-case in C-like languages. Here is a slight difference: you can extract the associated data by giving them a name on the left of `=>`, and use them as variables on the right side. + +We will explore more powerful features of *pattern matching* in the next chapter. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson14_test/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson14_test/index.mbt new file mode 100644 index 00000000..8d16ea42 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson14_test/index.mbt @@ -0,0 +1,25 @@ +test { + assert_eq!(1, 1 + 2) + assert_false!(1 == 2) + assert_true!([1,2,3] == [1,2,3]) +} + +test { + inspect!(fib(5)) + inspect!([1,2,3,4].map(fib)) +} + +// Add test name to make it more descriptive. +test "fibonacci" { + inspect!(fib(5), content="5") + inspect!(fib(6), content="8") +} + +fn fib(n : Int) -> Int { + if n < 2 { + n + } else { + fib(n - 1) + fib(n - 2) + } +} + diff --git a/moonbit-tour/tour/chapter1_basic/lesson14_test/index.md b/moonbit-tour/tour/chapter1_basic/lesson14_test/index.md new file mode 100644 index 00000000..65770f29 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson14_test/index.md @@ -0,0 +1,17 @@ +# Test + +MoonBit has built-in testing support. There is no need to import or configure extra packages or tools; just use the test block and write the test code inside. + +**Note: this feature is not supported in this tour. You can try it in our [playground](try.moonbitlang.com) or in your terminal if the MoonBit toolchain is installed.** + +In the first test block, we test some properties using the built-in functions assert_eq, assert_false, and assert_true. By running `moon test` in the terminal or clicking the test button, the tests will be executed. + +## Maintaining Tests + +Sometimes it's tedious to maintain the expected value manually. MoonBit also supports built-in *snapshot tests*. Snapshot tests will run the tested code and store the expected result as a snapshot. + +In the second test block, we use the `inspect` function to test the result of `fib` and the array's `map` method. By running `moon test --update` in the terminal or clicking the `Update test` button, the result will be automatically inserted as the second argument. + +The next time you run the test, it will report any differences between the current result and the stored result. You can update the stored result to the new result by `--update` flag. + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson15_option/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson15_option/index.mbt new file mode 100644 index 00000000..4a1202fe --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson15_option/index.mbt @@ -0,0 +1,14 @@ +fn first_char(s : String) -> Option[Char] { + if s.length() == 0 { + None + } else { + Some(s[0]) + } +} + +fn main { + let c1 : Char? = first_char("hello") + let c2 : Option[Char] = first_char("") + println("\{c1.is_empty()}, \{c1.unwrap()}") + println("\{c2.is_empty()}, \{c2}") +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson15_option/index.md b/moonbit-tour/tour/chapter1_basic/lesson15_option/index.md new file mode 100644 index 00000000..a10c5964 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson15_option/index.md @@ -0,0 +1,13 @@ +# Option + +`Option[Char]` represents a `Char` value that may or may not be present. It is a common way to handle exceptional cases. + +- `None` means the value is missing. +- `Some(e)` is a wrapper that contains the value `e`. + +The `[Char]` part in the type is a type parameter, which means the value type in `Option` is `Char`. We can use `Option[String]`, `Option[Double]`, etc. We will cover generics later. + +The type annotation `Option[A]` can be shortened to `A?`. + +You can use `c1.is_empty()` to check if the value is missing and `c1.unwrap()` to get the value. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson16_result/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson16_result/index.mbt new file mode 100644 index 00000000..c283dc22 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson16_result/index.mbt @@ -0,0 +1,14 @@ +fn first_char(s : String) -> Result[Char, String] { + if s.length() == 0 { + Err("empty string") + } else { + Ok(s[0]) + } +} + +fn main { + let c1 = first_char("hello") + let c2 = first_char("") + println("\{c1.is_ok()}, \{c1}, \{c1.unwrap()}") + println("\{c2.is_err()}, \{c2}") +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson16_result/index.md b/moonbit-tour/tour/chapter1_basic/lesson16_result/index.md new file mode 100644 index 00000000..fb4d08fc --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson16_result/index.md @@ -0,0 +1,9 @@ +# Result + +Similar to `Option[Char]`, `Result[Char, String]` represents a `Char` value that may or may not be present. If not, it can contain an error message of type `String`. + +- `Err("error message")` means the value is missing, and the error message is provided. +- `Ok('h')` is a wrapper that contains the value `'h'`. + +The processing of `Option` and `Result` in examples so far is verbose and prone to bugs. To handle `Option` and `Result` values safely and cleanly, you can use pattern matching. It's recommended to use *error handling* to process errors effectively. These two topics will be covered in a later chapter. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.mbt new file mode 100644 index 00000000..8f57983d --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.mbt @@ -0,0 +1,5 @@ +fn main { + let a : Int = 10 + let b = 20 + println(a + b) +} \ No newline at end of file diff --git a/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.md b/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.md new file mode 100644 index 00000000..23fd115e --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson1_variable/index.md @@ -0,0 +1,8 @@ +# Variables + +The `let` keyword used to define a variables. + +The type of the variable can be annotated by using a colon followed by the type. +It is optional, if not provided the type will be inferred from the value. + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.mbt new file mode 100644 index 00000000..80999b6c --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.mbt @@ -0,0 +1,9 @@ +fn main { + let mut a = 10 + a = a + 1 + println(a) + + let b = 20 + // b = b + 1 + println(b) +} \ No newline at end of file diff --git a/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.md b/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.md new file mode 100644 index 00000000..2842f1f2 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson2_mutable-variable/index.md @@ -0,0 +1,9 @@ +# Mutable Variables + +Variables are immutable by default in MoonBit. + +You can add an extra `mut` keyword to make them mutable at the local level. + +If you uncomment the `b = b + 1`, you will get an error. + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.mbt new file mode 100644 index 00000000..d1a477ef --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.mbt @@ -0,0 +1,11 @@ +fn main { + let dec : Int = 1000000 + let dec2 : Int = 1_000_000 + let hex : Int = 0xFFFF + let oct = 0o777 + let bin = 0b1001 + + let num1 : Double = 3.14 + let num2 : Float = 3.14 +} + diff --git a/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.md b/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.md new file mode 100644 index 00000000..8b5398b0 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson3_numbers/index.md @@ -0,0 +1,10 @@ +# Numbers + +integers and floats are the most common types in MoonBit, it can be represented in decimal, hexadecimal, octal, and binary, and you can use the underscore to separate digits for better readability. +We call these *number literals*. + +The `0xFFFF` is a hexadecimal number, `0o777` is an octal number, `0b1010` is a binary number, +and `1_000_000` is a decimal number equivalent to `1000000`. + + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson4_function/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson4_function/index.mbt new file mode 100644 index 00000000..2007599f --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson4_function/index.mbt @@ -0,0 +1,12 @@ +fn add(a : Int, b : Int) -> Int { + a + b +} + +fn compute() -> Unit { + println(add(2, 40)) +} + +fn main { + compute() +} + diff --git a/moonbit-tour/tour/chapter1_basic/lesson4_function/index.md b/moonbit-tour/tour/chapter1_basic/lesson4_function/index.md new file mode 100644 index 00000000..8da5a5a2 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson4_function/index.md @@ -0,0 +1,14 @@ +# Function + +This example defines two functions, `add` and `compute`. + +The `add` function takes two arguments, `a` and `b`, and returns their sum. + +The `compute` function takes no arguments and returns nothing. +Its return type is `Unit`, which is used to represent the absence of a return value. + + + + + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson5_array/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson5_array/index.mbt new file mode 100644 index 00000000..14b05c70 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson5_array/index.mbt @@ -0,0 +1,22 @@ +fn main { + let arr1 : Array[Int] = [1, 2, 3, 4, 5] + let arr2 = Array::make(4,1) + + println(arr1.length()) // get the length of the array + println(arr1[1]) // get the second element of the array + + // We can also use the spread operator to concatenate arrays. + let arr3 = [..arr1, 1000, 2000, ..arr2, 3000, 4000] + println("spread arrays:") + println(arr3) + + let view : ArrayView[Int] = arr1[1:4] + println("array view:") + println(view) + println("view[0]:") + println(view[0]) + + arr1.push(6) // push an element to the end + println("updated array:") + println(arr1) +} \ No newline at end of file diff --git a/moonbit-tour/tour/chapter1_basic/lesson5_array/index.md b/moonbit-tour/tour/chapter1_basic/lesson5_array/index.md new file mode 100644 index 00000000..ba05f38c --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson5_array/index.md @@ -0,0 +1,27 @@ +# Array + +Array is a collection of elements, which have same type. + +You can create an array by *array literal syntax*, which is a comma-separated list +of elements enclosed in square brackets: `[1,2,3]`. + +You can also create an array by using the `Array::make` function, which takes a size and a element value, +as shown in the example, `Array::make(4,1)` creates an array equal to `[1,1,1,1]`. + +The `arr3` is an array consists of elements in `arr1`, elements in `arr2` and a few more numbers. +`..arr1` in square brackets is called *array spread*, which is used to expand an array into another array. + +## Array view + +You can use the `array[start:end]` syntax to get a view of the array from index `start` to `end` (inclusive). The `start` and `end` parts are optional. A view is a reference to the original array, it is used to avoid copying the array. + +## Mutability of array + +You may notice that we push an element to the array `arr1`, which changes the content of the array. How does that work if `arr1` is not marked with `mut`? + +The answer is that the elements inside the array are mutable, which is **defined by the array type itself**. The `mut` keyword in the `let` statement is only used to determine whether the variable name you defined can be reassigned. + +If you try to reassign `arr1` to another array like `arr1 = [1,2,3]`, you will get a compile error. + + + diff --git a/moonbit-tour/tour/chapter1_basic/lesson6_string/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson6_string/index.mbt new file mode 100644 index 00000000..3220c4bf --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson6_string/index.mbt @@ -0,0 +1,20 @@ +fn main { + let str = "Hello, World!" + // Access a character by index. + let c : Char = str[4] + println(c) + let c2 = 'o' + println(c == c2) + + // Use escape sequence. + println("\nHello, \tWorld!") + println("unicode \u{1F407} is a rabbit") + + // Concatenate two strings. + println(str + " Hello, MoonBit!") + + // Use string interpolation. + let moon = "Moon" + let bit = "Bit" + println("Use \{moon + bit}. Happy coding") +} \ No newline at end of file diff --git a/moonbit-tour/tour/chapter1_basic/lesson6_string/index.md b/moonbit-tour/tour/chapter1_basic/lesson6_string/index.md new file mode 100644 index 00000000..03f39a10 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson6_string/index.md @@ -0,0 +1,11 @@ +# String + +A string is a sequence of characters encoded in UTF-16. In MoonBit, strings are immutable, +which means you cannot change the elements inside a string. + +MoonBit supports C-style escape characters in strings and chars, such as `\n`, `\t`, `\\`, `\"`, and `\'`. + +Unicode escape characters are also supported. You can use `\u{}` to represent a Unicode character by its code point. + +MoonBit also supports string interpolation written like `\{variable}`, which allows you to embed expressions into strings. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.mbt new file mode 100644 index 00000000..7173dbc0 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.mbt @@ -0,0 +1,18 @@ +fn main { + // create Tuple + let tuple = (3.14, false, [1,2,3]) + let tuple2 : (Float, Bool, Int) = (2.1, true, 20) + println(tuple) + + // Accessing tuple elements + println(tuple.0) + println(tuple.2) + + // Tuple can also be destructured. + let (a, b, c) = f() + println("\{a}, \{b}, \{c}") +} + +fn f() -> (Int, Bool, Double) { + (1, false, 3.14) // return multiple values via tuple +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.md b/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.md new file mode 100644 index 00000000..5f3ecf58 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson7_tuple/index.md @@ -0,0 +1,15 @@ +# Tuple + +Tuple is a collection of values, which can have different types. It is immutable, +which means that once it is created, it cannot be changed. It is created using +parentheses. + +You can access the elements of tuple via the index: `tuple.0`, `tuple.1`, etc. + +Tuple can be destructured via syntax like `let (a,b) = tuple`, the `tuple` in +right side is a tuple with two elements, and `a` and `b` are the variables to +store the elements. This is a special use case of pattern matching. We will +introduce pattern matching in the later chapter. + +It's common to use tuple to return multiple values from a function. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson8_map/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson8_map/index.mbt new file mode 100644 index 00000000..71d29b6d --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson8_map/index.mbt @@ -0,0 +1,18 @@ +fn main { + // Create a map by map literal + let map1 = { "key1": 1, "key2": 2, "key3": 3 } + println(map1) + // You can also create a map by Map::of, from a list of key-value pairs + let map2 = Map::of([("key1", 1), ("key2", 2), ("key3", 3)]) + println(map1 == map2) + + // Access a value by key + println(map1["key1"]) + + // Update a value by key + map1["key1"] = 10 + println(map1) + + // test a if a key exists + println(map1.contains("key1")) +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson8_map/index.md b/moonbit-tour/tour/chapter1_basic/lesson8_map/index.md new file mode 100644 index 00000000..672c5a43 --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson8_map/index.md @@ -0,0 +1,16 @@ +# Map + +A map is a collection of key-value pairs. Each key is unique in the map, and all keys are associated with a value. It is a mutable collection. + +Expression like `{"key1": value1, "key2": value2}` represents a map, called a map +literal. If the key and value type of the map is basic type (`Int`, `String`, +`Bool`, `Double`, etc.), it can be written as map literal. + +In other cases, you can create the map using the `Map::of` function. It takes a +array of two elements tuple, the first element is the key, and the second element +is the value. + +Values in a map can be accessed by the key using the `map[key]` syntax. + +The elements in a map can be updated by `map[key] = new_value`. + diff --git a/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.mbt b/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.mbt new file mode 100644 index 00000000..8389db9b --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.mbt @@ -0,0 +1,20 @@ +fn main { + let array = [1, 2, 3] + + println("for loop:") + for i = 0; i < array.length(); i = i + 1 { + println("array[\{i}]: \{array[i]}") + } + + println("\nwhile loop:") + let mut j = 0 + while true { + println("array[\{j}]: \{array[j]}") + j = j + 1 + if j < array.length() { + continue + } else { + break + } + } +} diff --git a/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.md b/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.md new file mode 100644 index 00000000..a1a457ca --- /dev/null +++ b/moonbit-tour/tour/chapter1_basic/lesson9_for_while/index.md @@ -0,0 +1,33 @@ +# Control flows + +In this example, we use for loops, while loops, and if-else expression to +iterate over an array. + +## For loop + +The for loop is analogous to a C-style for loop: + +``` +for init; condition; increment { + // loop body +} +``` + + +The loop initializes the variables `init` before it starts. When the loop starts, +it tests the `condition` and executes the loop body if the `condition` is true. +After that, it runs the `increment` expression and repeats the process until the +condition is false. + +The for loop in MoonBit is more expressive than the C-style for loop. We will +explain it in the following chapters. + +## While loop and if-else expression + +The while loop is also similar to the C-style while loop. + +It tests the condition before executing the loop body. If the condition is true, +it executes the loop body and repeats the process until the condition is false. + +MoonBit also support `continue` and `break` in the loop. + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.mbt new file mode 100644 index 00000000..c4c67be7 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.mbt @@ -0,0 +1,16 @@ +struct Point { + x : Int + y : Int +} derive(Show) + +fn main { + let tuple = (1, false, 3.14) + let array = [1, 2, 3] + let record = { x: 5, y: 6 } + let (a, b, c) = tuple + println("a:\{a}, b:\{b}, c:\{c}") + let [d, e, f] = array + println("d:\{d}, e:\{e}, f:\{f}") + let { x, y } = record + println("x:\{x}, y:\{y}") +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.md new file mode 100644 index 00000000..f87eab42 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson1_intro/index.md @@ -0,0 +1,9 @@ +# Pattern Matching + +We have seen pattern matching in the previous example. +It's a powerful feature in MoonBit that can be used in many places. It can help you test conditions conveniently and effectively, making your program more precise and robust. + +In this example, we give some basic use cases of pattern matching. Some other languages call it "destructuring", a way to extract values from a complex data structure. + +"Destructuring" is just a subset of this feature. +In MoonBit, almost every type you can construct can have a form to "destruct", which we call a *pattern*. diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.mbt new file mode 100644 index 00000000..a61e4d26 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.mbt @@ -0,0 +1,45 @@ +enum Resource { + TextFile(String) + Image(String) + Folder(Map[String, Resource]) +} + +let assets : Resource = Folder( + { + "readme.md": TextFile("hello world"), + "image.jpg": Image("https://someurl1"), + "folder1": Folder( + { + "src1.mbt": TextFile("some code1"), + "src2.mbt": TextFile("some MoonBit code 2"), + }, + ), + "folder2": Folder( + { + "src3.mbt": TextFile("some code3"), + "image2.jpg": Image("https://someurl2"), + }, + ), + }, +) + +fn main { + let Folder(top_level) = assets + println("we have items in the root folder:\n \{top_level.keys()}") + println("resource count: \{count(assets)}") +} + +fn count(res : Resource) -> Int { + match res { + Folder(map) => { + let mut sum = 0 + for name, res in map { + sum += count(res) + } + sum + } + TextFile(_) => 1 + Image(_) => 1 + } +} + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md new file mode 100644 index 00000000..1f9d6c81 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md @@ -0,0 +1,22 @@ +# Pattern in let and match + +There are two common place to use pattern: let and match. + +We defined a `Resource` type, it describes a file system. The `Resource` can be a text file, an image, or a folder associated with more files. + +## Pattern in let statement + +In a let statement, the left side of `=` can be a pattern, we knowns that assets is a folder so just use `let Folder(top_level) = assets` to match it and extract the inside map. + +You may notice that there is a partial match warning because the resource can also be `Image` or `TextFile`. **Partial match make the program more fragile: the pattern matching will fail in other cases and lead to the program aborting.** Practically, the match expression is used more frequently. + +## Pattern in match expression + +The `count` function traverse the input `res` recursively and return the count of `Image` and `TextFile`, using match expression. + +Match expression have *first match semantic*. It will try to find the first matched pattern from first case to last case, and execute the e + +The match expression has a `Int` return value beacause all the case result in same value type `Int`. + +Patterns can be nested. If you don't care about the data associated with the enum constructor, you can use the *any pattern*, written as `_`, instead of introducing a new variable. It means discarding that value. + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.mbt new file mode 100644 index 00000000..910e0dc2 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.mbt @@ -0,0 +1,39 @@ +fn fibonacci(x : Int) -> Int { + // assume x > 0 + match x { + 1 => 1 + 2 => 2 + _ => fibonacci(x - 1) + fibonacci(x - 2) + } +} + +fn negate(x : Bool) -> Bool { + match x { + true => false + false => true + } +} + +fn read(x : Char) -> Int? { + match x { + '1' => Some(1) + '2' => Some(2) + '3' => Some(3) + _ => None + } +} + +fn contents(file : String) -> String? { + match file { + "README" => Some("# hello world") + "hello.mbt" => Some("println(\"hello world\")") + _ => None + } +} + +fn main { + println("fib(5): \{fibonacci(5)}") + println("negate(false): \{negate(false)}") + println("read('2'): \{read('2')}, read('5'): \{read('5')}") + println(contents("README")) +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.md new file mode 100644 index 00000000..48a5872e --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson3_constant_pattern/index.md @@ -0,0 +1,4 @@ +# Constant pattern + +Almost all constant in MoonBit can be represented as a constant pattern. + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.mbt new file mode 100644 index 00000000..167c3535 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.mbt @@ -0,0 +1,20 @@ +fn logical_and(x : Bool, y : Bool) -> Bool { + match (x, y) { + (true, true) => true + (false, _) => false + (_, false) => false + } +} + +fn logical_or(x : Bool, y : Bool) -> Bool { + match (x, y) { + (true, _) => true + (_, true) => true + _ => false + } +} + +fn main { + println("true and false: \{logical_and(true, false)}") + println("true or false: \{logical_or(true, false)}") +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md new file mode 100644 index 00000000..227aa08b --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md @@ -0,0 +1,9 @@ +# Tuple pattern + +Use tuple patten to match multiple conditions at once. + +This example simulates *logical and* and *logical or* operation via pattern matching. + +In this scenario, the overhead of creating the tuple in the condition will be optimized out by the compiler. + + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.mbt new file mode 100644 index 00000000..b9696611 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.mbt @@ -0,0 +1,6 @@ +fn main { + let (a, (b, _) as tuple, _) as triple = (1, (true, 5), false) + println("a: \{a}, b: \{b}") + println("tuple: \{tuple}") + println("triple: \{triple}") +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.md new file mode 100644 index 00000000..2399481a --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson5_alias_pattern/index.md @@ -0,0 +1,7 @@ +# Alias Pattern + +Any pattern can be bound to an extra new name via an *alias pattern*. The syntax is `pattern as name`. In this example, we use this feature to preserve the original tuples while pattern matching them. + + + + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.mbt new file mode 100644 index 00000000..b17a0099 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.mbt @@ -0,0 +1,17 @@ +fn main { + let array = [1, 2, 3, 4, 5, 6] + let [a, b, ..] = array + let [.., c, d] = array + let [e, .., f] = array + println("a: \{a}, b: \{b}") + println("c: \{c}, d: \{d}") + println("e: \{e}, f: \{f}") + println("sum of array: \{sum(array[:])}") +} + +fn sum(array : ArrayView[Int]) -> Int { + match array { + [] => 0 + [x, .. as xs] => x + sum(xs) + } +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.md new file mode 100644 index 00000000..b6009810 --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson6_array_pattern/index.md @@ -0,0 +1,11 @@ +# Array Pattern + +Array pattern is a sequence of patterns enclosed in `[]` that matches an array. + +You can use `..` to match the rest of the array at the start or end, or the middle elements of the array. + +In an array pattern, the `..` part can be bound to a new variable via an *alias pattern*. The type of that variable is `ArrayView`. The `sum` function uses this feature to calculate the sum of the array recursively. + + + + diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.mbt b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.mbt new file mode 100644 index 00000000..18945b1a --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.mbt @@ -0,0 +1,23 @@ +enum Color { + Blue + Red + Green + RGB(Int, Int, Int) + RGBA(Int, Int, Int, Int) +} derive(Show) + +fn get_green(color : Color) -> Int { + match color { + Blue | Red => 0 + Green => 255 + RGB(_, g, _) | RGBA(_, g, _, _) => g + } +} + +fn main { + println("The green part of Red is \{get_green(Red)}") + println("The green part of Green is \{get_green(Green)}") + println("The green part of Blue is \{get_green(Blue)}") + println("The green part of RGB(0,0,0) is \{get_green(RGB(0,0,0))}") + println("The green part of RGBA(50,5,0,6) is \{get_green(RGBA(50,5,0,6))}") +} diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md new file mode 100644 index 00000000..773ac50a --- /dev/null +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md @@ -0,0 +1,6 @@ +# Or Pattern + +It's a little verbose if any two cases have common datas and same way to handle them. For example, here is a enum `RGB` and a function `get_green` to get the green value from it. + +The `RGB` and `RGBA` cases can be combined as well. In an *or pattern*, the sub-patterns can introduce new variables, but they must be of the same type and have the same name in all sub-patterns. This restriction allows us to handle them uniformly. + diff --git a/moonbit-tour/tour/index.mbt b/moonbit-tour/tour/index.mbt new file mode 100644 index 00000000..a8fc1076 --- /dev/null +++ b/moonbit-tour/tour/index.mbt @@ -0,0 +1,3 @@ +fn main { + println("hello") +} \ No newline at end of file diff --git a/moonbit-tour/tour/index.md b/moonbit-tour/tour/index.md new file mode 100644 index 00000000..ecc232a6 --- /dev/null +++ b/moonbit-tour/tour/index.md @@ -0,0 +1,9 @@ +# Welcome to the MoonBit language tour! 💫 + +This tour covers all aspects of the MoonBit language, and assumes you have some prior programming experience. It should teach you everything you need to write real programs in MoonBit. + +The tour is interactive! The code shown is editable and will be compiled and evaluated as you type. Anything you print using `println` will be shown in the bottom section. To evaluate MoonBit code the tour compiles MoonBit to wasm gc and runs it, all entirely within your browser window. + +If at any point you get stuck or have a question do not hesitate to ask in the MoonBit Discord server. We're here to help, and if you find something confusing then it's likely others will too, and we want to know about it so we can improve the tour. + +OK, let's go. Click "Next" to get started, or click "Contents" to jump to a specific topic. diff --git a/moonbit-tour/tsconfig.json b/moonbit-tour/tsconfig.json new file mode 100644 index 00000000..aab93282 --- /dev/null +++ b/moonbit-tour/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "strictNullChecks": true, + "strictBindCallApply": true, + "strictBuiltinIteratorReturn": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true + }, + "include": ["src"] +} diff --git a/moonbit-tour/vite.config.ts b/moonbit-tour/vite.config.ts new file mode 100644 index 00000000..0fe98582 --- /dev/null +++ b/moonbit-tour/vite.config.ts @@ -0,0 +1,27 @@ +import { defineConfig } from "vite"; +import { BASE } from "./dev/const"; +import generatePlugin from "./dev/generate-plugin"; +import indexPlugin from "./dev/index-plugin"; + +export default defineConfig({ + base: BASE, + build: { + rollupOptions: { + output: { + entryFileNames: `assets/[name].js`, + chunkFileNames: `assets/[name].js`, + assetFileNames: `assets/[name].[ext]`, + }, + }, + }, + worker: { + rollupOptions: { + output: { + entryFileNames: `assets/[name].js`, + chunkFileNames: `assets/[name].js`, + assetFileNames: `assets/[name].[ext]`, + }, + }, + }, + plugins: [indexPlugin(), generatePlugin()], +}); diff --git a/package.json b/package.json index a122dac4..fbae49eb 100644 --- a/package.json +++ b/package.json @@ -7,5 +7,6 @@ "devDependencies": { "npm-run-all": "^4.1.5", "prettier": "3.3.3" - } + }, + "packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28341954..a7a3f067 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,7 +65,7 @@ importers: version: link:../packages/rehypeshiki '@types/node': specifier: ^20.14.11 - version: 22.3.0 + version: 20.17.10 '@types/react': specifier: ^18.2.0 version: 18.3.3 @@ -79,6 +79,64 @@ importers: specifier: ~5.5.4 version: 5.5.4 + moonbit-tour: + dependencies: + '@moonbit/moonpad-monaco': + specifier: ^0.1.202412060 + version: 0.1.202412060(monaco-editor-core@0.52.2) + monaco-editor-core: + specifier: ^0.52.0 + version: 0.52.2 + devDependencies: + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.16) + '@types/node': + specifier: ^22.10.1 + version: 22.10.2 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.49) + postcss: + specifier: ^8.4.49 + version: 8.4.49 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + prettier-plugin-organize-imports: + specifier: ^4.1.0 + version: 4.1.0(prettier@3.4.2)(typescript@5.6.3) + prettier-plugin-tailwindcss: + specifier: ^0.6.9 + version: 0.6.9(prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.6.3))(prettier@3.4.2) + rehype-stringify: + specifier: ^10.0.1 + version: 10.0.1 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 + remark-rehype: + specifier: ^11.1.1 + version: 11.1.1 + shiki: + specifier: ^1.24.1 + version: 1.24.2 + tailwindcss: + specifier: ^3.4.16 + version: 3.4.16 + tsx: + specifier: ^4.19.2 + version: 4.19.2 + typescript: + specifier: ~5.6.2 + version: 5.6.3 + unified: + specifier: ^11.0.5 + version: 11.0.5 + vite: + specifier: ^6.0.1 + version: 6.0.3(@types/node@22.10.2)(jiti@1.21.6)(terser@5.31.6)(tsx@4.19.2)(yaml@2.6.1) + packages/rehypeshiki: dependencies: '@shikijs/transformers': @@ -102,7 +160,7 @@ importers: version: 3.0.4 '@types/node': specifier: ^20.14.11 - version: 22.3.0 + version: 20.17.10 mdast-util-to-hast: specifier: ^13.2.0 version: 13.2.0 @@ -120,10 +178,10 @@ importers: version: 11.1.0 unbuild: specifier: ^2.0.0 - version: 2.0.0(typescript@5.5.4) + version: 2.0.0(typescript@5.6.3) vitest: specifier: ^2.0.3 - version: 2.0.5(@types/node@22.3.0)(jsdom@24.1.1)(terser@5.31.6) + version: 2.0.5(@types/node@20.17.10)(jsdom@24.1.1)(terser@5.31.6) packages: @@ -211,6 +269,10 @@ packages: '@algolia/transporter@4.24.0': resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1096,6 +1158,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -1114,6 +1182,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -1132,6 +1206,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -1150,6 +1230,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -1168,6 +1254,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -1186,6 +1278,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -1204,6 +1302,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -1222,6 +1326,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -1240,6 +1350,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -1258,6 +1374,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -1276,6 +1398,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -1294,6 +1422,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -1312,6 +1446,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -1330,6 +1470,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -1348,6 +1494,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -1366,6 +1518,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -1384,6 +1542,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -1402,12 +1566,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.0': resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -1426,6 +1602,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -1444,6 +1626,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -1462,6 +1650,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -1480,6 +1674,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -1498,12 +1698,22 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1560,6 +1770,17 @@ packages: '@moonbit/analyzer@0.1.202408140': resolution: {integrity: sha512-p1bBR9G7vnuBzKDF/y7MENA8ks4BlyxQX6Pdu9/WezqMs6MZQL0KbwL1z1Oo1MGuxYXLJKV0mXUX2NXpqy2n1A==} + '@moonbit/analyzer@0.1.202412100': + resolution: {integrity: sha512-DmAkytsK/btbYa32REv28rWpvBZfJ9/HSvADhkLV5kXmpiIvOtpzmjzrYPjBmNhY+JqqKRjAC7YeXYMBNuGoxQ==} + + '@moonbit/moonc-worker@0.1.202412100': + resolution: {integrity: sha512-InT6BHHEoP0Yj06uXahtoQs8oqSDFXY4R1+bwfWeRrRIIJJbVQ8PC2QmQDGEk0ZV6DsAK40qBcvoWe7ZN9p3eg==} + + '@moonbit/moonpad-monaco@0.1.202412060': + resolution: {integrity: sha512-evvUrxHIb/J5tlZOChlqPAV68qwCA+Ce988O7QjeS3Lds0nUMunOAB/iv6Nmd6eq7VCDcwlrBQgqws9zWdTmyA==} + peerDependencies: + monaco-editor-core: ^0.52.0 + '@moonbit/moonpad@0.0.8': resolution: {integrity: sha512-ZP0EvnHBP+IZX0B58sqS3FSBhzrPUbd0pe5ZgIsekXkqnxvkdvZ0c5ortGvF1MGCrim3u7NO9wpDjs0QJPpVLQ==} @@ -1575,6 +1796,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -1649,87 +1874,197 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.28.1': + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.18.1': resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.28.1': + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.18.1': resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.28.1': + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.18.1': resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.28.1': + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.28.1': + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.28.1': + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.18.1': resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.18.1': resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.28.1': + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.18.1': resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.28.1': + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.18.1': resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.18.1': resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.28.1': + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.18.1': resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.28.1': + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.18.1': resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.28.1': + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.18.1': resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.28.1': + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.18.1': resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.28.1': + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.18.1': resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.28.1': + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + cpu: [x64] + os: [win32] + '@shikijs/core@1.13.0': resolution: {integrity: sha512-Mj5NVfbAXcD1GnwOTSPl8hBn/T8UDpfFQTptp+p41n/CbUcJtOq98WaRD7Lz3hCglYotUTHUWtzu3JhK6XlkAA==} + '@shikijs/core@1.24.2': + resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} + + '@shikijs/engine-javascript@1.24.2': + resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} + + '@shikijs/engine-oniguruma@1.24.2': + resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} + '@shikijs/transformers@1.13.0': resolution: {integrity: sha512-51aLIT6a93rVGoTxl2+p6hb7ILbTA4p/unoibEAjnPMzHto4cqxhuHyDVgtQur5ANpGsL3ihSGKaZDrpcWH8vQ==} + '@shikijs/types@1.24.2': + resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} + + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -1835,6 +2170,11 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -1869,6 +2209,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.19.5': resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} @@ -1926,8 +2269,11 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.3.0': - resolution: {integrity: sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==} + '@types/node@20.17.10': + resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} + + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -2159,6 +2505,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2209,6 +2558,13 @@ packages: peerDependencies: postcss: ^8.1.0 + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -2287,6 +2643,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2325,6 +2686,10 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -2339,6 +2704,9 @@ packages: caniuse-lite@1.0.30001642: resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} + caniuse-lite@1.0.30001688: + resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2454,6 +2822,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2464,6 +2835,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -2835,10 +3210,16 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -2888,6 +3269,12 @@ packages: electron-to-chromium@1.4.829: resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==} + electron-to-chromium@1.5.73: + resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2964,10 +3351,19 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} @@ -3154,6 +3550,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + fork-ts-checker-webpack-plugin@6.5.3: resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -3263,6 +3663,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3373,6 +3777,9 @@ packages: hast-util-to-html@9.0.1: resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -3791,6 +4198,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3888,6 +4298,10 @@ packages: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3919,12 +4333,21 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -3948,6 +4371,9 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4179,6 +4605,10 @@ packages: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.33.0: resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} engines: {node: '>= 0.6'} @@ -4236,9 +4666,17 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mkdist@1.5.4: resolution: {integrity: sha512-GEmKYJG5K1YGFIq3t0K3iihZ8FTgXphLf/4UjbmpXIAtBFn4lEjXk3pXNTSfy7EtcEXhp2Nn1vzw5pIus6RY3g==} hasBin: true @@ -4257,6 +4695,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + monaco-editor-core@0.52.2: + resolution: {integrity: sha512-5TOyTUymNx7jB24TGP4Qs5UEVrntDKSMzDUvW3ADaI1CFRO1t7FPhbT2u4m3iIKZf85zTM+mkCxiUSgj+v/YtA==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -4278,6 +4719,9 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4307,6 +4751,9 @@ packages: node-releases@2.0.17: resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4348,6 +4795,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.2: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} @@ -4382,6 +4833,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-to-es@0.7.0: + resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -4430,6 +4884,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -4502,6 +4959,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -4532,6 +4993,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4541,10 +5005,18 @@ packages: engines: {node: '>=0.10'} hasBin: true + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} @@ -4650,6 +5122,30 @@ packages: peerDependencies: postcss: ^8.4.31 + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-loader@7.3.4: resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} engines: {node: '>= 14.15.0'} @@ -4765,6 +5261,12 @@ packages: peerDependencies: postcss: ^8.2.14 + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + postcss-normalize-charset@6.0.2: resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -4915,10 +5417,18 @@ packages: peerDependencies: postcss: ^8.4.31 + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + postcss-selector-parser@6.1.1: resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + postcss-sort-media-queries@5.2.0: resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} engines: {node: '>=14.0.0'} @@ -4962,11 +5472,85 @@ packages: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + prettier-plugin-organize-imports@4.1.0: + resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==} + peerDependencies: + prettier: '>=2.0' + typescript: '>=2.9' + vue-tsc: ^2.1.0 + peerDependenciesMeta: + vue-tsc: + optional: true + + prettier-plugin-tailwindcss@0.6.9: + resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -5125,6 +5709,9 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} @@ -5164,6 +5751,15 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regex-recursion@4.3.0: + resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -5190,6 +5786,9 @@ packages: rehype-stringify@10.0.0: resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -5216,6 +5815,9 @@ packages: remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -5283,6 +5885,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} @@ -5439,6 +6046,9 @@ packages: shiki@1.13.0: resolution: {integrity: sha512-e0dWfnONbEv6xl7FJy3XIhsVHQ/65XHDZl92+6H9+4xWjfdo7pmkqG7Kg47KWtDiEtzM5Z+oEfb4vtRvoZ/X9w==} + shiki@1.24.2: + resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -5491,6 +6101,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -5634,6 +6248,11 @@ packages: peerDependencies: postcss: ^8.4.31 + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5661,6 +6280,11 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwindcss@3.4.16: + resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} + engines: {node: '>=14.0.0'} + hasBin: true + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -5698,6 +6322,13 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -5752,6 +6383,9 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} @@ -5760,6 +6394,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -5796,6 +6435,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -5811,8 +6455,11 @@ packages: typescript: optional: true - undici-types@6.18.2: - resolution: {integrity: sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -5884,6 +6531,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-notifier@6.0.2: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} @@ -5974,6 +6627,46 @@ packages: terser: optional: true + vite@6.0.3: + resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@2.0.5: resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6013,6 +6706,12 @@ packages: vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-oniguruma@2.0.1: + resolution: {integrity: sha512-poJU8iHIWnC3vgphJnrLZyI3YdqRlR27xzqDmpPXYzA93R4Gk8z7T6oqDzDoHjoikA2aS82crdXFkjELCdJsjQ==} + + vscode-textmate@9.1.0: + resolution: {integrity: sha512-lxKSVp2DkFOx9RDAvpiYUrB9/KT1fAfi1aE8CBGstP8N7rLF+Seifj8kDA198X0mYj1CjQUC+81+nQf8CO0nVA==} + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -6130,6 +6829,10 @@ packages: wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} @@ -6186,6 +6889,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -6321,6 +7029,8 @@ snapshots: '@algolia/logger-common': 4.24.0 '@algolia/requester-common': 4.24.0 + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -7354,9 +8064,9 @@ snapshots: '@docusaurus/cssnano-preset@3.5.2': dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.4.39) - postcss: 8.4.39 - postcss-sort-media-queries: 5.2.0(postcss@8.4.39) + cssnano-preset-advanced: 6.1.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-sort-media-queries: 5.2.0(postcss@8.4.49) tslib: 2.6.3 '@docusaurus/logger@3.5.2': @@ -7929,6 +8639,9 @@ snapshots: '@esbuild/aix-ppc64@0.23.0': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.19.12': optional: true @@ -7938,6 +8651,9 @@ snapshots: '@esbuild/android-arm64@0.23.0': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.19.12': optional: true @@ -7947,6 +8663,9 @@ snapshots: '@esbuild/android-arm@0.23.0': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.19.12': optional: true @@ -7956,6 +8675,9 @@ snapshots: '@esbuild/android-x64@0.23.0': optional: true + '@esbuild/android-x64@0.24.0': + optional: true + '@esbuild/darwin-arm64@0.19.12': optional: true @@ -7965,6 +8687,9 @@ snapshots: '@esbuild/darwin-arm64@0.23.0': optional: true + '@esbuild/darwin-arm64@0.24.0': + optional: true + '@esbuild/darwin-x64@0.19.12': optional: true @@ -7974,6 +8699,9 @@ snapshots: '@esbuild/darwin-x64@0.23.0': optional: true + '@esbuild/darwin-x64@0.24.0': + optional: true + '@esbuild/freebsd-arm64@0.19.12': optional: true @@ -7983,6 +8711,9 @@ snapshots: '@esbuild/freebsd-arm64@0.23.0': optional: true + '@esbuild/freebsd-arm64@0.24.0': + optional: true + '@esbuild/freebsd-x64@0.19.12': optional: true @@ -7992,6 +8723,9 @@ snapshots: '@esbuild/freebsd-x64@0.23.0': optional: true + '@esbuild/freebsd-x64@0.24.0': + optional: true + '@esbuild/linux-arm64@0.19.12': optional: true @@ -8001,6 +8735,9 @@ snapshots: '@esbuild/linux-arm64@0.23.0': optional: true + '@esbuild/linux-arm64@0.24.0': + optional: true + '@esbuild/linux-arm@0.19.12': optional: true @@ -8010,6 +8747,9 @@ snapshots: '@esbuild/linux-arm@0.23.0': optional: true + '@esbuild/linux-arm@0.24.0': + optional: true + '@esbuild/linux-ia32@0.19.12': optional: true @@ -8019,6 +8759,9 @@ snapshots: '@esbuild/linux-ia32@0.23.0': optional: true + '@esbuild/linux-ia32@0.24.0': + optional: true + '@esbuild/linux-loong64@0.19.12': optional: true @@ -8028,6 +8771,9 @@ snapshots: '@esbuild/linux-loong64@0.23.0': optional: true + '@esbuild/linux-loong64@0.24.0': + optional: true + '@esbuild/linux-mips64el@0.19.12': optional: true @@ -8037,6 +8783,9 @@ snapshots: '@esbuild/linux-mips64el@0.23.0': optional: true + '@esbuild/linux-mips64el@0.24.0': + optional: true + '@esbuild/linux-ppc64@0.19.12': optional: true @@ -8046,6 +8795,9 @@ snapshots: '@esbuild/linux-ppc64@0.23.0': optional: true + '@esbuild/linux-ppc64@0.24.0': + optional: true + '@esbuild/linux-riscv64@0.19.12': optional: true @@ -8055,6 +8807,9 @@ snapshots: '@esbuild/linux-riscv64@0.23.0': optional: true + '@esbuild/linux-riscv64@0.24.0': + optional: true + '@esbuild/linux-s390x@0.19.12': optional: true @@ -8064,6 +8819,9 @@ snapshots: '@esbuild/linux-s390x@0.23.0': optional: true + '@esbuild/linux-s390x@0.24.0': + optional: true + '@esbuild/linux-x64@0.19.12': optional: true @@ -8073,6 +8831,9 @@ snapshots: '@esbuild/linux-x64@0.23.0': optional: true + '@esbuild/linux-x64@0.24.0': + optional: true + '@esbuild/netbsd-x64@0.19.12': optional: true @@ -8082,9 +8843,15 @@ snapshots: '@esbuild/netbsd-x64@0.23.0': optional: true + '@esbuild/netbsd-x64@0.24.0': + optional: true + '@esbuild/openbsd-arm64@0.23.0': optional: true + '@esbuild/openbsd-arm64@0.24.0': + optional: true + '@esbuild/openbsd-x64@0.19.12': optional: true @@ -8094,6 +8861,9 @@ snapshots: '@esbuild/openbsd-x64@0.23.0': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.19.12': optional: true @@ -8103,6 +8873,9 @@ snapshots: '@esbuild/sunos-x64@0.23.0': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.19.12': optional: true @@ -8112,6 +8885,9 @@ snapshots: '@esbuild/win32-arm64@0.23.0': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.19.12': optional: true @@ -8121,6 +8897,9 @@ snapshots: '@esbuild/win32-ia32@0.23.0': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.19.12': optional: true @@ -8130,12 +8909,24 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true + '@esbuild/win32-x64@0.24.0': + optional: true + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -8145,7 +8936,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -8207,7 +8998,7 @@ snapshots: periscopic: 3.1.0 remark-mdx: 3.0.1 remark-parse: 11.0.0 - remark-rehype: 11.1.0 + remark-rehype: 11.1.1 source-map: 0.7.4 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 @@ -8225,6 +9016,21 @@ snapshots: '@moonbit/analyzer@0.1.202408140': {} + '@moonbit/analyzer@0.1.202412100': {} + + '@moonbit/moonc-worker@0.1.202412100': {} + + '@moonbit/moonpad-monaco@0.1.202412060(monaco-editor-core@0.52.2)': + dependencies: + '@moonbit/analyzer': 0.1.202412100 + '@moonbit/moonc-worker': 0.1.202412100 + comlink: 4.4.2 + monaco-editor-core: 0.52.2 + vscode-jsonrpc: 8.2.1 + vscode-languageserver-protocol: 3.17.5 + vscode-oniguruma: 2.0.1 + vscode-textmate: 9.1.0 + '@moonbit/moonpad@0.0.8(@lezer/common@1.2.1)': dependencies: '@codemirror/autocomplete': 6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.32.0)(@lezer/common@1.2.1) @@ -8254,6 +9060,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@pkgjs/parseargs@0.11.0': + optional: true + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -8320,59 +9129,143 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.18.1': optional: true + '@rollup/rollup-android-arm-eabi@4.28.1': + optional: true + '@rollup/rollup-android-arm64@4.18.1': optional: true + '@rollup/rollup-android-arm64@4.28.1': + optional: true + '@rollup/rollup-darwin-arm64@4.18.1': optional: true + '@rollup/rollup-darwin-arm64@4.28.1': + optional: true + '@rollup/rollup-darwin-x64@4.18.1': optional: true + '@rollup/rollup-darwin-x64@4.28.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.28.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.28.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.18.1': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.18.1': optional: true + '@rollup/rollup-linux-arm64-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.18.1': optional: true + '@rollup/rollup-linux-arm64-musl@4.28.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.18.1': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.18.1': optional: true + '@rollup/rollup-linux-s390x-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.18.1': optional: true + '@rollup/rollup-linux-x64-gnu@4.28.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.18.1': optional: true + '@rollup/rollup-linux-x64-musl@4.28.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.18.1': optional: true + '@rollup/rollup-win32-arm64-msvc@4.28.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.18.1': optional: true + '@rollup/rollup-win32-ia32-msvc@4.28.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.18.1': optional: true + '@rollup/rollup-win32-x64-msvc@4.28.1': + optional: true + '@shikijs/core@1.13.0': dependencies: '@types/hast': 3.0.4 + '@shikijs/core@1.24.2': + dependencies: + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.24.2': + dependencies: + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.7.0 + + '@shikijs/engine-oniguruma@1.24.2': + dependencies: + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/transformers@1.13.0': dependencies: shiki: 1.13.0 + '@shikijs/types@1.24.2': + dependencies: + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.1': {} + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -8490,6 +9383,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.16)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.16 + '@trysound/sax@0.2.0': {} '@types/acorn@4.0.6': @@ -8499,20 +9400,20 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.5 - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/connect@3.4.38': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/debug@4.1.12': dependencies: @@ -8534,9 +9435,11 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -8564,7 +9467,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/istanbul-lib-coverage@2.0.6': {} @@ -8590,13 +9493,17 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/node@17.0.45': {} - '@types/node@22.3.0': + '@types/node@20.17.10': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.10.2': dependencies: - undici-types: 6.18.2 + undici-types: 6.20.0 '@types/parse-json@4.0.2': {} @@ -8636,12 +9543,12 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/serve-index@1.9.4': dependencies: @@ -8650,12 +9557,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/unist@2.0.10': {} @@ -8663,7 +9570,7 @@ snapshots: '@types/ws@8.5.11': dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 '@types/yargs-parser@21.0.3': {} @@ -8889,6 +9796,8 @@ snapshots: ansi-styles@6.2.1: {} + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -8941,6 +9850,16 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001688 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -9056,6 +9975,13 @@ snapshots: node-releases: 2.0.17 update-browserslist-db: 1.1.0(browserslist@4.23.2) + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001688 + electron-to-chromium: 1.5.73 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + buffer-from@1.1.2: {} builtin-modules@3.3.0: {} @@ -9093,6 +10019,8 @@ snapshots: pascal-case: 3.1.2 tslib: 2.6.3 + camelcase-css@2.0.1: {} + camelcase@6.3.0: {} camelcase@7.0.1: {} @@ -9106,6 +10034,8 @@ snapshots: caniuse-lite@1.0.30001642: {} + caniuse-lite@1.0.30001688: {} + ccount@2.0.1: {} chai@5.1.1: @@ -9227,12 +10157,16 @@ snapshots: delayed-stream: 1.0.0 optional: true + comlink@4.4.2: {} + comma-separated-tokens@2.0.3: {} commander@10.0.1: {} commander@2.20.3: {} + commander@4.1.1: {} + commander@5.1.0: {} commander@7.2.0: {} @@ -9359,14 +10293,18 @@ snapshots: dependencies: postcss: 8.4.39 + css-declaration-sorter@7.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + css-loader@6.11.0(webpack@5.93.0): dependencies: - icss-utils: 5.1.0(postcss@8.4.39) - postcss: 8.4.39 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.39) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.39) - postcss-modules-scope: 3.2.0(postcss@8.4.39) - postcss-modules-values: 4.0.0(postcss@8.4.39) + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.49) + postcss-modules-scope: 3.2.0(postcss@8.4.49) + postcss-modules-values: 4.0.0(postcss@8.4.49) postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: @@ -9375,9 +10313,9 @@ snapshots: css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.93.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.4.39) + cssnano: 6.1.2(postcss@8.4.49) jest-worker: 29.7.0 - postcss: 8.4.39 + postcss: 8.4.49 schema-utils: 4.2.0 serialize-javascript: 6.0.2 webpack: 5.93.0 @@ -9414,16 +10352,16 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-advanced@6.1.2(postcss@8.4.39): + cssnano-preset-advanced@6.1.2(postcss@8.4.49): dependencies: - autoprefixer: 10.4.19(postcss@8.4.39) + autoprefixer: 10.4.20(postcss@8.4.49) browserslist: 4.23.2 - cssnano-preset-default: 6.1.2(postcss@8.4.39) - postcss: 8.4.39 - postcss-discard-unused: 6.0.5(postcss@8.4.39) - postcss-merge-idents: 6.0.3(postcss@8.4.39) - postcss-reduce-idents: 6.0.3(postcss@8.4.39) - postcss-zindex: 6.0.2(postcss@8.4.39) + cssnano-preset-default: 6.1.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-discard-unused: 6.0.5(postcss@8.4.49) + postcss-merge-idents: 6.0.3(postcss@8.4.49) + postcss-reduce-idents: 6.0.3(postcss@8.4.49) + postcss-zindex: 6.0.2(postcss@8.4.49) cssnano-preset-default@6.1.2(postcss@8.4.39): dependencies: @@ -9459,47 +10397,85 @@ snapshots: postcss-svgo: 6.0.3(postcss@8.4.39) postcss-unique-selectors: 6.0.4(postcss@8.4.39) - cssnano-preset-default@7.0.4(postcss@8.4.39): + cssnano-preset-default@6.1.2(postcss@8.4.49): dependencies: browserslist: 4.23.2 - css-declaration-sorter: 7.2.0(postcss@8.4.39) - cssnano-utils: 5.0.0(postcss@8.4.39) - postcss: 8.4.39 - postcss-calc: 10.0.0(postcss@8.4.39) - postcss-colormin: 7.0.1(postcss@8.4.39) - postcss-convert-values: 7.0.2(postcss@8.4.39) - postcss-discard-comments: 7.0.1(postcss@8.4.39) - postcss-discard-duplicates: 7.0.0(postcss@8.4.39) - postcss-discard-empty: 7.0.0(postcss@8.4.39) - postcss-discard-overridden: 7.0.0(postcss@8.4.39) - postcss-merge-longhand: 7.0.2(postcss@8.4.39) - postcss-merge-rules: 7.0.2(postcss@8.4.39) - postcss-minify-font-values: 7.0.0(postcss@8.4.39) - postcss-minify-gradients: 7.0.0(postcss@8.4.39) - postcss-minify-params: 7.0.1(postcss@8.4.39) - postcss-minify-selectors: 7.0.2(postcss@8.4.39) - postcss-normalize-charset: 7.0.0(postcss@8.4.39) - postcss-normalize-display-values: 7.0.0(postcss@8.4.39) - postcss-normalize-positions: 7.0.0(postcss@8.4.39) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.39) - postcss-normalize-string: 7.0.0(postcss@8.4.39) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.39) - postcss-normalize-unicode: 7.0.1(postcss@8.4.39) - postcss-normalize-url: 7.0.0(postcss@8.4.39) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.39) - postcss-ordered-values: 7.0.1(postcss@8.4.39) - postcss-reduce-initial: 7.0.1(postcss@8.4.39) - postcss-reduce-transforms: 7.0.0(postcss@8.4.39) - postcss-svgo: 7.0.1(postcss@8.4.39) - postcss-unique-selectors: 7.0.1(postcss@8.4.39) + css-declaration-sorter: 7.2.0(postcss@8.4.49) + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-calc: 9.0.1(postcss@8.4.49) + postcss-colormin: 6.1.0(postcss@8.4.49) + postcss-convert-values: 6.1.0(postcss@8.4.49) + postcss-discard-comments: 6.0.2(postcss@8.4.49) + postcss-discard-duplicates: 6.0.3(postcss@8.4.49) + postcss-discard-empty: 6.0.3(postcss@8.4.49) + postcss-discard-overridden: 6.0.2(postcss@8.4.49) + postcss-merge-longhand: 6.0.5(postcss@8.4.49) + postcss-merge-rules: 6.1.1(postcss@8.4.49) + postcss-minify-font-values: 6.1.0(postcss@8.4.49) + postcss-minify-gradients: 6.0.3(postcss@8.4.49) + postcss-minify-params: 6.1.0(postcss@8.4.49) + postcss-minify-selectors: 6.0.4(postcss@8.4.49) + postcss-normalize-charset: 6.0.2(postcss@8.4.49) + postcss-normalize-display-values: 6.0.2(postcss@8.4.49) + postcss-normalize-positions: 6.0.2(postcss@8.4.49) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.49) + postcss-normalize-string: 6.0.2(postcss@8.4.49) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.49) + postcss-normalize-unicode: 6.1.0(postcss@8.4.49) + postcss-normalize-url: 6.0.2(postcss@8.4.49) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.49) + postcss-ordered-values: 6.0.2(postcss@8.4.49) + postcss-reduce-initial: 6.1.0(postcss@8.4.49) + postcss-reduce-transforms: 6.0.2(postcss@8.4.49) + postcss-svgo: 6.0.3(postcss@8.4.49) + postcss-unique-selectors: 6.0.4(postcss@8.4.49) + + cssnano-preset-default@7.0.4(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + css-declaration-sorter: 7.2.0(postcss@8.4.49) + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-calc: 10.0.0(postcss@8.4.49) + postcss-colormin: 7.0.1(postcss@8.4.49) + postcss-convert-values: 7.0.2(postcss@8.4.49) + postcss-discard-comments: 7.0.1(postcss@8.4.49) + postcss-discard-duplicates: 7.0.0(postcss@8.4.49) + postcss-discard-empty: 7.0.0(postcss@8.4.49) + postcss-discard-overridden: 7.0.0(postcss@8.4.49) + postcss-merge-longhand: 7.0.2(postcss@8.4.49) + postcss-merge-rules: 7.0.2(postcss@8.4.49) + postcss-minify-font-values: 7.0.0(postcss@8.4.49) + postcss-minify-gradients: 7.0.0(postcss@8.4.49) + postcss-minify-params: 7.0.1(postcss@8.4.49) + postcss-minify-selectors: 7.0.2(postcss@8.4.49) + postcss-normalize-charset: 7.0.0(postcss@8.4.49) + postcss-normalize-display-values: 7.0.0(postcss@8.4.49) + postcss-normalize-positions: 7.0.0(postcss@8.4.49) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.49) + postcss-normalize-string: 7.0.0(postcss@8.4.49) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.49) + postcss-normalize-unicode: 7.0.1(postcss@8.4.49) + postcss-normalize-url: 7.0.0(postcss@8.4.49) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.49) + postcss-ordered-values: 7.0.1(postcss@8.4.49) + postcss-reduce-initial: 7.0.1(postcss@8.4.49) + postcss-reduce-transforms: 7.0.0(postcss@8.4.49) + postcss-svgo: 7.0.1(postcss@8.4.49) + postcss-unique-selectors: 7.0.1(postcss@8.4.49) cssnano-utils@4.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 - cssnano-utils@5.0.0(postcss@8.4.39): + cssnano-utils@4.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + cssnano-utils@5.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 cssnano@6.1.2(postcss@8.4.39): dependencies: @@ -9507,11 +10483,17 @@ snapshots: lilconfig: 3.1.2 postcss: 8.4.39 - cssnano@7.0.4(postcss@8.4.39): + cssnano@6.1.2(postcss@8.4.49): dependencies: - cssnano-preset-default: 7.0.4(postcss@8.4.39) + cssnano-preset-default: 6.1.2(postcss@8.4.49) lilconfig: 3.1.2 - postcss: 8.4.39 + postcss: 8.4.49 + + cssnano@7.0.4(postcss@8.4.49): + dependencies: + cssnano-preset-default: 7.0.4(postcss@8.4.49) + lilconfig: 3.1.2 + postcss: 8.4.49 csso@5.0.5: dependencies: @@ -9644,10 +10626,14 @@ snapshots: dependencies: dequal: 2.0.3 + didyoumean@1.2.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + dlv@1.1.3: {} + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -9707,6 +10693,10 @@ snapshots: electron-to-chromium@1.4.829: {} + electron-to-chromium@1.5.73: {} + + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -9884,8 +10874,37 @@ snapshots: '@esbuild/win32-ia32': 0.23.0 '@esbuild/win32-x64': 0.23.0 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escalade@3.1.2: {} + escalade@3.2.0: {} + escape-goat@4.0.0: {} escape-html@1.0.3: {} @@ -9953,7 +10972,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 require-like: 0.1.2 eventemitter3@4.0.7: {} @@ -10111,7 +11130,12 @@ snapshots: dependencies: is-callable: 1.2.7 - fork-ts-checker-webpack-plugin@6.5.3(typescript@5.5.4)(webpack@5.93.0): + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fork-ts-checker-webpack-plugin@6.5.3(typescript@5.5.4)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -10217,6 +11241,15 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -10398,6 +11431,20 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + 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.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.5 @@ -10602,9 +11649,9 @@ snapshots: safer-buffer: 2.1.2 optional: true - icss-utils@5.1.0(postcss@8.4.39): + icss-utils@5.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 ignore@5.3.1: {} @@ -10820,10 +11867,16 @@ snapshots: isobject@3.0.1: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.3.0 + '@types/node': 20.17.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -10831,13 +11884,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -10935,6 +11988,8 @@ snapshots: lilconfig@3.1.2: {} + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} load-json-file@4.0.0: @@ -10967,10 +12022,16 @@ snapshots: dependencies: p-locate: 6.0.0 + lodash.castarray@4.4.0: {} + lodash.debounce@4.0.8: {} + lodash.isplainobject@4.0.6: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.uniq@4.5.0: {} lodash@4.17.21: {} @@ -10991,6 +12052,8 @@ snapshots: lowercase-keys@3.0.0: {} + lru-cache@10.4.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11512,6 +12575,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.33.0: {} mime-db@1.52.0: {} @@ -11552,13 +12620,19 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.8: {} - mkdist@1.5.4(typescript@5.5.4): + minipass@7.1.2: {} + + mkdist@1.5.4(typescript@5.6.3): dependencies: - autoprefixer: 10.4.19(postcss@8.4.39) + autoprefixer: 10.4.20(postcss@8.4.49) citty: 0.1.6 - cssnano: 7.0.4(postcss@8.4.39) + cssnano: 7.0.4(postcss@8.4.49) defu: 6.1.4 esbuild: 0.23.0 fast-glob: 3.3.2 @@ -11566,11 +12640,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 - postcss: 8.4.39 - postcss-nested: 6.0.1(postcss@8.4.39) + postcss: 8.4.49 + postcss-nested: 6.0.1(postcss@8.4.49) semver: 7.6.3 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 mlly@1.7.1: dependencies: @@ -11579,6 +12653,8 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.4 + monaco-editor-core@0.52.2: {} + mri@1.2.0: {} mrmime@2.0.0: {} @@ -11594,6 +12670,12 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.7: {} negotiator@0.6.3: {} @@ -11618,6 +12700,8 @@ snapshots: node-releases@2.0.17: {} + node-releases@2.0.19: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -11662,6 +12746,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -11693,6 +12779,12 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-to-es@0.7.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 4.3.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -11738,6 +12830,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-json@8.1.1: dependencies: got: 12.6.1 @@ -11813,6 +12907,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-to-regexp@0.1.7: {} path-to-regexp@1.8.0: @@ -11839,12 +12938,18 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} pidtree@0.3.1: {} + pify@2.3.0: {} + pify@3.0.0: {} + pirates@4.0.6: {} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 @@ -11861,9 +12966,9 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-calc@10.0.0(postcss@8.4.39): + postcss-calc@10.0.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 @@ -11873,6 +12978,12 @@ snapshots: postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 + postcss-calc@9.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.1 + postcss-value-parser: 4.2.0 + postcss-colormin@6.1.0(postcss@8.4.39): dependencies: browserslist: 4.23.2 @@ -11881,12 +12992,20 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-colormin@7.0.1(postcss@8.4.39): + postcss-colormin@6.1.0(postcss@8.4.49): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.1(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-convert-values@6.1.0(postcss@8.4.39): @@ -11895,50 +13014,91 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.2(postcss@8.4.39): + postcss-convert-values@6.1.0(postcss@8.4.49): dependencies: browserslist: 4.23.2 - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-discard-comments@6.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 - postcss-discard-comments@7.0.1(postcss@8.4.39): + postcss-discard-comments@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-discard-comments@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-selector-parser: 6.1.1 postcss-discard-duplicates@6.0.3(postcss@8.4.39): dependencies: postcss: 8.4.39 - postcss-discard-duplicates@7.0.0(postcss@8.4.39): + postcss-discard-duplicates@6.0.3(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-discard-duplicates@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-discard-empty@6.0.3(postcss@8.4.39): dependencies: postcss: 8.4.39 - postcss-discard-empty@7.0.0(postcss@8.4.39): + postcss-discard-empty@6.0.3(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-discard-empty@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-discard-overridden@6.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 - postcss-discard-overridden@7.0.0(postcss@8.4.39): + postcss-discard-overridden@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 - postcss-discard-unused@6.0.5(postcss@8.4.39): + postcss-discard-overridden@7.0.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-discard-unused@6.0.5(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-selector-parser: 6.1.1 + postcss-import@15.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.49): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.49 + + postcss-load-config@4.0.2(postcss@8.4.49): + dependencies: + lilconfig: 3.1.3 + yaml: 2.6.1 + optionalDependencies: + postcss: 8.4.49 + postcss-loader@7.3.4(postcss@8.4.39)(typescript@5.5.4)(webpack@5.93.0): dependencies: cosmiconfig: 8.3.6(typescript@5.5.4) @@ -11949,10 +13109,10 @@ snapshots: transitivePeerDependencies: - typescript - postcss-merge-idents@6.0.3(postcss@8.4.39): + postcss-merge-idents@6.0.3(postcss@8.4.49): dependencies: - cssnano-utils: 4.0.2(postcss@8.4.39) - postcss: 8.4.39 + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-merge-longhand@6.0.5(postcss@8.4.39): @@ -11961,11 +13121,17 @@ snapshots: postcss-value-parser: 4.2.0 stylehacks: 6.1.1(postcss@8.4.39) - postcss-merge-longhand@7.0.2(postcss@8.4.39): + postcss-merge-longhand@6.0.5(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.4.49) + + postcss-merge-longhand@7.0.2(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 - stylehacks: 7.0.2(postcss@8.4.39) + stylehacks: 7.0.2(postcss@8.4.49) postcss-merge-rules@6.1.1(postcss@8.4.39): dependencies: @@ -11975,12 +13141,20 @@ snapshots: postcss: 8.4.39 postcss-selector-parser: 6.1.1 - postcss-merge-rules@7.0.2(postcss@8.4.39): + postcss-merge-rules@6.1.1(postcss@8.4.49): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.39) - postcss: 8.4.39 + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-selector-parser: 6.1.1 + + postcss-merge-rules@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 postcss-selector-parser: 6.1.1 postcss-minify-font-values@6.1.0(postcss@8.4.39): @@ -11988,9 +13162,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-minify-font-values@7.0.0(postcss@8.4.39): + postcss-minify-font-values@6.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-font-values@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-minify-gradients@6.0.3(postcss@8.4.39): @@ -12000,11 +13179,18 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.0(postcss@8.4.39): + postcss-minify-gradients@6.0.3(postcss@8.4.49): dependencies: colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.39) - postcss: 8.4.39 + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.0(postcss@8.4.49): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-minify-params@6.1.0(postcss@8.4.39): @@ -12014,11 +13200,18 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.1(postcss@8.4.39): + postcss-minify-params@6.1.0(postcss@8.4.49): dependencies: browserslist: 4.23.2 - cssnano-utils: 5.0.0(postcss@8.4.39) - postcss: 8.4.39 + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.1(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-minify-selectors@6.0.4(postcss@8.4.39): @@ -12026,54 +13219,73 @@ snapshots: postcss: 8.4.39 postcss-selector-parser: 6.1.1 - postcss-minify-selectors@7.0.2(postcss@8.4.39): + postcss-minify-selectors@6.0.4(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.1 + + postcss-minify-selectors@7.0.2(postcss@8.4.49): dependencies: cssesc: 3.0.0 - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 - postcss-modules-extract-imports@3.1.0(postcss@8.4.39): + postcss-modules-extract-imports@3.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 - postcss-modules-local-by-default@4.0.5(postcss@8.4.39): + postcss-modules-local-by-default@4.0.5(postcss@8.4.49): dependencies: - icss-utils: 5.1.0(postcss@8.4.39) - postcss: 8.4.39 + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.0(postcss@8.4.39): + postcss-modules-scope@3.2.0(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 - postcss-modules-values@4.0.0(postcss@8.4.39): + postcss-modules-values@4.0.0(postcss@8.4.49): dependencies: - icss-utils: 5.1.0(postcss@8.4.39) - postcss: 8.4.39 + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 - postcss-nested@6.0.1(postcss@8.4.39): + postcss-nested@6.0.1(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + postcss-normalize-charset@6.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 - postcss-normalize-charset@7.0.0(postcss@8.4.39): + postcss-normalize-charset@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-normalize-charset@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-normalize-display-values@6.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-display-values@7.0.0(postcss@8.4.39): + postcss-normalize-display-values@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-display-values@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-positions@6.0.2(postcss@8.4.39): @@ -12081,9 +13293,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.0(postcss@8.4.39): + postcss-normalize-positions@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-repeat-style@6.0.2(postcss@8.4.39): @@ -12091,9 +13308,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.0(postcss@8.4.39): + postcss-normalize-repeat-style@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-string@6.0.2(postcss@8.4.39): @@ -12101,9 +13323,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.0(postcss@8.4.39): + postcss-normalize-string@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-timing-functions@6.0.2(postcss@8.4.39): @@ -12111,9 +13338,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.0(postcss@8.4.39): + postcss-normalize-timing-functions@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-unicode@6.1.0(postcss@8.4.39): @@ -12122,10 +13354,16 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.1(postcss@8.4.39): + postcss-normalize-unicode@6.1.0(postcss@8.4.49): dependencies: browserslist: 4.23.2 - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.1(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-url@6.0.2(postcss@8.4.39): @@ -12133,9 +13371,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.0(postcss@8.4.39): + postcss-normalize-url@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-normalize-whitespace@6.0.2(postcss@8.4.39): @@ -12143,9 +13386,14 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.0(postcss@8.4.39): + postcss-normalize-whitespace@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-ordered-values@6.0.2(postcss@8.4.39): @@ -12154,15 +13402,21 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.1(postcss@8.4.39): + postcss-ordered-values@6.0.2(postcss@8.4.49): dependencies: - cssnano-utils: 5.0.0(postcss@8.4.39) - postcss: 8.4.39 + cssnano-utils: 4.0.2(postcss@8.4.49) + postcss: 8.4.49 postcss-value-parser: 4.2.0 - postcss-reduce-idents@6.0.3(postcss@8.4.39): + postcss-ordered-values@7.0.1(postcss@8.4.49): dependencies: - postcss: 8.4.39 + cssnano-utils: 5.0.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-reduce-idents@6.0.3(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 postcss-reduce-initial@6.1.0(postcss@8.4.39): @@ -12171,30 +13425,51 @@ snapshots: caniuse-api: 3.0.0 postcss: 8.4.39 - postcss-reduce-initial@7.0.1(postcss@8.4.39): + postcss-reduce-initial@6.1.0(postcss@8.4.49): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 - postcss: 8.4.39 + postcss: 8.4.49 + + postcss-reduce-initial@7.0.1(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + caniuse-api: 3.0.0 + postcss: 8.4.49 postcss-reduce-transforms@6.0.2(postcss@8.4.39): dependencies: postcss: 8.4.39 postcss-value-parser: 4.2.0 - postcss-reduce-transforms@7.0.0(postcss@8.4.39): + postcss-reduce-transforms@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + postcss-reduce-transforms@7.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-selector-parser@6.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sort-media-queries@5.2.0(postcss@8.4.39): + postcss-selector-parser@6.1.2: dependencies: - postcss: 8.4.39 + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sort-media-queries@5.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 sort-css-media-queries: 2.2.0 postcss-svgo@6.0.3(postcss@8.4.39): @@ -12203,9 +13478,15 @@ snapshots: postcss-value-parser: 4.2.0 svgo: 3.3.2 - postcss-svgo@7.0.1(postcss@8.4.39): + postcss-svgo@6.0.3(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-svgo@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-value-parser: 4.2.0 svgo: 3.3.2 @@ -12214,16 +13495,21 @@ snapshots: postcss: 8.4.39 postcss-selector-parser: 6.1.1 - postcss-unique-selectors@7.0.1(postcss@8.4.39): + postcss-unique-selectors@6.0.4(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 + postcss-selector-parser: 6.1.1 + + postcss-unique-selectors@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 postcss-selector-parser: 6.1.1 postcss-value-parser@4.2.0: {} - postcss-zindex@6.0.2(postcss@8.4.39): + postcss-zindex@6.0.2(postcss@8.4.49): dependencies: - postcss: 8.4.39 + postcss: 8.4.49 postcss@8.4.39: dependencies: @@ -12231,8 +13517,27 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.6.3): + dependencies: + prettier: 3.4.2 + typescript: 5.6.3 + + prettier-plugin-tailwindcss@0.6.9(prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.6.3))(prettier@3.4.2): + dependencies: + prettier: 3.4.2 + optionalDependencies: + prettier-plugin-organize-imports: 4.1.0(prettier@3.4.2)(typescript@5.6.3) + prettier@3.3.3: {} + prettier@3.4.2: {} + pretty-bytes@6.1.1: {} pretty-error@4.0.0: @@ -12427,6 +13732,10 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 @@ -12475,6 +13784,16 @@ snapshots: dependencies: '@babel/runtime': 7.24.8 + regex-recursion@4.3.0: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -12515,6 +13834,12 @@ snapshots: hast-util-to-html: 9.0.1 unified: 11.0.5 + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.1 + unified: 11.0.5 + relateurl@0.2.7: {} remark-directive@3.0.0: @@ -12578,6 +13903,14 @@ snapshots: unified: 11.0.5 vfile: 6.0.2 + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.2 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -12624,11 +13957,11 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.4): + rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.3): dependencies: magic-string: 0.30.10 rollup: 3.29.4 - typescript: 5.5.4 + typescript: 5.6.3 optionalDependencies: '@babel/code-frame': 7.24.7 @@ -12658,6 +13991,31 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 + rollup@4.28.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 + fsevents: 2.3.3 + rrweb-cssom@0.6.0: optional: true @@ -12670,7 +14028,7 @@ snapshots: dependencies: escalade: 3.1.2 picocolors: 1.0.1 - postcss: 8.4.39 + postcss: 8.4.49 strip-json-comments: 3.1.1 run-parallel@1.2.0: @@ -12857,6 +14215,15 @@ snapshots: '@shikijs/core': 1.13.0 '@types/hast': 3.0.4 + shiki@1.24.2: + dependencies: + '@shikijs/core': 1.24.2 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -12908,6 +14275,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -13059,12 +14428,28 @@ snapshots: postcss: 8.4.39 postcss-selector-parser: 6.1.1 - stylehacks@7.0.2(postcss@8.4.39): + stylehacks@6.1.1(postcss@8.4.49): dependencies: browserslist: 4.23.2 - postcss: 8.4.39 + postcss: 8.4.49 postcss-selector-parser: 6.1.1 + stylehacks@7.0.2(postcss@8.4.49): + dependencies: + browserslist: 4.23.2 + postcss: 8.4.49 + postcss-selector-parser: 6.1.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -13094,6 +14479,33 @@ snapshots: symbol-tree@3.2.4: optional: true + tailwindcss@3.4.16: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tapable@1.1.3: {} tapable@2.2.1: {} @@ -13124,6 +14536,14 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + thunky@1.1.0: {} tiny-invariant@1.3.3: {} @@ -13165,6 +14585,8 @@ snapshots: trough@2.2.0: {} + ts-interface-checker@0.1.13: {} + tslib@2.6.3: {} tsx@4.17.0: @@ -13174,6 +14596,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.19.2: + dependencies: + esbuild: 0.23.0 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -13221,6 +14650,8 @@ snapshots: typescript@5.5.4: {} + typescript@5.6.3: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: @@ -13230,7 +14661,7 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - unbuild@2.0.0(typescript@5.5.4): + unbuild@2.0.0(typescript@5.6.3): dependencies: '@rollup/plugin-alias': 5.1.0(rollup@3.29.4) '@rollup/plugin-commonjs': 25.0.8(rollup@3.29.4) @@ -13247,23 +14678,25 @@ snapshots: hookable: 5.5.3 jiti: 1.21.6 magic-string: 0.30.10 - mkdist: 1.5.4(typescript@5.5.4) + mkdist: 1.5.4(typescript@5.6.3) mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 pretty-bytes: 6.1.1 rollup: 3.29.4 - rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.5.4) + rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.6.3) scule: 1.3.0 untyped: 1.4.2 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - sass - supports-color - vue-tsc - undici-types@6.18.2: {} + undici-types@6.19.8: {} + + undici-types@6.20.0: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -13349,6 +14782,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + update-notifier@6.0.2: dependencies: boxen: 7.1.1 @@ -13420,13 +14859,13 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@2.0.5(@types/node@22.3.0)(terser@5.31.6): + vite-node@2.0.5(@types/node@20.17.10)(terser@5.31.6): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.3.4(@types/node@22.3.0)(terser@5.31.6) + vite: 5.3.4(@types/node@20.17.10)(terser@5.31.6) transitivePeerDependencies: - '@types/node' - less @@ -13437,17 +14876,30 @@ snapshots: - supports-color - terser - vite@5.3.4(@types/node@22.3.0)(terser@5.31.6): + vite@5.3.4(@types/node@20.17.10)(terser@5.31.6): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 + postcss: 8.4.49 rollup: 4.18.1 optionalDependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 + fsevents: 2.3.3 + terser: 5.31.6 + + vite@6.0.3(@types/node@22.10.2)(jiti@1.21.6)(terser@5.31.6)(tsx@4.19.2)(yaml@2.6.1): + dependencies: + esbuild: 0.24.0 + postcss: 8.4.49 + rollup: 4.28.1 + optionalDependencies: + '@types/node': 22.10.2 fsevents: 2.3.3 + jiti: 1.21.6 terser: 5.31.6 + tsx: 4.19.2 + yaml: 2.6.1 - vitest@2.0.5(@types/node@22.3.0)(jsdom@24.1.1)(terser@5.31.6): + vitest@2.0.5(@types/node@20.17.10)(jsdom@24.1.1)(terser@5.31.6): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -13465,11 +14917,11 @@ snapshots: tinybench: 2.8.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.3.4(@types/node@22.3.0)(terser@5.31.6) - vite-node: 2.0.5(@types/node@22.3.0)(terser@5.31.6) + vite: 5.3.4(@types/node@20.17.10)(terser@5.31.6) + vite-node: 2.0.5(@types/node@20.17.10)(terser@5.31.6) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.3.0 + '@types/node': 20.17.10 jsdom: 24.1.1 transitivePeerDependencies: - less @@ -13491,6 +14943,10 @@ snapshots: vscode-languageserver-types@3.17.5: {} + vscode-oniguruma@2.0.1: {} + + vscode-textmate@9.1.0: {} + w3c-keyname@2.2.8: {} w3c-xmlserializer@5.0.0: @@ -13683,6 +15139,12 @@ snapshots: wildcard@2.0.1: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 @@ -13718,6 +15180,8 @@ snapshots: yaml@1.10.2: {} + yaml@2.6.1: {} + yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d0dc15bf..238f9467 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'packages/*' - 'moonbit-docs' + - 'moonbit-tour' From a720b02a71038a49af5c6bb3180aec4f42ba9021 Mon Sep 17 00:00:00 2001 From: Bao Zhiyuan Date: Fri, 13 Dec 2024 17:30:34 +0800 Subject: [PATCH 2/3] tweak ci --- .github/workflows/release.yml | 4 ---- .github/workflows/tour-check.yml | 19 +++++++++++++++++++ .github/workflows/tour-page.yml | 4 +--- .github/workflows/website-check.yml | 2 -- moonbit-tour/package.json | 1 - 5 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/tour-check.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ea56977a..b627349c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,8 +12,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - with: - version: 9 - name: install run: | pnpm install @@ -36,8 +34,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - with: - version: 9 - name: install run: | pnpm install diff --git a/.github/workflows/tour-check.yml b/.github/workflows/tour-check.yml new file mode 100644 index 00000000..fb70096d --- /dev/null +++ b/.github/workflows/tour-check.yml @@ -0,0 +1,19 @@ +name: check langauge tour + +on: + pull_request: + branches: main + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - name: install + run: | + pnpm install + - name: check + run: | + cd moonbit-tour + pnpm build diff --git a/.github/workflows/tour-page.yml b/.github/workflows/tour-page.yml index 0ccc53ee..36717d73 100644 --- a/.github/workflows/tour-page.yml +++ b/.github/workflows/tour-page.yml @@ -34,11 +34,9 @@ jobs: - name: Setup Pages uses: actions/configure-pages@v5 - uses: pnpm/action-setup@v4 - with: - version: 9 + - run: pnpm install - run: | cd moonbit-tour - pnpm install pnpm build - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/.github/workflows/website-check.yml b/.github/workflows/website-check.yml index 51a254e1..3941c171 100644 --- a/.github/workflows/website-check.yml +++ b/.github/workflows/website-check.yml @@ -10,8 +10,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - with: - version: 9 - name: install run: | pnpm install diff --git a/moonbit-tour/package.json b/moonbit-tour/package.json index f53ec973..9996b6a6 100644 --- a/moonbit-tour/package.json +++ b/moonbit-tour/package.json @@ -27,7 +27,6 @@ "unified": "^11.0.5", "vite": "^6.0.1" }, - "packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab", "dependencies": { "@moonbit/moonpad-monaco": "^0.1.202412060", "monaco-editor-core": "^0.52.0" From 56713dd28c4526a1d4af71f754cccf1ba4a4d870 Mon Sep 17 00:00:00 2001 From: Bao Zhiyuan Date: Fri, 13 Dec 2024 17:33:50 +0800 Subject: [PATCH 3/3] fix typo --- .../tour/chapter1_basic/lesson11_struct/index.md | 11 +++++------ .../lesson2_let_match/index.md | 11 +++++------ .../lesson4_tuple_pattern/index.md | 6 ++---- .../lesson7_or_pattern/index.md | 7 +++---- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md index ae451409..e8dc4f68 100644 --- a/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md +++ b/moonbit-tour/tour/chapter1_basic/lesson11_struct/index.md @@ -1,18 +1,17 @@ # Struct -Structs are new types composed of other types. +Structs are new types composed of other types. -In the example we define a struct `Point` with two fields, `x` and `y`, both of which are integers. +In the example we define a struct `Point` with two fields, `x` and `y`, both of which are integers. We can create an instance of `Point` by using the `{ x: 3, y: 4}`. The structs name can be omitted since the compiler can infer it from the labels `x` and `y`. We can also add a `Point::` prefix to create an instance explicitly to disambiguate. -Anologous to tuples, we can access the fields of a struct using the syntax `point.x`. +Analogous to tuples, we can access the fields of a struct using the syntax `point.x`. -The `derive(Show)` after the struct definition means that we can print the struct using the `println` function. +The `derive(Show)` after the struct definition means that we can print the struct using the `println` function. -The fields of a struct are immutable by default; they can't be changed after they are created. There is a syntax called *functional update* that allows you to create a new struct with some fields updated. +The fields of a struct are immutable by default; they can't be changed after they are created. There is a syntax called _functional update_ that allows you to create a new struct with some fields updated. We will learn how to make the fields mutable in the next lesson. - diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md index 1f9d6c81..2b6f3c98 100644 --- a/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson2_let_match/index.md @@ -6,17 +6,16 @@ We defined a `Resource` type, it describes a file system. The `Resource` can be ## Pattern in let statement -In a let statement, the left side of `=` can be a pattern, we knowns that assets is a folder so just use `let Folder(top_level) = assets` to match it and extract the inside map. +In a let statement, the left side of `=` can be a pattern, we knowns that assets is a folder so just use `let Folder(top_level) = assets` to match it and extract the inside map. You may notice that there is a partial match warning because the resource can also be `Image` or `TextFile`. **Partial match make the program more fragile: the pattern matching will fail in other cases and lead to the program aborting.** Practically, the match expression is used more frequently. ## Pattern in match expression -The `count` function traverse the input `res` recursively and return the count of `Image` and `TextFile`, using match expression. +The `count` function traverse the input `res` recursively and return the count of `Image` and `TextFile`, using match expression. -Match expression have *first match semantic*. It will try to find the first matched pattern from first case to last case, and execute the e +Match expression have _first match semantic_. It will try to find the first matched pattern from first case to last case, and execute the e -The match expression has a `Int` return value beacause all the case result in same value type `Int`. - -Patterns can be nested. If you don't care about the data associated with the enum constructor, you can use the *any pattern*, written as `_`, instead of introducing a new variable. It means discarding that value. +The match expression has a `Int` return value because all the case result in same value type `Int`. +Patterns can be nested. If you don't care about the data associated with the enum constructor, you can use the _any pattern_, written as `_`, instead of introducing a new variable. It means discarding that value. diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md index 227aa08b..9a5a10e4 100644 --- a/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson4_tuple_pattern/index.md @@ -1,9 +1,7 @@ # Tuple pattern -Use tuple patten to match multiple conditions at once. +Use tuple pattern to match multiple conditions at once. -This example simulates *logical and* and *logical or* operation via pattern matching. +This example simulates _logical and_ and _logical or_ operation via pattern matching. In this scenario, the overhead of creating the tuple in the condition will be optimized out by the compiler. - - diff --git a/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md index 773ac50a..154758f0 100644 --- a/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md +++ b/moonbit-tour/tour/chapter2_pattern_matching/lesson7_or_pattern/index.md @@ -1,6 +1,5 @@ -# Or Pattern +# Or Pattern -It's a little verbose if any two cases have common datas and same way to handle them. For example, here is a enum `RGB` and a function `get_green` to get the green value from it. - -The `RGB` and `RGBA` cases can be combined as well. In an *or pattern*, the sub-patterns can introduce new variables, but they must be of the same type and have the same name in all sub-patterns. This restriction allows us to handle them uniformly. +It's a little verbose if any two cases have common data and same way to handle them. For example, here is a enum `RGB` and a function `get_green` to get the green value from it. +The `RGB` and `RGBA` cases can be combined as well. In an _or pattern_, the sub-patterns can introduce new variables, but they must be of the same type and have the same name in all sub-patterns. This restriction allows us to handle them uniformly.