From ff89bb45cdeea74371388b384c9d74eb5bb8ffab Mon Sep 17 00:00:00 2001 From: cypress evelyn masso Date: Tue, 5 Mar 2024 09:07:35 -0800 Subject: [PATCH] Fix Build (#12) * rewrite md comments * update content * Update build-contribute.ts * update contribute docs export * skip invalid md * improve relative image link rewrite logic * Update astro.config.mjs * Update description.mdx * Create index.astro * [slug] to [...slug] * remove unneeded deps * temporary manual fixes --- astro.config.mjs | 7 + package-lock.json | 12133 ++++++---------- package.json | 3 +- src/content/contributor-docs/ar/README.mdx | 38 +- src/content/contributor-docs/en/README.mdx | 19 +- src/content/contributor-docs/en/access.mdx | 68 +- .../en/archive/benchmarking_p5.mdx | 7 +- .../en/archive/discussions.mdx | 6 - .../en/archive/es6-adoption.mdx | 104 +- .../contributor-docs/en/archive/roadmap.mdx | 18 +- .../en/contributing_documentation.mdx | 22 +- ...> contributing_to_the_p5.js_reference.mdx} | 45 +- .../en/contributor_guidelines.mdx | 277 +- .../en/creating_libraries.mdx | 72 +- .../contributor-docs/en/custom_p5_build.mdx | 12 +- .../contributor-docs/en/design_principles.mdx | 15 +- .../en/documentation_style_guide.mdx | 244 +- .../en/friendly_error_system.mdx | 48 +- .../en/internationalization.mdx | 11 +- .../contributor-docs/en/issue_labels.mdx | 19 +- src/content/contributor-docs/en/navbar.mdx | 8 +- .../contributor-docs/en/organization.mdx | 36 +- .../project_wrapups/DIVYANSHU_RAJ_GSOC_20.mdx | 123 - .../en/project_wrapups/L05_GSOC_2019.mdx | 40 +- .../en/project_wrapups/README.mdx | 34 +- .../acheng_ogarcia_gsoc_2019.mdx | 20 +- .../project_wrapups/adilrabbani_gsoc_2018.mdx | 39 +- .../en/project_wrapups/aditya_gsoc_2021.mdx | 63 +- .../project_wrapups/aidannelson_gsoc_2018.mdx | 10 +- .../project_wrapups/akshaypadte_gsoc_2020.mdx | 51 +- .../anaisgonzalez_gsoc_2021.mdx | 113 - .../aryan_koundal_gsoc_2023.mdx | 294 +- .../project_wrapups/ashleykang_gsoc2019.mdx | 29 +- .../project_wrapups/ayush23dash_gsoc_2023.mdx | 91 +- .../project_wrapups/connieliu_gsoc_2020.mdx | 47 +- .../en/project_wrapups/dewansDT_gsoc_2023.mdx | 36 +- .../elginmclaren_gsoc_2018.mdx | 28 +- .../project_wrapups/ghalestrilo_gsoc_2020.mdx | 64 +- .../project_wrapups/graciazhang_gsoc_2022.mdx | 77 +- .../project_wrapups/inhwayeom_gsoc_2020.mdx | 74 +- .../en/project_wrapups/jithinks_gsoc_2018.mdx | 60 +- .../project_wrapups/josephhong_gsoc_2021.mdx | 170 - .../en/project_wrapups/junshern_gsoc_2018.mdx | 59 +- .../project_wrapups/katiejliu_gsoc_2021.mdx | 32 +- .../en/project_wrapups/liang_gsoc_2018.mdx | 16 +- .../project_wrapups/lichlyter_gsoc_2023.mdx | 51 +- .../en/project_wrapups/luismn_gsoc_2020.mdx | 39 +- .../project_wrapups/malayvasa_gsoc_2022.mdx | 111 +- .../project_wrapups/munusshih_gsoc_2023.mdx | 35 +- .../en/project_wrapups/nikiito_gsoc_2021.mdx | 40 - .../project_wrapups/orenshoham_gsoc_2019.mdx | 24 +- .../project_wrapups/rachellim_gsoc_2019.mdx | 22 +- .../project_wrapups/sai_bhushan_gsoc_2021.mdx | 87 +- .../sakshamsaxena_gsoc_2017.mdx | 25 +- .../sanjay_singh_rajpoot_gsoc2020.mdx | 25 +- .../en/project_wrapups/sanket_gsoc_2019.mdx | 39 +- .../shantanuKaushik_gsoc_2021.mdx | 33 +- .../shubham_sharma_gsoc_2022.mdx | 25 +- .../project_wrapups/sithencube_gsoc_2018.mdx | 21 +- .../project_wrapups/slominski_gsoc_2022.mdx | 67 +- .../en/project_wrapups/smrghsh_gsoc_2022.mdx | 34 +- .../en/project_wrapups/tanvi_gsoc_2018.mdx | 26 +- .../en/project_wrapups/urvashi_gsoc_2019.mdx | 54 +- .../en/project_wrapups/vedhant_gsoc_2019.mdx | 51 +- .../en/project_wrapups/wong_gsoc_2023.mdx | 35 +- .../en/project_wrapups/xu_gsoc_2019.mdx | 7 +- .../project_wrapups/yukienomiya_gsoc_2020.mdx | 55 +- .../contributor-docs/en/release_process.mdx | 36 +- .../contributor-docs/en/repo_structure.mdx | 41 +- src/content/contributor-docs/en/sidebar.mdx | 50 +- .../en/steward_guidelines.mdx | 219 +- .../en/supported_browsers.mdx | 7 +- .../contributor-docs/en/unit_testing.mdx | 61 +- .../contributor-docs/en/web_accessibility.mdx | 270 +- .../en/webgl_contribution_guide.mdx | 51 +- .../en/webgl_mode_architecture.mdx | 175 +- src/content/contributor-docs/es/README.mdx | 20 +- src/content/contributor-docs/hi/README.mdx | 67 +- src/content/contributor-docs/hi/access.mdx | 31 +- .../contributor-docs/hi/benchmarking_p5.mdx | 7 +- .../hi/contributing_documentation.mdx | 19 +- .../contributor-docs/hi/design_principles.mdx | 14 +- .../contributor-docs/hi/discussions.mdx | 5 - .../contributor-docs/hi/es6-adoption.mdx | 100 +- .../contributor-docs/hi/issue_labels.mdx | 68 +- .../contributor-docs/hi/organization.mdx | 31 +- .../hi/preparing_a_pull_request.mdx | 37 +- src/content/contributor-docs/hi/roadmap.mdx | 17 +- .../contributor-docs/hi/unit_testing.mdx | 58 +- src/content/contributor-docs/ko/README.mdx | 371 +- .../contributor-docs/ko/benchmarking_p5.mdx | 7 +- .../ko/contributing_documentation.mdx | 13 +- .../ko/creating_libraries.mdx | 80 +- .../contributor-docs/ko/custom_p5_build.mdx | 11 +- .../contributor-docs/ko/design_principles.mdx | 14 +- .../contributor-docs/ko/discussions.mdx | 6 - .../contributor-docs/ko/es6-adoption.mdx | 98 +- .../ko/friendly_error_system.mdx | 56 +- .../ko/inline_documentation.mdx | 26 +- .../ko/internationalization.mdx | 8 +- .../contributor-docs/ko/issue_labels.mdx | 68 +- .../contributor-docs/ko/organization.mdx | 37 +- .../ko/preparing_a_pull_request.mdx | 38 +- .../contributor-docs/ko/release_process.mdx | 26 +- src/content/contributor-docs/ko/roadmap.mdx | 20 +- src/content/contributor-docs/ko/sidebar.mdx | 50 +- .../ko/supported_browsers.mdx | 26 +- .../contributor-docs/ko/unit_testing.mdx | 26 +- .../ko/webgl_mode_architecture.mdx | 176 +- src/content/contributor-docs/pt-br/README.mdx | 11 +- src/content/contributor-docs/sk/README.mdx | 50 +- src/content/contributor-docs/zh/README.mdx | 65 +- src/content/contributor-docs/zh/access.mdx | 32 +- .../zh/contributing_documentation.mdx | 13 +- .../zh/contributor_guidelines.mdx | 100 +- .../zh/creating_libraries.mdx | 85 +- .../contributor-docs/zh/custom_p5_build.mdx | 12 +- .../contributor-docs/zh/design_principles.mdx | 15 +- .../zh/fes_reference_dev_notes.mdx | 234 +- .../zh/friendly_error_system.mdx | 47 +- .../zh/inline_documentation.mdx | 21 +- .../zh/internationalization.mdx | 9 +- .../contributor-docs/zh/issue_labels.mdx | 37 +- .../contributor-docs/zh/organization.mdx | 36 +- .../contributor-docs/zh/release_process.mdx | 12 +- .../contributor-docs/zh/repo_structure.mdx | 40 +- .../zh/steward_guidelines.mdx | 210 +- .../zh/supported_browsers.mdx | 7 +- .../contributor-docs/zh/unit_testing.mdx | 28 +- .../contributor-docs/zh/web_accessibility.mdx | 25 +- .../zh/webgl_mode_architecture.mdx | 176 +- .../28_ArduinoSensor/description.mdx | 4 +- src/pages/{[slug].astro => [...slug].astro} | 0 .../{[slug].astro => [...slug].astro} | 0 src/pages/index.astro | 1 + src/scripts/build-contribute.ts | 52 +- test/scripts/build-contributor-docs.test.ts | 6 +- 137 files changed, 8062 insertions(+), 11495 deletions(-) rename src/content/contributor-docs/en/{inline_documentation.mdx => contributing_to_the_p5.js_reference.mdx} (95%) delete mode 100644 src/content/contributor-docs/en/project_wrapups/DIVYANSHU_RAJ_GSOC_20.mdx delete mode 100644 src/content/contributor-docs/en/project_wrapups/anaisgonzalez_gsoc_2021.mdx delete mode 100644 src/content/contributor-docs/en/project_wrapups/josephhong_gsoc_2021.mdx delete mode 100644 src/content/contributor-docs/en/project_wrapups/nikiito_gsoc_2021.mdx rename src/pages/{[slug].astro => [...slug].astro} (100%) rename src/pages/examples/{[slug].astro => [...slug].astro} (100%) create mode 100644 src/pages/index.astro diff --git a/astro.config.mjs b/astro.config.mjs index f63d2e12d5..7aeee92472 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -19,4 +19,11 @@ export default defineConfig({ build: { format: "directory", }, + i18n: { + defaultLocale: "en", + locales: ["en", "ar", "es", "hi", "ko", "pt-br", "sk", "zh"], + routing: { + prefixDefaultLocale: true, + }, + }, }); diff --git a/package-lock.json b/package-lock.json index 3786aa6273..767a41963d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "@typescript-eslint/parser": "^7.0.2", "@uiw/codemirror-extensions-basic-setup": "^4.21.22", "@uiw/react-codemirror": "^4.21.22", - "documentation": "^14.0.3", "eslint": "^8.56.0", "eslint-config-preact": "^1.3.0", "eslint-config-prettier": "^9.1.0", @@ -35,15 +34,16 @@ "eslint-plugin-react": "^7.33.2", "gray-matter": "^4.0.3", "html-entities": "^1.3.1", + "is-absolute-url": "^4.0.1", "marked": "^4.0.10", "path": "^0.12.7", "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.11", "remark": "^15.0.1", + "remark-gfm": "^4.0.0", "remark-mdx": "^3.0.1", "simple-git": "^3.22.0", "tsx": "^4.7.1", - "yaml": "^2.4.0", "yuidocjs": "^0.10.2" } }, @@ -2467,12 +2467,6 @@ "@types/estree": "*" } }, - "node_modules/@types/extend": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz", - "integrity": "sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==", - "dev": true - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -2532,30 +2526,12 @@ "undici-types": "~5.26.4" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, - "node_modules/@types/supports-color": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", - "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", - "dev": true - }, "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", @@ -3172,81 +3148,6 @@ "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.16.tgz", "integrity": "sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==" }, - "node_modules/@vue/compiler-core": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.19.tgz", - "integrity": "sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.19", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "optional": true - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz", - "integrity": "sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==", - "dev": true, - "optional": true, - "dependencies": { - "@vue/compiler-core": "3.4.19", - "@vue/shared": "3.4.19" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz", - "integrity": "sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.19", - "@vue/compiler-dom": "3.4.19", - "@vue/compiler-ssr": "3.4.19", - "@vue/shared": "3.4.19", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.6", - "postcss": "^8.4.33", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "optional": true - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz", - "integrity": "sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==", - "dev": true, - "optional": true, - "dependencies": { - "@vue/compiler-dom": "3.4.19", - "@vue/shared": "3.4.19" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.19.tgz", - "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==", - "dev": true, - "optional": true - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4741,13 +4642,6 @@ "node": ">= 0.4" } }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "optional": true - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4982,1487 +4876,1181 @@ "node": ">=6.0.0" } }, - "node_modules/doctrine-temporary-fork": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.1.0.tgz", - "integrity": "sha512-nliqOv5NkE4zMON4UA6AMJE6As35afs8aYXATpU4pTUdIKiARZwrJVEP1boA3Rx1ZXHVkwxkhcq4VkqvsuRLsA==", - "dev": true, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "esutils": "^2.0.2" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/documentation": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/documentation/-/documentation-14.0.3.tgz", - "integrity": "sha512-B7cAviVKN9Rw7Ofd+9grhVuxiHwly6Ieh+d/ceMw8UdBOv/irkuwnDEJP8tq0wgdLJDUVuIkovV+AX9mTrZFxg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.18.10", - "@babel/generator": "^7.18.10", - "@babel/parser": "^7.18.11", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10", - "chalk": "^5.0.1", - "chokidar": "^3.5.3", - "diff": "^5.1.0", - "doctrine-temporary-fork": "2.1.0", - "git-url-parse": "^13.1.0", - "github-slugger": "1.4.0", - "glob": "^8.0.3", - "globals-docs": "^2.4.1", - "highlight.js": "^11.6.0", - "ini": "^3.0.0", - "js-yaml": "^4.1.0", - "konan": "^2.1.1", - "lodash": "^4.17.21", - "mdast-util-find-and-replace": "^2.2.1", - "mdast-util-inject": "^1.1.0", - "micromark-util-character": "^1.1.0", - "parse-filepath": "^1.0.2", - "pify": "^6.0.0", - "read-pkg-up": "^9.1.0", - "remark": "^14.0.2", - "remark-gfm": "^3.0.1", - "remark-html": "^15.0.1", - "remark-reference-links": "^6.0.1", - "remark-toc": "^8.0.1", - "resolve": "^1.22.1", - "strip-json-comments": "^5.0.0", - "unist-builder": "^3.0.0", - "unist-util-visit": "^4.1.0", - "vfile": "^5.3.4", - "vfile-reporter": "^7.0.4", - "vfile-sort": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "documentation": "bin/documentation.js" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@vue/compiler-sfc": "^3.2.37", - "vue-template-compiler": "^2.7.8" - } + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "node_modules/documentation/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/documentation/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/documentation/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, + "domelementtype": "^2.3.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">= 4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/documentation/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/documentation/node_modules/github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", - "dev": true - }, - "node_modules/documentation/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/documentation/node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true, + "node_modules/dset": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/documentation/node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/documentation/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, - "node_modules/documentation/node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/electron-to-chromium": { + "version": "1.4.677", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz", + "integrity": "sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==" }, - "node_modules/documentation/node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "dev": true, + "node_modules/emmet": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.6.tgz", + "integrity": "sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==", "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" } }, - "node_modules/documentation/node_modules/mdast-util-gfm-footnote": { + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/documentation/node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "dev": true, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "once": "^1.4.0" } }, - "node_modules/documentation/node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/documentation/node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/documentation/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" + "get-intrinsic": "^1.2.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/documentation/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/documentation/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0" + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/documentation/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/documentation/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/documentation/node_modules/micromark-extension-gfm": { + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/es-set-tostringtag": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/documentation/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "hasown": "^2.0.0" } }, - "node_modules/documentation/node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/documentation/node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "dev": true, - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/documentation/node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "dev": true, - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, - "node_modules/documentation/node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "dev": true, - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" } }, - "node_modules/documentation/node_modules/micromark-extension-gfm-task-list-item": { + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "dev": true, - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/documentation/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/documentation/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "node_modules/eslint-config-preact": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-preact/-/eslint-config-preact-1.3.0.tgz", + "integrity": "sha512-yHYXg5qNzEJd3D/30AmsIW0W8MuY858KpApXp7xxBF08IYUljSKCOqMx+dVucXHQnAm7+11wOnMkgVHIBAechw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@babel/core": "^7.13.16", + "@babel/eslint-parser": "^7.13.14", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-decorators": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "eslint-plugin-compat": "^4.0.0", + "eslint-plugin-jest": "^25.2.4", + "eslint-plugin-react": "^7.27.0", + "eslint-plugin-react-hooks": "^4.3.0" + }, + "peerDependencies": { + "eslint": "6.x || 7.x || 8.x" } }, - "node_modules/documentation/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/documentation/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/documentation/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/documentation/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" + "optional": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/documentation/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/documentation/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "node_modules/eslint-config-preact/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "optional": true, + "peer": true, "dependencies": { - "micromark-util-symbol": "^1.0.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "node_modules/eslint-config-preact/node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "jest": { + "optional": true } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" } }, - "node_modules/documentation/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "node_modules/eslint-config-preact/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/documentation/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "node_modules/eslint-config-preact/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } }, - "node_modules/documentation/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/documentation/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "node_modules/eslint-plugin-compat": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", + "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-types": "^1.0.0" + "@mdn/browser-compat-data": "^5.3.13", + "ast-metadata-inferer": "^0.8.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001524", + "find-up": "^5.0.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/documentation/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "jest": { + "optional": true } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" } }, - "node_modules/documentation/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/documentation/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/documentation/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/documentation/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/pify": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-6.1.0.tgz", - "integrity": "sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { - "node": ">=14.16" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/remark": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", - "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "remark-parse": "^10.0.0", - "remark-stringify": "^10.0.0", - "unified": "^10.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/documentation/node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/documentation/node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/documentation/node_modules/remark-stringify": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", - "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/documentation/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/documentation/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/documentation/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/documentation/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" + "engines": { + "node": ">=10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/documentation/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/documentation/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "esutils": "^2.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/documentation/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "engines": { + "node": "*" + } }, - "node_modules/documentation/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dset": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", - "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.677", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz", - "integrity": "sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==" - }, - "node_modules/emmet": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.6.tgz", - "integrity": "sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==", - "dependencies": { - "@emmetio/abbreviation": "^2.3.3", - "@emmetio/css-abbreviation": "^2.1.8" + "url": "https://opencollective.com/eslint" } }, - "node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.12" + "node": ">=8" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" + "node": ">=7.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">= 0.4" - } + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10.13.0" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6471,533 +6059,430 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-preact": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-preact/-/eslint-config-preact-1.3.0.tgz", - "integrity": "sha512-yHYXg5qNzEJd3D/30AmsIW0W8MuY858KpApXp7xxBF08IYUljSKCOqMx+dVucXHQnAm7+11wOnMkgVHIBAechw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/eslint-parser": "^7.13.14", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-decorators": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "eslint-plugin-compat": "^4.0.0", - "eslint-plugin-jest": "^25.2.4", - "eslint-plugin-react": "^7.27.0", - "eslint-plugin-react-hooks": "^4.3.0" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "peerDependencies": { - "eslint": "6.x || 7.x || 8.x" + "engines": { + "node": ">=4" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=0.10" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=4.0" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4.0" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/estree": "^1.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-preact/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unified" } }, - "node_modules/eslint-config-preact/node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dev": true, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "@types/estree": "^1.0.0" } }, - "node_modules/eslint-config-preact/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-config-preact/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "optional": true, - "peer": true, "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "node_modules/eslint-plugin-compat": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", - "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==", - "dev": true, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { - "@mdn/browser-compat-data": "^5.3.13", - "ast-metadata-inferer": "^0.8.0", - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001524", - "find-up": "^5.0.0", - "lodash.memoize": "^4.1.2", - "semver": "^7.5.4" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=14.x" + "node": ">=16.17" }, - "peerDependencies": { - "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "optional": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "node": ">=6" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 0.10.0" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "ms": "2.0.0" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "optional": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=8.6.0" } }, - "node_modules/eslint-plugin-jest/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "flat-cache": "^3.0.4" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/files-pipe": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/files-pipe/-/files-pipe-2.1.8.tgz", + "integrity": "sha512-2qebFhQ/Vnw7HygoeKpLjnd6ClzTt9y8qSNXjcP+5DHAFEwDq1T+d6sW8PLSkDujHMsN6Lq2ufFoWZCT8YraXw==", + "dependencies": { + "@types/node": "20.11.17", + "deepmerge-ts": "5.1.0", + "fast-glob": "3.3.2" + } + }, + "node_modules/files-pipe/node_modules/@types/node": { + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=10" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", @@ -7007,19 +6492,27 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { + "node_modules/flat-cache/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", @@ -7031,1057 +6524,988 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "glob": "^7.1.3" }, "bin": { - "resolve": "bin/resolve" + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/flattie": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.0.tgz", + "integrity": "sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", "dev": true, + "optional": true, "dependencies": { - "color-convert": "^2.0.1" + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/form-data/node_modules/mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "optional": true }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.6" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "optional": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": "*" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "optional": true + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "estraverse": "^5.1.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=0.10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "estraverse": "^5.2.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0" + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.0" } }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "sprintf-js": "~1.0.2" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "@types/estree": "^1.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" + "es-define-property": "^1.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "optional": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", "dependencies": { - "reusify": "^1.0.4" + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", "dependencies": { - "flat-cache": "^3.0.4" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/files-pipe": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/files-pipe/-/files-pipe-2.1.8.tgz", - "integrity": "sha512-2qebFhQ/Vnw7HygoeKpLjnd6ClzTt9y8qSNXjcP+5DHAFEwDq1T+d6sW8PLSkDujHMsN6Lq2ufFoWZCT8YraXw==", + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "dependencies": { - "@types/node": "20.11.17", - "deepmerge-ts": "5.1.0", - "fast-glob": "3.3.2" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/files-pipe/node_modules/@types/node": { - "version": "20.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", - "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", "dependencies": { - "undici-types": "~5.26.4" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", "dependencies": { - "to-regex-range": "^5.0.1" + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, + "node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", + "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", + "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" + "inline-style-parser": "0.2.2" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==", + "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", "dev": true, + "optional": true, "dependencies": { - "brace-expansion": "^1.1.7" + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" }, "engines": { - "node": "*" + "node": ">=0.8.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "he": "bin/he" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/flattie": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.0.tgz", - "integrity": "sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==", + "node_modules/hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "optional": true, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } + "node_modules/html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" }, - "engines": { - "node": ">=14" + "bin": { + "html-minifier-terser": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", - "dev": true, - "engines": { - "node": "*" + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/form-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "optional": true, "dependencies": { - "async": "~0.9.0", - "combined-stream": "~0.0.4", - "mime": "~1.2.11" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" } }, - "node_modules/form-data/node_modules/mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==", - "dev": true, - "optional": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", "dev": true, + "optional": true, + "dependencies": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.8" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "node": ">=16.17.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=0.8.19" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "optional": true }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", - "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/globals-docs": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/globals-docs/-/globals-docs-2.4.1.tgz", - "integrity": "sha512-qpPnUKkWnz8NESjrCvnlGklsgiQzlq+rcCxoG5uNQ+dNA7cFMCmn231slLAwS2N/PlkzZ3COL8CcS10jXmLHqg==", - "dev": true - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8090,129 +7514,118 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node": ">=8" } }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "engines": { "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -8220,13 +7633,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.3" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8235,819 +7707,771 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "function-bind": "^1.1.2" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/hast-util-from-html": { + "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", - "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dependencies": { - "@types/hast": "^3.0.0" + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-sanitize": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz", - "integrity": "sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-sanitize/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dev": true, - "dependencies": { - "@types/unist": "^2" + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" } }, - "node_modules/hast-util-sanitize/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", - "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", - "dependencies": { - "inline-style-parser": "0.2.2" + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hast-util-whitespace": { + "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dependencies": { - "@types/hast": "^3.0.0" + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hawk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "integrity": "sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==", - "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "optional": true, "dependencies": { - "boom": "0.4.x", - "cryptiles": "0.2.x", - "hoek": "0.9.x", - "sntp": "0.2.x" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/highlight.js": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", - "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", - "dev": true, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "engines": { - "node": ">=12.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" + "is-inside-container": "^1.0.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node": ">=16" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "node_modules/http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", - "dev": true, - "optional": true, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dependencies": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">= 4" + "node": ">=4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, "engines": { - "node": ">=0.8.19" + "node": ">=4.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "json-buffer": "3.0.1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, + "node_modules/lightningcss": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", + "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "detect-libc": "^1.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", + "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" + "node_modules/lightningcss-darwin-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", + "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", + "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", + "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", + "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", + "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", + "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", + "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", + "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "integrity": "sha512-eGHwtlABkp1NOJSiKUNqBf3SYAS5jPHtvRXPAgNaQwTqmkTahjtiLH9NtxdR5IOPhNvwNMN/diswSfZKzUkhGg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "uc.micro": "^1.0.1" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/is-generator-function": { + "node_modules/load-yaml-file/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "sprintf-js": "~1.0.2" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "is-extglob": "^2.1.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, "engines": { "node": ">=12" }, @@ -9055,211 +8479,176 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">= 0.4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "yallist": "^3.0.2" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, + "node_modules/magic-string": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", "dependencies": { - "is-unc-path": "^1.0.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "engines": { - "node": ">= 0.4" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "node_modules/markdown-it": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-4.4.0.tgz", + "integrity": "sha512-Rl8dHHeLuAh3E72OPY0tY7CLvlxgHiLhlshIYswAAabAg4YDBLa6e/LTgNkkxBO2K61ESzoquPQFMw/iMrT1PA==", "dev": true, "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "argparse": "~1.0.2", + "entities": "~1.1.1", + "linkify-it": "~1.2.0", + "mdurl": "~1.0.0", + "uc.micro": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "markdown-it": "bin/markdown-it.js" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/markdown-it/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, + "sprintf-js": "~1.0.2" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/marked": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 12" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", "dependencies": { - "unc-path-regex": "^0.1.2" + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { "node": ">=12" }, @@ -9267,1189 +8656,818 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", "dependencies": { - "call-bind": "^1.0.2" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { + "node_modules/mdast-util-gfm-footnote": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dependencies": { - "argparse": "^2.0.1" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=4.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz", + "integrity": "sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==", "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" - }, - "node_modules/konan": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/konan/-/konan-2.1.1.tgz", - "integrity": "sha512-7ZhYV84UzJ0PR/RJnnsMZcAbn+kLasJhVNWsu8ZyVEJYRpGA5XESQ9d/7zOa08U0Ou4cmB++hMNY/3OSV9KIbg==", - "dev": true, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dependencies": { - "@babel/parser": "^7.10.5", - "@babel/traverse": "^7.10.5" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", - "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.23.0", - "lightningcss-darwin-x64": "1.23.0", - "lightningcss-freebsd-x64": "1.23.0", - "lightningcss-linux-arm-gnueabihf": "1.23.0", - "lightningcss-linux-arm64-gnu": "1.23.0", - "lightningcss-linux-arm64-musl": "1.23.0", - "lightningcss-linux-x64-gnu": "1.23.0", - "lightningcss-linux-x64-musl": "1.23.0", - "lightningcss-win32-x64-msvc": "1.23.0" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", - "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", - "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", - "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/unified" } }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", - "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", - "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/mdn-links": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mdn-links/-/mdn-links-0.1.0.tgz", + "integrity": "sha512-m+gI2Hrgro1O0SwqHd9cFkqN8VGzP56eprB63gxu6z9EFQDMeaR083wcNqMVADIbgiMP/TOCCe0ZIXHLBv2tUg==", + "dev": true }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", - "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", - "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 0.6" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", - "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", - "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/lightningcss/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { - "node": ">=0.10" + "node": ">= 0.6" } }, - "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/linkify-it": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", - "integrity": "sha512-eGHwtlABkp1NOJSiKUNqBf3SYAS5jPHtvRXPAgNaQwTqmkTahjtiLH9NtxdR5IOPhNvwNMN/diswSfZKzUkhGg==", - "dev": true, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "uc.micro": "^1.0.1" + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dependencies": { - "sprintf-js": "~1.0.2" + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "optional": true, - "peer": true - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-4.4.0.tgz", - "integrity": "sha512-Rl8dHHeLuAh3E72OPY0tY7CLvlxgHiLhlshIYswAAabAg4YDBLa6e/LTgNkkxBO2K61ESzoquPQFMw/iMrT1PA==", - "dev": true, - "dependencies": { - "argparse": "~1.0.2", - "entities": "~1.1.1", - "linkify-it": "~1.2.0", - "mdurl": "~1.0.0", - "uc.micro": "^1.0.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdast-util-definitions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", - "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { + "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm": { + "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", + "@types/estree": "^1.0.0", "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm-footnote": { + "node_modules/micromark-factory-destination": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-gfm-strikethrough": { + "node_modules/micromark-factory-label": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", + "@types/estree": "^1.0.0", "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/mdast-util-gfm-task-list-item": { + "node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-inject": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz", - "integrity": "sha512-CcJ0mHa36QYumDKiZ2OIR+ClhfOM7zIzN+Wfy8tRZ1hpH9DKLCS+Mh4DyK5bCxzE9uxMWcbIpeNFWsg1zrj/2g==", - "dev": true, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "mdast-util-to-string": "^1.0.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-inject/node_modules/mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-mdx-expression": { + "node_modules/micromark-util-chunked": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz", - "integrity": "sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==", + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", - "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-toc": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.1.tgz", - "integrity": "sha512-Er21728Kow8hehecK2GZtb7Ny3omcoPUVrmObiSUwmoRYVZaXLR751QROEFjR8W/vAQdHMLj49Lz20J55XaNpw==", - "dev": true, - "dependencies": { - "@types/extend": "^3.0.0", - "@types/mdast": "^3.0.0", - "extend": "^3.0.0", - "github-slugger": "^2.0.0", - "mdast-util-to-string": "^3.1.0", - "unist-util-is": "^5.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-toc/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/mdast-util-toc/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/mdast-util-toc/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-toc/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-toc/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/mdn-links": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mdn-links/-/mdn-links-0.1.0.tgz", - "integrity": "sha512-m+gI2Hrgro1O0SwqHd9cFkqN8VGzP56eprB63gxu6z9EFQDMeaR083wcNqMVADIbgiMP/TOCCe0ZIXHLBv2tUg==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { + "node_modules/micromark-util-decode-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", "funding": [ { "type": "GitHub Sponsors", @@ -10461,29 +9479,31 @@ } ], "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/micromark-core-commonmark": { + "node_modules/micromark-util-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", "funding": [ { "type": "GitHub Sponsors", @@ -10495,239 +9515,20 @@ } ], "dependencies": { - "decode-named-character-reference": "^1.0.0", + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", + "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-destination": { + "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "funding": [ { "type": "GitHub Sponsors", @@ -10737,17 +9538,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + ] }, - "node_modules/micromark-factory-label": { + "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { "type": "GitHub Sponsors", @@ -10759,2728 +9555,1699 @@ } ], "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, - "node_modules/mlly": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.0.tgz", - "integrity": "sha512-YOvg9hfYQmnaB56Yb+KrJE2u0Yzz5zR+sLejEvF4fzwzV1Al6hkf2vyHTwqCRyv0hCi9rVCqVoXpyYevQIRwLQ==", - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", - "dependencies": { - "@types/nlcst": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abi": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.55.0.tgz", - "integrity": "sha512-uPEjtyh2tFEvWYt4Jw7McOD5FPcHkcxm/tHZc5PWaDB3JYq0rGFUbgaAK+CT5pYpQddBfsZVWI08OwoRfdfbcQ==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "optional": true - }, - "node_modules/node-html-parser": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", - "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", - "deprecated": "Use uuid module instead", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/oauth-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "integrity": "sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", - "dependencies": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "protocols": "^2.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "parse-path": "^7.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "mime-db": "1.52.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { - "node": "14 || >=16.14" + "node": ">= 0.6" } }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" - }, - "node_modules/path-type": { + "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/periscopic": { + "node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "optional": true, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">= 6" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "optional": true + }, + "node_modules/mlly": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.0.tgz", + "integrity": "sha512-YOvg9hfYQmnaB56Yb+KrJE2u0Yzz5zR+sLejEvF4fzwzV1Al6hkf2vyHTwqCRyv0hCi9rVCqVoXpyYevQIRwLQ==", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/nlcst-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", + "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@types/nlcst": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dependencies": { - "p-limit": "^2.2.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abi": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.55.0.tgz", + "integrity": "sha512-uPEjtyh2tFEvWYt4Jw7McOD5FPcHkcxm/tHZc5PWaDB3JYq0rGFUbgaAK+CT5pYpQddBfsZVWI08OwoRfdfbcQ==", + "optional": true, + "dependencies": { + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "optional": true + }, + "node_modules/node-html-parser": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", + "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "css-select": "^5.1.0", + "he": "1.2.0" } }, - "node_modules/pkg-types/node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "deprecated": "Use uuid module instead", "dev": true, - "engines": { - "node": ">= 0.4" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dependencies": { - "camelcase-css": "^2.0.1" + "path-key": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >= 16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" + "boolbase": "^1.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "node_modules/oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==", + "dev": true, + "optional": true, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/preact": { - "version": "10.19.5", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.5.tgz", - "integrity": "sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/preact-render-to-string": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.3.1.tgz", - "integrity": "sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, "dependencies": { - "pretty-format": "^3.8.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, - "peerDependencies": { - "preact": ">=10" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/preact-ssr-prepass": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/preact-ssr-prepass/-/preact-ssr-prepass-1.2.1.tgz", - "integrity": "sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==", - "peerDependencies": { - "preact": ">=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0" + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "optional": true, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prebuild-install/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prebuild-install/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "wrappy": "1" } }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/preferred-pm": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", - "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/preferred-pm/node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8.15" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">= 0.8.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "devOptional": true, - "bin": { - "prettier": "bin/prettier.cjs" + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dependencies": { - "fast-diff": "^1.1.2" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz", - "integrity": "sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==", - "dev": true, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=14.21.3" + "node": ">=10" }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" }, - "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 - }, - "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-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - }, - "prettier-plugin-twig-melody": { - "optional": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": ">= 0.6.0" + "node": ">=6" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { "node": ">=6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/parse-latin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", + "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", + "dependencies": { + "nlcst-to-string": "^3.0.0", + "unist-util-modify-children": "^3.0.0", + "unist-util-visit-children": "^2.0.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "entities": "^4.4.0" }, - "engines": { - "node": ">= 0.10" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.8" + } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "optional": true, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", "dev": true, + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dependencies": { - "side-channel": "^1.0.4" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=0.6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "optional": true + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "optional": true + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" }, - "bin": { - "rc": "cli.js" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/react": { - "name": "@preact/compat", - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", - "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", - "dev": true, - "peer": true, - "peerDependencies": { - "preact": "*" + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" } }, - "node_modules/react-dom": { - "name": "@preact/compat", - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", - "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", - "dev": true, - "peer": true, - "peerDependencies": { - "preact": "*" + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "pify": "^2.3.0" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/pkg-types/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "p-locate": "^6.0.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || >=14" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dependencies": { - "yocto-queue": "^1.0.0" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dependencies": { - "p-limit": "^4.0.0" + "camelcase-css": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^12 || ^14 || >= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" + "node": ">= 14" }, - "engines": { - "node": ">=8.10.0" + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", - "dev": true, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "postcss-selector-parser": "^6.0.11" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/rehype": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", - "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preact": { + "version": "10.19.5", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.5.tgz", + "integrity": "sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/preact" } }, - "node_modules/rehype-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", - "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "node_modules/preact-render-to-string": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.3.1.tgz", + "integrity": "sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" + "pretty-format": "^3.8.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "preact": ">=10" } }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "node_modules/preact-ssr-prepass": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/preact-ssr-prepass/-/preact-ssr-prepass-1.2.1.tgz", + "integrity": "sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==", + "peerDependencies": { + "preact": ">=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "optional": true, "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/rehype-stringify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", - "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "node_modules/prebuild-install/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "optional": true, "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" + "node_modules/prebuild-install/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/remark": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", - "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", - "dev": true, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "optional": true, "dependencies": { - "@types/mdast": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6" } }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "node_modules/preferred-pm": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/remark-html": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-15.0.2.tgz", - "integrity": "sha512-/CIOI7wzHJzsh48AiuIyIe1clxVkUtreul73zcCXLub0FmnevQE0UMFDQm7NUx8/3rl/4zCshlMfqBdWScQthw==", - "dev": true, + "node_modules/preferred-pm/node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", "dependencies": { - "@types/mdast": "^3.0.0", - "hast-util-sanitize": "^4.0.0", - "hast-util-to-html": "^8.0.0", - "mdast-util-to-hast": "^12.0.0", - "unified": "^10.0.0" + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.15" } }, - "node_modules/remark-html/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "@types/unist": "^2" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/remark-html/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2" + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "devOptional": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/remark-html/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/remark-html/node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" + "fast-diff": "^1.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/remark-html/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz", + "integrity": "sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==", "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" + "engines": { + "node": ">=14.21.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-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 + }, + "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-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "prettier-plugin-twig-melody": { + "optional": true + } } }, - "node_modules/remark-html/node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" } }, - "node_modules/remark-html/node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/remark-html/node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dev": true, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 6" } }, - "node_modules/remark-html/node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" } }, - "node_modules/remark-html/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/remark-html/node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "dev": true, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/remark-html/node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-html/node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-html/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "optional": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/remark-html/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "engines": { + "node": ">=6" + } }, - "node_modules/remark-html/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remark-html/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, + "optional": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/remark-html/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "consulting", + "url": "https://feross.org/support" } ] }, - "node_modules/remark-html/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "optional": true }, - "node_modules/remark-html/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.6" } }, - "node_modules/remark-html/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/remark-html/node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dev": true, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, "dependencies": { - "@types/unist": "^2.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "rc": "cli.js" } }, - "node_modules/remark-html/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "node_modules/react": { + "name": "@preact/compat", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peer": true, + "peerDependencies": { + "preact": "*" } }, - "node_modules/remark-html/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/react-dom": { + "name": "@preact/compat", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", "dev": true, + "peer": true, + "peerDependencies": { + "preact": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "pify": "^2.3.0" } }, - "node_modules/remark-html/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 6" } }, - "node_modules/remark-html/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "picomatch": "^2.2.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.10.0" } }, - "node_modules/remark-html/node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remark-html/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "node_modules/rehype": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", + "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", "unified": "^11.0.0" }, "funding": { @@ -13488,134 +11255,111 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-6.0.1.tgz", - "integrity": "sha512-34wY2C6HXSuKVTRtyJJwefkUD8zBOZOSHFZ4aSTnU2F656gr9WeuQ2dL6IJDK3NPd2F6xKF2t4XXcQY9MygAXg==", - "dev": true, + "node_modules/rehype-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/remark-reference-links/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/remark-reference-links/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dev": true, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", "dependencies": { - "@types/unist": "^2.0.0" + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" } }, - "node_modules/remark-reference-links/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-reference-links/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", @@ -13665,98 +11409,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-toc": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-8.0.1.tgz", - "integrity": "sha512-7he2VOm/cy13zilnOTZcyAoyoolV26ULlon6XyCFU+vG54Z/LWJnwphj/xKIDLOt66QmJUgTyUvLVHi2aAElyg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-toc": "^6.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-toc/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/remark-toc/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/remark-toc/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-toc/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-toc/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-toc/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/request": { "version": "2.40.0", "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", @@ -14371,18 +12023,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-array-concat": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", @@ -14822,38 +12462,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -15800,15 +13408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -15841,35 +13440,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-builder": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.1.tgz", - "integrity": "sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-builder/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -16090,24 +13660,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -16115,16 +13667,6 @@ "optional": true, "peer": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -16174,236 +13716,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.5.tgz", - "integrity": "sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==", - "dev": true, - "dependencies": { - "@types/supports-color": "^8.0.0", - "string-width": "^5.0.0", - "supports-color": "^9.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile": "^5.0.0", - "vfile-message": "^3.0.0", - "vfile-sort": "^3.0.0", - "vfile-statistics": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-reporter/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/vfile-reporter/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/vfile-reporter/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vfile-reporter/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/vfile-reporter/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-reporter/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-reporter/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-sort": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.1.tgz", - "integrity": "sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==", - "dev": true, - "dependencies": { - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-sort/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/vfile-sort/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-sort/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-sort/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.1.tgz", - "integrity": "sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==", - "dev": true, - "dependencies": { - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/vfile-statistics/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", @@ -16742,17 +14054,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "optional": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", diff --git a/package.json b/package.json index 32046195f1..55b7537b20 100644 --- a/package.json +++ b/package.json @@ -46,15 +46,16 @@ "eslint-plugin-react": "^7.33.2", "gray-matter": "^4.0.3", "html-entities": "^1.3.1", + "is-absolute-url": "^4.0.1", "marked": "^4.0.10", "path": "^0.12.7", "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.11", "remark": "^15.0.1", + "remark-gfm": "^4.0.0", "remark-mdx": "^3.0.1", "simple-git": "^3.22.0", "tsx": "^4.7.1", - "yaml": "^2.4.0", "yuidocjs": "^0.10.2" } } diff --git a/src/content/contributor-docs/ar/README.mdx b/src/content/contributor-docs/ar/README.mdx index 5dacf87c89..b917970bba 100644 --- a/src/content/contributor-docs/ar/README.mdx +++ b/src/content/contributor-docs/ar/README.mdx @@ -1,44 +1,46 @@ +# 🌸مرحبا 🌺 ---- +شكرا لإهتمامك بالمساهمة في p5.js! مجتمعنا يقدر المساهمات بكل أشكالها ويسعى إلى توسيع معنى كلمة "مساهم/ة" بأقصى شكل ممكن؛ بشكل يتضمن توثيق البرمجيات، التدريس، كتابة الشيفرة البرمجية، صناعة الفن، الكتابة، التصميم، النشاطية، التنظيم، نَظْم المحتوى أو أي شيء أخر يمكن أن تتخيله. [صفحة المجتمع خاصتنا](https://p5js.org/community/#contribute) تعطي ملخصا للطرق المختلفة التي يمكن بها المشاركة والمساهمة معنا. ---- -# 🌸مرحبا 🌺 -شكرا لإهتمامك بالمساهمة في p5.js! مجتمعنا يقدر المساهمات بكل أشكالها ويسعى إلى توسيع معنى كلمة "مساهم/ة" بأقصى شكل ممكن؛ بشكل يتضمن توثيق البرمجيات، التدريس، كتابة الشيفرة البرمجية، صناعة الفن، الكتابة، التصميم، النشاطية، التنظيم، نَظْم المحتوى أو أي شيء أخر يمكن أن تتخيله. [صفحة المجتمع خاصتنا](https://p5js.org/community/#contribute) تعطي ملخصا للطرق المختلفة التي يمكن بها المشاركة والمساهمة معنا. +هذا المشروع يتبع المواصفات القياسية لمشروع [all-contributors "كل المساهمين"](https://github.com/kentcdodds/all-contributors). نحن نستعمل البوت @all-contributors كي نضيف المساهمين/ات إلى الملف README.md. يمكنك الطلب من البوت @all-contributors أن يضيفك عن طريق كتابة الآتي في تعليق على طلب مشكلة "issue" على جيت هب "GitHub" أو طلب سحب"pull request" : -هذا المشروع يتبع المواصفات القياسية لمشروع [all-contributors "كل المساهمين"](https://github.com/kentcdodds/all-contributors). نحن نستعمل البوت @all-contributors كي نضيف المساهمين/ات إلى الملف README.md. يمكنك الطلب من البوت @all-contributors أن يضيفك عن طريق كتابة الآتي في تعليق على طلب مشكلة "issue" على جيت هب "GitHub" أو طلب سحب"pull request" : ``` @all-contributors please add @[اسم المسخدم خاصتك على جيت هب] for [نوع مساهمتك] ``` + يمكنك معرفة نوع مساهمتك المناسب من [هنا](https://allcontributors.org/docs/en/emoji-key)، على الرغم من أننا غالبا سنضيفك بشكل تلقائي إلى قائمة المساهمين بعد قبول طلب السحب خاصتك. دليل المساهمين منشور على [موقع](https://p5js.org/contributor-docs/#/) p5.js ومُستضاف على[ مستودع "repository" جيت هب](https://github.com/processing/p5.js/tree/main/contributor_docs) الخاص بـ p5.js. # قبل المساهمة معنا + المساهمة في مشروع p5.js يجب أن تكون تجربة خالية من أي ضغط، فنحن نرحب بكل المساهمات بغض النظر عن حجمها، سواء كانت إصلاح خطأ مطبعي بسيط أو إعادة هيكلة الآليات المعقدة لعرض الرسوم ثلاثية الأبعاد، لكن توجد بعض الأشياء التي يجب معرفتها وفهمها قبل البدء في المساهمة. بدايةً: من فضلك قم/قومي بقراءة [بيان مجتمعنا](https://p5js.org/community/) -أما بعد: نحن حاليا نعطي الأولوية للأعمال التي تُزيد الوصول (إمكانية الوصول والإتاحة وحقوق المعاقين/ات) لـ p5.js! للمزيد من التفاصيل، يمكنك إلقاء نظرة على [بيان الإتاحة خاصتنا](./access/) +أما بعد: نحن حاليا نعطي الأولوية للأعمال التي تُزيد الوصول (إمكانية الوصول والإتاحة وحقوق المعاقين/ات) لـ p5.js! للمزيد من التفاصيل، يمكنك إلقاء نظرة على [بيان الإتاحة خاصتنا](./access/) # البدء الآن أنت على استعداد لبدء المساهمة في p5.js! هناك العديد من الطرق لبدء المساهمة إلى p5.js وأيضا العديد من الأسباب للمساهمة معنا. في سياق هذا الدليل، سنقسم المساهمات بشكل عام إلى قسمين: على حسب نوع المساهمة المراد القيام بها إلى p5.js، يمكنك قراءة الجزء المناسب من هذا الدليل. ## [المساهمات إلى الشيفرة المصدرية](./contributor_guidelines/) -للقيام بمساهمة مثالية إلى مستودع p5.js أو موقع p5.js، يجب إتباع الخطوات الآتية: + +للقيام بمساهمة مثالية إلى مستودع p5.js أو موقع p5.js، يجب إتباع الخطوات الآتية: +
    -
  1. عمل طلب مشكلة على جيت هب
  2. -
  3. مناقشة طلب المشكلة
  4. -
  5. الحصول على موافقة لعمل بطلب سحب
  6. -
  7. تغيير الشيفرة المصدرية
  8. -
  9. عمل طلب سحب
  10. -
  11. مناقشة طلب السحب
  12. -
  13. الموافقة على طلبك وضمه
  14. +
  15. عمل طلب مشكلة على جيت هب
  16. +
  17. مناقشة طلب المشكلة
  18. +
  19. الحصول على موافقة لعمل بطلب سحب
  20. +
  21. تغيير الشيفرة المصدرية
  22. +
  23. عمل طلب سحب
  24. +
  25. مناقشة طلب السحب
  26. +
  27. الموافقة على طلبك وضمه
في هذه[ الصفحة](./contributor_guidelines/)، سيتم توجهيك خطوة بخطوة لتنفيذ الخطوات المذكورة أعلاه، يمكنك استعمال فهرس تلك الصفحة للوصول إلى الأجزاء المراد مراجعتها أو تذكرها. @@ -48,11 +50,9 @@ **نحن نرى المساهمة إلى p5.js كفرصة للتعلم** ولا نقيس النجاح بعدد المساهمات التي تصلنا. لا توجد مهلة تَحدُك لتنفيذ مساهمتك، لذا يمكنك اتخاذ الوقت والسرعة المناسبة لك (قد نراسلك إذا غبت لفترة طويلة). يمكنك سؤال المتعهدين/ات أو المشرفين/ات إذا احتجتهم وسوف نبذل قصارى جهدنا حتى نساعدك. ## المساهمات إلى غير الشيفرة المصدرية + هناك العديد من الطرق للمساهمة إلى p5.js بعيدا عن الشيفرة المصدرية، أكثر حتى من أن نحصيها هنا، بعض الطرق قد تتضمن العمل مع مستودع p5.js (كإضافة الأمثلة، أو كتابة درس للموقع، إلخ). على حسب المساهمة المخطط لها، قد تكون لدينا القدرة على مساعدتك بطرق عدة، لذا يمكنك التواصل معنا عبر أي قناة من قنوات التواصل المتاحة لك (البريد الإلكتروني، وسائل التواصل الإجتماعي، منتدى النقاش، ديسكورد، إلخ). ## [المتعهدين/ات والمشرفين/ات](./steward_guidelines/) للدليل الخاص بالمتعهدين/ات أو الصيانة العامة لمستودع p5.js على جيت هب، يمكنك إلقاء نظرة على [دليل المتعهدين](./steward_guidelines/) - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/README.mdx b/src/content/contributor-docs/en/README.mdx index 920b2c4076..4d686bc4f1 100644 --- a/src/content/contributor-docs/en/README.mdx +++ b/src/content/contributor-docs/en/README.mdx @@ -1,18 +1,17 @@ - ---- - ---- # 🌸 Welcome! 🌺 Thanks for your interest in contributing to p5.js! Our community values contributions of all forms and seeks to expand the meaning of the word "contributor" as far and wide as possible. It includes documentation, teaching, writing code, making art, writing, design, activism, organizing, curating, or anything else you might imagine. [Our community page](https://p5js.org/community/#contribute) gives an overview of some different ways to get involved and contribute. This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. We use the @all-contributors bot to handle adding people to the README.md file. You can ask @all-contributors bot to add you in an issue or PR comment like so: + ``` @all-contributors please add @[your GitHub handle] for [your contribution type] ``` + You can find relevant contribution type [here](https://allcontributors.org/docs/en/emoji-key). Although we will usually automatically add you to the contributor list using the bot after merging your PR. The contributor docs are published on p5.js [website](https://p5js.org/contributor-docs/#/), and hosted on p5.js [GitHub repository](https://github.com/processing/p5.js/tree/main/contributor_docs). # Before Contributing + Contributing to p5.js should be a stress free experience and we welcome contributions of all levels, whether you are just fixing a small typo in the documentation or refactoring complex 3D rendering functionalities. However there are just a few things you should be familiar with before starting your contribution. First, please have a read through our [community statement](https://p5js.org/community/). @@ -20,14 +19,18 @@ First, please have a read through our [community statement](https://p5js.org/com Next, we are currently prioritizing work that expands access (inclusion and accessibility) to p5.js! See [our access statement](./access/) for more details. # Get Started + Now you are ready to start contributing to p5.js! There are many ways to get started with contributing to p5.js and many reasons to do so. For the purpose of this documentation, we will split contributions roughly into two categories. -- Contributions that directly deals with the source code (including documentation) -- Contributions that directly deals with the source code very little or not at all + +* Contributions that directly deals with the source code (including documentation) +* Contributions that directly deals with the source code very little or not at all Depending on what kind of contribution you are making to p5.js, please read on to the relevant section of this documentation. ## [Source code contribution](./contributor_guidelines/) + For a typical contribution to the p5.js or p5.js-website repository, we will follow the following steps: + 1. Open an issue 2. Discuss 3. Approved for opening a Pull Request (PR) @@ -43,9 +46,9 @@ Most of the time we will stick with this workflow quite strictly and, especially **We see contributing to p5.js as a learning opportunity** and we don't measure sucess by only looking at the volume of contributions we received. There is no time limit on how long it takes you to complete a contribution, so take your time and work at your own pace (we may check in after a long period of inactivity). Ask for help from any of the stewards or maintainers if you need them and we'll try our best to support you. ## Non-source code contribution + There are many more ways to contribute to p5.js through non-source code contribution than can be exhaustively listed here, some of the ways may also involve working with some of the p5.js repositories (such as adding examples, writing tutorials for the website, etc.). Depending on what the planned contribution is, we may be able to support you in different ways so do reach out to us via any channel available to you (email, social media, [Discourse forum](https://discourse.processing.org/c/p5js/10), Discord, etc). ## [Stewards and maintainers](./steward_guidelines/) -For information related to area stewards or general maintenance of p5.js GitHub repository, please check out the [steward guidelines](./steward_guidelines/). - \ No newline at end of file +For information related to area stewards or general maintenance of p5.js GitHub repository, please check out the [steward guidelines](./steward_guidelines/). diff --git a/src/content/contributor-docs/en/access.mdx b/src/content/contributor-docs/en/access.mdx index 784a1c2478..2342e0339d 100644 --- a/src/content/contributor-docs/en/access.mdx +++ b/src/content/contributor-docs/en/access.mdx @@ -1,46 +1,56 @@ +# Our Focus on Access ---- +At the [2019 Contributors Conference](https://p5js.org/community/contributors-conference-2019.html), p5.js made the commitment to only add new features that increase access (inclusion and accessibility). We will not accept feature requests that don't support these efforts. We commit to the work of acknowledging, dismantling, and preventing barriers. This means considering intersecting[^1] experiences of diversity that can impact access and participation. These include alignments of gender, race, ethnicity, sexuality, language, location, et cetera. We center the needs of marginalized groups over the continued comfort of those privileged within the p5.js community. We are collectively exploring the meaning of access. We are learning how to practice and teach access. We choose to think of access through expansive, intersectional, and coalitionary frameworks. This commitment is part of the core values of p5.js outlined in our [Community Statement](https://p5js.org/community/). ---- -# Our Focus on Access +# Kinds of access -At the [2019 Contributors Conference](https://p5js.org/community/contributors-conference-2019.html), we made a commitment to only add features to p5.js that increase access (meaning inclusion and/or accessibility). This means considering the vectors of diversity (e.g. gender, social, economic, race, ethnicity, language, disability, etc.) that can impact access/participation; and taking action to acknowledge, dismantle, and prevent barriers. We prioritize the needs of historically marginalized groups over the continued comfort of more privileged groups with p5.js. +Increasing access is not focused on expanding the raw number of people in the p5.js community. Instead, we want to make p5.js available for people who get left out of the community. This is often a consequence of structural bias. This commitment extends to the tools and platforms p5.js offers. It also includes the makeup, decision-making, and actions of p5.js leadership. We resist a technological culture of speed, growth and competition. We prioritize intentionality, slowness, accommodation, and accountability as acts of collective care. -We will not accept feature requests that don't support our effort to increase access. You'll see this criteria reflected in our issue and pull request templates. +Access here means making p5.js equitable for: -This is part of an ongoing conversation about access and inclusion within p5.js. Our intention to hold these as core values from which p5.js is built is laid out in our [Community Statement](../CODE_OF_CONDUCT/), which was written at the [2015 Contributors Conference](https://p5js.org/community/contributors-conference-2015.html). +* People who speak languages other than English +* People of color and people of marginalized ethnic identities +* Lesbian, gay, bisexual, trans, queer, questioning, intersex, pansexual, two-spirit, and asexual people +* Women and people with other marginalized gender expressions +* Disabled people/people with disabilities, neurodivergent people/people with neurodivergence, and chronically ill people/people with chronic illness[^2] +* People who have lower income, or lack access to financial or cultural capital +* People with little or no prior experience in open source and creative coding +* People from diverse educational backgrounds +* People across all age groups, including children and elders +* People with a variety of technological skill, tools and internet access +* People from diverse religious backgrounds +* Other people who are systematically excluded and historically underrepresented +* And all intersections thereof -**Please consider this a starting point.** We want to invite more conversations about what access means and how we can prioritize it. +We recognize the complexity of the terms used to describe our respective identities. Language is nuanced, evolving and contested. This is not an exhaustive list. We provide an attempt to name and be accountable to our commitments and to the diverse needs of the p5.js community. -## Kinds of access +# Examples -Increasing access is not a focus on expanding the raw number of people in the p5.js community. It is a focus on making p5.js available to and approachable for people who are excluded from the p5.js community (intentionally or not) and from similar tools and communities. +These are examples of efforts we believe increase access: -Access here means making p5.js better for: +* Translating documentation and other materials into more languages, decentering linguistic imperialism[^3] (e.g., Rolando Vargas’ [Processing in Kuna Language](https://medium.com/@ProcessingOrg/culture-as-translation-processing-in-kuna-language-with-rolando-vargas-and-edinson-izquierdo-8079f14851f7), Felipe Santos Gomes, Julia Brasil, Katherine Finn Zander, and Marcela Mancino’s [Pê Cinco: Internationalization and Popularization for Portuguese Speakers](https://medium.com/processing-foundation/translating-p5-js-into-portuguese-for-the-brazilian-community-14b969e77ab1)) +* Improving our support for assistive technologies, such as screen readers (e.g., Katie Liu’s [Adding Alt Text in p5.js](https://medium.com/processing-foundation/adding-alt-text-e2c7684e44f8), Claire Kearney-Volpe’s [P5 Accessibility Project](https://medium.com/processing-foundation/p5-accessibility-115d84535fa8)) +* Following [Web Content Accessibility Guidelines](https://www.w3.org/TR/WCAG21/) in our tools and working towards making it easier for users to follow them in their projects +* Making p5.js error messages more helpful and supportive to people using the tool (e.g., the [p5.js Friendly Error System (FES)](https://github.com/processing/p5.js/blob/main/contributor_docs/friendly_error_system/)) +* Mentoring and supporting learners of p5.js within communities that are historically excluded from and marginalized in creative coding and the digital arts +* Hosting community events (e.g., [p5.js Access Day 2022](https://p5js.org/community/p5js-access-day-2022.html), [The Web We Want: p5.js x W3C TPAC 2020)](https://medium.com/processing-foundation/p5-js-x-w3c-tpac-bee4c621a053) with access-centered organizing tactics (e.g., ASL interpretation, live captioning, accessible venues) +* Supporting the creation of educational resources (e.g., Adekemi Sijuwade-Ukadike’s [A11y Syllabus](http://a11ysyllabus.site/)) +* Publishing documentation and reports of our work that follow WCAG guidelines, use plain language, and focus on beginners from diverse experiences (e.g., [OSACC p5.js Access Report](https://github.com/processing/OSACC-p5.js-Access-Report)) -- People who speak languages other than English -- Black people, Indigenous peoples, and People of Color -- People who are lesbian, gay, bisexual, trans, or queer -- People with marginalized genders -- People with disabilities or illness -- People who lack opportunities and/or resources to engage with creative coding due to class or income -- People with little or no prior experience in open source and creative coding -- and other people who are systemically excluded and historically underrepresented +# Maintenance -### Examples +We are not accepting feature requests that do not support our effort to increase access. You'll see this criteria reflected in our issue and pull request templates. We also affirm our intention to maintain the existing feature set of p5.js. We'd like to fix bugs regardless of which area of the codebase they're in. We believe consistency of the tool makes it more accessible for beginners. Examples of feature requests that improve accessibility include: +Performance increases for people using less powerful hardware (e.g., Support for drawing to/reading from framebuffers) +Consistency in the API (e.g, Add arcVertex() for creating arcs with beginShape()/endShape()) -These are examples of efforts we believe to increase access: +*** -- Translating more documentation and other materials into more languages -- Improving our support for assistive technologies (such as screenreaders) -- Following Web Content Accessibility Guidelines in our tools and working towards making it easier for users to follow them in their projects -- Making p5.js error messages more helpful and supportive to people using the tool -- Mentoring and supporting learners of p5.js within communities that are historically excluded from and marginalized in creative coding and the digital arts +Please consider this a ‘living document.' We will continue the conversation about what it means to prioritize access. We invite our community to engage with this document and the values it describes. If you have ideas or suggestions, we invite you to share them as an issue on Github or by emailing [hello@p5js.org](mailto:hello@p5js.org). -There are other things we haven't thought of yet and we're excited to figure out what they are together. If you have an idea, please [share it as an issue](https://github.com/processing/p5.js/issues/new/choose). +This version of the p5.js Access Statement was revised in collaboration with Evelyn Masso, Nat Decker, Bobby Joe Smith III, Sammie Veeler, Sonia (Suhyun) Choi, Xin Xin, Kate Hollenbach, Lauren Lee McCarthy, Caroline Sinders, Qianqian Ye, Tristan Jovani Magno Espinoza, Tanvi Sharma, Tsige Tafesse, and Sarah Ciston at the 2023 Open Source Arts Contributors Conference. It was finalized and published by Bobby Joe Smith III and Nat Decker through the support of the Processing Foundation Fellowship. -## Maintenance +[^1]: Crenshaw, Kimberlé (1989). "Demarginalizing the intersection of race and sex: a black feminist critique of antidiscrimination doctrine, feminist theory and antiracist politics". University of Chicago Legal Forum. 1989 (1): 139–167. ISSN 0892-5593. Full text at Archive.org. -We also affirm our intention to maintain the existing feature set of p5.js. We'd like to fix bugs regardless of which area of the codebase they're in because we believe consistency of the tool makes it more accessible for beginners. +[^2]: There are differing preferences between ‘person-first’ vs. ‘identity-first’ language within the disability community. Read [Unpacking the debate over person-first vs. identity-first language in the autism community](https://news.northeastern.edu/2018/07/12/unpacking-the-debate-over-person-first-vs-identity-first-language-in-the-autism-community/) and [I am Disabled: On Identity-First Versus People-First Language](https://thebodyisnotanapology.com/magazine/i-am-disabled-on-identity-first-versus-people-first-language/). - \ No newline at end of file +[^3]: Linguistic Imperialism, or Language Imperialism, refers to the ongoing domination/prioritization/imposition of certain languages such as English at the expense of native languages due to imperial expansion and globalization. diff --git a/src/content/contributor-docs/en/archive/benchmarking_p5.mdx b/src/content/contributor-docs/en/archive/benchmarking_p5.mdx index c239caf53c..4b9fc1b562 100644 --- a/src/content/contributor-docs/en/archive/benchmarking_p5.mdx +++ b/src/content/contributor-docs/en/archive/benchmarking_p5.mdx @@ -1,8 +1,3 @@ - ---- - ---- # Benchmarking p5.js -Benchmarking has been moved to its own repo available at https://github.com/limzykenneth/p5-benchmark. A overall view of the benchmark result of the latest version of p5.js can be seen at https://limzykenneth.github.io/p5-benchmark/. This is still a work in progress. - \ No newline at end of file +Benchmarking has been moved to its own repo available at [https://github.com/limzykenneth/p5-benchmark](https://github.com/limzykenneth/p5-benchmark). A overall view of the benchmark result of the latest version of p5.js can be seen at [https://limzykenneth.github.io/p5-benchmark/](https://limzykenneth.github.io/p5-benchmark/). This is still a work in progress. diff --git a/src/content/contributor-docs/en/archive/discussions.mdx b/src/content/contributor-docs/en/archive/discussions.mdx index ec47b1c099..41327fb689 100644 --- a/src/content/contributor-docs/en/archive/discussions.mdx +++ b/src/content/contributor-docs/en/archive/discussions.mdx @@ -1,9 +1,3 @@ - ---- - ---- Joining in on the discussion about how p5 is developed is a great way to contribute. This can be done in a number of ways but one great place to start is by checking out the existing Github [issues that have been labeled 'discussion'](https://github.com/processing/p5.js/labels/discussion) and adding your voice. The documents in this subsection are developed based on these discussion. This is where we compile ideas about current and future design for the library. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/archive/es6-adoption.mdx b/src/content/contributor-docs/en/archive/es6-adoption.mdx index 2c79a23ffc..0c6c87c852 100644 --- a/src/content/contributor-docs/en/archive/es6-adoption.mdx +++ b/src/content/contributor-docs/en/archive/es6-adoption.mdx @@ -1,15 +1,13 @@ - ---- - ---- ## ES6 Adoption -p5.js has recently adopted the ECMAScript 2015 (ES6) language specifications in order to reduce the complexity of the codebase, increase readability, and utilize features that facilitate elegant and effective coding practices for both newcomers and seasoned contributors. + +p5.js has recently adopted the ECMAScript 2015 (ES6) language specifications in order to reduce the complexity of the codebase, increase readability, and utilize features that facilitate elegant and effective coding practices for both newcomers and seasoned contributors. The transition process was initially [discussed](https://github.com/processing/p5.js/issues/3758) with the aim of migrating p5 to ES6, which later lead to a series of widespread syntactical changes in the codebase aligned with ES6 specifications. More info on the initial transition can be found [here](https://github.com/processing/p5.js/pull/3874). These changes consisted of minor modifications to the build system to facilitate processing, linting and testing the library based on ES6 standards, as well as major and ubiquitous syntactical modification in line with ES6 features. It is worthy to note that as of writing this, these transformations are by no means complete, and do not reflect nor implement every possible feature of ES6. They are intended to facilitate a smoother transition to properly and efficiently utilize ES6 features if and when aligned with the community interests and standards. And serve to motivate contributors to gradually conform to the new style and features. As such, we encourage all contributors to adhere to ES6 standards in their commits and pull requests as long as the utilized features: + 1. Reduce syntactical ambiguity and idiosyncrasies associated with Javascript 2. Increase readability and code clarity 3. Refrain from code obfuscation and over-abstraction (to aid with readability) @@ -17,77 +15,79 @@ As such, we encourage all contributors to adhere to ES6 standards in their commi 5. Ease contribution and development 6. Do not sacrifice performance -There are many ES6 features that have not been utilized in p5 as of yet. However many areas of the library could benefit from such features which include but are not limited to: -- Generators -- Number Type Checking -- Set/Map Data-Structures -- Typed Arrays -- [etc.](http://es6-features.org/) +There are many ES6 features that have not been utilized in p5 as of yet. However many areas of the library could benefit from such features which include but are not limited to: + +* Generators +* Number Type Checking +* Set/Map Data-Structures +* Typed Arrays +* [etc.](http://es6-features.org/) It is worth noting that full compliance with ES6 standards demands the efforts of the community in all areas of p5 and due to its nature is a gradual process. ### Relevant Resources -- [Official ES6 Language Specification](https://www.ecma-international.org/ecma-262/6.0/) -- [ES6 Performance Comparison](http://incaseofstairs.com/six-speed/) -- [ES6 Features: Overview & Comparison](http://es6-features.org/) -- [You Don't Know JS: ES6 & Beyond (Book)](https://github.com/getify/You-Dont-Know-JS/tree/main/es6%20%26%20beyond) -- [Exploring ES6 (Book)](https://exploringjs.com/es6/) + +* [Official ES6 Language Specification](https://www.ecma-international.org/ecma-262/6.0/) +* [ES6 Performance Comparison](http://incaseofstairs.com/six-speed/) +* [ES6 Features: Overview & Comparison](http://es6-features.org/) +* [You Don't Know JS: ES6 & Beyond (Book)](https://github.com/getify/You-Dont-Know-JS/tree/main/es6%20%26%20beyond) +* [Exploring ES6 (Book)](https://exploringjs.com/es6/) ### Performance -Although our goal is to comply and adhere to ES6 standards, it is important to note that p5 relies on performant code. As of writing this, many of the ES6 features are associated with performance-hits, bottlenecks, and overheads. Thus, it is important to refrain from using ES6 features that result in poor performing code. However, this seems to be a temporary concern given that browser engine developers are actively engaged in improving the performance of these new features. However, for the time being, it is important to prioritize performance over full compliance with ES6 standards, especially when syntactical changes do not result in major improvements aligned with the community goals. + +Although our goal is to comply and adhere to ES6 standards, it is important to note that p5 relies on performant code. As of writing this, many of the ES6 features are associated with performance-hits, bottlenecks, and overheads. Thus, it is important to refrain from using ES6 features that result in poor performing code. However, this seems to be a temporary concern given that browser engine developers are actively engaged in improving the performance of these new features. However, for the time being, it is important to prioritize performance over full compliance with ES6 standards, especially when syntactical changes do not result in major improvements aligned with the community goals. For a comparison of ES6 features' performance please refer to [this link](http://incaseofstairs.com/six-speed/). For a discussion that highlights performance prioritization please have a look at the case of `forEach` [here](https://github.com/processing/p5.js/issues/3758#issuecomment-507922753). - ### Browser Compatibility and Transpiling -p5 is built against [browserlist's](https://github.com/browserslist/browserslist) `last 2 versions` and `not dead`, in order to support the latest features while maintaining accessibility to a large userbase. To check supported browsers please visit [this link](https://browserl.ist/?q=last+2+versions). Moreover, as of now, p5 is [transpiled](https://en.wikipedia.org/wiki/Source-to-source_compiler) to the earlier ES5 standards using [Babel](https://babeljs.io/). This means that although we use ES6 or possibly more cutting edge features of Javascript, all these features are eventually converted to the earlier ES5 standards when the library is built for production (`p5-min.js`). This is to ensure compatibility with older browsers and mobile devices that fail to support these new features, such as Internet Explorer. So while it is important to be cognizant of browser compatibility, it is worth noting that ES6 features are eventually converted to the widely supported ES5 standards, and for the most part feature compatibility can be ignored thanks to the transpilation process. +p5 is built against [browserlist's](https://github.com/browserslist/browserslist) `last 2 versions` and `not dead`, in order to support the latest features while maintaining accessibility to a large userbase. To check supported browsers please visit [this link](https://browserl.ist/?q=last+2+versions). Moreover, as of now, p5 is [transpiled](https://en.wikipedia.org/wiki/Source-to-source_compiler) to the earlier ES5 standards using [Babel](https://babeljs.io/). This means that although we use ES6 or possibly more cutting edge features of Javascript, all these features are eventually converted to the earlier ES5 standards when the library is built for production (`p5-min.js`). This is to ensure compatibility with older browsers and mobile devices that fail to support these new features, such as Internet Explorer. So while it is important to be cognizant of browser compatibility, it is worth noting that ES6 features are eventually converted to the widely supported ES5 standards, and for the most part feature compatibility can be ignored thanks to the transpilation process. While reading this you might wonder: "*if ES6 is converted to ES5 what is the point of using these features?*" The answer to this very appropriate question is that ES5 will undoubtedly be replaced in the upcoming years by ES6. And perhaps when the time comes, there won't be a need to transpile the library back to ES5. Using ES6 standards primarily serves to simplify the code, increase readability and lower the barrier of entry for new developers while ensuring that p5 benefits from new features. Most importantly it makes the codebase future-proof. ### Compatibility vs. Performance -While for the most part browser compatibility can be ignored, the same is not true for performance. Conversion of ES6 to ES5 can be safely completed, but for most cases, there are performance penalties associated with the generated ES5 code. Again please refer to [this link](http://incaseofstairs.com/six-speed/) to see how code transpiled by Babel performs versus native ES5 implementations. +While for the most part browser compatibility can be ignored, the same is not true for performance. Conversion of ES6 to ES5 can be safely completed, but for most cases, there are performance penalties associated with the generated ES5 code. Again please refer to [this link](http://incaseofstairs.com/six-speed/) to see how code transpiled by Babel performs versus native ES5 implementations. ### ES6 Coding Guidelines -- Abandoning `require` in favor of ES6 `import` [[Read More](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] -- Abandoning `module.exports` in favor of ES6 `export` [[Read More](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] - - **Exception:** `app.js` still using `module.exports = p5;` due to build system limitations -- Use `const` always and switch to `let` only when reassignment is necessary [[Discussion](https://github.com/processing/p5.js/issues/3877)] -- Prototype members should all use function declarations instead of arrow functions [[Discussion](https://github.com/processing/p5.js/issues/3875)] - - **Correct:** `p5.prototype.myMethod = function() { }` - - **Incorrect:** `p5.prototype.myMethod = () => { }` -- Prototype members that need `.bind(this)` should be converted to arrow functions [[Discussion](https://github.com/processing/p5.js/issues/3875)] - - **Correct:** `p5.prototype.myMethod = () => { }` - - **Incorrect:** `p5.prototype.myMethod = function() {...}.bind(this);` -- Constants are imported such that syntax replicates old format: `constants.TWO_PI` +* Abandoning `require` in favor of ES6 `import` \[[Read More](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] +* Abandoning `module.exports` in favor of ES6 `export` \[[Read More](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] + * **Exception:** `app.js` still using `module.exports = p5;` due to build system limitations +* Use `const` always and switch to `let` only when reassignment is necessary \[[Discussion](https://github.com/processing/p5.js/issues/3877)] +* Prototype members should all use function declarations instead of arrow functions \[[Discussion](https://github.com/processing/p5.js/issues/3875)] + * **Correct:** `p5.prototype.myMethod = function() { }` + * **Incorrect:** `p5.prototype.myMethod = () => { }` +* Prototype members that need `.bind(this)` should be converted to arrow functions \[[Discussion](https://github.com/processing/p5.js/issues/3875)] + * **Correct:** `p5.prototype.myMethod = () => { }` + * **Incorrect:** `p5.prototype.myMethod = function() {...}.bind(this);` +* Constants are imported such that syntax replicates old format: `constants.TWO_PI` ### Summary of Transformations -- [Modules: Export/Import](http://es6-features.org/#ValueExportImport) -- [Modules: Default & Wildcard](http://es6-features.org/#ValueExportImport) -- [Constants](http://es6-features.org/#Constants) -- [Block-Scoped Variables](http://es6-features.org/#BlockScopedVariables) -- [Rest Parameter](http://es6-features.org/#RestParameter) -- [Spread Operator](http://es6-features.org/#SpreadOperator) -- [Method Properties](http://es6-features.org/#MethodProperties) -- [Property Shorthand](http://es6-features.org/#PropertyShorthand) -- [Arrow Functions: Statement Bodies](http://es6-features.org/#StatementBodies) -- [Arrow Functions: Expression Bodies](http://es6-features.org/#ExpressionBodies) -- [Class Definition](http://es6-features.org/#ClassDefinition) -- [Class Inheritance](http://es6-features.org/#ClassInheritance) -- [Template Literals: String Interpolation](http://es6-features.org/#StringInterpolation) -- [Template Literals: Custom Interpolation](http://es6-features.org/#CustomInterpolation) -- [Default Parameter Values](http://es6-features.org/#DefaultParameterValues) -- [String Searching: Includes](http://es6-features.org/#StringSearching) -- [Array Searching: Includes (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) -- [Iterators: For-Of](http://es6-features.org/#IteratorForOfOperator) + +* [Modules: Export/Import](http://es6-features.org/#ValueExportImport) +* [Modules: Default & Wildcard](http://es6-features.org/#ValueExportImport) +* [Constants](http://es6-features.org/#Constants) +* [Block-Scoped Variables](http://es6-features.org/#BlockScopedVariables) +* [Rest Parameter](http://es6-features.org/#RestParameter) +* [Spread Operator](http://es6-features.org/#SpreadOperator) +* [Method Properties](http://es6-features.org/#MethodProperties) +* [Property Shorthand](http://es6-features.org/#PropertyShorthand) +* [Arrow Functions: Statement Bodies](http://es6-features.org/#StatementBodies) +* [Arrow Functions: Expression Bodies](http://es6-features.org/#ExpressionBodies) +* [Class Definition](http://es6-features.org/#ClassDefinition) +* [Class Inheritance](http://es6-features.org/#ClassInheritance) +* [Template Literals: String Interpolation](http://es6-features.org/#StringInterpolation) +* [Template Literals: Custom Interpolation](http://es6-features.org/#CustomInterpolation) +* [Default Parameter Values](http://es6-features.org/#DefaultParameterValues) +* [String Searching: Includes](http://es6-features.org/#StringSearching) +* [Array Searching: Includes (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) +* [Iterators: For-Of](http://es6-features.org/#IteratorForOfOperator) **Note:** Please Update the list above as new features are incorporated into the library. - ### Current Issues -- [`#3883`](https://github.com/processing/p5.js/issues/3883): Failure to construct `new p5()` when using `combineModules` to create custom bundles. Global mode is unaffected and behaves as expected. +### Current Issues - \ No newline at end of file +* [`#3883`](https://github.com/processing/p5.js/issues/3883): Failure to construct `new p5()` when using `combineModules` to create custom bundles. Global mode is unaffected and behaves as expected. diff --git a/src/content/contributor-docs/en/archive/roadmap.mdx b/src/content/contributor-docs/en/archive/roadmap.mdx index cc9682f945..0196ad90ed 100644 --- a/src/content/contributor-docs/en/archive/roadmap.mdx +++ b/src/content/contributor-docs/en/archive/roadmap.mdx @@ -1,14 +1,11 @@ - ---- - ---- -# p5.js 1.0 Roadmap [WIP] +# p5.js 1.0 Roadmap \[WIP] This document is a list of possible features, improvements, and maintenance items for a future 1.0 version of p5.js. The first draft was created by the working group at UCLA Design Media Arts and is put out for your feedback. This is a working draft that may be updated and will be significantly revised at the p5.js Contributor’s Conference, schedule for August 2019. Our goal is to release p5.js 1.0 by the end of 2019. With the exception of ES6 migration, the tasks here are not ordered by priority. The [milestones](https://github.com/processing/p5.js/milestones) on github is where we prioritize tasks for releases and track progress. ## ES6 migration + * Phase 1: User facing * p5js.org tutorials (issue per tutorial) * p5js.org examples (issue per section) @@ -23,15 +20,17 @@ With the exception of ES6 migration, the tasks here are not ordered by priority. * Contributed libraries ## Maintenance + * Audio updates for pending Chrome changes (user must interact first) * Update reference documentation and examples, and examples page * Update FES to warn about this? * More complete unit tests * Clearer tutorial for doing this * Improve Friendly Error System documentation - * Add comments to https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js to better document what’s happening in this process. + * Add comments to [https://github.com/processing/p5.js/blob/main/src/core/friendly\_errors/fes\_core.js](https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js) to better document what’s happening in this process. ## Bug fixing + * Mobile device support / upgrades * WebGL robustness * Lighting @@ -43,6 +42,7 @@ With the exception of ES6 migration, the tasks here are not ordered by priority. * One rendering method for shapes, construct geom object from retain mode ## New Features + * Shapes * createShape() public API for returning a p5.Geometry object?? What is the equivalent in 2D? * Anything SVG for 2D? @@ -57,8 +57,9 @@ With the exception of ES6 migration, the tasks here are not ordered by priority. * Implement Promises across the library * Confirm/implement use of Promises across codebase * Open use of Promises in API for loadX() functions (lower priority?) - + ## Contributor process and support + * Open tickets for incompleteness in various areas: * Testing * Feature implementation @@ -67,6 +68,5 @@ With the exception of ES6 migration, the tasks here are not ordered by priority. * Clarify process for soliciting roadmap input for future versions. ## Etc -* For 1.0 release, drop a sweet new set of curated examples from artists and coders. - \ No newline at end of file +* For 1.0 release, drop a sweet new set of curated examples from artists and coders. diff --git a/src/content/contributor-docs/en/contributing_documentation.mdx b/src/content/contributor-docs/en/contributing_documentation.mdx index 1d60be4847..47598d33f1 100644 --- a/src/content/contributor-docs/en/contributing_documentation.mdx +++ b/src/content/contributor-docs/en/contributing_documentation.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Contributing Documentation Documentation is essential for new learners and experienced programmers alike. It helps make our community inclusive by extending a friendly hand to those who are less familiar with p5.js. It also helps us find the bugs and issues with the code itself, because we test and try things out as we document. @@ -9,13 +5,17 @@ Documentation is essential for new learners and experienced programmers alike. I There are several ways to contribute to documentation: ## ☝️ Make changes + If you're just getting started, one really helpful way you can contribute is by improving our documentation. If you notice a typo, a missing or broken example, or a function description that is confusing, here are some things you can do: -* If you are just correcting a small typo, feel free to go ahead and work on it and send in a PR when you're finished! + +* If you are just correcting a small typo, feel free to go ahead and work on it and send in a PR when you're finished! * If you don't feel like fixing it yourself, that's alright. Let us know by [opening an issue](https://github.com/processing/p5.js/issues). * If you're unsure about anything, [open an issue](https://github.com/processing/p5.js/issues) anyway! -## 🗯 Contribute to the reference +## 🗯 Contribute to the reference + Read through the [reference](http://p5js.org/reference/), and look for typos, broken examples, or confusing documentation. If it's a straightforward fix, go ahead and work on it! If it's a more involved question that requires discussion, create an [issue](https://github.com/processing/p5.js/issues/new). + * Here are instructions for [getting setup for the first time with the p5.js repo](./README/). * The reference is built from the inline documentation in the source code (found in the `src/` folder). * Here is information on [how to update or add inline documentation and examples](./inline_documentation/). @@ -23,23 +23,25 @@ Read through the [reference](http://p5js.org/reference/), and look for typos, br * If you find errors with the [spanish documentation](http://p5js.org/es), there are instructions to update this [here](https://github.com/processing/p5.js-website#internationalization-i18n-and-structure). * Community-maintained Typescript definitions are [here](https://github.com/p5-types/p5.ts). -## ✨ Make examples +## ✨ Make examples + While the examples in the reference are meant to be very simplistic snippets of code, it is also useful to have longer, more complex examples. + * Currently we are working on porting the examples from the [processing examples page](https://processing.org/examples/) to the [p5.js examples page](http://p5js.org/examples). If you would like to help with this, please see the instructions [here](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/). * Alternatively, you can create your own set of examples and publish them independently anywhere you like. If you share them online tag [@p5xjs](https://twitter.com/p5xjs) or email [hello@p5js.org](mailto:hello@p5js.org) to let us know, and we will share far and wide! This [guide to embedding p5.js](https://github.com/processing/p5.js/wiki/Embedding-p5.js) may be useful for posting your examples online. * If you find bugs in p5.js along the way, please log them in the [issues](https://github.com/processing/p5.js/issues). -## 👯 Make tutorials +## 👯 Make tutorials + * If you are new to p5.js, this is a great place to start. Try making something yourself, then making a tutorial to teach others to do it too. * Currently we are working on porting the tutorials from the [processing tutorials page](https://processing.org/tutorials) to the [p5.js learn page](http://p5js.org/learn). If you would like to help with this, please see the tutorial on making tutorials [here](https://p5js.org/learn/tutorial-guide.html). * We also welcome tutorials on different subjects. You can publish these anywhere, in any format you like. If you share them online tag [@p5xjs](https://twitter.com/p5xjs) or email [hello@p5js.org](mailto:hello@p5js.org) to let us know, and we will share far and wide! We especially encourage tutorials created with a specific audience or use case in mind (ex: p5 for journalists, activists, poets, kids, seniors, dreamers, in a different language, etc). We like to consider, who does not already feel welcome or included in the p5 community, and can we use learning as an invitation? What is the language you use to communicate with your audience and make them feel known? Feel free to be experimental with your format. Check out [Sharon De La Cruz's talk on Code Slang](https://www.youtube.com/watch?v=CFT6w9NKfCs) for inspiration. * If you find bugs in p5.js along the way, please log them in the [issues](https://github.com/processing/p5.js/issues). ## 👉 Getting started + * Read the [p5.js community statement](http://p5js.org/community/) * Optional: Check out the [contributor docs](./README/) to get an overview of the repository and learn how to build the code (if relevant for you). * All discussion happens on GitHub issues, so there's no slack/gitter/etc channel you need to join. * Add your name to the [contributors list](https://github.com/processing/p5.js#contributors) in the readme.md file! Instructions [here](https://github.com/processing/p5.js/issues/2309). * And of course, if you're more of a bug fixer kind of person, feel free to jump into any of the [issues](https://github.com/processing/p5.js/issues)! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/inline_documentation.mdx b/src/content/contributor-docs/en/contributing_to_the_p5.js_reference.mdx similarity index 95% rename from src/content/contributor-docs/en/inline_documentation.mdx rename to src/content/contributor-docs/en/contributing_to_the_p5.js_reference.mdx index e552c7bbd5..46ecd19685 100644 --- a/src/content/contributor-docs/en/inline_documentation.mdx +++ b/src/content/contributor-docs/en/contributing_to_the_p5.js_reference.mdx @@ -1,14 +1,9 @@ - ---- - ---- # Contributing to the p5.js Reference In p5.js, we author the code reference you see on the [reference](https://p5js.org/reference/) page on the p5.js website by including them alongside the library’s source code as specialized comments. These reference comments include the description, the function’s signature (its parameters and return value), and usage examples. In other words, the content on each p5.js function/variable’s reference page is built from the reference comments in the source code. This document will show you how to write and format the reference comments so that they can eventually be rendered onto the website correctly. You should follow this guide whenever you are editing or writing a reference for any p5.js function or variable. - ## A quick introduction to how reference comments work When you look at the source code of p5.js, you will see many lines in the library being reference comments; they look like this: @@ -72,7 +67,6 @@ They are usually followed by the actual JavaScript code that defines the functio Anything in a block in this manner will be interpreted as reference documentation. You may be familiar with this style of code comments through [JSDoc](https://jsdoc.app/). While p5.js does not use JSDoc, it uses a very similar tool called [YUIDoc](https://yui.github.io/yuidoc/), which has a very similar reference syntax. In this style of reference comments, each comment block is further divided into individual elements, which we will have a look at next.  - ## Reference comments block Let’s break down the reference comments block above for the `sin()` function and see what each section does. You can compare what you see in the comments here and what you can see on the reference page for [`sin()`](https://p5js.org/reference/#/p5/sin). @@ -95,14 +89,14 @@ At the very top of the comment is the text description of the function. This des A function will typically have the three sections above, each starting with an `@` symbol followed by one of the following keywords: -- `@method` is used to define the name of the function, in this case `sin` (note that the function name does not include the brackets `()`). -- `@param` is used to define the parameters or arguments that the function accepts. - - Following the keyword `@param`, stored in curly brackets `{}` is the type of the parameter. - - After the type, the next word (angle) is the name of the parameter. - - After the name, the rest of the line is the description of the parameter. -- `@return` is used to define the return value of the function. - - Following the keyword `@return`, stored in curly brackets `{}` is the type of the return value. - - After the type, the rest of the line is the description of the return value. +* `@method` is used to define the name of the function, in this case `sin` (note that the function name does not include the brackets `()`). +* `@param` is used to define the parameters or arguments that the function accepts. + * Following the keyword `@param`, stored in curly brackets `{}` is the type of the parameter. + * After the type, the next word (angle) is the name of the parameter. + * After the name, the rest of the line is the description of the parameter. +* `@return` is used to define the return value of the function. + * Following the keyword `@return`, stored in curly brackets `{}` is the type of the return value. + * After the type, the rest of the line is the description of the return value. More generically for parameters, you should follow this format: @@ -116,7 +110,6 @@ If the parameter is optional, add square brackets around the name: @param {type} [name] Description here. ``` - ### Additional info: Constants If the parameter takes one or more values defined in [`constants.js`](https://github.com/processing/p5.js/blob/main/src/core/constants.js) , then the type should be specified as `{Constant}` and the valid values should be enumerated in the comment following the `either` keyword, e.g.: @@ -133,7 +126,6 @@ For return types you should follow this format: If the function does not return a value, the `@return` tag can be left out. - ### Additional info: Chaining If the method returns the parent object, you can skip the `@return` tag and add this line instead: @@ -142,7 +134,6 @@ If the method returns the parent object, you can skip the `@return` tag and add @chainable ``` - ## Additional signatures If a function has multiple possible parameter options, you can specify each individually. For example, the [`background()`](http://p5js.org/reference/#p5/background) function takes a number of different parameter options (see "Syntax" section on the reference page). Choose one version to list as the first signature using the template above. At the end of the first reference comment block, you can add additional signatures, each in its own block, using only the `@method` and `@param` tags following the example below. @@ -163,12 +154,10 @@ If a function has multiple possible parameter options, you can specify each indi  */ ``` - ### Additional info: Multiple signatures It is not necessary to create a separate signature if the only difference between two signatures is the addition of an optional parameter. Limit the use of this feature if possible because it can create unnecessary noise in the reference. - ## Reference for p5.js variables So far, we have looked at how to write references for functions and constants. Variables follow the same structure but use different tags. @@ -200,12 +189,11 @@ So far, we have looked at how to write references for functions and constants. V The start of the block contains the description of the variable (`mouseX` in this case). To define the name of the variable, we use `@property` instead of `@method`. `@property` follows the same syntax as `@param` for defining the type and its name. The `@readonly` tag is present on most p5.js variables and is used internally to indicate this value should not be overwritten directly by a library user. - ## Adding examples One tag that is present in both `sin()` and `mouseX`’s reference comments that we have not talked about yet is the `@example` tag. This tag is where you define the code example(s) that is run when you visit the reference page. -![Screenshot of the p5.js reference page of the "red()" function, showing only the example code section.](images/contributor-docs/reference-screenshot.png) +![Screenshot of the p5.js reference page of the "red()" function, showing only the example code section.](/images/contributor-docs/reference-screenshot.png) The relevant `@example` tag to create the above is as follows: @@ -274,7 +262,6 @@ If you do not want the example to be run as part of the automated tests (for exa If your example uses external asset files, put them in the [/docs/yuidoc-p5-theme/assets](https://github.com/processing/p5.js/tree/main/docs/yuidoc-p5-theme/assets) folder (or reuse one already in there) then link to them with "assets/filename.ext" in the code. See the [tint()](http://p5js.org/reference/#/p5/tint) reference for example. - ### Add a canvas description using `describe()` Finally, for every example you add, you are required to use the p5.js function `describe()` in the example to create a screen-reader accessible description for the canvas. Include only one parameter: a string with a brief description of what is happening on the canvas.  @@ -314,7 +301,6 @@ For more on `describe()` visit the [web accessibility contributor documentation] With all the above you should have most of the tools needed to write and edit p5.js reference comments. However, there are a few more specialized usage of JSDoc style reference comments that you may come across in p5.js. These are situationally useful and not something that you need often. - ### `@private` tag You can use the `@private` if a property or variable is a private function or variable. If a feature is marked as `@private` it will not be included as part of the rendered reference on the website. The reason to use the `@private` tag to mark a reference comments block as private is when you document internal features for the library itself. For example, see the reference comments for `_start` below: @@ -331,7 +317,6 @@ You can use the `@private` if a property or variable is a private function or va p5.prototype._start = function () { ``` - ### `@module` and related tags At the top of each source code file will be a `@module` tag. Modules correspond to a group of features in p5.js which on the rendered reference page on the website are split into the corresponding sections. Inside each module, there are additional submodules defined with the `@submodule` tag. @@ -352,7 +337,6 @@ The `@requires` tag defines the required imported modules that the current modul The convention p5.js follows is that each subfolder in the `src/` folder will be one `@module` while each file inside the subfolder will be its own `@submodule` under the overall subfolder’s `@module`. Unless you are adding new subfolders/files to the p5.js source code, you shouldn’t need to edit this reference comments block. - ### `@class` tag Class constructors are defined with the `@class` tag and the `@constructor` tag. The format for this block is similar to how a function is defined with the `@method` block, the class’s name will need to be defined with the `@class` tag and the `@constructor` tag will indicate the class has a constructor function. See the example below for the `p5.Color` class: @@ -386,12 +370,11 @@ Class constructors are defined with the `@class` tag and the `@constructor` tag.  */ ``` - ## Generating and previewing the reference The p5.js repository is set up so that you can generate and preview the reference without needing to build and run the p5.js website as well. -- The main command to generate the reference from the reference comments in the source code is to run the following command.  +* The main command to generate the reference from the reference comments in the source code is to run the following command.  ``` npm run docs @@ -399,7 +382,7 @@ npm run docs This will generate the necessary preview files and the main `docs/reference/data.json` file, which is the same file (after minification) that will be used to render the reference page on the website. -- For continuous work on the reference, you can run the following command. +* For continuous work on the reference, you can run the following command. ``` npm run docs:dev @@ -407,14 +390,10 @@ npm run docs:dev This will launch a live preview of the rendered reference that will update each time you make changes (you will need to refresh the page after making changes to see them appear). This is useful, especially for previewing example code running in the browser. -- The main template files are stored in the `docs/` folder and, in most cases, you should not make changes directly to files in this folder, except to add new asset files in the `docs/yuidoc-p5-theme/assets` folder. - +* The main template files are stored in the `docs/` folder and, in most cases, you should not make changes directly to files in this folder, except to add new asset files in the `docs/yuidoc-p5-theme/assets` folder. ## Next steps For additional details about the reference system, you can checkout the documentation for [JSDoc](https://jsdoc.app/) and [YUIDoc](https://yui.github.io/yuidoc/). For examples of issues related to the reference, have a look at [#6519](https://github.com/processing/p5.js/issues/6519) and [#6045](https://github.com/processing/p5.js/issues/6045). The [contributor guidelines](https://docs.google.com/document/d/1roBu-7s9xspuie3M6EhEokYWc82DZhDNYO2SQiY4k68/edit?tab=t.0#heading=h.627q50vo09fb) document is also a good place to start. - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/contributor_guidelines.mdx b/src/content/contributor-docs/en/contributor_guidelines.mdx index 453694f7c7..2e9c159680 100644 --- a/src/content/contributor-docs/en/contributor_guidelines.mdx +++ b/src/content/contributor-docs/en/contributor_guidelines.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Contributor Guidelines Welcome to the contributor guidelines! This document is for new contributors looking to contribute code to p5.js, contributors looking to refresh their memories on some technical steps, or just about anything else to do with code contributions to p5.js. @@ -12,54 +8,51 @@ This is a relatively long and comprehensive document but we will try to signpost **If you are a new contributor, you may want to start with the first section, “All about issues.” If you just want a step-by-step setup of the development process, you can look at the “Quick Get Started For Developers” section.** - # Table of Contents -- [All about issues](#all-about-issues) - - [What are issues?](#what-are-issues) - - [Issue templates](#issue-templates) - - [Found a bug](#found-a-bug) - - [Existing Feature Enhancement](#existing-feature-enhancement) - - [New Feature Request](#new-feature-request) - - [Discussion](#discussion) -- [Working on p5.js codebase](#working-on-the-p5js-codebase) - - [Quick Get Started For Developers](#quick-get-started-for-developers) - - [Using the Github edit functionality](#using-the-github-edit-functionality) - - [Forking p5.js and working from your fork](#forking-p5js-and-working-from-your-fork) - - [Using Github Desktop](#using-github-desktop) - - [Using the git command line interface](#using-the-git-command-line-interface) - - [Codebase breakdown](#codebase-breakdown) - - [Build setup](#build-setup) - - [Git workflow](#git-workflow) - - [Source code](#source-code) - - [Unit tests](#unit-tests) - - [Inline documentation](#inline-documentation) - - [Internationalization](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#internationalization) - - [Accessibility](#accessibility) - - [Code standard](#code-standard) - - [Software Design principles](#software-design-principles) -- [Pull requests](#pull-requests) - - [Creating a pull request](#creating-a-pull-request) - - [Pull request information](#pull-request-information) - - [Title](#title) - - [Resolves](#resolves) - - [Changes](#changes) - - [Screenshots of the change](#screenshots-of-the-change) - - [PR Checklist](#pr-checklist) - - [Rebase and resolve conflicts](#rebase-and-resolve-conflicts) - - [Discuss and amend](#discuss-and-amend) - ---- - +* [All about issues](#all-about-issues) + * [What are issues?](#what-are-issues) + * [Issue templates](#issue-templates) + * [Found a bug](#found-a-bug) + * [Existing Feature Enhancement](#existing-feature-enhancement) + * [New Feature Request](#new-feature-request) + * [Discussion](#discussion) +* [Working on p5.js codebase](#working-on-the-p5js-codebase) + * [Quick Get Started For Developers](#quick-get-started-for-developers) + * [Using the Github edit functionality](#using-the-github-edit-functionality) + * [Forking p5.js and working from your fork](#forking-p5js-and-working-from-your-fork) + * [Using Github Desktop](#using-github-desktop) + * [Using the git command line interface](#using-the-git-command-line-interface) + * [Codebase breakdown](#codebase-breakdown) + * [Build setup](#build-setup) + * [Git workflow](#git-workflow) + * [Source code](#source-code) + * [Unit tests](#unit-tests) + * [Inline documentation](#inline-documentation) + * [Internationalization](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#internationalization) + * [Accessibility](#accessibility) + * [Code standard](#code-standard) + * [Software Design principles](#software-design-principles) +* [Pull requests](#pull-requests) + * [Creating a pull request](#creating-a-pull-request) + * [Pull request information](#pull-request-information) + * [Title](#title) + * [Resolves](#resolves) + * [Changes](#changes) + * [Screenshots of the change](#screenshots-of-the-change) + * [PR Checklist](#pr-checklist) + * [Rebase and resolve conflicts](#rebase-and-resolve-conflicts) + * [Discuss and amend](#discuss-and-amend) + +*** # All about issues The majority of the activity on p5.js' GitHub repositories (repo for short) happens in issues, which is a great place to start your contribution journey. - ## What are issues? -![A cropped screenshot of the p5.js library GitHub repository, only showing contents of the top right corner. A red box is drawn on top of the screenshot surrounding the Issues tab.](images/contributor-docs/issues-tab.png) +![A cropped screenshot of the p5.js library GitHub repository, only showing contents of the top right corner. A red box is drawn on top of the screenshot surrounding the Issues tab.](/images/contributor-docs/issues-tab.png) “Issue” is the generic name for a post on GitHub that aims to describe, well, an issue. This issue can be a bug report, a request to add a new feature, a discussion, or anything that works as a post related to p5.js library development. Comments can be added below each issue by anyone with a GitHub account, including bots! It is the place where contributors discuss topics related to the development of the project in the repo. @@ -69,17 +62,15 @@ either on the [forum](https://discourse.processing.com) or on other platforms su We have created easy-to-use issue templates to aid you in deciding whether a topic should be a GitHub issue or posted elsewhere! - ## Issue templates p5.js's issue templates make it easier for stewards and maintainers to understand and review issues. They also make it easier for you to file the relevant issue and receive a reply faster.  -![Screenshot of an example of what an issue looks like on GitHub. The title of the issue in the screenshot is "Warning being logged in Safari when using a filter shader in 2D mode #6597"](images/contributor-docs/github-issue.png) +![Screenshot of an example of what an issue looks like on GitHub. The title of the issue in the screenshot is "Warning being logged in Safari when using a filter shader in 2D mode #6597"](/images/contributor-docs/github-issue.png) To file a new issue, simply go to the "Issues" tab on the p5.js repo and click on the "New issue" button on the right side. You will be presented with several different options, each of which either corresponds to a relevant issue template or redirects you to the relevant place to file your question. We recommend choosing the most relevant option out of those presented to ensure your issue receives the right attention promptly. -![Cropped screenshot of the GitHub repository's issue page with the green "New issue" button highlighted with a red box surrounding it.](images/contributor-docs/new-issue.png) - +![Cropped screenshot of the GitHub repository's issue page with the green "New issue" button highlighted with a red box surrounding it.](/images/contributor-docs/new-issue.png) ### ["Found a bug"](https://github.com/processing/p5.js/issues/new?assignees=\&labels=Bug\&projects=\&template=found-a-bug.yml) @@ -92,51 +83,33 @@ There are a few fields for you to fill in for this template: 3. *Web browser and version* - This helps us isolate different behaviors between browsers. To find the browser version number, follow the instructions in the table below for the browser you are using. - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
- -Chrome - - - -Firefox - - - -Safari - -
- -In the address bar, navigate to `chrome://version` - - - -In the address bar, navigate to  `about:support` - - - -Under the top bar “Safari” menu item, choose “About Safari” - -
+ Chrome + + Firefox + + Safari +
+ In the address bar, navigate to `chrome://version` + + In the address bar, navigate to  `about:support` + + Under the top bar “Safari” menu item, choose “About Safari” +
4. *Operating System* - You should include the OS version number if possible, e.g., `macOS 12.5`. Some bugs can stem from OS behaviors. @@ -155,7 +128,6 @@ If you wish to contribute a fix to the bug you just reported, you can indicate s For bug reports to be accepted for fixing, they must be approved by at least one [area steward or maintainer](https://github.com/processing/p5.js#stewards) before work can begin on a pull request. - ### ["Existing Feature Enhancement"](https://github.com/processing/p5.js/issues/new?assignees=\&labels=Enhancement\&projects=\&template=existing-feature-enhancement.yml) This template should be used if you wish to propose changes or add functionality to existing features of p5.js (functions, constants, rendering, etc). For example, if you want to add a new way to define a color to the `color()` function and other functions that accept colors, this is the template to use. @@ -170,7 +142,6 @@ For feature enhancement proposals to be accepted they must be approved by at lea **You should not file a pull request (or start working on code changes) without a corresponding issue or before an issue has been approved for implementation**, because there is no guarantee that the proposal will be accepted. Any pull requests filed before a proposal has been approved will be closed until approval is given to the issue. - ### ["New Feature Request"](https://github.com/processing/p5.js/issues/new?assignees=\&labels=Feature+Request\&projects=\&template=feature-request.yml) This template should be used if you wish to propose a new feature to be added to p5.js. For example to add support for drawing native HTML `` elements with a new `createTable` function. Some proposals may overlap with existing feature enhancement proposals, in these cases you should just choose whichever template you feel is most appropriate. @@ -181,7 +152,6 @@ For new feature request proposals to be accepted, they must be approved by at le **You should not file a pull request (or start working on code changes) without a corresponding issue or before an issue has been approved for implementation**, that is because there is no guarantee that the proposal will be accepted. Any pull requests filed before a proposal has been approved will be closed until approval is given to the issue. - ### ["Discussion"](https://github.com/processing/p5.js/issues/new?assignees=\&labels=Discussion\&projects=\&template=discussion.yml) This template is used when the issue you are filing does not fit into any of the above in any way. An issue not fitting into any of the above templates should be relatively rare in practice. For example, a discussion about whether to adopt a specific Web API feature in p5.js should be filed as a [new feature request](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#new-feature-request); a discussion about adding an additional color mode to the various color functions should be filed as a [feature enchancement](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#existing-feature-enchancement); an announcement about a local creative coding event that you are organizing should be posted on the forum and contacting the Processing Foundation if you are looking for support or publicity; etc. @@ -190,8 +160,7 @@ When opening a discussion issue, you can use the "Labels" panel on the side pane [**⬆ back to top**](#contributor-guidelines) ---- - +*** # Working on the p5.js codebase @@ -199,7 +168,6 @@ When opening a discussion issue, you can use the "Labels" panel on the side pane To proceed you should be minimally familiar with working with the command line, git, node.js (at least v18 and up), and have a local development environment setup. - ## Introduction Now that your issue has been discussed, an implementation approved, and you are willing to make the code changes, you are ready to start working on the codebase. @@ -212,7 +180,6 @@ If you file a PR for an issue while someone else is still working on the same is Similarly, you should work at your own pace and be confident that there is no hard time limit on how long you can spend working on something. That being said, if you are having trouble with any aspect of your code contribution, do not hesitate to ask for help in the issue, the stewards and maintainers, as well as members of our community, will do our best to guide you! - ## Quick Get Started For Developers If you want to work/contribute to p5.js'🌸 codebase as a developer, either directly for improving p5.js or for improving its sub-projects like [Friendly Error Systems](https://github.com/processing/p5.js/blob/main/contributor_docs/friendly_error_system/), you can follow the following steps: @@ -221,74 +188,70 @@ If you want to work/contribute to p5.js'🌸 codebase as a developer, either dir 2. [Clone your created fork to your computer.](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) 3. [Add upstream using the following command](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/configuring-a-remote-repository-for-a-fork): - ``` - git remote add upstream https://github.com/processing/p5.js - ``` +``` +git remote add upstream https://github.com/processing/p5.js +``` 4. Make sure your machine has [NodeJs](https://nodejs.org/en/download) installed; check it with the following command: - ``` - node -v - ``` +``` +node -v +``` 5. Install dependencies with: - ``` - npm ci - ``` +``` +npm ci +``` 6. Create a git branch of the `main` branch having a descriptive branch name using:  - ``` - git checkout -b [branch_name] - ``` +``` +git checkout -b [branch_name] +``` 7. As you start making changes to the codebase, frequently run the tests (it takes time, but it ensures that existing behaviors are not being broken). - ``` - npm test - ``` +``` +npm test +``` 8. Add any unit tests if you are working on adding new features or feature enhancement. 9. Once done, you can commit the changes and create a [Pull Request](https://p5js.org/contributor-docs/#/./contributor_guidelines?id=pull-requests). - ## Using the GitHub edit functionality When viewing a file on the GitHub web interface, near the top of the content of the file you are viewing will be a pencil icon button. This button is a convenient edit feature provided by GitHub that simplifies many of the processes we will be covering below and can be used to make quick and simple edits to the file you are viewing. -![Cropped screenshot of a file view in GitHub of the p5.js repository, "src/color/color\_conversion.js" file. A red arrow pointing to a pencil icon button on the right side of the image.](images/contributor-docs/edit-file.png) +![Cropped screenshot of a file view in GitHub of the p5.js repository, "src/color/color\_conversion.js" file. A red arrow pointing to a pencil icon button on the right side of the image.](/images/contributor-docs/edit-file.png) However, it is not recommended to use this feature other than for very simple changes. One of the main reasons for this is that for more complex changes to the source code, it should be built and tested locally before being filed as a PR. Using a local development environment is also often much more fluent for most as compared to the basic editing environment provided by this edit functionality. - ## Forking p5.js and working from your fork The first step to work on the p5.js source code is to fork the p5.js repository. Forking has a specific meaning in open source, but for our purpose, it means creating a copy of the repository and storing it in your own GitHub account. To fork a repo, simply click on the "Fork" button near the top of the page, and GitHub will make a copy of the repo in your account. -![Screenshot of the main page of repository. A button, labeled with a fork icon and "Fork 59.3k," is outlined in dark orange.](fork.png) +![Screenshot of the main page of repository. A button, labeled with a fork icon and "Fork 59.3k," is outlined in dark orange.](/images/contributor-docs/fork.png) Working from your fork of the p5.js repository is necessary because you will likely not have direct write access to the official p5.js repository, and working on a fork allows you to make changes and later submit them back to the official repository. - ### Using GitHub Desktop GitHub Desktop is a program that lets you work with git via a graphical user interface rather than typing commands into a terminal. It is a good option if you are new to git, and you can always switch back and forth between Github Desktop and a terminal whenever you feel like it. First, [download and install GitHub Desktop.](https://desktop.github.com/) Once installed, open the application. It will ask you to sign in to your GitHub account. After you have signed in, it will list your projects, including your fork of p5.js. Select your fork, which will be named `yourUsername/p5.js`, and click the blue "Clone" button. It will ask for some details about where to place your project; you can either change them or leave the default settings and continue. -![The GitHub Desktop user interface after signing in. On the right half of the screen, it lists your projects, and a Clone button in the bottom right.](images/contributor-docs/github-desktop-init.png) +![The GitHub Desktop user interface after signing in. On the right half of the screen, it lists your projects, and a Clone button in the bottom right.](/images/contributor-docs/github-desktop-init.png) Once cloned, it will ask how you plan to use your fork. Select the option to contribute to the parent project and click "Continue." -![The view after cloning a fork. It asks if you are planning to contribute to the parent project, or use it for your own purposes.](images/contributor-docs/github-desktop-fork.png) - +![The view after cloning a fork. It asks if you are planning to contribute to the parent project, or use it for your own purposes.](/images/contributor-docs/github-desktop-fork.png) ### Using the `git` command line interface Once the fork is created, navigate to your fork's page and copy the git URL by clicking the green "Code" button. It should look something like `https://github.com/limzykenneth/p5.js.git`. -![Screenshot of the list of files on the landing page of a repository. The "Code" button is highlighted with a dark orange outline.](images/contributor-docs/code-button.png) +![Screenshot of the list of files on the landing page of a repository. The "Code" button is highlighted with a dark orange outline.](/images/contributor-docs/code-button.png) Next go to the command line in your local environment and clone this git repository. "Clone" simply means download a copy of the repo to your local machine. Run the following command in a folder where you want to store the p5.js source code folder. @@ -298,20 +261,18 @@ git clone [git_url] Replace `[git_url]` with the URL you just copied above. This can take several minutes, depending on the speed of your internet connection, a good time to make some coffee! Once the process is finished, you can open up the downloaded folder named `p5.js` in your preferred text editor and start looking around. - ## Codebase breakdown Some of the key files and folders you will be in the p5.js folder are as follows: -- `src` - Where all the code that eventually gets combined into the final p5.js and p5.min.js files lives -- [`test`](https://github.com/processing/p5.js/blob/main/contributor_docs/unit_testing/) - Where unit tests and code for testing all documentation examples lives -- `tasks` - Where detailed and custom build code lives -- `Gruntfile.js` - This is the main build configuration file -- `contributor_docs` - Where the documentation and all other contributor documentation lives +* `src` - Where all the code that eventually gets combined into the final p5.js and p5.min.js files lives +* [`test`](https://github.com/processing/p5.js/blob/main/contributor_docs/unit_testing/) - Where unit tests and code for testing all documentation examples lives +* `tasks` - Where detailed and custom build code lives +* `Gruntfile.js` - This is the main build configuration file +* `contributor_docs` - Where the documentation and all other contributor documentation lives The other files and folders are either configurations or other kinds of support files; in most cases, you shouldn't need to make any modifications. - ## Build setup Before you do anything, you'll need to set up the local project folder so that you can build and run tests for p5.js. Assuming you have node.js installed, run: @@ -322,7 +283,6 @@ npm ci This will likely take a while, as npm downloads all dependencies required. However, once done, that's it, you are all set up. Pretty simple, right? - ## Git workflow Now, you are ready to make the changes you need to make; for more details about the different parts of the repository and how you can make relevant changes, see the subsections below. To start, run: @@ -343,7 +303,7 @@ Next, we recommend that you make a branch off the `main` branch before starting In GitHub Desktop, this can be done by clicking the Current Branch button in the header of the window. From here, you can change branches, or enter a branch name to make a new one. For our purposes, enter a new branch name describing the change you will make, and click Create New Branch. -![A screenshot of the GitHub Desktop branch selection menu. After entering a new branch name that does not yet exist, a "Create New Branch" button appears.](images/contributor-docs/github-desktop-create-branch.png) +![A screenshot of the GitHub Desktop branch selection menu. After entering a new branch name that does not yet exist, a "Create New Branch" button appears.](/images/contributor-docs/github-desktop-create-branch.png) From the terminal, run `git checkout -b branch_name` while you are on the `main` branch, replacing `branch_name` with something descriptive, and you will be on a separate branch now.  @@ -355,7 +315,7 @@ A question that may arise is how often should you commit to git? In general it i To commit all current changes from GitHub Desktop, open the app after making your changes. It will show a list of the files you have changed in the left sidebar, and the specific changes within each file on the right. Type a brief, high-level description in the field next to your user icon in the bottom left corner of the window. This will be the title of the commit. You may elaborate further in the description field below or just leave it blank. Click the blue "Commit" button to finalize the change. -![A screenshot of GitHub Desktop after having made a change. The area where you need to write a title for your change is circled in red in the lower left of the window.](images/contributor-docs/github-desktop-commit.png) +![A screenshot of GitHub Desktop after having made a change. The area where you need to write a title for your change is circled in red in the lower left of the window.](/images/contributor-docs/github-desktop-commit.png) To commit all current changes from the terminal, run the following: @@ -393,63 +353,55 @@ git commit -m "Add documentation example to circle() function" Repeat the above steps for all commits you will be making while making sure to run `npm test` periodically to make sure things are working. - ### Source code If you are going to work on the source code, a good place to start, if you know which of p5.js features you are going to work on, is to visit the documentation and at the bottom of each documented functionality of p5.js will be a link to its source code. -![Cropped screenshot of a reference page on the p5.js website containing the sentence "Notice any errors or typos? Please let us know. Please feel free to edit src/core/shape/2d\_primitives.js and issue a pull request!". Part of the above sentence where it says "src/core/shape/2d\_primitives.js" is highlighted with a red underline and arrow pointing to it.](images/contributor-docs/reference-code-link.png) - +![Cropped screenshot of a reference page on the p5.js website containing the sentence "Notice any errors or typos? Please let us know. Please feel free to edit src/core/shape/2d\_primitives.js and issue a pull request!". Part of the above sentence where it says "src/core/shape/2d\_primitives.js" is highlighted with a red underline and arrow pointing to it.](/images/contributor-docs/reference-code-link.png) ### Unit tests If you are going to work on unit tests, please see [here](https://github.com/processing/p5.js/blob/main/contributor_docs/unit_testing/). Note that for any feature enhancement, new features, and certain bug fix, unit tests covering the new implementations should be included in the PR. - ### Inline documentation If you are going to work on the inline documentation, please see [here](https://github.com/processing/p5.js/blob/main/contributor_docs/inline_documentation/). - ### Accessibility If you are going to work on accessibility features, please see [here](https://github.com/processing/p5.js/blob/main/contributor_docs/web_accessibility/). For a Friendly Error System, please see [here](https://github.com/processing/p5.js/blob/main/contributor_docs/friendly_error_system/). - ## Code standard p5.js' code standard or code style is enforced by [ESLlint](https://eslint.org/). Any git commit and pull request must pass linting before it will be accepted. The easiest way for you to follow the right coding standard is to use the ESLint plugin available for your text editor with linting error highlighting (available for most popular text editors). - ## Software Design principles While working on any features of p5.js, it is important to keep in mind the design principles of p5.js. Our priorities may differ from the priorities of other projects, so if you are coming from a different project, we recommend that you familiarize yourself with p5.js' design principles. -- **Access** We prioritize accessibility first and foremost, and decisions we make must take into account how it increases access to historically marginalized groups. Read more about this in our access statement. -- **Beginner Friendly** The p5.js API aims to be friendly to beginner coders, offering a low barrier to creating interactive and visual web content with cutting-edge HTML5/Canvas/DOM APIs. -- **Educational** p5.js is focused on an API and curriculum that supports educational use, including a complete reference to the API with supporting examples, as well as tutorials and sample class curricula that introduce core creative coding principles in a clear and engaging order. -- **JavaScript and its community** p5.js aims to make web development practices more accessible to beginners by modeling proper JavaScript design patterns and usage while abstracting them where necessary. As an open-source library, p5.js also includes the wider JavaScript community in its creation, documentation, and dissemination. -- **Processing and its community** p5.js is inspired by the Processing language and its community and aims to make the transition from Processing Java to JavaScript easy and clear. +* **Access** We prioritize accessibility first and foremost, and decisions we make must take into account how it increases access to historically marginalized groups. Read more about this in our access statement. +* **Beginner Friendly** The p5.js API aims to be friendly to beginner coders, offering a low barrier to creating interactive and visual web content with cutting-edge HTML5/Canvas/DOM APIs. +* **Educational** p5.js is focused on an API and curriculum that supports educational use, including a complete reference to the API with supporting examples, as well as tutorials and sample class curricula that introduce core creative coding principles in a clear and engaging order. +* **JavaScript and its community** p5.js aims to make web development practices more accessible to beginners by modeling proper JavaScript design patterns and usage while abstracting them where necessary. As an open-source library, p5.js also includes the wider JavaScript community in its creation, documentation, and dissemination. +* **Processing and its community** p5.js is inspired by the Processing language and its community and aims to make the transition from Processing Java to JavaScript easy and clear. [**⬆ back to top**](#contributor-guidelines) ---- - +*** # Pull requests Now that you have made the changes you need to make, including unit tests if applicable, `npm test` does not error, and you have committed the changes, you can start preparing pull requests to get your new commits merged into the official p5.js repository. A pull request, more formally, is a request to a repo (in this case, the official p5.js repo) to pull or merge changes from another repo (in this case, your forked p5.js repo) into its commit history. - ## Creating a pull request The first step here is to push your new commits to your fork of p5.js; think of it as uploading the changes to your fork. -From GitHub Desktop, just to the right of the button to change branches in the header is a button to push your changes to GitHub. Click this to push your changes.![A view of GitHub Desktop after committing changes. The button to push the changes online is circled in red.](images/contributor-docs/publish-branch.png) +From GitHub Desktop, just to the right of the button to change branches in the header is a button to push your changes to GitHub. Click this to push your changes.![A view of GitHub Desktop after committing changes. The button to push the changes online is circled in red.](/images/contributor-docs/publish-branch.png) Once your code is uploaded, it will show a button prompting you to create a pull request. Clicking the button once will show a preview with another button to actually create the request. Press the "Create Pull Request" button to begin the process. -![A screenshot of Github Desktop after pushing code. In the left sidebar, it says "0 changed items." In the right pane, below the "No local changes" header, a blue "Review Pull Request" button has been marked up with a red circle.](images/contributor-docs/preview-pull-request.png) +![A screenshot of Github Desktop after pushing code. In the left sidebar, it says "0 changed items." In the right pane, below the "No local changes" header, a blue "Review Pull Request" button has been marked up with a red circle.](/images/contributor-docs/preview-pull-request.png) From the terminal, run the following command: @@ -463,46 +415,39 @@ Once the push is complete, you may see a link in the terminal that lets you open You may also see a button to open a pull request when you visit the p5.js Github repo. Clicking it will also work to open a new pull request. -![Cropped screenshot of the main page of the p5.js GitHub repository web page. A section near the top of the page is a yellow call to action box containing a green button with the text "Compare & pull request".](images/contributor-docs/recent-pushes) - +![Cropped screenshot of the main page of the p5.js GitHub repository web page. A section near the top of the page is a yellow call to action box containing a green button with the text "Compare & pull request".](/images/contributor-docs/recent-pushes) ### Pull request information -![Screenshot of an "Open a pull request" page on GitHub that is prepopulated with p5.js's pull request template.](images/contributor-docs/new-pr.png) +![Screenshot of an "Open a pull request" page on GitHub that is prepopulated with p5.js's pull request template.](/images/contributor-docs/new-pr.png) Before filing the pull request, you will need to fill out the pull request template.  - ### Title The pull request title should briefly describe what the changes are, again avoid generic statements here. - ### Resolves In the template, there is this line `Resolves #[Add issue number here]`, which you should replace `[Add issue number here]` with the issue number of the issue you are addressing/fixing [above](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#all-about-issues) (e.g., `Resolves #1234`). This will make sure the issue is automatically closed after this PR is merged. If you do not wish to automatically close the issue after this PR is merged (maybe because there are more changes coming in a separate PR), change `Resolves` to `Addresses`. - ### Changes You should clearly describe the changes you have made in this PR. Include any implementation details and decisions you made here that are relevant to whoever will review it. - ### Screenshots of the change This is optional depending on circumstances and should be included when making changes related to how p5.js renders visuals on the canvas. Note that this is not a screenshot of the text editor but a screenshot of an example sketch's behavior after your changes. - ### PR Checklist This contains some relevant checklist items that you should tick by replacing `[ ]` with `[x]` wherever relevant to your changes. Once done, click on "Create pull request." - ### Rebase and resolve conflicts -![Screenshot of an open pull request on p5.js's GitHub repository. The title of the pull request says "Fix filter shaders when rectMode is applied; add tests #6603.](images/contributor-docs/opened-pr.png) +![Screenshot of an open pull request on p5.js's GitHub repository. The title of the pull request says "Fix filter shaders when rectMode is applied; add tests #6603.](/images/contributor-docs/opened-pr.png) You should now inspect the opened pull request and pay attention to a few things: @@ -512,19 +457,19 @@ You should now inspect the opened pull request and pay attention to a few things If any of the above is not true (there are more commits than you expected or there are conflicts), you may need to [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) or help resolve conflicts. Conflicts here mean that you have made changes to a file that also recently had changes applied to it, and git is not sure which set of changes to keep or leave out. If you are not confident in resolving these issues, let us know and we'll guide you through the process. Basic instruction is as below. -Sometimes, Github lets you resolve conflicts directly in the browser by showing you a Resolve Conflicts button:![A screenshot of a GitHub pull request with merge conflicts. The conflicting filenames are listed, and there is a "Resolve conflicts" button highlighted.](images/contributor-docs/resolve-conflicts.png) +Sometimes, Github lets you resolve conflicts directly in the browser by showing you a Resolve Conflicts button:![A screenshot of a GitHub pull request with merge conflicts. The conflicting filenames are listed, and there is a "Resolve conflicts" button highlighted.](/images/contributor-docs/resolve-conflicts.png) Conflicts are shown between `<<<<<<<` and `>>>>>>>`, separated by `=======`. One section shows your code, and the other section shows what has changed in the main branch. -![A screenshot of GitHub's conflict resolution interface. A sidebar lists the files with conflicts. The right pane contains the conflicting code, with merge conflict markers highlighted.](images/contributor-docs/conflicts-interface.png) +![A screenshot of GitHub's conflict resolution interface. A sidebar lists the files with conflicts. The right pane contains the conflicting code, with merge conflict markers highlighted.](/images/contributor-docs/conflicts-interface.png) Remove the conflict markers and keep just the final code that you want in your PR. You can click "Mark as resolved" when all the conflicts have been addressed. -![A screenshot of the GitHub conflict resolution interface after editing the code to remove the merge conflict markers. The "mark as resolved" button in the upper right is enabled.](images/contributor-docs/mark-as-resolved.png) +![A screenshot of the GitHub conflict resolution interface after editing the code to remove the merge conflict markers. The "mark as resolved" button in the upper right is enabled.](/images/contributor-docs/mark-as-resolved.png) When all files with conflicts have been resolved, you can commit your changes. -![The GitHub conflict resolution interface after all conflicts have been marked as resolved. A green "commit merge" button is enabled.](images/contributor-docs/commit-merge.png) +![The GitHub conflict resolution interface after all conflicts have been marked as resolved. A green "commit merge" button is enabled.](/images/contributor-docs/commit-merge.png) Sometimes, the conflicts are too complicated for Github to show on the web. In this case, or if you just prefer the manual method, you can resolve your conflicts locally: @@ -543,7 +488,6 @@ git rebase --continue The checklist above may clear out after these steps but if not, we'll guide you through any fix necessary. - ## Discuss and amend Now that your PR is opened, a steward or maintainer will review your PR. It may take several days before a steward is able to reply to your PR, so be patient. Why not use the time to check out some of the other open issues in the meantime? @@ -553,6 +497,3 @@ Once a steward has reviewed your PR, one of two things may happen: 1. Your PR is If changes are requested of your PR and you are able to make those changes, follow the [same process as before](https://github.com/processing/p5.js/blob/main/contributor_docs/contributor_guidelines.md#git-workflow) but just continue from your local copy of the repo and relevant branch, make those changes, commit them into git, and push them to your forked remote repo. Once you have pushed additional commits to your forked remote repo, you will see that the new commits automatically show up in the PR. Leave a comment in the PR to let the reviewer know you have made the requested changes, and if no additional changes are needed, your PR will be merged! [**⬆ back to top**](#contributor-guidelines) - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/creating_libraries.mdx b/src/content/contributor-docs/en/creating_libraries.mdx index f64b425a35..e32641231f 100644 --- a/src/content/contributor-docs/en/creating_libraries.mdx +++ b/src/content/contributor-docs/en/creating_libraries.mdx @@ -1,32 +1,26 @@ - ---- - ---- # Creating an Addon Library A p5.js addon library is JavaScript code that extends or adds to the p5.js core functionality. While p5.js itself already provides a wide range of functionality, it doesn’t aim to cover everything you can do with JavaScript and the Web API. Addon libraries let you extend p5.js without needing to incorporate the features into p5.js. This guide will take you through the steps of creating an addon library that loads a simple CSV file by implementing a `loadCSV()` function. Here are some examples of why you may want to create an addon library: -- Provide a simplified interface to another library - - [p5.ble.js](https://github.com/ITPNYU/p5.ble.js) - - [p5.serialserver](https://github.com/p5-serial/p5.serialserver) -- Implement specialized algorithms or functionalities - - [p5.pattern](https://github.com/SYM380/p5.pattern) - - [p5.mapper](https://github.com/jdeboi/p5.mapper) -- Test out new Web API features that are not widely available in different browsers yet - - [p5.webserial](https://github.com/gohai/p5.webserial/) - - [p5.joystick](https://github.com/Vamoss/p5.joystick) -- Test alternative or new implementations of existing p5.js functionalities - - [número](https://github.com/nickmcintyre/numero) - - [p5.cmyk.js](https://github.com/jtnimoy/p5.cmyk.js) - +* Provide a simplified interface to another library + * [p5.ble.js](https://github.com/ITPNYU/p5.ble.js) + * [p5.serialserver](https://github.com/p5-serial/p5.serialserver) +* Implement specialized algorithms or functionalities + * [p5.pattern](https://github.com/SYM380/p5.pattern) + * [p5.mapper](https://github.com/jdeboi/p5.mapper) +* Test out new Web API features that are not widely available in different browsers yet + * [p5.webserial](https://github.com/gohai/p5.webserial/) + * [p5.joystick](https://github.com/Vamoss/p5.joystick) +* Test alternative or new implementations of existing p5.js functionalities + * [número](https://github.com/nickmcintyre/numero) + * [p5.cmyk.js](https://github.com/jtnimoy/p5.cmyk.js) ## Prerequisites -- p5.js foundation -- Prototype-based object orientation in Javascript - +* p5.js foundation +* Prototype-based object orientation in Javascript ## Step 1 @@ -50,7 +44,6 @@ p5.Element.prototype.shout = function () { }; ``` - ## Step 2 You now have a p5.loadcsv.js file with one method attached to the `p5.prototype` object. This method,` loadCSV()`, doesn’t do much currently; it just logs a message to the console. Run the following code in a new sketch that loads both p5.js and p5.loadcsv.js in the` ` tag. @@ -80,7 +73,6 @@ function setup() { Running the sketch should print a single message in the console saying “I will load a CSV file soon!”. - ## Step 3 To load a CSV file with your `loadCSV()` function, the function needs to accept an argument. This can be defined in the same way as any other function parameter. @@ -104,13 +96,12 @@ function setup() { } ``` - ## Step 4 You can access p5.js functions and variables such as `circle()` and `PI` in your addon code using the “`this`” object. We’ll use the `hour()` and `minute()` functions to further customize the `loadCSV()` function’s console message. This will give us some information about when the function is called.
-You should always use the “`function()`” keyword to attach methods to the `p5.prototype` object. Don’t use the arrow function syntax “`() =>`” because the value of “`this`” when using the “`function()`” keyword is the created object (i.e., the p5 sketch), but with the arrow function syntax, the value of “`this`” is whatever the value of “`this`” is when the arrow function is defined. In the example below, “`this`” will refer to “`window`” instead of the p5 sketch, which is usually not what we want. + You should always use the “`function()`” keyword to attach methods to the `p5.prototype` object. Don’t use the arrow function syntax “`() =>`” because the value of “`this`” when using the “`function()`” keyword is the created object (i.e., the p5 sketch), but with the arrow function syntax, the value of “`this`” is whatever the value of “`this`” is when the arrow function is defined. In the example below, “`this`” will refer to “`window`” instead of the p5 sketch, which is usually not what we want.
```js @@ -129,7 +120,6 @@ p5.prototype.loadCSV = function (filename) { }; ``` - ## Step 5 So far, we have looked at several handy features for creating an addon library. If you just need to implement an algorithm, perform some drawings, or use other p5 functions in your addon, the previous steps should be enough for you to get started. You can explore more functionality a p5.js addon has access to by looking at the p5.js source code (every p5.js module is also written in the same way as a p5.js addon function!) or the “Looking inside p5.js” guide for more details on how p5.js work under the hood and how your addon library can utilize more advanced features. @@ -213,19 +203,21 @@ Note two things from the code above: 1. We call the `p5.prototype.registerPreloadMethod()` function passing in the name of the `loadCSV()` function as a string as the first parameter and `p5.prototype` as the second parameter. 2. At the end of `fetch()`, after the CSV data has been parsed and pushed into the result array, `this._decrementPreload()` function is called. + 3) Now, if you test your sketch again, you should see that the “`myCSV`” variable is populated with the data from the CSV file! + 4. Note that due to inherent limitations of this technique, the returned “`result`” variable must be an object (array is also a type of object in Javascript) and must not be overwritten in the function body. You can set properties of the object (or push to the array), but you cannot reassign the variable (i.e., you cannot do “`result = data.split(‘\n’)`”).
-Quite a bit of magic is happening here: firstly, why does “`result`” now contain the additional data when `fetch()` should still have been asynchronous and thus running after “`result`” has returned? + Quite a bit of magic is happening here: firstly, why does “`result`” now contain the additional data when `fetch()` should still have been asynchronous and thus running after “`result`” has returned? -This is related to why the return type must be an object. In Javascript, objects are passed by reference while most other types such as strings and numbers are passed by value. What this means is that when an object is returned from a function, it points to the original object that was created (in this case, the empty array we create in the line “`let result = [];`”.) In contrast, pass by value types, when returning from a function, will be copied and lose their relation to the original reference. This behavior allows us to modify the properties of the returned objects after they have been returned from the function as long as we don’t reassign the variable, which will create a new reference separate from the original object. + This is related to why the return type must be an object. In Javascript, objects are passed by reference while most other types such as strings and numbers are passed by value. What this means is that when an object is returned from a function, it points to the original object that was created (in this case, the empty array we create in the line “`let result = [];`”.) In contrast, pass by value types, when returning from a function, will be copied and lose their relation to the original reference. This behavior allows us to modify the properties of the returned objects after they have been returned from the function as long as we don’t reassign the variable, which will create a new reference separate from the original object.
-Secondly, what is `registerPreloadMethod()` doing and what about `this._decrementPreload()`? + Secondly, what is `registerPreloadMethod()` doing and what about `this._decrementPreload()`? -Without going into all the details, `registerPreloadMethod()` adds the function we specified into an internal list of functions that p5 keeps track of whenever it is called in `preload()`. When p5 detects such a function is called, it will add 1 to an internal counter. If this internal counter is larger than 0, it will keep waiting in `preload()` and defer running `setup()` and starting the `draw()` loop. Loading functions can decrement that internal counter by calling `this._decrementPreload()`, effectively signaling to p5 that a loading function in `preload()` is complete. If the internal counter reaches 0 after the decrement, it means all loadings are complete and the whole sketch can start. + Without going into all the details, `registerPreloadMethod()` adds the function we specified into an internal list of functions that p5 keeps track of whenever it is called in `preload()`. When p5 detects such a function is called, it will add 1 to an internal counter. If this internal counter is larger than 0, it will keep waiting in `preload()` and defer running `setup()` and starting the `draw()` loop. Loading functions can decrement that internal counter by calling `this._decrementPreload()`, effectively signaling to p5 that a loading function in `preload()` is complete. If the internal counter reaches 0 after the decrement, it means all loadings are complete and the whole sketch can start.
## Step 6 @@ -236,14 +228,14 @@ There is one more major feature that is available for addon libraries and these The available hooks, in order of execution, are: -- `init` — Called when the sketch is first initialized, just before the sketch initialization function (the one that was passed into the `p5` constructor) is executed. This is also called before any global mode setup, so your library can add anything to the sketch and it will automatically be assigned to the `window` object if global mode is active. -- `beforePreload` — Called before the `preload()` function is executed. -- `afterPreload` — Called after the `preload()` function is executed. -- `beforeSetup` — Called before the `setup()` function is executed. -- `afterSetup` — Called after the `setup()` function is executed. -- `pre` — Called at the beginning of `draw()`. Called repeatedly the same as `draw()`. -- `post` — Called at the end of `draw()`. Called repeatedly the same as `draw()`. -- `remove` — Called when `remove()` is called. +* `init` — Called when the sketch is first initialized, just before the sketch initialization function (the one that was passed into the `p5` constructor) is executed. This is also called before any global mode setup, so your library can add anything to the sketch and it will automatically be assigned to the `window` object if global mode is active. +* `beforePreload` — Called before the `preload()` function is executed. +* `afterPreload` — Called after the `preload()` function is executed. +* `beforeSetup` — Called before the `setup()` function is executed. +* `afterSetup` — Called after the `setup()` function is executed. +* `pre` — Called at the beginning of `draw()`. Called repeatedly the same as `draw()`. +* `post` — Called at the end of `draw()`. Called repeatedly the same as `draw()`. +* `remove` — Called when `remove()` is called. To create an action hook, you can use the snippet below. @@ -266,7 +258,6 @@ You can also unregister the hook when it is no longer needed. p5.prototype.unregisterMethod('remove', p5.prototype.doRemoveStuff); ``` - ## Next steps Below are some extra tips about authoring your addon library. @@ -309,7 +300,4 @@ p5.prototype.myMethod = function(){ **Examples are great, too!** They show people what your library can do. Because this is all JavaScript, people can see them running online before they download anything.[ ](http://jsfiddle.net/)You can create 0a collection of examples on the p5.js web editor to showcase how your library works. -**Let us know!** Once your library is ready for distribution, send an email to hello\@p5js.org with a link and some info. We'll include it on the [libraries page](http://p5js.org/libraries/)! If you have created a library and would like to have it included on the [p5js.org/libraries](https://p5js.org/libraries) page, please fill in [this form](https://docs.google.com/forms/d/e/1FAIpQLSdWWb95cfvosaIFI7msA7XC5zOEVsNruaA5klN1jH95ESJVcw/viewform). - - - \ No newline at end of file +**Let us know!** Once your library is ready for distribution, send an email to [hello@p5js.org](mailto:hello@p5js.org) with a link and some info. We'll include it on the [libraries page](http://p5js.org/libraries/)! If you have created a library and would like to have it included on the [p5js.org/libraries](https://p5js.org/libraries) page, please fill in [this form](https://docs.google.com/forms/d/e/1FAIpQLSdWWb95cfvosaIFI7msA7XC5zOEVsNruaA5klN1jH95ESJVcw/viewform). diff --git a/src/content/contributor-docs/en/custom_p5_build.mdx b/src/content/contributor-docs/en/custom_p5_build.mdx index 8c539a7101..7f0eaf0ead 100644 --- a/src/content/contributor-docs/en/custom_p5_build.mdx +++ b/src/content/contributor-docs/en/custom_p5_build.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Creating a custom build of p5.js with select components ## Overview @@ -38,13 +34,11 @@ npm run grunt combineModules:min:module_x:module_y uglify ## Examples -- `npm run grunt combineModules:min:core/shape:color:math:image uglify` +* `npm run grunt combineModules:min:core/shape:color:math:image uglify`\ Generates a `p5Custom.min.js` bundle in the `lib/modules` directory with the combineModules and uglify tasks. Note that modules should be listed after `combineModules:min` and the `uglify` task should have a space after the modules list. -- `npm run grunt combineModules:core/shape:color:math:image` +* `npm run grunt combineModules:core/shape:color:math:image`\ Generates a non-minified `p5Custom.js` bundle in the `lib/modules` directory. -- `npm run grunt combineModules:min:core/shape:color:math:image` +* `npm run grunt combineModules:min:core/shape:color:math:image`\ Generates a `p5Custom.pre-min.js` in the `lib/modules` directory with the `combineModules:min` task. Note that in this example `npm run grunt uglify` can be run separately after running the `combineModules:min` task. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/design_principles.mdx b/src/content/contributor-docs/en/design_principles.mdx index de4a2e6353..2bf0fe1b5a 100644 --- a/src/content/contributor-docs/en/design_principles.mdx +++ b/src/content/contributor-docs/en/design_principles.mdx @@ -1,16 +1,9 @@ - ---- - ---- # Design principles for p5.js -- **Beginner Friendly** The p5.js API aims to be friendly to beginner coders, offering a low barrier to creating interactive and visual web content with cutting-edge HTML5/canvas/DOM APIs. - -- **Educational** p5.js is focused on an API and curriculum that supports educational use, including a complete reference to the API with supporting examples, as well as tutorials and sample class curricula that introduces core creative coding principles in a clear and engaging order. - -- **JavaScript and its community** p5.js aims to make web development practices more accessible to beginners by modeling proper JavaScript design patterns and usage, while abstracting them where necessary. As an open source library, p5.js also includes the wider JavaScript community in its creation, documentation and dissemination. +* **Beginner Friendly** The p5.js API aims to be friendly to beginner coders, offering a low barrier to creating interactive and visual web content with cutting-edge HTML5/canvas/DOM APIs. -- **Processing and its community** p5.js is a direct response to the Processing language and its community, and aims to make the transition from Processing to JavaScript easy and clear. Supporting the Processing API and community is a priority for p5.js, while also expanding to include the new possibilities of creative coding on the web, and taking a Processing-style approach to exposing that API to beginners. +* **Educational** p5.js is focused on an API and curriculum that supports educational use, including a complete reference to the API with supporting examples, as well as tutorials and sample class curricula that introduces core creative coding principles in a clear and engaging order. +* **JavaScript and its community** p5.js aims to make web development practices more accessible to beginners by modeling proper JavaScript design patterns and usage, while abstracting them where necessary. As an open source library, p5.js also includes the wider JavaScript community in its creation, documentation and dissemination. - \ No newline at end of file +* **Processing and its community** p5.js is a direct response to the Processing language and its community, and aims to make the transition from Processing to JavaScript easy and clear. Supporting the Processing API and community is a priority for p5.js, while also expanding to include the new possibilities of creative coding on the web, and taking a Processing-style approach to exposing that API to beginners. diff --git a/src/content/contributor-docs/en/documentation_style_guide.mdx b/src/content/contributor-docs/en/documentation_style_guide.mdx index c3891dac19..6982fd46a4 100644 --- a/src/content/contributor-docs/en/documentation_style_guide.mdx +++ b/src/content/contributor-docs/en/documentation_style_guide.mdx @@ -1,46 +1,45 @@ - ---- - ---- # Documentation Style Guide Hello! Welcome to the guidelines for writing p5.js documentation. This document is a remix of the following resources: -- Ruby on Rails [API Documentation Guidlines](https://guides.rubyonrails.org/api_documentation_guidelines.html) (CC BY-SA 4.0) -- WordPress documentation guidelines for [accessibility](https://make.wordpress.org/docs/style-guide/general-guidelines/accessibility/) and [inclusivity](https://make.wordpress.org/docs/style-guide/general-guidelines/inclusivity/) (CC0) -- Airbnb [JavaScript Style Guide](https://airbnb.io/javascript/) (MIT) +* Ruby on Rails [API Documentation Guidlines](https://guides.rubyonrails.org/api_documentation_guidelines.html) (CC BY-SA 4.0) +* WordPress documentation guidelines for [accessibility](https://make.wordpress.org/docs/style-guide/general-guidelines/accessibility/) and [inclusivity](https://make.wordpress.org/docs/style-guide/general-guidelines/inclusivity/) (CC0) +* Airbnb [JavaScript Style Guide](https://airbnb.io/javascript/) (MIT) Our community is large and diverse. Many people learn to code using p5.js, and a large subset of those people are students in K–12 classes. After reading this guide, you will know: -- How to write effective, inclusive, and accessible prose for documentation purposes. -- How to write simple code samples for documentation purposes. + +* How to write effective, inclusive, and accessible prose for documentation purposes. +* How to write simple code samples for documentation purposes. ## Table of Contents ### Writing -- [YUIDoc](#yuidoc) -- [English](#english) -- [Oxford Comma](#oxford-comma) -- [Wording](#wording) -- [Unbiased Documentation](#unbiased-documentation) -- [Accessibility and Disability](#accessibility-and-disability) + +* [YUIDoc](#yuidoc) +* [English](#english) +* [Oxford Comma](#oxford-comma) +* [Wording](#wording) +* [Unbiased Documentation](#unbiased-documentation) +* [Accessibility and Disability](#accessibility-and-disability) ### Code -- [Code Samples](#code-samples) -- [Comments](#comments) -- [Whitespace](#whitespace) -- [Semicolons](#semicolons) -- [Naming Conventions](#naming-conventions) -- [Variables](#variables) -- [Strings](#strings) -- [Boolean Operators](#boolean-operators) -- [Conditionals](#conditionals) -- [Iteration](#iteration) -- [Objects](#objects) -- [Arrays](#arrays) -- [Functions](#functions) -- [Arrow Functions](#arrow-functions) -- [Classes](#classes) -- [Assets](#assets) + +* [Code Samples](#code-samples) +* [Comments](#comments) +* [Whitespace](#whitespace) +* [Semicolons](#semicolons) +* [Naming Conventions](#naming-conventions) +* [Variables](#variables) +* [Strings](#strings) +* [Boolean Operators](#boolean-operators) +* [Conditionals](#conditionals) +* [Iteration](#iteration) +* [Objects](#objects) +* [Arrays](#arrays) +* [Functions](#functions) +* [Arrow Functions](#arrow-functions) +* [Classes](#classes) +* [Assets](#assets) ## YUIDoc @@ -95,13 +94,13 @@ Write documentation without bias towards any kind of person. While documenting p While writing unbiased documentation: -- Be inclusive of every gender identity and expression, sexual orientation, race, ethnicity, language, neuro-type, size, disability, class, religion, culture, subculture, political opinion, age, skill level, occupation, and background. Make examples as diverse as our community. -- Avoid politicized content. If political content is necessary, remain neutral. -- Follow accessibility guidelines. -- Avoid content that would insult or cause harm to people. -- Don’t make any generalizations about people, countries, and cultures. That includes positive or neutral generalizations. -- Don’t write prejudiced and discriminatory content against minority communities. -- Avoid terms related to historical events. +* Be inclusive of every gender identity and expression, sexual orientation, race, ethnicity, language, neuro-type, size, disability, class, religion, culture, subculture, political opinion, age, skill level, occupation, and background. Make examples as diverse as our community. +* Avoid politicized content. If political content is necessary, remain neutral. +* Follow accessibility guidelines. +* Avoid content that would insult or cause harm to people. +* Don’t make any generalizations about people, countries, and cultures. That includes positive or neutral generalizations. +* Don’t write prejudiced and discriminatory content against minority communities. +* Avoid terms related to historical events. Prefer wordings that avoid "you"s and "your"s. For example, instead of: @@ -117,42 +116,42 @@ Always use `let` to declare variables. **Pronouns** -| Recommended | Not Recommended | -| -- | -- | -| they | he or she | -| them | him or her | -| their | his or her | -| theirs | his or hers | -| themselves | himself or herself | +| Recommended | Not Recommended | +| ----------- | ------------------ | +| they | he or she | +| them | him or her | +| their | his or her | +| theirs | his or hers | +| themselves | himself or herself | **[⬆ back to top](#table-of-contents)** ## Accessibility and Disability -- Emphasize the reader rather than underlining their inconveniences. -- Don’t refer to a person with a disability as a disabled person. Use [approved terminology](https://make.wordpress.org/docs/style-guide/general-guidelines/inclusivity/#accessibility-terminology) for people with specific disabilities. -- Maintain a uniform structure throughout the p5.js documentation. Emphasize important points both stylistically and visually. -- Use a screen reader to test documentation. To test a screen reader, see [List of screen readers](https://en.wikipedia.org/wiki/List_of_screen_readers). -- Consider multi-platform accessibility for all types of devices and operating systems. -- Create examples with all types of input devices such as voice and gesture based devices, controllers, mice, and keyboards. -- Don’t use ableist language. Be inclusive and unbiased while writing about accessibility and disability. -- Take a pragmatic approach to HTML semantics. Don’t add semantics purely for the sake of semantics. If there is an HTML structure that clearly matches the content, use that element. For example, a group of links should most likely use a list element. -- Use simple tables and tabular formats. Avoid span tags (such as rowspan and colspan). Tables prove to be difficult for screen readers. +* Emphasize the reader rather than underlining their inconveniences. +* Don’t refer to a person with a disability as a disabled person. Use [approved terminology](https://make.wordpress.org/docs/style-guide/general-guidelines/inclusivity/#accessibility-terminology) for people with specific disabilities. +* Maintain a uniform structure throughout the p5.js documentation. Emphasize important points both stylistically and visually. +* Use a screen reader to test documentation. To test a screen reader, see [List of screen readers](https://en.wikipedia.org/wiki/List_of_screen_readers). +* Consider multi-platform accessibility for all types of devices and operating systems. +* Create examples with all types of input devices such as voice and gesture based devices, controllers, mice, and keyboards. +* Don’t use ableist language. Be inclusive and unbiased while writing about accessibility and disability. +* Take a pragmatic approach to HTML semantics. Don’t add semantics purely for the sake of semantics. If there is an HTML structure that clearly matches the content, use that element. For example, a group of links should most likely use a list element. +* Use simple tables and tabular formats. Avoid span tags (such as rowspan and colspan). Tables prove to be difficult for screen readers. **Accessibility terminology** The following terminiology is adapted from the WordPress documentation guidelines for [Writing inclusive documentation](https://make.wordpress.org/docs/style-guide/general-guidelines/inclusivity/#accessibility-terminology). For more background on people-first language, see the CDC's guide on [Communicating With and About People with Disabilities](https://www.cdc.gov/ncbddd/disabilityandhealth/materials/factsheets/fs-communicating-with-people.html). -| Recommended | Not Recommended | -| -- | -- | -| person with disability | the disabled, handicapped, differently abled, challenged, abnormal | -| person without disability | normal person, healthy person, able-bodied | -| has [disability] | victim of, suffering from, affected by, stricken with | -| unable to speak, uses synthetic speech | dumb, mute | -| deaf, low-hearing | hearing-impaired | -| blind, low-vision | vision-impaired, visually-challenged | -| cognitive or developmental disabilities | mentally-challenged, slow-learner | -| person with limited mobility, person with a physical disability | crippled, handicapped | +| Recommended | Not Recommended | +| --------------------------------------------------------------- | ------------------------------------------------------------------ | +| person with disability | the disabled, handicapped, differently abled, challenged, abnormal | +| person without disability | normal person, healthy person, able-bodied | +| has \[disability] | victim of, suffering from, affected by, stricken with | +| unable to speak, uses synthetic speech | dumb, mute | +| deaf, low-hearing | hearing-impaired | +| blind, low-vision | vision-impaired, visually-challenged | +| cognitive or developmental disabilities | mentally-challenged, slow-learner | +| person with limited mobility, person with a physical disability | crippled, handicapped | ## Code Samples @@ -162,7 +161,7 @@ Choose meaningful code samples that cover the basics as well as gotchas. Only us ## Comments -- Use `//` for single line comments. Place single line comments on a newline above the subject of the comment. Put an empty line before the comment unless it’s on the first line of a block. +* Use `//` for single line comments. Place single line comments on a newline above the subject of the comment. Put an empty line before the comment unless it’s on the first line of a block. ```javascript // Bad. @@ -188,7 +187,7 @@ if (keyIsPressed === true) { } ``` -- Start all comments with a space to make it easier to read. +* Start all comments with a space to make it easier to read. ```javascript // Bad. @@ -200,7 +199,7 @@ let magicWord = 'Please'; let magicWord = 'Please'; ``` -- Use `//` for multiline comments. +* Use `//` for multiline comments. ```javascript @@ -235,7 +234,7 @@ let magicWord = 'Please'; ## Whitespace -- Indent blocks 2 spaces. +* Indent blocks 2 spaces. ```javascript // Bad. @@ -254,7 +253,7 @@ function setup() { } ``` -- Place 1 space before the leading brace. +* Place 1 space before the leading brace. ```javascript // Bad. @@ -268,7 +267,7 @@ function setup() { } ``` -- Place 1 space before the opening parenthesis in control statements such as `if` and `for`. Place no space between the argument list and the function name. +* Place 1 space before the opening parenthesis in control statements such as `if` and `for`. Place no space between the argument list and the function name. ```javascript // Bad. @@ -292,7 +291,7 @@ function setup() { } ``` -- Place spaces between operators. +* Place spaces between operators. ```javascript // Bad. @@ -304,7 +303,7 @@ let y = x + 5; ## Semicolons -- Yep. +* Yep. > Why? JavaScript's [automatic semicolon insertion](https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion) can lead to subtle bugs. @@ -318,7 +317,7 @@ let x = 0; ## Naming Conventions -- Avoid single letter names. Be descriptive. +* Avoid single letter names. Be descriptive. ```javascript // Bad. @@ -332,7 +331,7 @@ function vectorField(x, y) { } ``` -- Name objects, functions, and instances using camelCase. +* Name objects, functions, and instances using camelCase. ```javascript // Bad. @@ -345,7 +344,7 @@ let this_is_my_object = {}; let thisIsMyObject = {}; ``` -- Name classes using PascalCase. +* Name classes using PascalCase. ```javascript // Bad. @@ -363,7 +362,7 @@ class Player { } ``` -- Don't use trailing or leading underscores. +* Don't use trailing or leading underscores. > Why? JavaScript doesn't have private properties or methods. @@ -387,7 +386,7 @@ class Spy { ## Variables -- Avoid using `var` to declare variables. +* Avoid using `var` to declare variables. > Why? Variables declared with `var` have confusing scoping rules. These lead to subtle bugs. @@ -403,7 +402,7 @@ let x = 200; let y = 200; ``` -- Always use `let` to declare variables. Avoid using `const`. +* Always use `let` to declare variables. Avoid using `const`. > Why? Variables declared with `let` are easier to reason about than those declared with `var`. Variables are often reassigned in sketches, so it's helpful to default to `let`. @@ -417,7 +416,7 @@ const flower = '🌸'; let flower = '🌸'; ``` -- Use one `let` declaration per variable or assignment. +* Use one `let` declaration per variable or assignment. > Why? It’s easier to read and to add new variable declarations. @@ -433,7 +432,7 @@ let startSearch = true; let dragonball = 'z'; ``` -- Assign variables where needed and place them in a reasonable place. +* Assign variables where needed and place them in a reasonable place. > Why? `let` is block scoped and not function scoped. @@ -469,7 +468,7 @@ function getCharacter(name = 'default') { } ``` -- Avoid using unary increments and decrements (`++`, `--`). +* Avoid using unary increments and decrements (`++`, `--`). > Why? Unary increment and decrement statements are subject to [automatic semicolon insertion](https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion). This can cause silent errors with incrementing or decrementing values. It's also more expressive to update variables with statements like num `+= 1` instead of `num++`. @@ -489,7 +488,7 @@ num -= 1; ## Strings -- Use single quotes `''` for strings. +* Use single quotes `''` for strings. ```javascript // Bad. @@ -502,7 +501,7 @@ let name = `Hilma af Klint`; let name = 'Hilma af Klint'; ``` -- Don't concatenate strings that cause the line to go over 80 characters. +* Don't concatenate strings that cause the line to go over 80 characters. > Why? Broken strings are hard to read and make code less searchable. @@ -519,7 +518,7 @@ let essay = 'You see us as you want to see us: ' + let essay = 'You see us as you want to see us: in the simplest terms, in the most convenient definitions.'; ``` -- Use template strings instead of concatenation when needed. +* Use template strings instead of concatenation when needed. > Why? Template strings have a concise syntax. They also provide proper newlines and string interpolation features. @@ -533,7 +532,7 @@ text(name + ', this conversation can serve no purpose anymore. Goodbye.' + name, text(`${name}, this conversation can serve no purpose anymore. Goodbye.`, 0, 0); ``` -- Do not unnecessarily escape characters in strings. +* Do not unnecessarily escape characters in strings. > Why? Backslashes harm readability. @@ -549,9 +548,9 @@ let good = 'Air quotes make you look "cool".'; ## Boolean Operators -- Use `===` and `!==` over `==` and `!=`. +* Use `===` and `!==` over `==` and `!=`. -- Don't use shortcuts for booleans. +* Don't use shortcuts for booleans. > Why? It's easier to understand for beginners. @@ -587,9 +586,9 @@ if (collection.length > 0) { } ``` -- Don't use `switch` statements unless it's necessary. +* Don't use `switch` statements unless it's necessary. -- Use parentheses when mixing operators. The only exceptions are the arithmetic operators `+`, `-`, and `**`. +* Use parentheses when mixing operators. The only exceptions are the arithmetic operators `+`, `-`, and `**`. > Why? It's easier to read and avoids subtle bugs. @@ -619,7 +618,7 @@ let what = a + (b / c) * d; ## Conditionals -- Use braces with all multiline blocks. +* Use braces with all multiline blocks. ```javascript // Bad. @@ -635,7 +634,7 @@ if (mouseIsPressed === true) { } ``` -- Put `else` on the same line as the preceding `if` block’s closing brace. +* Put `else` on the same line as the preceding `if` block’s closing brace. ```javascript // Bad. @@ -656,7 +655,7 @@ if (mouseIsPressed === true) { } ``` -- Don't use an `else` block after an `if` block that always executes a `return` statement. +* Don't use an `else` block after an `if` block that always executes a `return` statement. ```javascript // Bad. @@ -678,7 +677,7 @@ function mouseIsOnLeft() { } ``` -- If a condition gets too long, place each (grouped) condition on a new line. The logical operator should begin the line. +* If a condition gets too long, place each (grouped) condition on a new line. The logical operator should begin the line. > Why? It's easier to read. @@ -698,7 +697,7 @@ if ( } ``` -- Don't use selection operators in place of conditionals. +* Don't use selection operators in place of conditionals. ```javascript // Bad. @@ -714,7 +713,7 @@ if ( ## Iteration -- Don’t use a `while` or `do-while` loops unless it's necessary. Use `for` loops to iterate a fixed number of times. +* Don’t use a `while` or `do-while` loops unless it's necessary. Use `for` loops to iterate a fixed number of times. ```javascript let numPetals = 7; @@ -734,7 +733,7 @@ for (let i = 0; i < numPetals; i += 1) { } ``` -- Don’t use `for` loops to iterate over arrays. +* Don’t use `for` loops to iterate over arrays. > Why? Pure functions are easier to reason about than side effects. @@ -761,7 +760,7 @@ diameters.forEach((d) => circle(0, 0, d)); ## Objects -- Use the literal syntax for object creation. +* Use the literal syntax for object creation. ```javascript // Bad. @@ -771,7 +770,7 @@ let ball = new Object(); let ball = {}; ``` -- Only quote properties that are invalid identifiers. +* Only quote properties that are invalid identifiers. > Why? It's easier to read and improves syntax highlighting. JavaScript engines also have an easier time optimizing for performance. @@ -791,7 +790,7 @@ let secretObject = { }; ``` -- Use dot notation to access properties. +* Use dot notation to access properties. ```javascript let turtle = { @@ -808,7 +807,7 @@ let turtleName = turtle['name']; let turtleName = turtle.name; ``` -- Use bracket notation `[]` to access properties with a variable. +* Use bracket notation `[]` to access properties with a variable. ```javascript let turtle = { @@ -825,7 +824,7 @@ function getProp(prop) { let turtleName = getProp('name'); ``` -- Don't use leading commas. +* Don't use leading commas. ```javascript // Bad. @@ -841,7 +840,7 @@ let mathematician = { }; ``` -- Add a trailing comma. +* Add a trailing comma. ```javascript // Bad. @@ -861,7 +860,7 @@ let artist = { ## Arrays -- Use the literal syntax for array creation. +* Use the literal syntax for array creation. ```javascript // Bad. @@ -871,7 +870,7 @@ let images = new Array(); let images = []; ``` -- Use [Array#push](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push) instead of direct assignment to add items to an array. +* Use [Array#push](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push) instead of direct assignment to add items to an array. ```javascript let lyrics = []; @@ -883,7 +882,7 @@ lyrics[lyrics.length] = 'Little rough around the edges, but I keep it smooth'; lyrics.push('Little rough around the edges, but I keep it smooth'); ``` -- Use the `slice()` method to copy arrays. +* Use the `slice()` method to copy arrays. ```javascript // Bad. @@ -897,7 +896,7 @@ for (let i = 0; i < numbers.length; i += 1) { let numbersCopy = numbers.slice(); ``` -- Write arrays on multiple lines when it improves readibility. Use line breaks after the opening bracket and before the closing bracket. Add a trailing comma. +* Write arrays on multiple lines when it improves readibility. Use line breaks after the opening bracket and before the closing bracket. Add a trailing comma. ```javascript // Bad. @@ -920,7 +919,7 @@ let matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; ## Functions -- Use function declarations instead of named function expressions. +* Use function declarations instead of named function expressions. > Why? Function declarations have some gotchas, but they are easier to understand for beginners. @@ -941,7 +940,7 @@ function foo() { } ``` -- Use default parameter syntax. Don't mutate function arguments. +* Use default parameter syntax. Don't mutate function arguments. ```javascript // Bad. @@ -956,7 +955,7 @@ function createBall(diameter = 50) { } ``` -- Always put default parameters last. +* Always put default parameters last. ```javascript // Bad. @@ -974,7 +973,7 @@ function drawSpiral(length, angle = 90) { ## Arrow Functions -- Use arrow function notation for anonymous functions. Callbacks are a common case for this syntax. +* Use arrow function notation for anonymous functions. Callbacks are a common case for this syntax. > Why? The syntax is more concise. It also creates a version of the function that executes in the context of `this`, which is often helpful. @@ -1013,7 +1012,7 @@ function processImage(img) { } ``` -- Use the implicit return when possible. Omit braces if the function body returns a single statement without side effects. Otherwise, keep the braces and use a `return` statement. +* Use the implicit return when possible. Omit braces if the function body returns a single statement without side effects. Otherwise, keep the braces and use a `return` statement. > Why? It's easier to read. @@ -1034,7 +1033,7 @@ function processImage(img) { [1, 2, 3].map((number) => `${number} squared is ${number ** 2}.`); ``` -- Always include parentheses around arguments. +* Always include parentheses around arguments. > Why? Doing so reduces bugs when changing parameters. @@ -1048,7 +1047,7 @@ function processImage(img) { ## Classes -- Always use `class`. Avoid manipulating `prototype` directly. The only exception is explaining how to [create libraries](./creating_libraries/). +* Always use `class`. Avoid manipulating `prototype` directly. The only exception is explaining how to [create libraries](./creating_libraries/). > Why? `class` syntax is more concise and easier to reason about. @@ -1088,7 +1087,7 @@ class Mover { } ``` -- Use `extends` for inheritance. +* Use `extends` for inheritance. ```javascript class RandomMover extends Mover { @@ -1099,7 +1098,7 @@ class RandomMover extends Mover { } ``` -- Make sure that custom `toString()` methods don't cause side effects. +* Make sure that custom `toString()` methods don't cause side effects. ```javascript // Bad. @@ -1122,7 +1121,7 @@ class Mover { } ``` -- Don't write an empty constructor or one that only delegates to a parent class. +* Don't write an empty constructor or one that only delegates to a parent class. > Why? Classes have a default constructor if one isn't specified. @@ -1159,7 +1158,7 @@ class DragonBall extends Ball { } ``` -- Avoid duplicate class members. +* Avoid duplicate class members. > Why? Duplicate class member declarations prefer the last one. Having duplicates often means there's a bug. @@ -1199,12 +1198,13 @@ class Mover { ## Assets -- Always load assets from a folder called "assets". +* Always load assets from a folder called "assets". > Why? It models good project organization. It's also required for assets to load on the p5.js website. Place assets in the following folders to include them in our online documentation: -- Examples: [src/data/examples/assets](https://github.com/processing/p5.js-website/tree/main/src/data/examples) -- Reference Pages: [src/templates/pages/reference/assets](https://github.com/processing/p5.js-website/tree/main/src/templates/pages/reference/assets) -- Learn Pages: [src/assets/learn](https://github.com/processing/p5.js-website/tree/main/src/assets/learn) + +* Examples: [src/data/examples/assets](https://github.com/processing/p5.js-website/tree/main/src/data/examples) +* Reference Pages: [src/templates/pages/reference/assets](https://github.com/processing/p5.js-website/tree/main/src/templates/pages/reference/assets) +* Learn Pages: [src/assets/learn](https://github.com/processing/p5.js-website/tree/main/src/assets/learn) ```javascript let img; @@ -1221,5 +1221,3 @@ function preload() { ``` **[⬆ back to top](#table-of-contents)** - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/friendly_error_system.mdx b/src/content/contributor-docs/en/friendly_error_system.mdx index 18fbc0a598..a19546c87d 100644 --- a/src/content/contributor-docs/en/friendly_error_system.mdx +++ b/src/content/contributor-docs/en/friendly_error_system.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 🌸 p5.js Friendly Error System (FES) ## Overview @@ -13,16 +9,18 @@ The FES prints messages in the console window, as seen in the [p5.js Web Editor] [p5.js Web Editor]: https://editor.p5js.org/ ## Lowering the Barriers to Debugging + The design of a tool should match the need of the people who will use it. As a tool that aims to lower the barriers to debugging, the design of FES is no exception. The best way to evaluate our existing design is to hear directly from people using p5.js. We ran a community survey in 2021 to gather feedback and future wishes for Friendly Errors. We believe the insights from our community members will be helpful for our contributors. You can see the results through the summary comic or the full report: + * [21-22 FES Survey Report Comic] * [21-22 FES Survey Full Report] - [21-22 FES Survey Report Comic]: https://almchung.github.io/p5jsFESsurvey/ + [21-22 FES Survey Full Report]: https://observablehq.com/@almchung/p5-fes-21-survey ## Writing Friendly Error Messages @@ -34,8 +32,8 @@ The FES is a part of the p5.js' [internationalization] effort. We generate all F We welcome contributions from all around the world! 🌐 [internationalization]: https://github.com/processing/p5.js/blob/main/contributor_docs/internationalization.md -[i18next]: https://www.i18next.com/ +[i18next]: https://www.i18next.com/ #### Writing Best Practices @@ -50,16 +48,21 @@ FES message writers should prioritize lowering the barrier of understanding erro * Introduce one technical concept or technical term at a time. Keep consistency in technical writing. Try to link one external resource written in a beginner-friendly language with plenty of short, practical examples. [Friendly Errors i18n Book]: https://almchung.github.io/p5-fes-i18n-book/ + [interpolation]: https://www.i18next.com/translation-function/interpolation + [p5.js Code of Conduct]: https://github.com/processing/p5.js/blob/main/CODE_OF_CONDUCT.md#p5js-code-of-conduct + [expert blind spots]: https://tilt.colostate.edu/TipsAndGuides/Tip/181 [Friendly Errors i18n Book] is a public project, and you can contribute to the book through this separate [repo]. [repo]: https://github.com/almchung/p5-fes-i18n-book + #### Location of Translation Files `translator()` is based on i18next and imported from `src/core/internationalization.js`. It generates messages by looking up text data from a JSON translation file: + ``` translations/{{detected locale code, default=en}}/translation.json ``` @@ -70,36 +73,49 @@ If the detected browser locale is Korean (language designator: `ko`), the `trans The language designator can also include regional information, such as `es-PE` (Spanish from Peru). #### Structure of Translation Files + `translation.json` has a [format used by i18next](https://www.i18next.com/misc/json-format). The basic format of a translation file's item has a key and a value (message) in double quotation marks `""`, closed by the curly brackets `{}`: + ```json { "key": "value" } ``` + For example, we have a ASCII logo saved in this format: + ```json "logo": " _ \n /\\| |/\\ \n \\ ` ' / \n / , . \\ \n \\/|_|\\/ \n\n" ``` + i18next supports interpolation, which allows us to pass a variable to generate a message dynamically. We use curly brackets twice `{{}}` to set a placeholder of the variable: + ```json "greeting": "Hello, {{who}}!" ``` + Here, the key is `greeting`, and the variable name is `who`. To dynamically generate this message, we will need to pass a value: + ```JavaScript translator('greeting', { who: 'everyone' } ); ``` + The result generated by `translator` will look like this: + ``` Hello, everyone! ``` Here is an item from `fes`'s `fileLoadError` that demonstrates interpolation: + ```json "image": "It looks like there was a problem loading your image. {{suggestion}}" ``` + To dynamically generate the final message, the FES will call `translator()` with the key and a pre-generated `suggestion` value. + ```JavaScript translator('fes.fileLoadError.image', { suggestion }); ``` @@ -110,40 +126,47 @@ The [internationalization doc] has a step-by-step guide on adding and modifying [internationalization doc]: https://github.com/processing/p5.js/blob/main/contributor_docs/internationalization.md - ## Understanding How FES Works + In this section, we will give an overview of how FES generates and displays messages. For more detailed information on the FES functions, please see our [FES Reference + Dev Notes]. [FES Reference + Dev Notes]: https://github.com/processing/p5.js/tree/main/src/core/friendly_errors#fes-reference-and-notes-from-developers - #### Overview + p5.js calls the FES from multiple locations for different situations, when: + * The browser throws an error. * The user code calls a function from the p5.js API. * Other custom cases where the user would benefit from a help message. #### FES Code Location + You can find the core components of the FES inside: `src/core/friendly_errors`. You can find the translation files used by the `translator()` inside: `translations/`. #### FES Message Generators + These functions are mainly responsible for catching errors and generating FES messages: + * [`_friendlyFileLoadError()`] catches file loading errors. * [`_validateParameters()`] checks a p5.js function’s input parameters based on inline documents. -* [`_fesErrorMonitor()`] handles global errors. +* \[`_fesErrorMonitor()`] handles global errors. For full reference, please see our [Dev Notes]. [`_friendlyFileLoadError()`]: https://github.com/processing/p5.js/blob/main/contributor_docs/fes_reference_dev_notes.md#_friendlyfileloaderror + [`_validateParameters()`]: https://github.com/processing/p5.js/blob/main/contributor_docs/fes_reference_dev_notes.md#validateparameters + [`_fesErrorMontitor()`]: https://github.com/processing/p5.js/blob/main/contributor_docs/fes_reference_dev_notes.md#feserrormonitor -[Dev Notes]: https://github.com/processing/p5.js/blob/main/contributor_docs/fes_reference_dev_notes.md +[Dev Notes]: https://github.com/processing/p5.js/blob/main/contributor_docs/fes_reference_dev_notes.md #### FES Message Displayer + `fes_core.js/_friendlyError()` prints generated friendly error messages in the console. For example: ```JavaScript @@ -151,14 +174,17 @@ p5._friendlyError( translator('fes.globalErrors.type.notfunc', translationObj) ); ``` + This function can be called anywhere in p5. ## Turning Off the FES + There may be cases where you want to [disable the FES for performance]. `p5.disableFriendlyErrors` allows you to turn off the FES when set to `true`. Example: + ```JavaScript p5.disableFriendlyErrors = true; @@ -170,5 +196,3 @@ function setup() { The single minified file of p5 (i.e., p5.min.js) automatically omits the FES. [disable the FES for performance]: https://github.com/processing/p5.js/wiki/Optimizing-p5.js-Code-for-Performance#disable-the-friendly-error-system-fes - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/internationalization.mdx b/src/content/contributor-docs/en/internationalization.mdx index f8a2248f11..056390ec7d 100644 --- a/src/content/contributor-docs/en/internationalization.mdx +++ b/src/content/contributor-docs/en/internationalization.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 🌐 Internationalization [Internationalization](https://developer.mozilla.org/docs/Glossary/Internationalization_and_localization) (sometimes abbreviated "i18n") refers to supporting multiple languages in a software project. This often means maintaining translations of text strings used in the project and letting users choose which translation they receive (or detecting it from their browser settings). @@ -62,7 +58,7 @@ would become something like console.log(translator('fileLoading.notFound', { fileName: file.name })) ``` -Translations like this expect the variables it uses to have a certain name, so make sure you use that. Check a translation file (look in translations/{YOUR_LANGUAGE}/) to see what the variable name is. You'll find the translation under the object path in the translation key. +Translations like this expect the variables it uses to have a certain name, so make sure you use that. Check a translation file (look in `translations/{YOUR_LANGUAGE}/`) to see what the variable name is. You'll find the translation under the object path in the translation key. "`fileLoading.notFound`" would be found at @@ -89,12 +85,11 @@ This will generate you a fresh translations file in `translations/{LANGUAGE_CODE You'll also need to add an entry for it in [`translations/index.js`](../translations/index.js) and [`translations/dev.js`](../translations/dev.js). You can follow the pattern used in that file for `en` and `es`. ### Testing changes -The bulk of translations are not included in the final library, but are hosted online and are automatically downloaded by p5.js when it needs them. Updates to these only happen whenever a new version of p5.js is released. + +The bulk of translations are not included in the final library, but are hosted online and are automatically downloaded by p5.js when it needs them. Updates to these only happen whenever a new version of p5.js is released. However, if you want to see your changes (or any other changes which aren't released yet), you can simply run `npm run dev` which will build p5.js configured to use the translation files present locally on your computer, instead of the ones on the internet. ### Further Reading See the [i18next translation function documentation](https://www.i18next.com/translation-function/essentials). Everything documented above is just a subset of their functionality. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/issue_labels.mdx b/src/content/contributor-docs/en/issue_labels.mdx index e5046b244b..2c8d39efb1 100644 --- a/src/content/contributor-docs/en/issue_labels.mdx +++ b/src/content/contributor-docs/en/issue_labels.mdx @@ -1,12 +1,8 @@ - ---- - ---- # p5.js issue labels p5.js uses a set of labels to help sort and organize issues. -All issues should have at least two labels to indicate the status and which areas are affected. +All issues should have at least two labels to indicate the status and which areas are affected. ## Status @@ -24,30 +20,29 @@ All issues should have at least two labels to indicate the status and which area | More Info Needed | Require more info to illustrate the issue | | Please Help Label | Not sure which label should be added | - ## Areas + Indicate the part of the code base affected by the issue. All the Area labels are now coordinated with the [src folder](https://github.com/processing/p5.js/tree/main/src) structure. + * Area:Accessibility * Area:Color * Area:Core * Area:Data * Area:DOM * Area:Events -* Area:Image -* Area:IO -* Area:Math +* Area:Image +* Area:IO +* Area:Math * Area:Typography * Area:Utilities * Area:WebGL All the labels below are coordinated with the rest of the steward [focus areas](https://github.com/processing/p5.js#stewards). + * Build Process * Unit Testing * Internalization * Friendly Errors * Documentation - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/navbar.mdx b/src/content/contributor-docs/en/navbar.mdx index cd060bd195..fcea538f2c 100644 --- a/src/content/contributor-docs/en/navbar.mdx +++ b/src/content/contributor-docs/en/navbar.mdx @@ -1,8 +1,4 @@ - ---- - ---- - +{/* _navbar.md */} * [En](/) * [Es](/es/) @@ -12,5 +8,3 @@ * [Zh](/zh/) * [Hi](/hi/) * [Ar](/ar/) - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/organization.mdx b/src/content/contributor-docs/en/organization.mdx index 24d742a73c..ce823dc223 100644 --- a/src/content/contributor-docs/en/organization.mdx +++ b/src/content/contributor-docs/en/organization.mdx @@ -1,8 +1,5 @@ - ---- - ---- # Organizing Contributions + Keeping the repository organized ensures that it is always clear which discussions and tasks are the most important. This helps everyone from maintainers to new contributors navigate the repository without getting overwhelmed. To help with this, we have a set of guidelines for how to organize issues, work, and pull requests. Helping with organization can be a great way to contribute. If a bug report is missing information such as example code, feel free to chime in and ask for the missing info. If an issue with an assignee has seen no activity for 60 days, it can be helpful to comment on the issue to check in with the assignee to see if they still want to work on the issue. Whenever you are helping with organizational tasks, make sure to be kind and always keep the community guidelines in mind. @@ -10,24 +7,25 @@ Helping with organization can be a great way to contribute. If a bug report is m # Guidelines for Organization ## Issues -- **All issues should use the relevant issue template** -- **All bug reports should include sample code** - - This can be in the form of code posted in the body of the issue, or it can be a link to an online example of the code preferably in [the online editor](https://editor.p5js.org) -- **All issues should have at least 2 labels** - - This makes it much easier to navigate the issues. - - Depending on issue template used, labels for area will be automatically set in many cases. You can add additional labels as required. -- **Issue assignment is first-come, first-serve** - - If a bug has been reproduced, or a feature request/enhancement has been agreed upon by the community, it becomes available for assignment. When this happens the first contributor to request assignment by saying something like "I'd like to work on this issue!" will be assigned. - - Do not request to be assigned to an issue if it is unclear whether the bug is reproducible or the feature request/enhancement has been agreed upon. -## Pull Requests -- **All pull requests should be associated with an issue** - - If you want to fix a bug or add a feature, start by opening an issue so the community can discuss it. - - If a pull request is opened without an associated issue, comment and ask the contributor to open an issue. +* **All issues should use the relevant issue template** +* **All bug reports should include sample code** + * This can be in the form of code posted in the body of the issue, or it can be a link to an online example of the code preferably in [the online editor](https://editor.p5js.org) +* **All issues should have at least 2 labels** + * This makes it much easier to navigate the issues. + * Depending on issue template used, labels for area will be automatically set in many cases. You can add additional labels as required. +* **Issue assignment is first-come, first-serve** + * If a bug has been reproduced, or a feature request/enhancement has been agreed upon by the community, it becomes available for assignment. When this happens the first contributor to request assignment by saying something like "I'd like to work on this issue!" will be assigned. + * Do not request to be assigned to an issue if it is unclear whether the bug is reproducible or the feature request/enhancement has been agreed upon. +## Pull Requests +* **All pull requests should be associated with an issue** + * If you want to fix a bug or add a feature, start by opening an issue so the community can discuss it. + * If a pull request is opened without an associated issue, comment and ask the contributor to open an issue. # Guidelines for Decision-Making + p5 aspires to make its decision-making process as transparent and horizontal as possible. To do this, p5 uses an informal consensus-seeking model for decision-making. This means that we prefer to reach community consensus on any and all decisions. If this fails, then a vote will take place instead. **Stewards** have the ability to veto proposals. This can happen when a proposal doesn't align with the mission/community guidelines, or when a proposal presents a significant maintenance or implementation challenge that the project is not able to tackle at that time. @@ -38,8 +36,6 @@ To propose a change, open an issue. If it is a large change or a change that nec > If you have an idea for how to automate any of the above with a bot or github action feel free to open an issue with your proposal! - - # Stewards Stewards are contributors that are particularly involved, familiar, or responsive to certain areas of the project. Their role is to help provide context and guidance to others working on p5.js. If you have a question about contributing to a particular area, you can tag the listed steward in an issue or pull request. They may also weigh in on feature requests and guide the overall direction of their area, with the input of the community. @@ -47,5 +43,3 @@ Stewards are contributors that are particularly involved, familiar, or responsiv Anyone interested can volunteer to be a steward! There are no specific requirements for expertise, just an interest in actively learning and participating. If you’re familiar with one or more parts of this project, open an issue to volunteer as a steward! Once added, a steward's username will remain in the [stewards section of the readme](https://github.com/processing/p5.js#stewards) until they request to be removed. If a steward is unresponsive for an extended period of time, we may ping them to ask about their status. And you can always take a break as a steward and come back! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/DIVYANSHU_RAJ_GSOC_20.mdx b/src/content/contributor-docs/en/project_wrapups/DIVYANSHU_RAJ_GSOC_20.mdx deleted file mode 100644 index b147776b4c..0000000000 --- a/src/content/contributor-docs/en/project_wrapups/DIVYANSHU_RAJ_GSOC_20.mdx +++ /dev/null @@ -1,123 +0,0 @@ - ---- - ---- - - -

- github - endurance21 -

- -# Project Overview - This project aimed at - - * REVAMPING the current modules system from ``require.js`` to ``ESModules`` . - - * Writing Audio Nodes in `ES6 classes` way rather than older `function constructor` way . - - * REVAMPING Testing Architecture of the codebase . - -

- -## The New Module system -Javascript has a struggling history of module sytems , from ``IIFE`` to ``ESM 2015`` we have come a long way to finally own a native module support ! [ [here is a great tutorial for the same ](https://www.youtube.com/watch?v=qJWALEoGge4&t=3s) ]. -Earlier p5.js-sound library was dependent on `require.js` for making the codebase modular , which was very cumbersome to maintain and scale , However , now we have been shifted to ESM . - -Perks of having native ESM --> - - * More cleaner way to write modules ( export/import keywords instead of require()). - * Named exports has always been great feature of ESM . - * Modules can be loaded from a URL, which is not there in Commonjs . - -[ [More on ESM Modules](https://nodejs.org/api/esm.html#esm_ecmascript_modules) ] - - - -This is not it !, -Many browsers does not support many ES6 features such as `export/import` , ``classes`` , ``arrow functions `` .. etc , and here we needed the backward compatiblity , and BABEL (JS TRANSPILER ) is -here to save the day , which with help of WEBPACK ( module bundler ) ships the final code in older verion of ES ! YES you heard it right , we write code in NODE.JS env with modern JS syntax but at the end of the day we ship the code in older ES versions to ensure compatiblity in all browsers ! - - - -[ [More On BABEL ](https://babeljs.io/docs/en/babel-preset-env) ] - -[ [More On WEBPACK ](https://webpack.js.org/concepts/ ) ] - - - [ [THIS PR SUCCESSFULLY REVAMPED THE CODEBASE TO THE NEW MODULE SYSTEM ](https://github.com/processing/p5.js-sound/pull/489) ] - - - -## ES6 class syntax - -The introduction of es6 classes into the JS world , was a great relief for developers out there , though its a syntactic sugar for ``constructor functions`` yet it abstracts out the protypal approach under the hood ,leaving a cleaner interface to the developers . - -[ [More on ES6 CLASSES ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) ] - -when it comes to AUDIO GRAPHS , where one node is connected to so many other nodes and inherit property from its parent nodes , a more robust and cleaner implementation of Nodes was required and ES6 classes rocked the way . - -Following PR REVAMPED the p5.sound's AUDIO NODES from ``funtion syntax`` to ``ES6 classes syntax`` - - [ [#502](https://github.com/processing/p5.js-sound/pull/502) -[#503](https://github.com/processing/p5.js-sound/pull/503) -[#508](https://github.com/processing/p5.js-sound/pull/508) -[#509](https://github.com/processing/p5.js-sound/pull/509) -[#514](https://github.com/processing/p5.js-sound/pull/514) -[#515](https://github.com/processing/p5.js-sound/pull/515) -[#516](https://github.com/processing/p5.js-sound/pull/516) -[#517](https://github.com/processing/p5.js-sound/pull/517) -[#518](https://github.com/processing/p5.js-sound/pull/518) -[#519](https://github.com/processing/p5.js-sound/pull/519) -[#520](https://github.com/processing/p5.js-sound/pull/520) -[#521](https://github.com/processing/p5.js-sound/pull/521) -[#522](https://github.com/processing/p5.js-sound/pull/522) -[#523](https://github.com/processing/p5.js-sound/pull/523) -[#524](https://github.com/processing/p5.js-sound/pull/524) -[#525](https://github.com/processing/p5.js-sound/pull/525) -[#526](https://github.com/processing/p5.js-sound/pull/526) -[#527](https://github.com/processing/p5.js-sound/pull/527) -[#528](https://github.com/processing/p5.js-sound/pull/528) -[#530](https://github.com/processing/p5.js-sound/pull/530) -[#531](https://github.com/processing/p5.js-sound/pull/531) -[#532](https://github.com/processing/p5.js-sound/pull/532) -[#533](https://github.com/processing/p5.js-sound/pull/533) -[#534](https://github.com/processing/p5.js-sound/pull/534) -[#535](https://github.com/processing/p5.js-sound/pull/535) -[#536](https://github.com/processing/p5.js-sound/pull/536) -[#537](https://github.com/processing/p5.js-sound/pull/537) -[#538](https://github.com/processing/p5.js-sound/pull/538) -[#539](https://github.com/processing/p5.js-sound/pull/539) ] - - - -## New Testing architecture -Unit automated testings are fun and helps ship the errorless code to the end users . Testing Frameworks like ``mocha`` , assertion library ``chai`` , stubbing helpers like ``sinon`` helped achieve the same , however we were still using ``require.js`` mdoule format and chached ``mocha.js`` , ``chai.js`` ,``sinon.js`` file that not only increased the size of the codebase but also very tidious to update them , - -With [THIS PR](https://github.com/processing/p5.js-sound/pull/541) i sucessfully revamped the module System to ESM and removed those chached file and made them downloadable using NPM , Moreover i have added following unit tests to some of uncovered AUDIO NODES and modules . - - -[ [Unit tests for p5.master](https://github.com/processing/p5.js-sound/pull/463) ] - -[ [Unit tests for helper methods](https://github.com/processing/p5.js-sound/pull/440) ] - -[ [Unit test for p5.Gain](https://github.com/processing/p5.js-sound/pull/462) ] - -PS - This one was more of my second gsoc proposal , however i completed the goals of 1st proposal early and decided to make that happen too . - - -## Off GSOC Tasks -* [ [pre commit hooks](https://github.com/processing/p5.js-sound/pull/492) ] -while completing my gsoc tasks , i enjoyed helping jason and kyle in adding pre-commit hooks in the codebase . - - -* [ [p5.js file](https://github.com/processing/p5.js-sound/pull/501) ] -Most of out unit tests and examples required p5.js to work with , and it was chached too into the codebase which not only was bulking the codebase but also making it hard to update , I removed the cached p5.js file and used NPM to download it , however after download by default it was present inside the node_modules folder , which was a serious issue beacause our ``unit tests`` and ``examples`` used /lib/p5.js reference to the p5.js file , i decided to copy the p5.js file from node_modules folder to /lib/p5.js on project setup using ``POSTINSTALL`` NPM SCRIPT . - -Also i loved dicussing the issues of others related to the library and reviewing the code was self rewarding . - - -# Acknowldegements -I am extremly grateful to Processing Foundation and GSOC team to let me live my dream here .I would like to thank my amazing mentors Jason Sigal and Kyle James for their unmeasured support and motivation throughout this amazing GSOC period . - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/L05_GSOC_2019.mdx b/src/content/contributor-docs/en/project_wrapups/L05_GSOC_2019.mdx index 5904ebc212..f7a8f52bc3 100644 --- a/src/content/contributor-docs/en/project_wrapups/L05_GSOC_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/L05_GSOC_2019.mdx @@ -1,15 +1,12 @@ - ---- - ---- # p5.touchgui + ***A Mouse & Multi-Touch GUI Library for p5.js*** -*by [Carlos "L05" Garcia](https://github.com/L05) ([@L05_](https://twitter.com/L05_) | [L05.is](https://L05.is))* +*by [Carlos "L05" Garcia](https://github.com/L05) ([@L05\_](https://twitter.com/L05_) | [L05.is](https://L05.is))* ------ +*** -[*p5.js*](https://p5js.org) is a wonderfully accessible way for students and creative minds alike to learn computer programming and create interactive art and experiences. +[*p5.js*](https://p5js.org) is a wonderfully accessible way for students and creative minds alike to learn computer programming and create interactive art and experiences. [*p5.touchgui*](https://github.com/L05/p5.touchgui) is intended to extend *p5.js* and make it easy to add canvas-based buttons, sliders, and other GUI (graphical user interface) objects to *p5.js* sketches, enabling users to focus on quickly iterating ideas with easily created GUI objects that work with both mouse and multi-touch input. @@ -19,18 +16,19 @@ As an artist and immersive experience designer, I have been researching and developing multi-person interactive experiences for 8 years, experimenting with all kinds of input sensors and mechanisms to create some [pretty cool stuff](https://L05.is). -A couple of years ago, as I was learning node.js and WebSockets, I started to experiment with *p5.js* as a way of creating simple, mobile touch-screen interfaces that would enable audience members to control games and installations with their phone. In this process, I created a small toolkit of p5-based GUI elements and a node.js server template for multi-person interactive games. Check out an example of one such experience [here](https://i.vimeocdn.com/video/706438411.webp?mw=1100&mh=619&q=70). +A couple of years ago, as I was learning node.js and WebSockets, I started to experiment with *p5.js* as a way of creating simple, mobile touch-screen interfaces that would enable audience members to control games and installations with their phone. In this process, I created a small toolkit of p5-based GUI elements and a node.js server template for multi-person interactive games. Check out an example of one such experience [here](https://i.vimeocdn.com/video/706438411.webp?mw=1100\&mh=619\&q=70). *Sidenote: my next *p5.js* project is to package and release a multi-player node.js server and client template along with a tutorial!* -[![Space Dander Example Video](https://i.vimeocdn.com/video/706438411.webp?mw=1100&mh=619&q=70)](https://vimeo.com/274410221) +[![Space Dander Example Video](https://i.vimeocdn.com/video/706438411.webp?mw=1100\&mh=619\&q=70)](https://vimeo.com/274410221) During my graduate studies at UCLA's Design Media Arts department, I had the wonderful opportunity to work as a teaching assistant for Lauren McCarthy and Casey Reas, who both taught *p5.js* in their classes. I noticed that students often had difficulty with GUI elements in their projects; building a simple button in *p5.js* is an excellent learning exercise if the primary focus of an assignment, but it can be a blocker if the assignment goals are to express some larger creative vision. Having already created my own personal toolkit of project-specific GUI elements, I realized that with some work, I could adapt it into a more generalized tool that may be useful to students, artists, and educators. And so the process began... ### Research -My first step in working on *p5.touchgui* was to research GUI design methodologies and examples. I looked at the current state of UI within *p5.js*. Users must either use DOM elements via *p5.dom* or create their own canvas-based GUI objects with *p5.js*. + +My first step in working on *p5.touchgui* was to research GUI design methodologies and examples. I looked at the current state of UI within *p5.js*. Users must either use DOM elements via *p5.dom* or create their own canvas-based GUI objects with *p5.js*. I performed a number of preliminary tests with DOM elements and multi-touch screens, and it seemed DOM elements were not well suited to multi-touch environments: the performance was often slow and touch quality inconsistent. DOM elements seemed sufficient for simple interactions but not for more dynamic experiences such as touch-screen controllers. @@ -65,14 +63,17 @@ function draw() { endGui(); } ``` + [See it in action here!](https://editor.p5js.org/L05/sketches/7yMYNgJyM) **Pros** + * Accessing GUI object states in the `draw()` loop seemed like an exciting idea for teaching beginners. * No GUI object states had to be stored, retained, or synchronized. * It was entirely data driven. **Cons** + * Required the creation of JavaScript objects in order for pass-by-reference to work. This is an advanced concept to have to introduce to beginners. * Would be difficult to offer custom styling. * Multi-touch input would not work well with a strictly Immediate-Mode GUI. This was obviously kind of a deal breaker. @@ -116,6 +117,7 @@ function draw() { } } ``` + [See it in action here!](https://editor.p5js.org/L05/sketches/YjR7CxKg-). ## > Next Steps @@ -133,6 +135,7 @@ I am interested in working with the *p5.js* community to find ways of making bot Style is one area where *p5.touchgui* needs more work; as it turns out, it's hard to build a style system that balances customizability with simplicity! The presets are a good start, and it is possible to stylize individual objects, but the number of lines of code it would take to build out a larger interface still seem extraneous. Some features I think would help: + * *Group styling* - i.e. determining the style of an entire object class. This is a high priority feature to be added to the library. * *Simplified style properties* - the properties currently get pretty granular, which on one hand gives a lot of color control and on the other means that a non-trivial number of properties need to be set. I am very interested in the simplery way Material UI has primary and secondary color choices, for instance. * More presets! @@ -142,12 +145,12 @@ Some features I think would help: There are a number of additional features on which I would like to work: * More GuiObjects! - * Radio Button - * Color Picker - * Button Bank - * Slider Bank - * Range Slider - * Text Field + * Radio Button + * Color Picker + * Button Bank + * Slider Bank + * Range Slider + * Text Field * Tags (grouping GuiObjects by tag) * Selective Input Lock (right now all GuiObjects default to input lock) * Migrate reference documentation to Docsify model. @@ -158,13 +161,12 @@ You can also check out my [development notes](https://github.com/L05/p5.touchgui ## > Support Please use *p5.touchgui* and give me feedback! + * If you **use it in a project**, what works and doesn't work? * If you **teach it in a class**, what works and doesn't work? -Any questions pertaining to this project may be communicated via Issues on the [p5.touchgui GitHub repository](https://github.com/L05/p5.touchgui). Simply create a new Issue and either assign or tag me in the conversation with [@L05](https://github.com/L05). For anything else, don't hesitate to get in touch at carlosga@gmail.com! +Any questions pertaining to this project may be communicated via Issues on the [p5.touchgui GitHub repository](https://github.com/L05/p5.touchgui). Simply create a new Issue and either assign or tag me in the conversation with [@L05](https://github.com/L05). For anything else, don't hesitate to get in touch at [carlosga@gmail.com](mailto:carlosga@gmail.com)! ## > Acknowledgements I'd like to give an extra special thanks to my GSOC mentor Yining Shi for her support, guidance, understanding, and encouragement throughout the project. I'd also like to thank Lauren McCarthy for talking through some of the pedagogical applications of *p5.touchgui* with me during its development. Finally, thank you to all of the contributors and community members of *p5.js* who make it such a fantastic resource and community! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/README.mdx b/src/content/contributor-docs/en/project_wrapups/README.mdx index c46ccfb237..457841127d 100644 --- a/src/content/contributor-docs/en/project_wrapups/README.mdx +++ b/src/content/contributor-docs/en/project_wrapups/README.mdx @@ -1,24 +1,25 @@ - ---- - ---- This folder contains wrap-up reports from p5.js related [Google Summer of Code](https://summerofcode.withgoogle.com/organizations/4915113891463168/) and [Processing Fellowships](https://processingfoundation.org/fellowships) projects. - *Note for contributors: Embedded images and media are welcome. Please host these files externally rather than placing in this repo to avoid adding growing the repository filesize too much.* ## Google Summer of Code ### Google Summer of Code 2023 + * [Improving p5.js WebGL/3d functionality(On-going)](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/aryan_koundal_gsoc_2023/) by Aryan Koundal, 2023 + * [Mobile/Responsive Design Implementation of p5.js Web Editor](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/dewansDT_gsoc_2023/) by Dewansh Thakur, 2023 + * [Friendly Error System(FES) and Documentation](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/ayush23dash_gsoc_2023/) by Ayush Shankar, 2023 + * [Supporting shader-based filters in p5js](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/wong_gsoc_2023/) by Justin Wong, 2023 + * [Updating p5js.org Site Documentation and Accessibility](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/lichlyter_gsoc_2023/), by Kathryn Lichlyter, 2023 + * [A Typographic Revamp for p5.js](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/munusshih_gsoc_2023/), by Munus Shih, 2023 - ### Google Summer of Code 2022 + * [p5 /teach reorganize & update](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/graciazhang_gsoc_2022/) by Gracia Zhang, 2022 * [p5xr Immersive Session Process and Controller API update](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/smrghsh_gsoc_2022/) by Samir Ghosh, 2022 * [Improving p5.js WebGL functionality](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/shubham_sharma_gsoc_2022/) by Shubham Kumar Sharma, 2022 @@ -26,6 +27,7 @@ This folder contains wrap-up reports from p5.js related [Google Summer of Code]( * [Reworked and New Examples](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/malayvasa_gsoc_2022/) by Malay Vasa, 2022 ### Google Summer of Code 2021 + * [Adding Alt Text to the p5.js Website](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/katiejliu_gsoc_2021/) by Katie Liu, 2021 * [Adding to p5.js Friendly Error System](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/shantanuKaushik_gsoc_2021/) by Shantanu Kaushik, 2021 * [Activism Through Storytelling with Code](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/nikiito_gsoc_2021/) by Niki Ito, 2021 @@ -36,6 +38,7 @@ This folder contains wrap-up reports from p5.js related [Google Summer of Code]( * [Improve Test Coverage in p5.Sound library](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/sai_bhushan_gsoc_2021/) by [Sai Bhushan](https://github.com/satyasaibhushan), 2021 ### Google Summer of Code 2020 + * [p5.js accessibility and canvas descriptions](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/luismn_gsoc_2020/) by Luis Morales-Navarro, 2020 * [p5.js Web Editor Mobile UI](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/ghalestrilo_gsoc_2020/) by [ghales](https://github.com/ghalestrilo), 2020 * [Extending the p5.js Friendly Error System](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/akshaypadte_gsoc_2020/) by Akshay Padte, 2020 @@ -44,37 +47,39 @@ This folder contains wrap-up reports from p5.js related [Google Summer of Code]( * [i18n improvements and Italian translation](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/yukienomiya_gsoc_2020/) by Yukie Nomiya, 2020 ### Google Summer of Code 2019 + * [Search Bar for Sketches in the p5.js Web Editor](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/rachellim_gsoc_2019/) by Rachel Lim, 2019 * [Improving WebGL functionality of p5.js](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/sanket_gsoc_2019/) by [Sanket Singh](https://github.com/sanketsingh24), 2019 * [Improve p5.js unit tests](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/urvashi_gsoc_2019/) by [Urvashi](https://github.com/ihsavru), 2019 * [Stabilizing and improving p5.xr](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/vedhant_gsoc_2019/) by [Vedhant Agarwal](https://github.com/vedhant), 2019 * [AudioWorklet Support in p5.js-sound](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/orenshoham_gsoc_2019/) by Oren Shoham, 2019 * [Code Slang](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/xu_gsoc_2019/) by Jenna Xu, 2019 -* [p5.touchgui](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/L05_GSOC_2019/) by [Carlos L05 Garcia](https://github.com/L05), 2019 +* [p5.touchgui](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/L05_GSOC_2019/) by [Carlos L05 Garcia](https://github.com/L05), 2019 * [Curating Community Creativity for p5.js 1.0](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/ashleykang_gsoc2019/) by Ashley Kang, 2019 * [Math in Motion](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/acheng_ogarcia_gsoc_2019/) by Alexandra Cheng and Oskar Garcia, 2019 ### Google Summer of Code 2018 + * [A Platform for Algorithmic Composition on p5.js-sound](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/junshern_gsoc_2018/) by Chan Jun Shern, 2018 * [New JavaScript console in p5.js web editor](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/liang_gsoc_2018/) by Liang Tang, 2018 * [Updates to WebGL Mode](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/aidannelson_gsoc_2018/) by Aidan Nelson, 2018 * [Implementing missing primitives in p5.js WebGL mode](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/adilrabbani_gsoc_2018/) by Adil Rabbani, 2018 -* [Dynamic Learning, a collaborative platform for teachers and creative coders]( -https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/jithinks_gsoc_2018/) by Jithin KS, 2018 +* [Dynamic Learning, a collaborative platform for teachers and creative coders](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/jithinks_gsoc_2018/) by Jithin KS, 2018 * [Updating hello.p5js.org](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/elginmclaren_gsoc_2018/) by Elgin-Skye McLaren, 2018 * [Improvements to existing I/O Methods of p5.js](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/tanvi_gsoc_2018/) by Tanvi Kumar, 2018 ### Google Summer of Code 2017 ([archive](https://summerofcode.withgoogle.com/archive/2017/organizations/5256745899261952/)) + * [Processing Foundation: GSOC Grand Wrap-Up Post](https://medium.com/processing-foundation/2017-google-summer-of-code-grand-wrap-up-post-16680b1438db) * [Improving Developer Operations](https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/sakshamsaxena_gsoc_2017/) by Saksham Saxena, 2017 * [Maps, Maps, Maps!](https://medium.com/processing-foundation/maps-maps-maps-f0914218c87b) by Cristobal Valenzuela, 2017 * [Friendly Error System for p5.js](https://medium.com/processing-foundation/2017-marks-the-processing-foundations-sixth-year-participating-in-google-summer-of-code-d365f62fc463) by A. Mira Chung, 2017 * [Processing Foundation: Our Summer of Code Has Begun!](https://medium.com/processing-foundation/our-summer-of-code-has-begun-dffc1bbddb7c) - ## Processing Foundation Fellowships ### Processing Foundation Fellowships 2021 + * [Three-Layer CS Cake - How to Make Sure Every Kid Gets Some Cake](https://medium.com/processing-foundation/three-layer-cs-cake-how-to-make-sure-every-kid-gets-some-cake-f7ee52e147f1) by Angi Chau, 2021 Teaching Fellow * [Easy but Awesome: Free and Open-Source Creative Tools for Middle-School Students](https://medium.com/processing-foundation/easy-but-awesome-free-and-open-source-creative-tools-for-middle-school-students-89260eb3824d) by Shawn Patrick Higgins, 2021 Teaching Fellow * [P5LIVE: Walking Through a Collaborative p5.js Environment for Live Coding](https://medium.com/processing-foundation/p5live-walking-through-a-collaborative-p5-js-environment-for-live-coding-bc39d95908c6) by Ted Davis, 2021 Teaching Fellow @@ -83,8 +88,8 @@ https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/j * [Teaching Humans and Machines to Listen to Arrernte, an Indigenous Language of Central Australia](https://medium.com/processing-foundation/teaching-humans-and-machines-to-listen-to-arrernte-an-indigenous-language-of-central-australia-90d86957132e) by Indigemoji, 2021 * [Meet Our 2021 Fellows!](https://medium.com/processing-foundation/meet-our-2021-fellows-c22084da8019) - ### Processing Foundation Fellowships 2020 + * [Open Computer Vision for p5.js and Processing](https://medium.com/processing-foundation/open-computer-vision-for-p5-js-and-processing-fb4490441705) by George Profenza, 2020 * [Zoom-Teaching p5.js to Children Grades 3–6](https://medium.com/processing-foundation/zoom-teaching-p5-js-to-children-grades-3-6-54a0955c0ba5) by Michael O’Connell, 2020 * [Visualizing the Americans with Disabilities Act Using p5.js](https://medium.com/processing-foundation/visualizing-the-americans-with-disabilities-act-using-p5-js-7853b9180b56) by Kalila Shapiro, 2020 @@ -93,6 +98,7 @@ https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/j * [Meet Our 2020 Fellows!](https://medium.com/processing-foundation/meet-our-2020-fellows-7a51034f6845) ### Processing Foundation Fellowships 2019 + * [Interview with Stalgia Grigg, 2019 p5.js Fellow](https://medium.com/processing-foundation/interview-with-stalgia-grigg-2019-p5-js-fellow-6fc40252e0) by Stalgia Grigg, 2019 p5.js Fellow * [Interview with Evelyn Masso, 2019 p5.js Fellow](https://medium.com/processing-foundation/interview-with-evelyn-masso-2019-p5-js-fellow-7ac6769704df) by Evelyn Masso, 2019 p5.js Fellow * [Coding with Sound and Art for Middle-School Students](https://medium.com/processing-foundation/interview-with-2019-teaching-fellow-layla-quinones-3039f10ae761) by Layla Quinones, 2019 Teaching Fellow @@ -101,12 +107,14 @@ https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/j * [Meet Our 2019 Fellows!](https://medium.com/processing-foundation/meet-our-2019-fellows-9f13d4e4a68a) ### Processing Foundation Fellowships 2018 + * [A p5.js Dissection Manual](https://medium.com/processing-foundation/a-p5-js-dissection-manual-38959ff8522e) by Vijith Assar, 2018 * [Chinese Translation for p5.js and preparing a future of more translations](https://medium.com/processing-foundation/chinese-translation-for-p5-js-and-preparing-a-future-of-more-translations-b56843ea096e), [p5.js 的中文翻译 — 为支持更多种语言翻译做准备](https://medium.com/processing-foundation/p5-js-%E7%9A%84%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91-%E4%B8%BA%E6%94%AF%E6%8C%81%E6%9B%B4%E5%A4%9A%E7%A7%8D%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91%E5%81%9A%E5%87%86%E5%A4%87-a0fa94da770f) by Kenneth Lim, 2018 * [Making p5.js Accessible](https://medium.com/processing-foundation/making-p5-js-accessible-e2ce366e05a0) by Luis Morales-Navarro and Mathura Govindarajan, 2018 * [Introducing the 2018 Processing Foundation Fellows](https://medium.com/processing-foundation/introducing-the-2018-processing-foundation-fellows-a16ae4e87f80) ### Processing Foundation Fellowships 2017 + * [p5 Accessibility](https://medium.com/processing-foundation/p5-accessibility-115d84535fa8) by Claire Kearney-Volpe, 2017 * [A p5.js Web Editor for All](https://medium.com/processing-foundation/a-p5-js-web-editor-for-all-64aaa3f9d767) by Cassie Tarakajian, 2017 * [Community and Code](https://medium.com/processing-foundation/community-and-code-882b00e6ee32) by Saskia Freeke, 2017 @@ -115,7 +123,3 @@ https://github.com/processing/p5.js/blob/main/contributor_docs/project_wrapups/j * [Everyone Can Code: A creative coding curriculum for students with low computer literacy](https://medium.com/processing-foundation/anyone-can-code-a-creative-coding-curriculum-for-students-with-low-computer-literacy-69e121149abc) by Niklas Peters, 2017 * [Creative Coding with p5.js for Prisons in Washington State](https://medium.com/processing-foundation/creative-coding-with-p5-js-for-prisons-in-washington-state-3bd1d342d769) by Susan Evans, 2017 * [Announcing our 2017 Processing Foundation Fellows](https://medium.com/processing-foundation/announcing-our-2017-processing-foundation-fellows-8b9e7c8bd2f) - - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/acheng_ogarcia_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/acheng_ogarcia_gsoc_2019.mdx index f60cdf490d..43275e49c1 100644 --- a/src/content/contributor-docs/en/project_wrapups/acheng_ogarcia_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/acheng_ogarcia_gsoc_2019.mdx @@ -1,22 +1,17 @@ - ---- - ---- # Math in Motion -by Alexandra Cheng & Oskar Garcia - +by Alexandra Cheng & Oskar Garcia ## Early demo – Summer 2019 + Math in Motion (MiM) is a modern interface for working with math on the web. It has a short learning curve and makes it easier to input, edit, and display math on the screen. Since it’s built with core web technologies, it can be used by anyone with a browser. -Github repository: https://github.com/math-in-motion/early-demo +Github repository: [https://github.com/math-in-motion/early-demo](https://github.com/math-in-motion/early-demo) -Try it out for yourself at: https://math-in-motion.github.io/early-demo/ +Try it out for yourself at: [https://math-in-motion.github.io/early-demo/](https://math-in-motion.github.io/early-demo/) Your feedback is golden! Let us know what you think of the project: [Feedback form](https://docs.google.com/forms/d/e/1FAIpQLSfvj-Rl70SucoTN3Rzo8iyYSsTeZfxU5GTdxMHNvCe0FKzrZQ/viewform) - ## Core features * Easily type and edit complex math expressions in real time @@ -26,14 +21,12 @@ Your feedback is golden! Let us know what you think of the project: [Feedback fo * Shortcuts for superscript and subscript * Basic syntax highlighting for common math symbols - ## Technologies and libraries used * HTML, CSS, and JavaScript * [MathQuill](http://mathquill.com/) * [Anime.js](https://animejs.com/) - ## Potential features * Keyboard shortcuts for navigating and editing complex mathematical expressions @@ -49,7 +42,4 @@ Your feedback is golden! Let us know what you think of the project: [Feedback fo ## Acknowledgements -This project was made possible by [Google Summer of Code 2019](https://summerofcode.withgoogle.com/) and the [Processing Foundation](https://processing.org/). We're extremely thankful for the support of our incredible mentors [Ellen Nickles](https://ellennickles.site/) and Gregory Benedis-Grab. Without their insights, this project wouldn't have been a success. - - - \ No newline at end of file +This project was made possible by [Google Summer of Code 2019](https://summerofcode.withgoogle.com/) and the [Processing Foundation](https://processing.org/). We're extremely thankful for the support of our incredible mentors [Ellen Nickles](https://ellennickles.site/) and Gregory Benedis-Grab. Without their insights, this project wouldn't have been a success. diff --git a/src/content/contributor-docs/en/project_wrapups/adilrabbani_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/adilrabbani_gsoc_2018.mdx index 7ec2428f15..f77e1ddd69 100644 --- a/src/content/contributor-docs/en/project_wrapups/adilrabbani_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/adilrabbani_gsoc_2018.mdx @@ -1,8 +1,5 @@ - ---- - ---- # Implementing missing WebGL primitives + #### by Adil Rabbani ([@adilrabbani](https://github.com/AdilRabbani)) This summer I worked on improving p5.js WebGL mode, along side [Aidan Nelson](https://github.com/AidanNelson) with the help of our mentors [Stalgia Grigg](https://github.com/mlarghydracept) @@ -13,43 +10,43 @@ curveVertex, quadraticVertex and text. My first contribution to p5.js was when I was writing my GSOC proposal. This was just a minor change in [reference examples](https://github.com/processing/p5.js/pull/2737) for curves and some examples for [vertex()](https://github.com/processing/p5.js/pull/2798). These small changes helped me in understanding the use of grunt, lint, and other node modules being -used in the build process. I was really happy (and surprised) when my proposal got accepted 😄. I was about to contribute to one of my favourite libraries. We had a shared branch on +used in the build process. I was really happy (and surprised) when my proposal got accepted 😄. I was about to contribute to one of my favourite libraries. We had a shared branch on [git](https://github.com/processing/p5.js/tree/webgl-gsoc-2018) where we would compare our pull requests to be merged. ### arc -I started by going through [manual examples](https://github.com/processing/p5.js/tree/main/test/manual-test-examples/webgl), debugging them in browser and watching the code jump from -function to function. I have to admit though, it was a little daunting at first. My first task was to implement arc for WebGL mode and so I decided to go through already implemented ellipse +I started by going through [manual examples](https://github.com/processing/p5.js/tree/main/test/manual-test-examples/webgl), debugging them in browser and watching the code jump from +function to function. I have to admit though, it was a little daunting at first. My first task was to implement arc for WebGL mode and so I decided to go through already implemented ellipse and debugging it in the chrome editor. The code started to make sense after a while and I started to make small changes so as to move forward in implementing arc. Before my first evaluation I was able to implement arc [#2942](https://github.com/processing/p5.js/pull/2942) with all three modes -(OPEN, PIE, CHORD) and add documentation and [test examples](https://github.com/processing/p5.js/tree/webgl-gsoc-2018/test/manual-test-examples/webgl/arc). Ellipse was now refactored by using +(OPEN, PIE, CHORD) and add documentation and [test examples](https://github.com/processing/p5.js/tree/webgl-gsoc-2018/test/manual-test-examples/webgl/arc). Ellipse was now refactored by using the same arc implementation. This closed issue [#2181](https://github.com/processing/p5.js/issues/2181). ### point -WebGL by default renders square points. Looking through some resources on web gave me an idea of discarding pixels from a square point further to render a circular point. Adding the shader in p5.js was +WebGL by default renders square points. Looking through some resources on web gave me an idea of discarding pixels from a square point further to render a circular point. Adding the shader in p5.js was relatively simple. But I was stuck on a bug for a while that didn't go off no matter what. Thankfully with the help of my mentor I was able to debug it and come up with a solution. -One small problem was still there though. A good approach on rendering points would be to use the default square point when the size of the point was really small and when it became big enough, it should -render good looking circular points. I posted this issue on Github and [Adam Ferris](https://github.com/aferriss) who have been working on this before, suggested to use his shader which worked the same way -as mentioned. Read the discussion [here](https://github.com/processing/p5.js/issues/3017). Finally, I opened a [pull request](https://github.com/processing/p5.js/pull/3031) for point and added two test examples +One small problem was still there though. A good approach on rendering points would be to use the default square point when the size of the point was really small and when it became big enough, it should +render good looking circular points. I posted this issue on Github and [Adam Ferris](https://github.com/aferriss) who have been working on this before, suggested to use his shader which worked the same way +as mentioned. Read the discussion [here](https://github.com/processing/p5.js/issues/3017). Finally, I opened a [pull request](https://github.com/processing/p5.js/pull/3031) for point and added two test examples for the primitive. This closed issue [#2662](https://github.com/processing/p5.js/issues/2662) and [#2184](https://github.com/processing/p5.js/issues/2184) ### bezierVertex, curveVertex and quadraticVertex -I decided to go for curves next. I went through a great [article](https://pomax.github.io/bezierinfo/) on bezier curves for this task. Reading the article I came to know that a bezier curve can be easily converted -to Catmull Rom Splines so this meant that if I was able to implement bezierVertex, implementing curveVertex was relatively simple (just converting the points). While quadraticVertex can be implemented by changing the formula used to compute +I decided to go for curves next. I went through a great [article](https://pomax.github.io/bezierinfo/) on bezier curves for this task. Reading the article I came to know that a bezier curve can be easily converted +to Catmull Rom Splines so this meant that if I was able to implement bezierVertex, implementing curveVertex was relatively simple (just converting the points). While quadraticVertex can be implemented by changing the formula used to compute coefficients for curves. -I finally added the required functions and started testing curves. Everything worked quite well, except just one. Filling curves gave weird results. At first, I thought maybe there was something wrong going on in -my code but a further researching revealed that we can't just fill curves with all the intersections and loops without a proper triangulation algorithm. After approval from Kate and Stalgia, I started testing different +I finally added the required functions and started testing curves. Everything worked quite well, except just one. Filling curves gave weird results. At first, I thought maybe there was something wrong going on in +my code but a further researching revealed that we can't just fill curves with all the intersections and loops without a proper triangulation algorithm. After approval from Kate and Stalgia, I started testing different triangulation libraries ([Earcut](https://github.com/mapbox/earcut), [Libtess](https://github.com/brendankenny/libtess.js/), [Tess2](https://github.com/diatomic/tess2)). Earcut was the most precise but wasn't giving correct results. After a quick discussion with Earcut's creator, it was decided that Earcut wasn't a good option for us. -Tess2 wasn't really a good option either. It wasn't giving correct results and was too big in size. Libtess seemed to work really well and this was also because it was based on the same [GLU Tesselator implementation](https://github.com/processing/processing-android/tree/main/core/src/processing/opengl/tess) that was being used in Processing. The only problem with Libtess was that it was quite bigger than Earcut. We contacted [Lauren](https://github.com/lmccart) -if it was okay with integrating this library for the triangulation part. She encouraged us by saying that we can add the library as a node module just as opentype was being used for 2D text in p5.js. After integrating libtess, -I decided to improve the code further for some performance gains. I was able to implement a look up table with the help of which, we wouldn't need to compute coefficients after rendering curve, the first time. This was a huge performance boost from the +Tess2 wasn't really a good option either. It wasn't giving correct results and was too big in size. Libtess seemed to work really well and this was also because it was based on the same [GLU Tesselator implementation](https://github.com/processing/processing-android/tree/main/core/src/processing/opengl/tess) that was being used in Processing. The only problem with Libtess was that it was quite bigger than Earcut. We contacted [Lauren](https://github.com/lmccart) +if it was okay with integrating this library for the triangulation part. She encouraged us by saying that we can add the library as a node module just as opentype was being used for 2D text in p5.js. After integrating libtess, +I decided to improve the code further for some performance gains. I was able to implement a look up table with the help of which, we wouldn't need to compute coefficients after rendering curve, the first time. This was a huge performance boost from the previous trivial implementation. All that was left was to submit a [pull request](https://github.com/processing/p5.js/pull/3085) with an [example](https://github.com/processing/p5.js/tree/webgl-gsoc-2018/test/manual-test-examples/webgl/curves) showcasing what you can do with WebGL curves in p5.js. This closed issues [#2185](https://github.com/processing/p5.js/issues/2185), [#2186](https://github.com/processing/p5.js/issues/2186) and [#2187](https://github.com/processing/p5.js/issues/2187). ### text @@ -64,7 +61,8 @@ Fixed a minor issue with triangle stroke in 2D mode [#3075](https://github.com/p Ported some examples from Processing to p5.js [#242](https://github.com/processing/p5.js-website/pull/242). ## Support -Any questions pertaining to this project may be addressed via Issues on the [p5.js repository](https://github.com/processing/p5.js). Simply create a new Issue and either assign or tag me in the conversation with @adilrabbani. For anything else, don't hesitate to get in touch at 14bscsarabbani@seecs.edu.pk! + +Any questions pertaining to this project may be addressed via Issues on the [p5.js repository](https://github.com/processing/p5.js). Simply create a new Issue and either assign or tag me in the conversation with @adilrabbani. For anything else, don't hesitate to get in touch at [14bscsarabbani@seecs.edu.pk](mailto:14bscsarabbani@seecs.edu.pk)! ## Conclusion @@ -72,4 +70,3 @@ I learned a lot this summer. I would like to thank my mentor, [Stalgia Grigg](ht to this library. Thanks everyone! 😃 - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/aditya_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/aditya_gsoc_2021.mdx index 3940b915e5..4b1bddcf2a 100644 --- a/src/content/contributor-docs/en/project_wrapups/aditya_gsoc_2021.mdx +++ b/src/content/contributor-docs/en/project_wrapups/aditya_gsoc_2021.mdx @@ -1,27 +1,24 @@ - ---- - ---- - # Addon Library Development - [p5.teach.js](https://github.com/two-ticks/p5.teach.js/) -| **Project** | [Addon Library Development - p5.teach.js](https://summerofcode.withgoogle.com/projects/#4613016500305920) | -| :--- | :--- | -| **Student** | Aditya Siddheshwar | -| **Github** | [@two-ticks](https://github.com/two-ticks) | -| **Organisation** | [Processing Foundation](https://processingfoundation.org/) | -| **Mentors** | [Nick McIntyre](https://github.com/nickmcintyre), [Jithin KS](https://github.com/JithinKS97) | -| **Repo**| https://github.com/two-ticks/p5.teach.js/ | -| **Merged Code** | https://github.com/two-ticks/p5.teach.js/tree/GSoC'21 | - +| **Project** | [Addon Library Development - p5.teach.js](https://summerofcode.withgoogle.com/projects/#4613016500305920) | +| :--------------- | :------------------------------------------------------------------------------------------------------------- | +| **Student** | Aditya Siddheshwar | +| **Github** | [@two-ticks](https://github.com/two-ticks) | +| **Organisation** | [Processing Foundation](https://processingfoundation.org/) | +| **Mentors** | [Nick McIntyre](https://github.com/nickmcintyre), [Jithin KS](https://github.com/JithinKS97) | +| **Repo** | [https://github.com/two-ticks/p5.teach.js/](https://github.com/two-ticks/p5.teach.js/) | +| **Merged Code** | [https://github.com/two-ticks/p5.teach.js/tree/GSoC'21](https://github.com/two-ticks/p5.teach.js/tree/GSoC'21) | ## Overview -During the Google Summer of Code '21, I worked on p5.teach, under the mentorship of **Jithin KS** and **Nick McIntyre**. The goal of this project was to build an addon library for teaching maths through animations and simulations. It will provide users friendly API for creating text, TeX, and shape animations. + +During the Google Summer of Code '21, I worked on p5.teach, under the mentorship of **Jithin KS** and **Nick McIntyre**. The goal of this project was to build an addon library for teaching maths through animations and simulations. It will provide users friendly API for creating text, TeX, and shape animations.\ The major goals of this project were: -1. Development of animation methods and controls -2. Support for TeX + +1. Development of animation methods and controls +2. Support for TeX ## Tasks Completed + * Created TeX elements with help of tex-to-svg library (using MathJax) * Created TeX and text animations using MathJax and anime.js by manipulating p5.js DOM elements and SVG elements * Wrote play function for animations like write, waveIn, waveOut, fadeIn, fadeOut, createFill, etc. for TeX and text @@ -31,31 +28,35 @@ The major goals of this project were: * Included SVG plotting methods and animations * Developed demo sketches and posted on Instagram, Processing Forum, and Twitter -## TODO -- [ ] Write unit-tests -- [ ] Refactor animations -- [ ] Export animations +## TODO + +* [ ] Write unit-tests +* [ ] Refactor animations +* [ ] Export animations ## Challenges + * TDD is important and is one of the most preferred best practices; however, it was quite challenging to develop test cases considering the lack of documentation involving Jest with p5.js and keep progressing under GSoC time constraints. -* Adding animations to TeX with help of SVGs required a lot of effort and research. I learned a lot about SVGs and TypeScript from articles and tutorials while solving this problem. -* GObjects (Geometry Objects) required a lot of digging and discussion to figure out API and apply configurations to the plots. +* Adding animations to TeX with help of SVGs required a lot of effort and research. I learned a lot about SVGs and TypeScript from articles and tutorials while solving this problem. +* GObjects (Geometry Objects) required a lot of digging and discussion to figure out API and apply configurations to the plots. -## PRs -* https://github.com/two-ticks/p5.teach.js/pull/13 -* https://github.com/two-ticks/p5.teach.js/pull/6 -* https://github.com/two-ticks/p5.teach.js/pull/20 +## PRs + +* [https://github.com/two-ticks/p5.teach.js/pull/13](https://github.com/two-ticks/p5.teach.js/pull/13) +* [https://github.com/two-ticks/p5.teach.js/pull/6](https://github.com/two-ticks/p5.teach.js/pull/6) +* [https://github.com/two-ticks/p5.teach.js/pull/20](https://github.com/two-ticks/p5.teach.js/pull/20) ## Contribution & Next Steps + p5.teach is having text, TeX, and Shapes, I will refactor and fix bugs in animation. Before hosting it on the cloud, I will coordinate with mentors to ensure the library meets the coding standards and includes sufficient documentation. I will further improve the library by adding new features and adding more to the existing features. ## Conclusion and Acknowledgements -I really had a lot of fun working on this project and learned a lot of things this summer working with my mentors and Processing Community. -I would like to thank my mentors **Jithin KS** and **Nick McIntyre** for their invaluable help and guidance throughout this summer of code. Their love for teaching, code, and STEM inspired me to do more work on the library. Nick pushed me in the right direction for API, and Jithin always emphasized best practices and standards. I am extremely grateful to the Processing community for having me in the team (family). + +I really had a lot of fun working on this project and learned a lot of things this summer working with my mentors and Processing Community.\ +I would like to thank my mentors **Jithin KS** and **Nick McIntyre** for their invaluable help and guidance throughout this summer of code. Their love for teaching, code, and STEM inspired me to do more work on the library. Nick pushed me in the right direction for API, and Jithin always emphasized best practices and standards. I am extremely grateful to the Processing community for having me in the team (family). ## Useful Links + * [API Reference](https://github.com/two-ticks/p5.teach.js/blob/GSoC'21/api_reference/) * [Animating maths in p5.js](https://discourse.processing.org/t/animating-maths-in-p5-js/31583) * [Discussion and Review of Proposal - Addon Library Development - p5-teach.js](https://discourse.processing.org/t/discussion-and-review-of-proposal-addon-library-development-p5-teach-js/29065) - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/aidannelson_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/aidannelson_gsoc_2018.mdx index 406c644724..f6b897c941 100644 --- a/src/content/contributor-docs/en/project_wrapups/aidannelson_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/aidannelson_gsoc_2018.mdx @@ -1,7 +1,3 @@ - ---- - ---- # p5.js WebGL Updates Over the course of this Google Summer of Code 2018 project for The Processing Foundation, I worked along with [Adil Rabbani](https://github.com/AdilRabbani) and our mentors [Kate Hollenbach](https://github.com/kjhollen) and [Stalgia Grigg](https://github.com/mlarghydracept) to further expand and improve p5.js' WebGL implementation. I focused specifically on helping beginner coders visualize and understand 3D space through an expanded orbitControl(), reorganization and expansion of the camera and a debugMode(). @@ -10,7 +6,7 @@ Over the course of this Google Summer of Code 2018 project for The Processing Fo Having never before contributed substantially to open-source, I began the summer by getting up to speed on p5.js' contribution practices, the automated build process and working with git on our shared [webgl-gsoc-2018](https://github.com/processing/p5.js/tree/webgl-gsoc-2018) branch. During this time, I worked on improving existing WebGL mode documentation [here](https://github.com/processing/p5.js/pull/2940) and [here](https://github.com/processing/p5.js/pull/2939). In addition, fixing minor bugs ([here](https://github.com/processing/p5.js/pull/2944), [here](https://github.com/processing/p5.js/pull/2945), [here](https://github.com/processing/p5.js/pull/2975) and [here](https://github.com/processing/p5.js/pull/2976)) helped enormously to understand how the WebGL mode and broader p5.js codebases interacted with each other, with the browser and with the graphics card, as did a deep and ongoing friendship with the Chrome Debugger. -Along with this work, I found it extremely helpful to learn and use 'vanilla' WebGL outside of the p5.js ecosystem. Without the implementation-specific complexity of a library, I found it much easier to see how the various elements of a WebGL canvas interact. This series of [videos](https://www.youtube.com/watch?v=kB0ZVUrI4Aw) is particularly thorough in setting up a WebGL context, writing shaders and creating a program, and implementing the various matrices necessary for a 3D scene. To develop a more high-level background on the matrix math underlying 3D graphics and an intuitive sense of how matrices are composed, I found this series of [videos](https://www.youtube.com/watch?v=kjBOesZCoqc&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) very helpful. Among the dozens of articles I found on 3D cameras and projection, the chapters on [camera control](http://learnwebgl.brown37.net/#section-7-cameras) and [projection](http://learnwebgl.brown37.net/#section-8-projections-and-viewports) in 'Learn WebGL' were particularly helpful in developing an approach to the p5.Camera object reorganization. +Along with this work, I found it extremely helpful to learn and use 'vanilla' WebGL outside of the p5.js ecosystem. Without the implementation-specific complexity of a library, I found it much easier to see how the various elements of a WebGL canvas interact. This series of [videos](https://www.youtube.com/watch?v=kB0ZVUrI4Aw) is particularly thorough in setting up a WebGL context, writing shaders and creating a program, and implementing the various matrices necessary for a 3D scene. To develop a more high-level background on the matrix math underlying 3D graphics and an intuitive sense of how matrices are composed, I found this series of [videos](https://www.youtube.com/watch?v=kjBOesZCoqc\&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) very helpful. Among the dozens of articles I found on 3D cameras and projection, the chapters on [camera control](http://learnwebgl.brown37.net/#section-7-cameras) and [projection](http://learnwebgl.brown37.net/#section-8-projections-and-viewports) in 'Learn WebGL' were particularly helpful in developing an approach to the p5.Camera object reorganization. ## orbitControl() @@ -48,12 +44,10 @@ Because human depth perception is based in numerous visual and contextual clues | ![Are we moving or is the box moving? Which way is up?](http://www.aidanjnelson.com/files/gsoc-wpr-images/noDebugMode.gif) | ![Easier to identify orientation and movement with debugMode()](http://www.aidanjnelson.com/files/gsoc-wpr-images/debugMode.gif) | | :-------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | -| Are we moving or is the box moving? Which way is up? | Easier to identify orientation and movement with debugMode() | +| Are we moving or is the box moving? Which way is up? | Easier to identify orientation and movement with debugMode() | ## Summary A full list of my contributions to the WebGL branch can be found [here](https://github.com/processing/p5.js/commits/webgl-gsoc-2018?author=aidannelson) and my merged pull requests can be found [here](https://github.com/processing/p5.js/pulls?q=is%3Apr+is%3Amerged+author%3AAidanNelson). Working on this project for p5.js has been an incredible learning experience and a joy. I am extremely grateful to the Processing community and especially to my mentor, Kate Hollenbach, for a summer's worth of guidance, debugging, git tutorials, WebGL articles and support. Thank you! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/akshaypadte_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/akshaypadte_gsoc_2020.mdx index fce34d017c..6f6d3ea71f 100644 --- a/src/content/contributor-docs/en/project_wrapups/akshaypadte_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/akshaypadte_gsoc_2020.mdx @@ -1,31 +1,31 @@ - ---- - ---- # Extending the p5.js Friendly Error System #### By Akshay Padte ([@akshay-99](https://github.com/akshay-99)) ### Overview + Over the course of this summer, I worked on extending the Friendly Error System of p5.js with the help of my mentor Stalgia Grigg. The Friendly Error System, or FES for short, is a component of p5.js designed to help new programmers with common errors as they get started with learning. It detects common errors and mistakes and provides helpful messages to help the user resolve these. The major goals of this project were: -1. Improving the efficiency (speed and size) of the entire system. -2. Fixing bugs with the existing FES -3. Extending internationalization to cover the entire FES -4. Adding functionality to detect errors spelling and capitalization. -5. Adding functionality to capture and simplify global errors + +1. Improving the efficiency (speed and size) of the entire system. +2. Fixing bugs with the existing FES +3. Extending internationalization to cover the entire FES +4. Adding functionality to detect errors spelling and capitalization. +5. Adding functionality to capture and simplify global errors ### Before GSoC + I had been a p5 user for more than a year and had come to love it and rely on it a lot for several personal projects. I started contributing to p5 in around February this year, picking up issues and helping resolve them. In this brief period, I got to learn a lot about the inner workings of p5, how it initializes, how it builds, how the tests run, how different components work together, etc. ### Work + #### Part 1: Addressing known problems with the FES I kicked off the summer by addressing the issue of speed and size. The FES has a component called `validateParameters()`, responsible for checking if the arguments passed by the user are correct. It does this by matching the arguments against a file auto-generated from the inline docs. Earlier, this file was imported directly into the main library for the FES to use, but it also has a lot of information that is not needed by the FES which increases size unnecessarily. Pre-processing this file to keep only what was needed helped reduce the size of the final built p5.js library by around 25%. ![](https://akshay-fes-gsoc.surge.sh/image1.png) -Another issue was speed. validateParameters does a lot extra work before the actual function is executed. Sometimes, as seen in [this](https://github.com/processing/p5.js-website/tree/main/src/assets/learn/performance/code/friendly-error-system/) performance test, it would slow down a function by up to 10 times. My initial assumption to speed it up did not work so I played around in chrome dev tools to figure out what was actually happening. I learnt that most of the time was spent just trying to figure out the nearest matching overload intended by the user, and that this entire process happened over and over again if the function was called multiple times with the same arguments. I addressed this with a trie like data structure [[1]](https://github.com/processing/p5.js/blob/8226395d40a9df0113b13e42c983ae578b3856fa/src/core/error_helpers.js#L300), where each node represents an argument. Thus if a function is called again with the same sequence of arguments, we don't need to run the entirety of validateParameters. This not only improved the speed but also prevented the FES from flooding the console on repetitive calls of the same function. +Another issue was speed. validateParameters does a lot extra work before the actual function is executed. Sometimes, as seen in [this](https://github.com/processing/p5.js-website/tree/main/src/assets/learn/performance/code/friendly-error-system/) performance test, it would slow down a function by up to 10 times. My initial assumption to speed it up did not work so I played around in chrome dev tools to figure out what was actually happening. I learnt that most of the time was spent just trying to figure out the nearest matching overload intended by the user, and that this entire process happened over and over again if the function was called multiple times with the same arguments. I addressed this with a trie like data structure [\[1\]](https://github.com/processing/p5.js/blob/8226395d40a9df0113b13e42c983ae578b3856fa/src/core/error_helpers.js#L300), where each node represents an argument. Thus if a function is called again with the same sequence of arguments, we don't need to run the entirety of validateParameters. This not only improved the speed but also prevented the FES from flooding the console on repetitive calls of the same function. There was another issue which caused validateParameters to ignore the last undefined argument passed to function. This sometimes used to cause confusing and inaccurate messages. Fixing this was pretty easy and only involved one line of change. @@ -33,19 +33,19 @@ Moving on. There was an issue that if one p5 function called another p5 function ![](https://akshay-fes-gsoc.surge.sh/image2.png) To fix this, one can take a look at the stack trace. We need to answer "was the most recent p5 function invoked from another p5 function?" If so, we don't need to display a message even if the arguments are wrong. I used another library [stacktrace.js](https://www.stacktracejs.com/), to help with this. Analyzing stack traces was extensively employed later-on in the project as well. We'll come back to it later. -As a next step, internationationalization support was added for validateParameters messages and the language of some of the messages was simplified [[2]](https://github.com/processing/p5.js/pull/4629). There were a couple of other small problems that were also fixed in this phase. You can see them in the full list of pull requests. +As a next step, internationationalization support was added for validateParameters messages and the language of some of the messages was simplified [\[2\]](https://github.com/processing/p5.js/pull/4629). There were a couple of other small problems that were also fixed in this phase. You can see them in the full list of pull requests. -PRs in this phase: [#4561](https://github.com/processing/p5.js/pull/4561), [#4580](https://github.com/processing/p5.js/pull/4580), [#4590](https://github.com/processing/p5.js/pull/4590), [#4606](https://github.com/processing/p5.js/pull/4606), [#4613](https://github.com/processing/p5.js/pull/4613), [#4629](https://github.com/processing/p5.js/pull/4629) +PRs in this phase: [#4561](https://github.com/processing/p5.js/pull/4561), [#4580](https://github.com/processing/p5.js/pull/4580), [#4590](https://github.com/processing/p5.js/pull/4590), [#4606](https://github.com/processing/p5.js/pull/4606), [#4613](https://github.com/processing/p5.js/pull/4613), [#4629](https://github.com/processing/p5.js/pull/4629) #### Phase 2: New functionality! I had ideas for two new features to make the FES more powerful. -The first was to add a spell-check kind of system to the FES. Beginners often need time to understand the various naming conventions commonly used in programming, such as camelCase for identifiers, CAPS for constants, etc. And so, capitalization and spelling mistakes are very common, such as writing `createcanvas()` instead of `createCanvas()`, `colour()` instead of `color()`, etc. These kinds of mistakes are relatively easier to resolve, as the browser would display an error pointing to the function call. But if someone misspells a p5 entry point function (which has to be defined by the user), such as by defining `preload()` as `preLoad()` (I learnt that this is a very common mistake), p5 wouldn't detect it and the sketch would fail silently. It may take a lot of time to debug this simple mistake. +The first was to add a spell-check kind of system to the FES. Beginners often need time to understand the various naming conventions commonly used in programming, such as camelCase for identifiers, CAPS for constants, etc. And so, capitalization and spelling mistakes are very common, such as writing `createcanvas()` instead of `createCanvas()`, `colour()` instead of `color()`, etc. These kinds of mistakes are relatively easier to resolve, as the browser would display an error pointing to the function call. But if someone misspells a p5 entry point function (which has to be defined by the user), such as by defining `preload()` as `preLoad()` (I learnt that this is a very common mistake), p5 wouldn't detect it and the sketch would fail silently. It may take a lot of time to debug this simple mistake. Case-insensitive Levenshtein distance, calculated by the Wagner-Fischer algorithm was used to automatically detect these mistakes in user-code. The check would run on two instances: -1. Whenever a reference error is thrown (happens when a predefined function is called with a wrong spelling or capitalization) -2. When p5 is initialized, to detect mistakes in naming any entry-point functions (setup, draw, preload, etc.) +1. Whenever a reference error is thrown (happens when a predefined function is called with a wrong spelling or capitalization) +2. When p5 is initialized, to detect mistakes in naming any entry-point functions (setup, draw, preload, etc.) Here are a few example messages from this feature : @@ -53,7 +53,8 @@ Here are a few example messages from this feature : The second new feature was Global Error Catching. This meant analyzing the errors thrown by the browser and trying to match them up with helpful explanations was to solve them. -The first step was to come up with a way to detect and classify errors. Detection was easily possible with the help of an error listener. To classify the errors, using a regex match against a prebuilt lookup table was settled upon. The idea was based on the fact that web browsers use template error strings to generate error messages. This means that for a given browser, all error messages of a particular kind would have a consistent structure (This is pretty obvious I guess but I wanted to be sure. So I went through the source code of Chromium to confirm this 🙂). We can have our own template strings with placeholders [[3]](https://github.com/processing/p5.js/blob/b52226962eebf9f58f70eed68c4ce32661677d23/src/core/friendly_errors/browser_errors.js) which are then replaced with regex matching sequences ( like ([a-zA-Z0-9_]+) ), and then the result is matched against the error message to detect what kind of error this is. The regex sequence also helps to extract relevant details. For example, take a look at this sketch: +The first step was to come up with a way to detect and classify errors. Detection was easily possible with the help of an error listener. To classify the errors, using a regex match against a prebuilt lookup table was settled upon. The idea was based on the fact that web browsers use template error strings to generate error messages. This means that for a given browser, all error messages of a particular kind would have a consistent structure (This is pretty obvious I guess but I wanted to be sure. So I went through the source code of Chromium to confirm this 🙂). We can have our own template strings with placeholders [\[3\]](https://github.com/processing/p5.js/blob/b52226962eebf9f58f70eed68c4ce32661677d23/src/core/friendly_errors/browser_errors.js) which are then replaced with regex matching sequences ( like (\[a-zA-Z0-9\_]+) ), and then the result is matched against the error message to detect what kind of error this is. The regex sequence also helps to extract relevant details. For example, take a look at this sketch: + ```js function setup() { let a = 5; @@ -62,6 +63,7 @@ function draw() { let b = a + 5; } ``` + It shows a very basic mistake with scope that a beginner can make. The error shown is: ![](https://akshay-fes-gsoc.surge.sh/image4.png) While the browser error message aims at being concise, the FES message aims to explain the error as much as possible and also provides links which have examples to fix this kind of error. This is more helpful to those who have just started learning to program and have not yet gotten used to deciphering error messages. @@ -88,15 +90,15 @@ During testing, I came across an issue that global error catching did not run wh The final week of GSoC involved documenting all the changes that were made as part of this project. -PRs in this phase: [#4701](https://github.com/processing/p5.js/pull/4701), [#4709](https://github.com/processing/p5.js/pull/4709), [#4726](https://github.com/processing/p5.js/pull/4726), [#4730](https://github.com/processing/p5.js/pull/4730) _(closed)_, [#4746](https://github.com/processing/p5.js/pull/4746) +PRs in this phase: [#4701](https://github.com/processing/p5.js/pull/4701), [#4709](https://github.com/processing/p5.js/pull/4709), [#4726](https://github.com/processing/p5.js/pull/4726), [#4730](https://github.com/processing/p5.js/pull/4730) *(closed)*, [#4746](https://github.com/processing/p5.js/pull/4746) ### Work Pull Requests and Issues -- All of the pull requests made as part of the project can be found here: -https://github.com/processing/p5.js/pulls?q=is%3Apr+author%3Aakshay-99+created%3A%3E2020-05-04+ +* All of the pull requests made as part of the project can be found here:\ + [https://github.com/processing/p5.js/pulls?q=is%3Apr+author%3Aakshay-99+created%3A%3E2020-05-04+](https://github.com/processing/p5.js/pulls?q=is%3Apr+author%3Aakshay-99+created%3A%3E2020-05-04+) -- All of the issues opened as part of this project can be found here: -https://github.com/processing/p5.js/issues?q=is%3Aissue+author%3Aakshay-99+created%3A%3E2020-05-04+ +* All of the issues opened as part of this project can be found here:\ + [https://github.com/processing/p5.js/issues?q=is%3Aissue+author%3Aakshay-99+created%3A%3E2020-05-04+](https://github.com/processing/p5.js/issues?q=is%3Aissue+author%3Aakshay-99+created%3A%3E2020-05-04+) ### Conclusion @@ -104,7 +106,6 @@ I really enjoyed working on this project. I learned a lot of new things. I would ### References -1. https://github.com/processing/p5.js/blob/8226395d40a9df0113b13e42c983ae578b3856fa/src/core/error_helpers.js#L300 -2. https://github.com/processing/p5.js/pull/4629 -3. https://github.com/processing/p5.js/blob/b52226962eebf9f58f70eed68c4ce32661677d23/src/core/friendly_errors/browser_errors.js - \ No newline at end of file +1. [https://github.com/processing/p5.js/blob/8226395d40a9df0113b13e42c983ae578b3856fa/src/core/error\_helpers.js#L300](https://github.com/processing/p5.js/blob/8226395d40a9df0113b13e42c983ae578b3856fa/src/core/error_helpers.js#L300) +2. [https://github.com/processing/p5.js/pull/4629](https://github.com/processing/p5.js/pull/4629) +3. [https://github.com/processing/p5.js/blob/b52226962eebf9f58f70eed68c4ce32661677d23/src/core/friendly\_errors/browser\_errors.js](https://github.com/processing/p5.js/blob/b52226962eebf9f58f70eed68c4ce32661677d23/src/core/friendly_errors/browser_errors.js) diff --git a/src/content/contributor-docs/en/project_wrapups/anaisgonzalez_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/anaisgonzalez_gsoc_2021.mdx deleted file mode 100644 index bb382cb528..0000000000 --- a/src/content/contributor-docs/en/project_wrapups/anaisgonzalez_gsoc_2021.mdx +++ /dev/null @@ -1,113 +0,0 @@ - ---- - ---- -# Improving the p5.xr Library Through Artistic Examples - -#### by [Anais Gonzalez](https://anaisgonzalez.design) - - - -## Work Pull Requests and Issues - * All of the pull requests made as a part of the project can be found [here](https://github.com/stalgiag/p5.xr/pulls?q=is%3Apr+author%3Aanagondesign+created%3A%3C2021-08-23). - * All of the issues opened as part of the project can be found [here](https://github.com/stalgiag/p5.xr/issues?q=is%3Aissue+author%3Aanagondesign+created%3A%3C2021-08-23+). - * All of the commits I made for the project can be found [here](https://github.com/stalgiag/p5.xr/commits?author=anagondesign). - - - -## Overview -Over the course of this summer, I worked on improving the p5.xr library by creating a series of artistic examples with the guidance of my mentor Stalgia Grigg. The p5.xr library is an add-on for p5 that adds the ability to run p5 sketches in Augmented Reality or Virtual Reality. It does this with the help of WebXR and anyone who is familiar with p5 can experiment with this library as long as they have the necessary equipment. - -The major goals of this project were to explore the possibilities of creative coding in p5.xr and show others how they can use p5 to work with the core concepts of immersive mediums. To accomplish this, the different themes of this project were broken down into a collection of simple and complex examples. The simple examples focused on the technical aspects of how to utilize VR specific functions within p5.XR while the complex examples were more of an abstract/creative exploration of all these concepts. - - - -## Work - -### [Example #1: Immersive Typography](https://github.com/stalgiag/p5.xr/tree/master/examples/immersive-typography) -This was the first theme I started working on since I like experimenting with type. I started thinking about ways in which I could immerse myself with letter forms and tried to imagine what that would look like through some sketches. - -![immersive-typography-sketch-1](https://user-images.githubusercontent.com/83731139/130163196-4c37fbfe-95ca-449b-8741-f41697cff63b.jpg) -![immersive-typography-sketch-2](https://user-images.githubusercontent.com/83731139/130163197-7ec096e4-00f4-4962-8e7f-cee00d285e74.jpg) - -I thought of including 3D shapes with moving typographic textures on them and floating letterforms that were scattered throughout space. When I started working on it in VR, I learned about how to use [intersectBox()](https://p5xr.org/#/reference/raycasting?id=intersectsbox), a VR-specific function that allows you to trigger changes in a box of a specific size by using raycasting. This function ended up being the basis for the basic example where I use it to change a box's stroke color and text just by looking at it. - -![immersive-typography-gif-1](https://user-images.githubusercontent.com/83731139/130161907-ef491b1d-dbce-4d7f-b2c1-647c04ae9c95.gif) - -For the complex example, I started working on typographic textures in WEBGL first before bringing them in VR. These are some different versions of these tests: [1](https://editor.p5js.org/agonzal019/sketches/ZTjSOBQ7L), [2](https://editor.p5js.org/agonzal019/sketches/aFxmSlZ2w), [3](https://editor.p5js.org/agonzal019/sketches/PTaRhklbv). One of the first things I struggled with was not knowing how to use timing properly to reset an array. After talking with Stalgia about it, they taught me about how to use modulo, which returns the remainder of something after division. This line of code would play a big role in many of the other examples I've created. This is where I encountered my first issue. I found out that using plain text in VR was difficult because the text would only be visible at certain angles, so I decided to keep on using createGraphics() to display the type instead. This process was going well until I tried to use deltaTime in one of the earlier versions of this example. The WEBGL example's timing changes functioned perfectly in the browser but when I brought it into VR, the letters in the array wouldn't switch. Luckily, after posting an [issue](https://github.com/stalgiag/p5.xr/issues/133) about it, the problem was resolved and deltaTime and millis() were now functioning. - -After that was resolved, I finished the complex example by combining different parts of my earlier drafts all into one piece. I used intersectBox() to increase the scale of the box upon viewing it, the array of changing letterforms scattered through space that used deltaTime, textToPoints, and a planetary structure with rotating text to make my own galaxy of typography. - -![immersive-typography-gif-2](https://user-images.githubusercontent.com/83731139/130161915-e75ca7c7-c8e0-419b-9cf1-04bff4281176.gif) - -PRs in this section: [#137](https://github.com/stalgiag/p5.xr/pull/137) , [#138](https://github.com/stalgiag/p5.xr/pull/138) - - - -### [Example #2: Visual Art Making Tools](https://github.com/stalgiag/p5.xr/tree/master/examples/visual-art-making-tools) - -![visual-art-making-tools-sketch](https://user-images.githubusercontent.com/83731139/130163201-9443f3b4-2a7b-48c6-bc51-cdb708bd53c4.jpg) - -I started experimenting with using 3D shapes as drawing tools in WEBGL by removing `background()` from `draw()`, but quickly ran into problems when trying to do this same method in VR. I learned that if background() is put into `draw()`, one of the eyes of the headset becomes completely blocked out. This is because draw runs twice in VR (once per eye), which is why [setVRBackgroundColor()](https://p5xr.org/#/reference/vr?id=setvrbackgroundcolor) goes in setup, so that the background is cleared after rendering for each eye. - -Since I couldn't use this approach of not drawing the background to keep previously drawn shapes, Stalgia showed me a different approach that stores an array of objects indicating previous brush strokes at the x, y, and z positions of the viewer's controller. Now that the positioning was correct, we had to use [generateRay()](https://p5xr.org/#/reference/raycasting?id=generateray) to create a ray originating at the hand's location in order to use `intersectSphere()`. It's also necessary to use **`applyMatrix(hand.pose)`** to apply the position and rotation of the hand to a box indicating the location of the player's hand. - -![visual-art-making-tools-gif-1](https://user-images.githubusercontent.com/83731139/130161879-d61c1ecb-2000-4310-9794-b11009e46225.gif) - -After I was able to actually draw something, I started thinking about ways in which I could add more variety. For the basic example, I used [intersectSphere()](https://p5xr.org/#/reference/raycasting?id=intersectssphere) to change the color of the brushstroke. This method of using ray intersection to change things became tedious in the complex example. I'd been using this method to change the color, size, and shape of the brush until I discovered that I could [utilize other buttons on my controller](https://github.com/stalgiag/p5.xr/blob/master/src/p5xr/core/p5xrInput.js) besides the trigger, so I started using those instead. *One thing to note for the Oculus Quest 2 is that the input code for the touchpad buttons does not work at all.* - -![visual-art-making-tools-gif-2](https://user-images.githubusercontent.com/83731139/130161882-2dd81c55-c823-44b7-bc00-5b98e07a1dac.gif) - -For the textures in the complex example, I initially wanted to use a collection of custom textures made in p5 as textures for the brushstroke, but that caused the sketch to run incredibly slow, so I improvised. I took screenshots of my textures, manipulated the images in Photoshop, and then used those images as my final textures for the sketch. I then made everything more fun and chaotic by randomizing the texture, shape, and size of the brush automatically when someone draws. - -PRs in this section: [#140](https://github.com/stalgiag/p5.xr/pull/140) , [#141](https://github.com/stalgiag/p5.xr/pull/141) - - - -### [Example #3: Immersive 360](https://github.com/stalgiag/p5.xr/tree/master/examples/immersive-360) - -![immersive-360-sketch](https://user-images.githubusercontent.com/83731139/130163198-e956e189-efae-4a1d-a71b-a2ca36b8f61c.jpg) - -I created p5 animations in the browser and then displayed them within VR by using a specific function called [surroundTexture()](https://p5xr.org/#/reference/vr?id=surroundtexture). Normally intended for displaying 360 photos, this function creates a very large sphere with inverted scale that surrounds the viewer. Regarding functionality, both the basic and complex examples allow the viewer to switch between states by pressing the trigger button. For the complex example, I also included some typographic animations to stay consistent with my style. - -![immersive-360-gif](https://user-images.githubusercontent.com/83731139/130161902-dbcda386-b55b-4454-8101-f108aa47e89d.gif) - -PRs in this section: [#145](https://github.com/stalgiag/p5.xr/pull/145) , [#146](https://github.com/stalgiag/p5.xr/pull/146) - - - -### [Example #4: Physics](https://github.com/stalgiag/p5.xr/tree/master/examples/physics) -I've never worked with physics in code before so I watched a Coding Train tutorial on strings, but the example didn't easily translate to the scale of VR. After speaking with my mentor about it, they showed me a working physics example that I was able to expand upon for the complex version of this theme. The basic example includes boundaries and a ball that can be held and thrown around. - -![physics-gif-1](https://user-images.githubusercontent.com/83731139/130161918-e969e700-eea6-46dc-923a-95979775cd6e.gif) - -For the complex example, I made the Ball class from earlier generate multiple balls at random locations that could change size, shape, texture, and color the moment they collide with a boundary. I also tried to include type textures on the shapes too, but UV wrapping on the 3D shapes made them illegible. So instead I displayed the type textures on the boundaries of the room. I eventually removed the ability for the ball to change shape or texture since it felt too busy and just left it so it changes only size and color upon collision. Once I added in the other walls and ceiling, the whole thing really came together. - -![physics-gif-2](https://user-images.githubusercontent.com/83731139/130161920-9fea2aa4-8e75-458a-9bac-97e67b9ce463.gif) - -PRs in this section: [#143](https://github.com/stalgiag/p5.xr/pull/143) , [#144](https://github.com/stalgiag/p5.xr/pull/144) - - - -### [Example #5: Embodiment](https://github.com/stalgiag/p5.xr/pull/147) -For the embodiment example, my mentor explained p5.xr viewer properties that helped position objects relative to the body in VR. We can get the location of the camera with `viewerPosition` and we can also get the pose of the camera with viewerPoseMatrix. We can use `applyMatrix(viewerPoseMatrix)` on the head of the body, which allows it to mirror the direction and pose of the viewer's head. By putting `viewerPosition` inside of translate, now the other parts of the body will be relative to the location of the head. - -![embodiment-gif-1](https://user-images.githubusercontent.com/83731139/130161883-66469af7-3e6b-4ab8-bd11-ef92933a9402.gif) - -There wasn't enough time to finish the complex example. I wanted to create a dragon that the viewer could look at and move with, but I was having trouble converting the scale to the correct dimensions in VR, which are extremely small. - -PRs in this section: [#147](https://github.com/stalgiag/p5.xr/pull/147) - - - - -## Future -Future work could add specific input controls for the Oculus Quest 2's x, y, a, and b buttons. Right now the gamepad code does not function for Oculus but does work with HTC Vive. -Future work could investigate performance issues with text in VR. - - - -## Conclusion -Even though it was challenging for me as a novice coder working with an experimental program, I had fun making these examples and I learned so many new things! First and foremost, I'd like to thank my mentor Stalgia Grigg for all the patience, kindness, and encouragement they've given to me this past summer. They've been such a great mentor to me and I don't think I wouldn't have gotten this far in the program without them and their guidance. I would also like to thank the Processing Foundation and Google for giving me this opportunity to contribute something cool to their community <3 - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/aryan_koundal_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/aryan_koundal_gsoc_2023.mdx index e6fba62e1d..69bdbf8f19 100644 --- a/src/content/contributor-docs/en/project_wrapups/aryan_koundal_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/aryan_koundal_gsoc_2023.mdx @@ -1,155 +1,161 @@ +# Improving p5.js WebGL/3d functionality ---- - ---- -# Improving p5.js WebGL/3d functionality - -#### By Aryan Koundal(@AryanKoundal) -#### Mentored by : Dave Pagurek(@davepagurek ), Tanvi Kumar(@TanviKumar ) - -## Overview - -In p5.js, there are two render modes: P2D (default renderer) and WebGL. WEBGL -enables the user to draw in 3D. There are many ways to implement lighting. +#### By Aryan Koundal(@AryanKoundal) + +#### Mentored by : Dave Pagurek(@davepagurek ), Tanvi Kumar(@TanviKumar ) + +## Overview + +In p5.js, there are two render modes: P2D (default renderer) and WebGL. WEBGL +enables the user to draw in 3D. There are many ways to implement lighting. Currently, p5js has implemented 8. To add lighting to a 3D object, one can use these functionalities. But there is another technique to light objects, not by direct light, but using the surrounding environment as a single light -source, which we call Image-Based lighting. -This project aims to add lighting to a 3D object, using the surrounding -environment as a single light source, which is generally called Image-Based -lighting. In simple words, one can very quickly drop in an image from real -life to use as surrounding lights, rather than continuously tweaking the colors -and positions of ambient, point, etc lights. - -1. Diffused IBL - 1. Create scene's irradiance. - 1. Calculation of Scene’s irradiance for any direction. - 1. Sample the scene’s radiance from all possible directions, within the - hemisphere, for each fragment. - 1. Take a finite number of samples of the scene's irradiance and pre-compute them. - 1. Create a pre-computed irradiance map. - 1. Sample the pre-computed irradiance map to retrieve diffuse irradiance. -1. Specular IBL - 1. We need to preconvolute it. - 1. Use split sum approximation to divide the specular part into 2 further parts - 1. First one is a prefiltered environment map. - 1. Finalize Pre filter convolution using low discrepancy hammersley sequence - and sample generation defined. - 1. Capturing prefilter mipmap levels, storing the results in prefiltered - environment cubemap - 1. Second one is BDRF - 1. pre -calculate the BRDF’s response given input as roughness and angle - between n and wi. - Precalculations done using BRDF’S geometry function and Fresnel-Schlicks approximation. - 1. Stored in 2D lookup texture known as BRDF integration map. - 1. Combine the prefiltered environment map and BRDF integration map -1. Combine the diffused and specular parts - - -## Current State of The Project - -The project is completed and here are some screenshots and videos demonstrating the work. - -#### Image of Example 1 -![example 1](https://github.com/processing/p5.js/assets/77334487/8d818df0-17a8-4332-b369-bcb79a5afc67) - -#### Video of Example 1 -https://github.com/processing/p5.js/assets/77334487/44b30c77-33c1-41d0-ada5-282424978832 - -#### Image oF Example 2 -![example 2](https://github.com/processing/p5.js/assets/77334487/e46f24b8-2713-4d2b-8392-744585da6a5b) - -#### Video of Example 2 -https://github.com/processing/p5.js/assets/77334487/a0a6b3f9-b25b-451f-961e-b2970cb9e907 - -## Pull Request - -- Pull Request: https://github.com/processing/p5.js/pull/6255 -- Work Reports: - - [p5js Week 1 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-1-report-gsoc23-processing-foundation-9910934112e5) - - [p5js Week 2 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-2-report-gsoc23-processing-foundation-c8a36f5cf34) - - [p5js Week 3 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-3-report-gsoc23-processing-foundation-39043d0363e2) - - and more... - - -## Work Done - -### src/webgl/light.js -1. This includes the function `imageLight()` which provides the whole functionality. -1. 2 Examples for the `imageLight()` are also included in this files. - -### src/webgl/p5.RendererGL.js -1. This includes 2 new maps, which are diffusedTextures and specularTextures for storing the p5 graphics. -1. Then the function `getDiffusedTexture()` which gets called from _setImageLightUniforms. It's function is to create a blurry -image from the input non blurry img, if it doesn't already exist. -1. Also the function `getSpecularTexture()` which also gets called from _setImageLightUniforms. It's function is too create a texture - from the input non blurry image, if it doesn't already exist -1. Then the function `_setImageLightUniforms()`. It creates the textures and sets those textures in the shader being processed. - -### src/webgl/p5.Texture.js -1. This includes the `MipmapTexture` class. - - -### src/webgl/shaders/imageLight.vert -1. It is a vertex shader only for the image Light feature. - -### src/webgl/shaders/imageLightDiffused.frag -1. It is the Fragment shader for the calculations of the Diffused Part of Image Light. - -### src/webgl/shaders/imageLightSpecular.frag -1. It is the Fragment shader for the calculations of the Specular Part of Image Light. -1. It has the functions `HammersleyNoBitOps()` , `VanDerCorput()`and `ImportanceSampleGGX()` which are -referenced from "https://learnopengl.com/PBR/IBL/Specular-IBL" - -### src/webgl/shaders/lighting.glsl -1. This includes `calculateImageDiffuse()` and `calculateImageSpecular()` which actually calculates the output textures. These are calculated only when `imageLight()` is called. - -### List of All shaders modified to improve webGL compatibility to newer versions -1. src/webgl/shaders/basic.frag -1. src/webgl/shaders/immediate.vert -1. src/webgl/shaders/light.vert -1. src/webgl/shaders/light_texture.frag -1. src/webgl/shaders/line.frag -1. src/webgl/shaders/line.vert -1. src/webgl/shaders/normal.frag -1. src/webgl/shaders/normal.vert -1. src/webgl/shaders/phong.frag -1. src/webgl/shaders/phong.vert -1. src/webgl/shaders/point.frag -1. src/webgl/shaders/point.vert -1. src/webgl/shaders/vertexColor.frag -1. src/webgl/shaders/vertexColor.vert - -### Sketches I made, which might be useful -1. Example 1 in imagelight https://editor.p5js.org/aryan_koundal/sketches/OEsyk6uZI -1. Example 2 in imagelight https://editor.p5js.org/aryan_koundal/sketches/XjalPP7s4 -1. Final Prototype Diffused + Roughness (Variable Roughness) https://editor.p5js.org/aryan_koundal/sketches/4V790dB9Z -1. Diffuse light final prototype https://editor.p5js.org/aryan_koundal/sketches/q_Zg37OB2 -1. Mipmap Specular roughness Prototype (visible variation) https://editor.p5js.org/aryan_koundal/sketches/Bi2BN7zjK -1. Specular prefilterconvolution with chessboard https://editor.p5js.org/aryan_koundal/sketches/qaIhxRZHI -1. Prefilterconvolution cubemaps prototypes 8 levels https://editor.p5js.org/aryan_koundal/sketches/YJTSFKhqt -1. Specular prefilterconvolution with image https://editor.p5js.org/aryan_koundal/sketches/8divJgdQxO -1. Specular mipmaps prototype with colors https://editor.p5js.org/aryan_koundal/sketches/3V9iDH8ax -1. Sphere with point Lights https://editor.p5js.org/aryan_koundal/sketches/9NdeCtfdW -1. Diffused texture Shader Prototype https://editor.p5js.org/aryan_koundal/sketches/DcFDcOFUn -1. Resolution Pixelwise https://editor.p5js.org/aryan_koundal/sketches/5RfDIy2I9 -1. Cube reflecting mountain spheremap https://editor.p5js.org/aryan_koundal/sketches/2QS5-Fy0V -1. Cube reflecting sky spheremap https://editor.p5js.org/aryan_koundal/sketches/O1NwI4ufp - -## Further Improvement -While working on this project, I realised that there is scope for improvement. Like increasing efficiency by using cubemaps instead of environment maps for Diffused Lighting. Also using framebuffers would improve the efficiency and reduce the time taken to render the lights. - -## Conclusion - +source, which we call Image-Based lighting. +This project aims to add lighting to a 3D object, using the surrounding +environment as a single light source, which is generally called Image-Based +lighting. In simple words, one can very quickly drop in an image from real +life to use as surrounding lights, rather than continuously tweaking the colors +and positions of ambient, point, etc lights. + +1. Diffused IBL + 1. Create scene's irradiance. + 2. Calculation of Scene’s irradiance for any direction. + 1. Sample the scene’s radiance from all possible directions, within the + hemisphere, for each fragment. + 2. Take a finite number of samples of the scene's irradiance and pre-compute them. + 3. Create a pre-computed irradiance map. + 3. Sample the pre-computed irradiance map to retrieve diffuse irradiance. +2. Specular IBL + 1. We need to preconvolute it. + 2. Use split sum approximation to divide the specular part into 2 further parts + 1. First one is a prefiltered environment map. + 1. Finalize Pre filter convolution using low discrepancy hammersley sequence + and sample generation defined. + 2. Capturing prefilter mipmap levels, storing the results in prefiltered + environment cubemap + 2. Second one is BDRF + 1. pre -calculate the BRDF’s response given input as roughness and angle + between n and wi. + Precalculations done using BRDF’S geometry function and Fresnel-Schlicks approximation. + 2. Stored in 2D lookup texture known as BRDF integration map. + 3. Combine the prefiltered environment map and BRDF integration map +3. Combine the diffused and specular parts + +## Current State of The Project + +The project is completed and here are some screenshots and videos demonstrating the work. + +#### Image of Example 1 + +![example 1](https://github.com/processing/p5.js/assets/77334487/8d818df0-17a8-4332-b369-bcb79a5afc67) + +#### Video of Example 1 + +[https://github.com/processing/p5.js/assets/77334487/44b30c77-33c1-41d0-ada5-282424978832](https://github.com/processing/p5.js/assets/77334487/44b30c77-33c1-41d0-ada5-282424978832) + +#### Image oF Example 2 + +![example 2](https://github.com/processing/p5.js/assets/77334487/e46f24b8-2713-4d2b-8392-744585da6a5b) + +#### Video of Example 2 + +[https://github.com/processing/p5.js/assets/77334487/a0a6b3f9-b25b-451f-961e-b2970cb9e907](https://github.com/processing/p5.js/assets/77334487/a0a6b3f9-b25b-451f-961e-b2970cb9e907) + +## Pull Request + +* Pull Request: [https://github.com/processing/p5.js/pull/6255](https://github.com/processing/p5.js/pull/6255) +* Work Reports: + * [p5js Week 1 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-1-report-gsoc23-processing-foundation-9910934112e5) + * [p5js Week 2 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-2-report-gsoc23-processing-foundation-c8a36f5cf34) + * [p5js Week 3 Report | GSoC’23 Processing Foundation](https://aryankoundal.medium.com/p5js-week-3-report-gsoc23-processing-foundation-39043d0363e2) + * and more... + +## Work Done + +### src/webgl/light.js + +1. This includes the function `imageLight()` which provides the whole functionality. +2. 2 Examples for the `imageLight()` are also included in this files. + +### src/webgl/p5.RendererGL.js + +1. This includes 2 new maps, which are diffusedTextures and specularTextures for storing the p5 graphics. +2. Then the function `getDiffusedTexture()` which gets called from \_setImageLightUniforms. It's function is to create a blurry + image from the input non blurry img, if it doesn't already exist. +3. Also the function `getSpecularTexture()` which also gets called from \_setImageLightUniforms. It's function is too create a texture + from the input non blurry image, if it doesn't already exist +4. Then the function `_setImageLightUniforms()`. It creates the textures and sets those textures in the shader being processed. + +### src/webgl/p5.Texture.js + +1. This includes the `MipmapTexture` class. + +### src/webgl/shaders/imageLight.vert + +1. It is a vertex shader only for the image Light feature. + +### src/webgl/shaders/imageLightDiffused.frag + +1. It is the Fragment shader for the calculations of the Diffused Part of Image Light. + +### src/webgl/shaders/imageLightSpecular.frag + +1. It is the Fragment shader for the calculations of the Specular Part of Image Light. +2. It has the functions `HammersleyNoBitOps()` , `VanDerCorput()`and `ImportanceSampleGGX()` which are + referenced from "[https://learnopengl.com/PBR/IBL/Specular-IBL](https://learnopengl.com/PBR/IBL/Specular-IBL)" + +### src/webgl/shaders/lighting.glsl + +1. This includes `calculateImageDiffuse()` and `calculateImageSpecular()` which actually calculates the output textures. These are calculated only when `imageLight()` is called. + +### List of All shaders modified to improve webGL compatibility to newer versions + +1. src/webgl/shaders/basic.frag +2. src/webgl/shaders/immediate.vert +3. src/webgl/shaders/light.vert +4. src/webgl/shaders/light\_texture.frag +5. src/webgl/shaders/line.frag +6. src/webgl/shaders/line.vert +7. src/webgl/shaders/normal.frag +8. src/webgl/shaders/normal.vert +9. src/webgl/shaders/phong.frag +10. src/webgl/shaders/phong.vert +11. src/webgl/shaders/point.frag +12. src/webgl/shaders/point.vert +13. src/webgl/shaders/vertexColor.frag +14. src/webgl/shaders/vertexColor.vert + +### Sketches I made, which might be useful + +1. Example 1 in imagelight [https://editor.p5js.org/aryan\_koundal/sketches/OEsyk6uZI](https://editor.p5js.org/aryan_koundal/sketches/OEsyk6uZI) +2. Example 2 in imagelight [https://editor.p5js.org/aryan\_koundal/sketches/XjalPP7s4](https://editor.p5js.org/aryan_koundal/sketches/XjalPP7s4) +3. Final Prototype Diffused + Roughness (Variable Roughness) [https://editor.p5js.org/aryan\_koundal/sketches/4V790dB9Z](https://editor.p5js.org/aryan_koundal/sketches/4V790dB9Z) +4. Diffuse light final prototype [https://editor.p5js.org/aryan\_koundal/sketches/q\_Zg37OB2](https://editor.p5js.org/aryan_koundal/sketches/q_Zg37OB2) +5. Mipmap Specular roughness Prototype (visible variation) [https://editor.p5js.org/aryan\_koundal/sketches/Bi2BN7zjK](https://editor.p5js.org/aryan_koundal/sketches/Bi2BN7zjK) +6. Specular prefilterconvolution with chessboard [https://editor.p5js.org/aryan\_koundal/sketches/qaIhxRZHI](https://editor.p5js.org/aryan_koundal/sketches/qaIhxRZHI) +7. Prefilterconvolution cubemaps prototypes 8 levels [https://editor.p5js.org/aryan\_koundal/sketches/YJTSFKhqt](https://editor.p5js.org/aryan_koundal/sketches/YJTSFKhqt) +8. Specular prefilterconvolution with image [https://editor.p5js.org/aryan\_koundal/sketches/8divJgdQxO](https://editor.p5js.org/aryan_koundal/sketches/8divJgdQxO) +9. Specular mipmaps prototype with colors [https://editor.p5js.org/aryan\_koundal/sketches/3V9iDH8ax](https://editor.p5js.org/aryan_koundal/sketches/3V9iDH8ax) +10. Sphere with point Lights [https://editor.p5js.org/aryan\_koundal/sketches/9NdeCtfdW](https://editor.p5js.org/aryan_koundal/sketches/9NdeCtfdW) +11. Diffused texture Shader Prototype [https://editor.p5js.org/aryan\_koundal/sketches/DcFDcOFUn](https://editor.p5js.org/aryan_koundal/sketches/DcFDcOFUn) +12. Resolution Pixelwise [https://editor.p5js.org/aryan\_koundal/sketches/5RfDIy2I9](https://editor.p5js.org/aryan_koundal/sketches/5RfDIy2I9) +13. Cube reflecting mountain spheremap [https://editor.p5js.org/aryan\_koundal/sketches/2QS5-Fy0V](https://editor.p5js.org/aryan_koundal/sketches/2QS5-Fy0V) +14. Cube reflecting sky spheremap [https://editor.p5js.org/aryan\_koundal/sketches/O1NwI4ufp](https://editor.p5js.org/aryan_koundal/sketches/O1NwI4ufp) + +## Further Improvement + +While working on this project, I realised that there is scope for improvement. Like increasing efficiency by using cubemaps instead of environment maps for Diffused Lighting. Also using framebuffers would improve the efficiency and reduce the time taken to render the lights. + +## Conclusion + My GSoC experience was genuinely transformative, leading to significant personal and professional development within the open-source domain. I successfully overcame initial obstacles related to setting up the project and navigating the codebase, steadily advancing through my contributions. -Throughout this summer, I actively participated in the p5.js open-source community, surpassing my +Throughout this summer, I actively participated in the p5.js open-source community, surpassing my initial expectations for my first major open-source venture and further igniting my enthusiasm. I want to express my heartfelt appreciation to my mentors, Dave Pagurek(@davepagurek ), and -Tanvi Kumar(@TanviKumar ), for their invaluable guidance in navigating coding challenges. +Tanvi Kumar(@TanviKumar ), for their invaluable guidance in navigating coding challenges. Effective teamwork, collaboration, and communication proved essential in this open-source journey. I eagerly anticipate expanding my contributions and honing my skills. This summer has instilled -a sense of purpose in me, and I'm profoundly grateful for the mentorship and knowledge gained. - - \ No newline at end of file +a sense of purpose in me, and I'm profoundly grateful for the mentorship and knowledge gained. diff --git a/src/content/contributor-docs/en/project_wrapups/ashleykang_gsoc2019.mdx b/src/content/contributor-docs/en/project_wrapups/ashleykang_gsoc2019.mdx index 1b6c3029f3..a89c59c04d 100644 --- a/src/content/contributor-docs/en/project_wrapups/ashleykang_gsoc2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/ashleykang_gsoc2019.mdx @@ -1,25 +1,22 @@ - ---- - ---- # p5.js Showcase For my Google Summer of Code 2019 project, I worked with my mentor Kate Hollenbach to curate new examples of work by the online and offline p5.js community and create a place for them on the [p5.js website](https://p5js.org/). This involved creating new `/showcase` and `/showcase/featuring` pages to highlight creative and inclusive ways people have been engaging with p5.js (including but not limited to: making art and design, learning and teaching code, improving and translating documentation, accessibility, integrating other libraries and devices, contributing to open source). We also established an open nomination process for people to submit or nominate work to be featured, especially educators and students when the school year starts. We are continuing to discuss how to update the pages periodically. ## Contributions + In summary: -- Created a main `/showcase` page on p5js.org via a [“showcase” branch](https://github.com/kangashley/p5.js-website/tree/showcase) in a fork of p5.js-website repo and subpages for each featured project under `/showcase/featuring` -- Updated side navigation to include link to showcase -- Identified potential 60+ creators to feature; created a database of their p5.js and Processing projects using Airtable; recognized various categories for how p5.js is used -- Made decisions on design and development direction using wireframes in [Figma](https://www.figma.com/file/WkRoMv5Nf9yzzzwY7cz2JbbR/p5.js-Showcase?node-id=0%3A1), then an HTML/CSS/JavaScript prototype in [Codepen](https://codepen.io/kangashley/pen/RXGKyX) -- Established a process for nominating p5.js projects by designing a [Nomination Form](https://forms.gle/tukmUDqzLUwckjAVA) with appropriate questions -- Reached out to the creators of 9 projects based on how they used p5.js to explore interesting concepts and contexts for art and design, with other technologies, and/or various learning/teaching methodologies; received interviews about 6 projects -- Edited interviews for length and clarity -- Raised accessibility (a11y) concerns that implicate the rest of the website (color contrast, page structure, link styles, visually hidden headings) -- Created a [template](https://gist.github.com/kangashley/ac5499997a6b06f8a0954f0d572e9cf4) for created a page for a p5.js Showcase featured project -- Initiated a [code review](https://github.com/processing/p5.js-website/pull/488) of implementations based on accessibility recommendations from the p5.js Website Audit, done at the p5.js Contributors’ Conference + +* Created a main `/showcase` page on p5js.org via a [“showcase” branch](https://github.com/kangashley/p5.js-website/tree/showcase) in a fork of p5.js-website repo and subpages for each featured project under `/showcase/featuring` +* Updated side navigation to include link to showcase +* Identified potential 60+ creators to feature; created a database of their p5.js and Processing projects using Airtable; recognized various categories for how p5.js is used +* Made decisions on design and development direction using wireframes in [Figma](https://www.figma.com/file/WkRoMv5Nf9yzzzwY7cz2JbbR/p5.js-Showcase?node-id=0%3A1), then an HTML/CSS/JavaScript prototype in [Codepen](https://codepen.io/kangashley/pen/RXGKyX) +* Established a process for nominating p5.js projects by designing a [Nomination Form](https://forms.gle/tukmUDqzLUwckjAVA) with appropriate questions +* Reached out to the creators of 9 projects based on how they used p5.js to explore interesting concepts and contexts for art and design, with other technologies, and/or various learning/teaching methodologies; received interviews about 6 projects +* Edited interviews for length and clarity +* Raised accessibility (a11y) concerns that implicate the rest of the website (color contrast, page structure, link styles, visually hidden headings) +* Created a [template](https://gist.github.com/kangashley/ac5499997a6b06f8a0954f0d572e9cf4) for created a page for a p5.js Showcase featured project +* Initiated a [code review](https://github.com/processing/p5.js-website/pull/488) of implementations based on accessibility recommendations from the p5.js Website Audit, done at the p5.js Contributors’ Conference ## Acknowledgements -Even before I was accepted to participate in GSoC, my journey as a technologist has been shaped by so many affiliated with the Processing Foundation. My first programming class was actually the undergrad section of Intro to Computational Media at NYU, where Dan O (and Dan Shiffman) taught us Processing and Arduino! Processing Community Day in Los Angeles back in January 2019 inspired me to go for this particular opportunity of working on a showcase to celebrate a community like p5.js. Thanks to Saber Khan and Evelyn Masso for their feedback on my proposal. Thanks to Kate Hollenbach for her support, availability, and understanding throughout this summer. Thanks to the NYU ITP students and campers back in June for expanding what I think is possible with p5.js and beyond. Thanks to Lauren McCarthy, Claire Kearney-Volpe, and Sina Bahram for your feedback. And of course, thanks to those who let me feature their projects with much enthusiasm and generosity—Roni Cantor, Phuong Ngo, Dae In Chung, Qianqian Ye, Casey Conchinha, Louise Lessél, Moon Jang, and Xin Xin. - \ No newline at end of file +Even before I was accepted to participate in GSoC, my journey as a technologist has been shaped by so many affiliated with the Processing Foundation. My first programming class was actually the undergrad section of Intro to Computational Media at NYU, where Dan O (and Dan Shiffman) taught us Processing and Arduino! Processing Community Day in Los Angeles back in January 2019 inspired me to go for this particular opportunity of working on a showcase to celebrate a community like p5.js. Thanks to Saber Khan and Evelyn Masso for their feedback on my proposal. Thanks to Kate Hollenbach for her support, availability, and understanding throughout this summer. Thanks to the NYU ITP students and campers back in June for expanding what I think is possible with p5.js and beyond. Thanks to Lauren McCarthy, Claire Kearney-Volpe, and Sina Bahram for your feedback. And of course, thanks to those who let me feature their projects with much enthusiasm and generosity—Roni Cantor, Phuong Ngo, Dae In Chung, Qianqian Ye, Casey Conchinha, Louise Lessél, Moon Jang, and Xin Xin. diff --git a/src/content/contributor-docs/en/project_wrapups/ayush23dash_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/ayush23dash_gsoc_2023.mdx index 2e04612bae..26311c4b22 100644 --- a/src/content/contributor-docs/en/project_wrapups/ayush23dash_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/ayush23dash_gsoc_2023.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Friendly Error System(FES) and Documentation By Ayush Shankar(@ayush23dash) || Mentored by : Alice Chung(@almchung) && Nick Briz(@nbriz) @@ -20,7 +16,7 @@ My initial proposal revolved around Decoupling Friendly Error System from p5.js * Other custom cases where the user would benefit from a help message. -##### All of the code for FES was to be taken from src/core/friendly_errors and i18n would have been taken care of by taking files from translations/ +##### All of the code for FES was to be taken from src/core/friendly\_errors and i18n would have been taken care of by taking files from translations/ * Once we are done with setting up FES in our new package, we would have tried establishing successful calls from local p5.js repo to our new package's local repo. @@ -35,7 +31,8 @@ The progress that I made in Decoupling in the initial weeks of coding period wer * Imported all of the files one by one from FES * `npm test` was failing by this time, so after googling a bit, adding following to package.json worked: -~~~ + +``` "browserify": { "transform": [ @@ -59,16 +56,17 @@ The progress that I made in Decoupling in the initial weeks of coding period wer ] } -~~~ +``` + * Corrected the import locations inside these newly created FES files * Imported new FES files in app.js(in main p5 repo) -* `npm test` worked fine with all of the FES files except : "fes_core.js" while testing +* `npm test` worked fine with all of the FES files except : "fes\_core.js" while testing * My further approach on Decoupling would have been creating a npm package for FES and import it directly in package.json. However, with this approach we needed to consider taking care of external imports(given below) in FES files from P5 : -~~~ +``` import {translator} from '../internationalization' import * as constants from '../constants' @@ -76,8 +74,7 @@ import * as constants from '../constants' const dataDoc = require('../../../docs/parameterData.json') import main -~~~ - +``` **The** direction of the project now moved to Refactoring the existing codebase along with solving some existing open issues, improving documentation and adding an i18n translation for the Hindi language. @@ -90,78 +87,77 @@ I reviewed a few PRs, added a comment on a Decoupling Issue and worked on a few * Following is the list of issues I created/commented, Pull Requests I created(merged/open), Pull Requests I reviewed and the discussions on which I commented on : * Created a couple of issues : - https://github.com/processing/p5.js/issues/6181(Closed) - https://github.com/processing/p5.js/issues/6202(Continuation to above issue) + [https://github.com/processing/p5.js/issues/6181(Closed)](https://github.com/processing/p5.js/issues/6181\(Closed\)) + [https://github.com/processing/p5.js/issues/6202(Continuation](https://github.com/processing/p5.js/issues/6202\(Continuation) to above issue) * Reviewed translation PRs : - https://github.com/processing/p5.js/pull/6210 - https://github.com/processing/p5.js/pull/5591 + [https://github.com/processing/p5.js/pull/6210](https://github.com/processing/p5.js/pull/6210) + [https://github.com/processing/p5.js/pull/5591](https://github.com/processing/p5.js/pull/5591) * Commented on the following GIthub Discussions/Issues : - https://github.com/processing/p5.js/issues/5650 - https://github.com/processing/p5.js/issues/5208 - https://github.com/processing/p5.js/issues/6215 - https://github.com/processing/p5.js/issues/5629 + [https://github.com/processing/p5.js/issues/5650](https://github.com/processing/p5.js/issues/5650) + [https://github.com/processing/p5.js/issues/5208](https://github.com/processing/p5.js/issues/5208) + [https://github.com/processing/p5.js/issues/6215](https://github.com/processing/p5.js/issues/6215) + [https://github.com/processing/p5.js/issues/5629](https://github.com/processing/p5.js/issues/5629) * Created the following PRs: - https://github.com/processing/p5.js/pull/6221(Merged) - https://github.com/processing/p5.js/pull/6260(Merged) - https://github.com/processing/p5.js/pull/6272(Merged) - https://github.com/processing/p5.js/pull/6335 + [https://github.com/processing/p5.js/pull/6221(Merged)](https://github.com/processing/p5.js/pull/6221\(Merged\)) + [https://github.com/processing/p5.js/pull/6260(Merged)](https://github.com/processing/p5.js/pull/6260\(Merged\)) + [https://github.com/processing/p5.js/pull/6272(Merged)](https://github.com/processing/p5.js/pull/6272\(Merged\)) + [https://github.com/processing/p5.js/pull/6335](https://github.com/processing/p5.js/pull/6335) **One of my major topics** of research was me manually digging into each of the files and functions of FES and maintaining a list and a flow chart for keeping a check on the places/files that these FES functions are being used throughout p5.js : ## Links of FES Functions to where they are being used in p5.js -**File Name** : validate_params.js - +**File Name** : validate\_params.js **Function Name** : ValidationError() -**Files Used in** : test_reference.html | test.html | chai_helpers.js | describe.js | outputs.js | creating_reading.js | p5.Color.js | 2d_primitives.js | attributes.js | curves.js | environment.js | error_helpers.js | transform.js | vertex.js | downloading.js | pixels.js | files.js | saveTable.js | trigonometry.js | attributes.js | 3d_primitives.js | interaction.js | normal.js +**Files Used in** : test\_reference.html | test.html | chai\_helpers.js | describe.js | outputs.js | creating\_reading.js | p5.Color.js | 2d\_primitives.js | attributes.js | curves.js | environment.js | error\_helpers.js | transform.js | vertex.js | downloading.js | pixels.js | files.js | saveTable.js | trigonometry.js | attributes.js | 3d\_primitives.js | interaction.js | normal.js -**Function Name** : _clearValidateParamsCache() -**Files Used in** : error_helpers.js +**Function Name** : \_clearValidateParamsCache() +**Files Used in** : error\_helpers.js -**Function Name** : _getValidateParamsArgTree() -**Files Used in** : error_helpers.js +**Function Name** : \_getValidateParamsArgTree() +**Files Used in** : error\_helpers.js -**Function Name** : _validateParameters() -**Files Used in** : describe.js | outputs.js | creating_reading.js | setting.js | environment.js | rendering.js | transform.js | 2d_primitives.js | attributes.js | curves.js | vertex.js | p5.TypedDict.js | dom.js | acceleration.js | keyboard.js | image.js |loading_displaying.js | p5.image.js | pixels.js | files.js | calculation.js | random.js | trigonometry.js | attributes.js | string_functions.js | 3d_primitives.js | interaction.js | light.js |loading.js | material.js | p5.Camera.js | p5.FrameBuffer.js | error_helpers.js | +**Function Name** : \_validateParameters() +**Files Used in** : describe.js | outputs.js | creating\_reading.js | setting.js | environment.js | rendering.js | transform.js | 2d\_primitives.js | attributes.js | curves.js | vertex.js | p5.TypedDict.js | dom.js | acceleration.js | keyboard.js | image.js |loading\_displaying.js | p5.image.js | pixels.js | files.js | calculation.js | random.js | trigonometry.js | attributes.js | string\_functions.js | 3d\_primitives.js | interaction.js | light.js |loading.js | material.js | p5.Camera.js | p5.FrameBuffer.js | error\_helpers.js | ---- -**File Name** : stacktrace.js +*** +**File Name** : stacktrace.js **Function Name** : getErrorStackParser() -**Files Used in** : validate_params.js(FES) | fes_core.js(FES) +**Files Used in** : validate\_params.js(FES) | fes\_core.js(FES) ---- -**File Name** : file_errors.js +*** +**File Name** : file\_errors.js -**Function Name** : _friendlyFileLoadError() -**Files Used in** : fes_core.js(FES) | loading_displaying.js | files.js | loading.js | downloading.js | loadBytes.js | loadImage.js | loadJSON.js | loadModel.js | loadShader.js | loadStrings.js | loadTable.js | loadXML.js | saveTable.js | loadFont.js | +**Function Name** : \_friendlyFileLoadError() +**Files Used in** : fes\_core.js(FES) | loading\_displaying.js | files.js | loading.js | downloading.js | loadBytes.js | loadImage.js | loadJSON.js | loadModel.js | loadShader.js | loadStrings.js | loadTable.js | loadXML.js | saveTable.js | loadFont.js | ---- -**File Name** : fes_core.js +*** +**File Name** : fes\_core.js -**Function Name** : _friendlyError() -**Files Used in** : main.js | file_errors.js(FES) | sketch_reader.js(FES) | validate_params.js(FES) | vertex.js | p5.Vector.js | loading.js | p5.Matrix.js | p5.RendererGL.js | p5.Shader.js | error_helpers.js | +**Function Name** : \_friendlyError() +**Files Used in** : main.js | file\_errors.js(FES) | sketch\_reader.js(FES) | validate\_params.js(FES) | vertex.js | p5.Vector.js | loading.js | p5.Matrix.js | p5.RendererGL.js | p5.Shader.js | error\_helpers.js | -**Function Name** : _friendlyAutoPlayError() +**Function Name** : \_friendlyAutoPlayError() **Files Used in** : dom.js **Function Name** : checkForUserDefinedFunctions() **Files Used in** : main.js **Function Name** : fesErrorMonitor() -**Files Used in** : browser_errors.js | validate_params.js(FES) | error_helpers.js +**Files Used in** : browser\_errors.js | validate\_params.js(FES) | error\_helpers.js **Function Name** : helpForMisusedAtTopLevelCode() -**Files Used in** : error_helpers.js +**Files Used in** : error\_helpers.js -**FLOWCHART FOR THE SAME** : https://sketchboard.me/jDWn1eYNgktY +**FLOWCHART FOR THE SAME** : [https://sketchboard.me/jDWn1eYNgktY](https://sketchboard.me/jDWn1eYNgktY) ## Current State of The Project @@ -202,4 +198,3 @@ Literally every doubt I had, was answered either on Github itself or on mails. I would continue contributing to the Processing Organisation and would even love to mentor other GSoC Students in the future. I would suggest the future contributors to be free of worries about any lack of support from the mentors and Processing in general, everything is answered well on time and is pretty well managed. - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/connieliu_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/connieliu_gsoc_2020.mdx index 5546a8922e..5b53613a71 100644 --- a/src/content/contributor-docs/en/project_wrapups/connieliu_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/connieliu_gsoc_2020.mdx @@ -1,12 +1,8 @@ - ---- - ---- # Increasing the Organization and Scope of the p5.js Showcase # Summary -For my Google Summer of Code 2020 Project I worked with my mentors Joey Lee and Yining Shi to expand the scope of the 2019 p5.js showcase to include features like filtering a large number of projects as well as improving the implementation process for the showcase to make it faster to add entries. The 2020 showcase was able to add 10 times more entries than the 2019 showcase (to house a total of 60 entries) and hopefully will continue to grow in the future. +For my Google Summer of Code 2020 Project I worked with my mentors Joey Lee and Yining Shi to expand the scope of the 2019 p5.js showcase to include features like filtering a large number of projects as well as improving the implementation process for the showcase to make it faster to add entries. The 2020 showcase was able to add 10 times more entries than the 2019 showcase (to house a total of 60 entries) and hopefully will continue to grow in the future. **View the p5.js 2020 showcase [here](https://showcase.p5js.org/#/) to see the wide variety of work created by the p5.js community. View the showcase repository [here](https://github.com/connieliu0/p5.js-showcase). The showcase repo is currently being maintained by me (Connie Liu).** @@ -20,34 +16,35 @@ In order to increase the showcase to 60 entries without hardcoding everything I ## Preparing for the showcase: -- Created [documentation](https://github.com/processing/p5.js-website/blob/main/contributor_docs/showcase_documentation/) for the old p5.js 2019 showcase and how to add to it ([PR here](https://github.com/processing/p5.js-website/pull/796/files)) -- Created [minor UI improvements](https://github.com/processing/p5.js-website/pull/813) to the old p5.js 2019 showcase (created tool tags for each project using handlebars). View all PR's for the p5js-website [here](https://github.com/processing/p5.js-website/pulls?q=is%3Apr+author%3Aconnieliu0+). -- For the 2020 showcase, created various marketing materials ([view Figma here](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=436%3A80) and [here](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=45%3A14)), and recreated the nomination form questions for easier integration of CSV content from autogenerated google form sheet data into a JSON format. [View the 2020 form here.](https://forms.gle/s2YNLT5eRdQLCKAm6) -- Reviewed all form submissions to see which ones to add to the showcase and lightly edited 60 final showcase entries for clarity. -- Created various mockups for how the final p5.js showcase would look as well as potential data visualizations of form responses to demonstrate the diversity of the p5.js community with [Figma](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=127%3A0). Lightly user-tested these designs w/ mentors and others to make sure they were understandable. +* Created [documentation](https://github.com/processing/p5.js-website/blob/main/contributor_docs/showcase_documentation/) for the old p5.js 2019 showcase and how to add to it ([PR here](https://github.com/processing/p5.js-website/pull/796/files)) +* Created [minor UI improvements](https://github.com/processing/p5.js-website/pull/813) to the old p5.js 2019 showcase (created tool tags for each project using handlebars). View all PR's for the p5js-website [here](https://github.com/processing/p5.js-website/pulls?q=is%3Apr+author%3Aconnieliu0+). +* For the 2020 showcase, created various marketing materials ([view Figma here](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=436%3A80) and [here](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=45%3A14)), and recreated the nomination form questions for easier integration of CSV content from autogenerated google form sheet data into a JSON format. [View the 2020 form here.](https://forms.gle/s2YNLT5eRdQLCKAm6) +* Reviewed all form submissions to see which ones to add to the showcase and lightly edited 60 final showcase entries for clarity. +* Created various mockups for how the final p5.js showcase would look as well as potential data visualizations of form responses to demonstrate the diversity of the p5.js community with [Figma](https://www.figma.com/file/Ym32EUY2S3z9DCTahMgpRc/Figma-Showcase?node-id=127%3A0). Lightly user-tested these designs w/ mentors and others to make sure they were understandable. ## Implementing the showcase ***(view repository [here](https://github.com/connieliu0/p5.js-showcase), view live version of the showcase [here](https://showcase.p5js.org/#/)):*** -- Expanded the interactivity of the 2020 showcase by implementing: - - **Data visualizations**: created a [map](https://github.com/connieliu0/p5.js-showcase/blob/master/src/simple.js) with leaflet.js, [graphs](https://github.com/connieliu0/p5.js-showcase/blob/master/src/App.js) with chart.js, and a [word visualizer](https://github.com/connieliu0/p5.js-showcase/blob/master/src/sketch.js) with p5.js - - **[Translations with react-i18next](https://github.com/connieliu0/p5.js-showcase/tree/master/src/locales)** +* Expanded the interactivity of the 2020 showcase by implementing: - *Various improvements specific to 2020 showcase:* + * **Data visualizations**: created a [map](https://github.com/connieliu0/p5.js-showcase/blob/master/src/simple.js) with leaflet.js, [graphs](https://github.com/connieliu0/p5.js-showcase/blob/master/src/App.js) with chart.js, and a [word visualizer](https://github.com/connieliu0/p5.js-showcase/blob/master/src/sketch.js) with p5.js + * **[Translations with react-i18next](https://github.com/connieliu0/p5.js-showcase/tree/master/src/locales)** - - Filters for various project categories. Hand-classified projects to relevant categories. - - Tools tags for relevant niche libraries and functions used in the p5.js projects. -- Made sure that the 2020 showcase had Spanish and Chinese translation. Currently only the Spanish translation includes a translation of the description and increasing the scope of translations is still a work in progress. -- Migrated 2019 showcase content to the new website for preservation and included link to reference the original 2019 showcase page. -- Created [documentation](https://github.com/connieliu0/p5.js-showcase/blob/master/showcase2020_documentation/) on how to add translations to the new showcase as well as a general overview of how i18next works in tandem with React and how to convert form results to the JSON format for adding entries. -- For the [final pull request](https://github.com/processing/p5.js-website/pull/851), updated links to the new p5.js 2020 showcase as entry points for the new website. + *Various improvements specific to 2020 showcase:* + + * Filters for various project categories. Hand-classified projects to relevant categories. + * Tools tags for relevant niche libraries and functions used in the p5.js projects. +* Made sure that the 2020 showcase had Spanish and Chinese translation. Currently only the Spanish translation includes a translation of the description and increasing the scope of translations is still a work in progress. +* Migrated 2019 showcase content to the new website for preservation and included link to reference the original 2019 showcase page. +* Created [documentation](https://github.com/connieliu0/p5.js-showcase/blob/master/showcase2020_documentation/) on how to add translations to the new showcase as well as a general overview of how i18next works in tandem with React and how to convert form results to the JSON format for adding entries. +* For the [final pull request](https://github.com/processing/p5.js-website/pull/851), updated links to the new p5.js 2020 showcase as entry points for the new website. # Technologies and libraries used -- Important packages/libraries used: i18next (translations), react-dom, react-router, react-markdown, react-clamp-lines, various react wrappers -- React.js -- chart.js, leaflet.js, p5.js +* Important packages/libraries used: i18next (translations), react-dom, react-router, react-markdown, react-clamp-lines, various react wrappers +* React.js +* chart.js, leaflet.js, p5.js # Future @@ -57,7 +54,7 @@ I hope that the showcase can be expanded every year or two years as a celebratio ### Support -Please tag me @connieliu0 on the p5js showcase [GitHub repo](https://github.com/connieliu0/p5.js-showcase) if you would like to **add translations or propose a new issue on the current repository.** Feel free to email me at cliu55567@gmail.com for any other matters concerning the showcase! +Please tag me @connieliu0 on the p5js showcase [GitHub repo](https://github.com/connieliu0/p5.js-showcase) if you would like to **add translations or propose a new issue on the current repository.** Feel free to email me at [cliu55567@gmail.com](mailto:cliu55567@gmail.com) for any other matters concerning the showcase! # Acknowledgements @@ -66,5 +63,3 @@ I am so grateful to the Processing Foundation for providing me with this opportu However, what really made this summer's GSoC experience with p5.js and the Processing Foundation especially special was the community itself. First and foremost I'd like to thank my wonderful and inspiring mentors Joey Lee and Yining Shi! They helped me so much with everything- from the best way to approach a bug to the actual curation of the showcase. In addition, they imparted so much wisdom in regards to a career in creative tech and provided advice on how to approach problems as a novice coder. I'd also like to thank my fellow GSoC-er, Inhwa Yeom, who was working on a similar project for her advice and support. In addition I'd like to thank Nick McIntyre and Kate Hollenbach for their feedback on my proposal, as well as Saber Khan, Aarón Montoya-Moraga, Ashley Kang and the various contributors and maintainers of p5.js for their help. Finally, I'd like to thank Lauren McCarthy and Moira Turner for leading the p5.js project itself. All in all, this project has provided me with a wonderful first experience in contributing to open source and I'm forever grateful. I can't wait to see where p5.js takes off to next. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/dewansDT_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/dewansDT_gsoc_2023.mdx index da908e1ca8..953f22db7a 100644 --- a/src/content/contributor-docs/en/project_wrapups/dewansDT_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/dewansDT_gsoc_2023.mdx @@ -1,11 +1,8 @@ - ---- - ---- # Mobile/Responsive Design Implementation of p5.js Web Editor. + ### Project by [dewanshDT](https://github.com/dewanshDT) -### Mentored by [Linda Paiste](https://github.com/lindapaiste) and [Shuju Lin](https://www.shujuuu.com/) +### Mentored by [Linda Paiste](https://github.com/lindapaiste) and [Shuju Lin](https://www.shujuuu.com/) ## Overview @@ -21,7 +18,6 @@ This project is dedicated to the enhancement of mobile responsive design impleme editor preview - The current layout of the web editor displays the editor side-by-side with the sketch preview, which offers a good user experience on larger screens. However, it's essential to consider the usability of smaller screens. To address this, a responsive design approach has been implemented. When the screen size is smaller, it's more practical to display one component at a time. If the sketch isn't actively running, the screen will primarily show the editor alongside the collapsible file drawer. In contrast, when the sketch is running, the screen will prioritize displaying the Preview along with the console. Moreover, the editor itself was previously implemented as a class component, relying on lifecycle methods for various functionalities, including the auto-save feature. Since some of the lifecycle methods are no longer supported I decided to convert the editor to a functional component and along with this me and Linda also improved the autosave logic as needed. @@ -43,13 +39,13 @@ Moreover, the editor itself was previously implemented as a class component, rel The navbar and the toolbar in the current version are used for: * Menus like "File", "Account", etc - + * Running the sketch - + * Login and Logout - + * Changing the language - + * Changing the Sketch name editor preview @@ -59,15 +55,14 @@ The project required the creation of an entirely redesigned navbar, intended to In terms of the mobile user interface, the navbar or header required specific features, which are outlined below for clarity: * **Dynamic Page Title Display**: The navbar should dynamically display the title corresponding to the page that the user is currently navigating, providing a contextually relevant user experience. - + * **Page-Specific Menu Items**: To enhance usability, the navbar should adapt its menu options based on the specific page the user is visiting. This ensures that users are presented with relevant actions and options depending on their current context. - + * **User-Authorized Sketch Name Editing**: In cases where user authorization permits, the navbar should offer the functionality to edit the name of the sketch. This empowers authorized users to manage and customize their project titles efficiently. - + * **Custom Language Select:** In order to select the language of the application the user has to use a drop-down menu which is good on bigger screens and even works well on smaller screens but a better I decided to go for a better option so I created a screen with an overlay to select the language, which turns out to be great. - + * **Combined menus:** The menus from the nav bar have to be combined in smaller screens so Shuju designed the drop-down menus that I then coded for mobile devices. - Additionally, I made the decision to centralize all the essential logic for editing, modifying, and saving operations into a dedicated hook called `useSketchActions`. This move streamlines our codebase by promoting code reusability across various components, eliminating the need for redundant implementation. @@ -120,15 +115,14 @@ The editor's functionality heavily depends on the utilization of modals and over The primary objective of achieving usability in the editor has been successfully accomplished and successfully integrated. However, there remains room for enhancement in specific domains, notably code sharing and the interface for incorporating user-contributed sketches into collections. Additionally, there are pending to-do items within the codebase that I have listed below: * Code Sharing Page - + * Add to the collection Page - + * For `MobileNav`'s title, instead of a switch, using props like `mobileTitle` - + * Adding Language Translations in some of the newer components. - + * Moving the autosave feature to the `Editor` component, it is in the `IDEView` component. - The following are key areas that need to be addressed in the future. Furthermore, there is room for refinement in the editor as it evolves over time. I would love to continue contributing to this project and see how it unfolds. @@ -149,5 +143,3 @@ Shuju played a crucial role in enhancing the project's UI/UX, showcasing how des This journey also highlighted the importance of collaboration, teamwork, and effective communication within the open-source community. Working with a fantastic group of individuals has been a rewarding experience. Looking ahead, I'm excited to continue contributing to open-source projects and refining my skills. This summer has given me purpose and a desire to make meaningful contributions. I'm grateful for this opportunity, the mentorship, and the knowledge gained. Here's to more open-source adventures in the future! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/elginmclaren_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/elginmclaren_gsoc_2018.mdx index af91821509..7787cb2543 100644 --- a/src/content/contributor-docs/en/project_wrapups/elginmclaren_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/elginmclaren_gsoc_2018.mdx @@ -1,24 +1,22 @@ - ---- - ---- # Updating hello.p5js.org ## Overview + The goal of this project was to modernize the hello.p5js.org website though development of a new trailer featuring diverse members of the Processing community. ## Project Description -hello.p5js.org is likely to be many users’ first introduction to p5.js (and possibly Processing as well). As these individuals may be brand new to coding, it is important that this webpage be inviting, interesting and informative. +hello.p5js.org is likely to be many users’ first introduction to p5.js (and possibly Processing as well). As these individuals may be brand new to coding, it is important that this webpage be inviting, interesting and informative. ## Tasks Completed + * Met with Lauren McCarthy and mentor to determine requirements for the new hello.p5.js website * Created a new code-base for the project using modern web tools (eg: Node, Browserify, Plyr) * Enabled multilingual captioning on video player using WebVTT files * Wrote code to toggle between languages using non-HTML video controls * Developed a survey to gather feedback from the community regarding what they use p5js for, and what they like about it * Promoted survey on Github, Processing Forum, and Twitter -* Analyzed results, identified key features, and incorporated feedback into a video script +* Analyzed results, identified key features, and incorporated feedback into a video script * Drew video storyboards for feedback from mentor and Lauren * Designed UX wireframes to illustrate how p5.js sketches would be overlayed on video content, how captions would appear, and how users would control the video * Recorded draft video as proof of concept for the final project @@ -29,26 +27,26 @@ hello.p5js.org is likely to be many users’ first introduction to p5.js (and po * Coded and modified p5.js sketches to be overlaid on the video content * Secured Spanish and French translation for video content * Consulted media professionals to ensure high quality look and feel -* Procured background music samples from several musicians and gathered feedback from mentor +* Procured background music samples from several musicians and gathered feedback from mentor * Edited video clips together using Adobe Premier, Audition, and After Effects - ## Challenges + * Crowdsourcing the video content was fun and filled with delightful suprises; however, it was challenging to coordinate video-making tasks with community members over the summer (e.g. tight GSOC time constraints, people's summer vacations). * Creating a dynamic, post-production greenscreen effect was more difficult than I imagined. Using seriously.js for the canvas background removal worked well; however, setting videos to a neutral background color in After Effects was difficult without a neutral background. * When incorporating browserify to pre-process my javascript, I missed one crucial line of code. This required tremendous digging to figure out why it wouldn't compile. It set me back several days, but I learned a lot! ## Contribution & Next Steps -I created a video and draft website to launch the new and improved hello.p5js.org. Before going live, I will coordinate with Processing to ensure the site's content meets the Processing foundations’ standards. I will also make sure it loads properly across devices. -Dropbox folder (for video files): https://www.dropbox.com/sh/vcr58ughgedaj0k/AAC9y13UjjiMuXdcYKxaVmCOa?dl=0 +I created a video and draft website to launch the new and improved hello.p5js.org. Before going live, I will coordinate with Processing to ensure the site's content meets the Processing foundations’ standards. I will also make sure it loads properly across devices. + +Dropbox folder (for video files): [https://www.dropbox.com/sh/vcr58ughgedaj0k/AAC9y13UjjiMuXdcYKxaVmCOa?dl=0](https://www.dropbox.com/sh/vcr58ughgedaj0k/AAC9y13UjjiMuXdcYKxaVmCOa?dl=0) -Github Repo: -https://github.com/emclaren/hello-p5 +Github Repo: +[https://github.com/emclaren/hello-p5](https://github.com/emclaren/hello-p5) ## Acknowledgements -I would like to thank my mentor Evelyn Masso, and Lauren McCarthy for their support and feedback. I would also like to acknowledge the awesome community members who volunteered to be a part of this project. -I learned so much while working on this project - thanks to the Processing foundation for having me on the team. +I would like to thank my mentor Evelyn Masso, and Lauren McCarthy for their support and feedback. I would also like to acknowledge the awesome community members who volunteered to be a part of this project. - \ No newline at end of file +I learned so much while working on this project - thanks to the Processing foundation for having me on the team. diff --git a/src/content/contributor-docs/en/project_wrapups/ghalestrilo_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/ghalestrilo_gsoc_2020.mdx index 4f956e6840..20663d01de 100644 --- a/src/content/contributor-docs/en/project_wrapups/ghalestrilo_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/ghalestrilo_gsoc_2020.mdx @@ -1,8 +1,3 @@ - ---- - ---- - # p5.js Web Editor Mobile UI #### by [@ghalestrilo](https://github.com/ghalestrilo) @@ -24,11 +19,10 @@ Researching how other mobile editors organize functionality also helped a lot wh The next phase of work was mapping out what the current editor does onto a spreadsheet, creating what is called a *feature map*. When looking at the map, notice how the UI is described in a tree structure, where the further from the root, the more clicks a functionality takes. The most urgent ones need to be as left as possible, near the user. - ![First feature map](https://raw.githubusercontent.com/processing/p5.js/main/contributor_docs/images/mobile-feature-map.png) +![First feature map](https://raw.githubusercontent.com/processing/p5.js/main/contributor_docs/images/mobile-feature-map.png) ## Step 3: Prototyping - Once the feature map was done, it was time to draw some screens. We created a Figma project and followed the feature map when putting things in place. Below is the glorious first draft: ![First design draft of the mobile layout](https://raw.githubusercontent.com/processing/p5.js/main/contributor_docs/images/mobile-draft-1.png) @@ -40,23 +34,25 @@ Despite many questionable design choices here, some things did hit the spot: the ![Final mobile UI proposals](https://raw.githubusercontent.com/processing/p5.js/main/contributor_docs/images/mobile-final-proposals.png) They're mostly the same, except for the bottom bar, and the position of the navigation icons. That said, our direction will be somewhere between the third and the second. Some lessons learned: -- It's hard to create a clear distinction between file-level actions and IDE navigation actions. -- These are probably the most common operations: undo, redo, toggle comment, copy line down/up, prettify code and find text + +* It's hard to create a clear distinction between file-level actions and IDE navigation actions. +* These are probably the most common operations: undo, redo, toggle comment, copy line down/up, prettify code and find text ## Step 4: Coding! -With a researched and tested design, it was time to start coding. I knew I wasn’t going to implement the whole design, given that this is a summer project, but I was excited to complete as much as possible. +With a researched and tested design, it was time to start coding. I knew I wasn’t going to implement the whole design, given that this is a summer project, but I was excited to complete as much as possible. Some key points here: -- Some core code will be the same **regardless** of the final design we decide on. This allowed me to get some stuff out of the way as I ran the user tests. Mainly, creating an endpoint for testing, and making the first screens - IDE, Sketch and Preferences came first because they were mostly the same across all proposals. -- Most of the time, I was working on a completely isolated environment (a different URL endpoint altogether), where I could code without interfering with the main editor code. This choice sped up the process quite a bit, as it minimized conflicts from parallel development. -- It's important to spend as little time as possible on a single branch, and to deliver small, easily integrated changes to the main branch. This enables reviews to be faster and more thorough, avoiding throttling and improving code quality. +* Some core code will be the same **regardless** of the final design we decide on. This allowed me to get some stuff out of the way as I ran the user tests. Mainly, creating an endpoint for testing, and making the first screens - IDE, Sketch and Preferences came first because they were mostly the same across all proposals. +* Most of the time, I was working on a completely isolated environment (a different URL endpoint altogether), where I could code without interfering with the main editor code. This choice sped up the process quite a bit, as it minimized conflicts from parallel development. +* It's important to spend as little time as possible on a single branch, and to deliver small, easily integrated changes to the main branch. This enables reviews to be faster and more thorough, avoiding throttling and improving code quality. After another design iteration, I come back to finish placing the core features: -- Adding the Console to the Mobile Editor -- Adding a Dropdown menu to the Header, for navigation -- Adding the Examples / My Stuff Screen to mobile (this was a big one, there were many different screens and use cases to take into account) + +* Adding the Console to the Mobile Editor +* Adding a Dropdown menu to the Header, for navigation +* Adding the Examples / My Stuff Screen to mobile (this was a big one, there were many different screens and use cases to take into account) To close the project, the editor had to detect automatically if it's being run on mobile, and choose the appropriate view. This is crucial for the user, otherwise the project missed the point completely. For this, we used a media query from `react-responsive` and merged the mobile and desktop endpoints. @@ -66,30 +62,26 @@ I was able to deliver more than I set out to at the beginning of the summer!. My It was my first contribution to open-source, and I learned a lot with it: doing many things I’m not used to, facing new challenges and developing new abilities. If approved by the community, this constitutes a nice milestone for the project (and for me!), and I’m excited to see how it unfolds in the future. - ## Future work There are definitely points of improvement on the editor, for instance: -- **Tutorial:** some users pointed out the lack of a tutorial to guide a new user through the interface. Since our aim is for the app to be beginner-friendly, this is a priority. Maybe GSoC '21 can make it happen! -- **Running Preview:** the most important feature the desktop has which is still missing from the mobile version is the ability to view the sketch and update the code as it runs, on the same screen. The floating preview is likely a good solution for this, and will definitely be attempted. -- **Missing Preferences:** due to time constraints, some settings are missing from the Preferences screen. The fact that the screen exists, though, makes them a lot easier to implement in the future. - +* **Tutorial:** some users pointed out the lack of a tutorial to guide a new user through the interface. Since our aim is for the app to be beginner-friendly, this is a priority. Maybe GSoC '21 can make it happen! +* **Running Preview:** the most important feature the desktop has which is still missing from the mobile version is the ability to view the sketch and update the code as it runs, on the same screen. The floating preview is likely a good solution for this, and will definitely be attempted. +* **Missing Preferences:** due to time constraints, some settings are missing from the Preferences screen. The fact that the screen exists, though, makes them a lot easier to implement in the future. ## PR Timeline: -- 15/06 - [#1455 Create Mobile Editor Endpoint](https://github.com/processing/p5.js-web-editor/pull/1455) -- **18/06 - [#1459 Add Editor component to the Mobile IDE View](https://github.com/processing/p5.js-web-editor/pull/1459)** -- **01/07 - [#1467 Mobile Sketch Preview Screen](https://github.com/processing/p5.js-web-editor/pull/1467)** -- **01/07 - [#1472 Mobile Preferences Screen Prototype](https://github.com/processing/p5.js-web-editor/pull/1472)** -- 06/07 - [#1490 Fixes #1487](https://github.com/processing/p5.js-web-editor/pull/1490) -- **21/07 - [#1502 Add to Mobile Views](https://github.com/processing/p5.js-web-editor/pull/1502)** -- 21/07 - [#1507 Refactor mobile components to react hooks](https://github.com/processing/p5.js-web-editor/pull/1507) -- 03/08 - [#1513 Add Dropdown Menu to the mobile IDE View](https://github.com/processing/p5.js-web-editor/pull/1513) -- 04/08 - [#1531 [HOTFIX] Restore Devtools Sidebar](https://github.com/processing/p5.js-web-editor/pull/1531) -- **17/08 - [#1528 Feature/mobile examples](https://github.com/processing/p5.js-web-editor/pull/1528)** -- **17/08 - [#1539 Implement Mobile version of Files tab / sidebar](https://github.com/processing/p5.js-web-editor/pull/1539)** -- **22/08 - [#1543 Add Login/Logout functionality to mobile layout](https://github.com/processing/p5.js-web-editor/pull/1543)** -- **22/08 - [#1564 Feature/switch mobile desktop](https://github.com/processing/p5.js-web-editor/pull/1564)** - - \ No newline at end of file +* 15/06 - [#1455 Create Mobile Editor Endpoint](https://github.com/processing/p5.js-web-editor/pull/1455) +* **18/06 - [#1459 Add Editor component to the Mobile IDE View](https://github.com/processing/p5.js-web-editor/pull/1459)** +* **01/07 - [#1467 Mobile Sketch Preview Screen](https://github.com/processing/p5.js-web-editor/pull/1467)** +* **01/07 - [#1472 Mobile Preferences Screen Prototype](https://github.com/processing/p5.js-web-editor/pull/1472)** +* 06/07 - [#1490 Fixes #1487](https://github.com/processing/p5.js-web-editor/pull/1490) +* 21/07 - [#1507 Refactor mobile components to react hooks](https://github.com/processing/p5.js-web-editor/pull/1507) +* 03/08 - [#1513 Add Dropdown Menu to the mobile IDE View](https://github.com/processing/p5.js-web-editor/pull/1513) +* 04/08 - [#1531 \[HOTFIX\] Restore Devtools Sidebar](https://github.com/processing/p5.js-web-editor/pull/1531) +* **17/08 - [#1528 Feature/mobile examples](https://github.com/processing/p5.js-web-editor/pull/1528)** +* **17/08 - [#1539 Implement Mobile version of Files tab / sidebar](https://github.com/processing/p5.js-web-editor/pull/1539)** +* **22/08 - [#1543 Add Login/Logout functionality to mobile layout](https://github.com/processing/p5.js-web-editor/pull/1543)** +* **22/08 - [#1564 Feature/switch mobile desktop](https://github.com/processing/p5.js-web-editor/pull/1564)** +- **21/07 - [#1502 Add `` to Mobile Views](https://github.com/processing/p5.js-web-editor/pull/1502)** diff --git a/src/content/contributor-docs/en/project_wrapups/graciazhang_gsoc_2022.mdx b/src/content/contributor-docs/en/project_wrapups/graciazhang_gsoc_2022.mdx index 0a3a25bec6..3b54b8b4b8 100644 --- a/src/content/contributor-docs/en/project_wrapups/graciazhang_gsoc_2022.mdx +++ b/src/content/contributor-docs/en/project_wrapups/graciazhang_gsoc_2022.mdx @@ -1,88 +1,70 @@ - ---- - ---- # p5 /teach reorganize & update -#### by Gracia Zhang ([@Gracia-zhang](https://github.com/Gracia-zhang)), mentored by ([@yinhwa](https://github.com/yinhwa)) +#### by Gracia Zhang ([@Gracia-zhang](https://github.com/Gracia-zhang)), mentored by ([@yinhwa](https://github.com/yinhwa)) ## Overview - Updated 12 new posts that were submitted in the past two years on Teach Page, using yaml and Handlebars. Re-design the user interface(UI) and the experience of the Teach Page with new functions and features. And responsible for the front-end development of this web page. The project was mentored by Inhwa Yeom. +* Project Page: [https://p5js.org/teach/](https://p5js.org/teach/) -* Project Page: https://p5js.org/teach/ - - -* Final Pull Request(UI/UX update): https://github.com/processing/p5.js-website/pull/1275 - +* Final Pull Request(UI/UX update): [https://github.com/processing/p5.js-website/pull/1275](https://github.com/processing/p5.js-website/pull/1275) ## Goal & Approach - -This project is an update and extension of Inhwa's project “p5 for 50+ teaching”. She has archived and visualized workshops, classes and relevant materials to better provide the community with access to education-related resources. - +This project is an update and extension of Inhwa's project “p5 for 50+ teaching”. She has archived and visualized workshops, classes and relevant materials to better provide the community with access to education-related resources. In this project, I updated the posts based on the recent submission form first to be familiar with the original /Teach and to research the user through the submitted forms. Based on user studies, I intend to bring more learners & diversity on /teach page by optimizing the submission form with a new form for learners who want to share and a new section "Upcoming Workshops". Inhwa and I hope that this new section will bring in more willing learners and give more teachers the opportunity to share their workshops, classes, etc. - ## Updating posts - ### Screening the submission forms for the last two years - #### 1)Filter unpublishable contents + -the answer in the spreadsheet doesn't seem like a full version. -filled the form up with unrelated contents. - #### 2)Update the other contents. + -updated with 12 filtered contents in yaml file. -added the corresponding model box for each of the 12 new posts. -* Teach Page Rebasing Pull Request: https://github.com/processing/p5.js-website/pull/1245 - -* Teach Page Posts Update Pull Request: https://github.com/processing/p5.js-website/pull/1249 +* Teach Page Rebasing Pull Request: [https://github.com/processing/p5.js-website/pull/1245](https://github.com/processing/p5.js-website/pull/1245) +* Teach Page Posts Update Pull Request: [https://github.com/processing/p5.js-website/pull/1249](https://github.com/processing/p5.js-website/pull/1249) -## UI/UX Design +## UI/UX Design Besides the specific UI/UX changes below, I also proposed an issue in processing/p5.js-website about the overall structural changes to enhance the user experience.[#1250](https://github.com/processing/p5.js-website/issues/1250) - -![](https://drive.google.com/uc?export=veiw&id=1r-wriIvnOPLL6G-ihrL-9wOSEOKfY7l3) - +![](https://drive.google.com/uc?export=veiw\&id=1r-wriIvnOPLL6G-ihrL-9wOSEOKfY7l3) #### 1)Upcoming Workshops -Following the original UI style, I used a combination of banners and headers to present the new workshops to guarantee accessibility. Also, to make it easier for users to plan their time, I have added workshop start time in this section. - +Following the original UI style, I used a combination of banners and headers to present the new workshops to guarantee accessibility. Also, to make it easier for users to plan their time, I have added workshop start time in this section. #### 2)Corresponding Tags In order to allow users to see the results of their selection more visually after selecting the filtering options, I added a tags column to the right of each posts and added a color change corresponding to being selected. - ## Submission Questionnaire Re-Design I adapted the original Submission Form specifically for learners. With the help of Saber and Inhwa, I also updated the parts of the original form that could be ambiguous, to try to avoid misunderstandings and irrelevant content when the sharers fill out the form. [Updated form.](https://forms.gle/GVLrxrvuBTpSTzgCA) - ### Updating Submission Form for Learners #### 1)In the guidelines: -- Changed the guideline for potential learners and added a section to encourage learners to share. -- Added a note for non-English submissions to remind submitters that their responses will be automatically translated into English. +* Changed the guideline for potential learners and added a section to encourage learners to share. +* Added a note for non-English submissions to remind submitters that their responses will be automatically translated into English. #### 2)For learners to share their experiences: -- Added a question to differentiate teachers and learners. -- Removed the question about teaching goal and method. -- Added questions about learning feelings and difficulties encountered. +* Added a question to differentiate teachers and learners. +* Removed the question about teaching goal and method. +* Added questions about learning feelings and difficulties encountered. ### New Submission Form for Upcoming Workshops @@ -92,34 +74,31 @@ For the new section "Upcoming workshops", I designed a new form for the submissi Languages: HTML, CSS, jQuery - -- Created an “upcoming workshops” section in the HTML file. -- Added script for showing/hiding each banner when different titles are clicked. -- Added HTML & jQuery & CSS codes for the preliminary versions of corresponding tags -- Edited HTML & jQuery & CSS codes for the final version of UI/UX design -- Added Css code for responsive web design on mobile devices. +* Created an “upcoming workshops” section in the HTML file. +* Added script for showing/hiding each banner when different titles are clicked. +* Added HTML & jQuery & CSS codes for the preliminary versions of corresponding tags +* Edited HTML & jQuery & CSS codes for the final version of UI/UX design +* Added Css code for responsive web design on mobile devices. Upcoming Workshops are still on open call for specific engagement content.[#1277](https://github.com/processing/p5.js-website/issues/1277) ## Future Plan & Sustainability My future contribution plans -- Add Chinese translation (As a Chinese Translation Stewards: [#1220](https://github.com/processing/p5.js-website/issues/1220)) -- Keep updating posts and upcoming workshops -- Help with the website user experience not limited to /teach.([#1250](https://github.com/processing/p5.js-website/issues/1250)) -- Start updating the workshops from an open call about “Upcoming workshops” and Learner-friendly form to gather more teachers and learners to join the /teach contribution.([#1277](https://github.com/processing/p5.js-website/issues/1277)) +* Add Chinese translation (As a Chinese Translation Stewards: [#1220](https://github.com/processing/p5.js-website/issues/1220)) +* Keep updating posts and upcoming workshops +* Help with the website user experience not limited to /teach.([#1250](https://github.com/processing/p5.js-website/issues/1250)) +* Start updating the workshops from an open call about “Upcoming workshops” and Learner-friendly form to gather more teachers and learners to join the /teach contribution.([#1277](https://github.com/processing/p5.js-website/issues/1277)) For Future Contributors: -- Add Spanish, Japanese, Hindi translation -- Gather more teaching experiences from around the world! -- Bring more ideas to keep the page visible and useful +* Add Spanish, Japanese, Hindi translation +* Gather more teaching experiences from around the world! +* Bring more ideas to keep the page visible and useful ## Acknowledgements The first person I want to thank is Inhwa. I have to say, I looooove Inhwa as my mentor!!! I am a beginner in front-end and she helped me a lot throughout the GSoC project in every way. I couldn't have completed my project without her help. She encouraged me when I was hesitant about the direction, and explained in detail when I had problems with the code. She is both my mentor and my friend! I would also like to thank Saber and Qianqian.The discussion with them about education has been very profitable and I have a more solid idea about my project. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/inhwayeom_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/inhwayeom_gsoc_2020.mdx index b40df6abc6..f3ac623a29 100644 --- a/src/content/contributor-docs/en/project_wrapups/inhwayeom_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/inhwayeom_gsoc_2020.mdx @@ -1,103 +1,101 @@ - ---- - ---- # p5 for 50+ teaching -#### by Inhwa Yeom ([@yinhwa](https://github.com/yinhwa)), mentored by [Qianqian Ye](https://qianqian-ye.com) +#### by Inhwa Yeom ([@yinhwa](https://github.com/yinhwa)), mentored by [Qianqian Ye](https://qianqian-ye.com) ## Overview Reaching out to 50 and more p5 educators around the world, "p5 for 50+ teaching" aims to contribute in documenting, showcasing, and sharing teaching experiences, specifically by re-using the existing features of p5js.org. The project was mentored by Qianqian Ye. -* Project Page: https://p5js.org/teach/ +* Project Page: [https://p5js.org/teach/](https://p5js.org/teach/) -* Final Pull Request: https://github.com/processing/p5.js-website/pull/867 - -* Demo Videos: https://drive.google.com/drive/folders/1FjKJWYg4SDX_WUft2lvSEqNduB68t84o?usp=sharing +* Final Pull Request: [https://github.com/processing/p5.js-website/pull/867](https://github.com/processing/p5.js-website/pull/867) +* Demo Videos: [https://drive.google.com/drive/folders/1FjKJWYg4SDX\_WUft2lvSEqNduB68t84o?usp=sharing](https://drive.google.com/drive/folders/1FjKJWYg4SDX_WUft2lvSEqNduB68t84o?usp=sharing) ## Goal & Approach The purpose of “p5 for 50+ teaching” was to collect information on p5 workshops, classes, or relevant materials currently scattered across the Web; archive and visualize the information on a single webpage of p5js.org, namely "/teach". Addressing the need for a better access to educational experiences and resources, my mentor Qianqian and I hope to contribute with this webpage in connecting and consolidating the p5 educator and learner community around the world. -The major functionality of /teach page lies in sharing a spectrum of data, such as dates/numbers, places/proper nouns, quotes, images, etc. To facilitate the user experience of gaining such information, I adhered to the following design principles: 1) maintain the intuitive design and use flow of the website, 2) by either re-activating or re-using the current features and functions on p5js.org. +The major functionality of /teach page lies in sharing a spectrum of data, such as dates/numbers, places/proper nouns, quotes, images, etc. To facilitate the user experience of gaining such information, I adhered to the following design principles: 1) maintain the intuitive design and use flow of the website, 2) by either re-activating or re-using the current features and functions on p5js.org. In terms of the optimization, I also refrained from adding too much script files, assets, features or functions -- except when necessary for the purpose of this project. - ## Researches on User Interface, Experience, Engagement ### Analysis on the Current Design Theme & Elements #### 1) Understanding the Purpose of p5js.org Website + With the major goal of p5js.org being enhancing accessibility, the website has always maintained its minimalist characteristics for visibility, readability, and usablity. #### 2) Elements to Universal & Accessible Design -- key colors: stark contrast between the p5 signature color (#ed225d) for highlights and black texts -- key shapes: 2D primitive elements, such as square, grid, dotted and dashed lines -- Interactions: simple and immediate transition upon mouse over or click inputs + +* key colors: stark contrast between the p5 signature color (#ed225d) for highlights and black texts +* key shapes: 2D primitive elements, such as square, grid, dotted and dashed lines +* Interactions: simple and immediate transition upon mouse over or click inputs Based on this analysis, design principle for creating /teach page, and created some [prototypes per design units](https://drive.google.com/drive/folders/1cz5nJSW-IvA4wB6KvzRQkyU47qMcWUd_?usp=sharing) (text disposition, text colors, range sliders, scroll bars, buttons, modal boxes, mouse interactions) -### Feature & Use Flow Design for /teach +### Feature & Use Flow Design for /teach #### 1) Leading Users to /teach Page + Instead of adding a direct link on the sidemenu, which already has 15, I added hyperlinks to some existing text and button elements: -- main page > "Get Involved" > text: "teach a workshop or class" -- "/learn" page > "Contributing to the Community" > "Teach" tab -#### 2) Basic Structure of /teach +* main page > "Get Involved" > text: "teach a workshop or class" +* "/learn" page > "Contributing to the Community" > "Teach" tab + +#### 2) Basic Structure of /teach + Just as the structure of other pages, /teach also has less than three steps for exploration: introduction & submission guideline, search filter, and search results #### 3) Personalizing Information + With the "Search Filter" feature, users can filter teaching cases based on the cases' relevance with diversity & inclusion issues, venue, year, level of difficulty. Although I initially planned to include range sliders for the filtering, I changed to checkboxes to guarantee freedom of selection and to eliminate possible connotations on chronological priority. #### 4) Delivering Detail Information -I chose modal box for containing detail infromation to each teaching case, for a number of reasons. First, users can access the detail without having to open a new window. Second, optimization-wise, modal boxes can circumvent the issue of overloading the repository with additional HandleBars and JavaScript files, and assets. +I chose modal box for containing detail infromation to each teaching case, for a number of reasons. First, users can access the detail without having to open a new window. Second, optimization-wise, modal boxes can circumvent the issue of overloading the repository with additional HandleBars and JavaScript files, and assets. ### Submission Questionnaire Design I made a submission questionnaire to facilitate the process of gathering p5 education experiences. With the feedback from my mentor Qianqian and Evelyn Masso, another GSoC mentor, I could draw [3 draft questionnaires](https://drive.google.com/drive/folders/1fJCEm1aR4f15XYroZiRkw1vhKeg9Je-x?usp=sharing) via Google Form until I could revise the [final version](https://docs.google.com/forms/d/1IKjaWXznJtLqjLw12-yXrckcMy2lWV92jl8H5gA7m_Q/edit?usp=sharing) of the submission form. -The submission form included 12 of short- or long-answer, or multiple-choice questions, and was designed to take less 20 minutes to finish. +The submission form included 12 of short- or long-answer, or multiple-choice questions, and was designed to take less 20 minutes to finish. ### Initial Gathering of Submissions For the first month, I have researched online 33 p5 workshops, classes, and materials, and organized the relevant links and contact information on a Google SpreadSheet. Among those list, Qianqian and I put the primary focus on receiving submissions from those who contribute to the diversity and inclusion of p5 community with their teaching practices. With a snowball sampling, I could eventually reach out to 53 people or entity in total via email. - ## Implementation Languages: HTML, CSS, jQuery -- Created a main `/teach` page on p5js.org with a [“teach” branch](https://github.com/yinhwa/p5.js-website/tree/teach) in a fork of p5.js-website repo -- Setup an `index.hbs` under `src/templates/pages/teach` as a landing page to p5js.org/teach, and a CSS section for /teach on `src/assets/css/main.css` -- Added jQuery for showing/hiding an accordion menu to "Search Filter" button; enabling 4 different filters (Diversity & Inclusion, Venue, Year, Level of Difficulty); opening/closing modal boxes to each teaching case -- Added HTML & jQuery & CSS codes for the preliminary versions of UI/UX design PR#1 -- Edited HTML & jQuery & CSS codes for the final version of UI/UX design -- Retrieved submissions and organized the infromation on modal contents -- Added codes for translation on i18n-relevant files +* Created a main `/teach` page on p5js.org with a [“teach” branch](https://github.com/yinhwa/p5.js-website/tree/teach) in a fork of p5.js-website repo +* Setup an `index.hbs` under `src/templates/pages/teach` as a landing page to p5js.org/teach, and a CSS section for /teach on `src/assets/css/main.css` +* Added jQuery for showing/hiding an accordion menu to "Search Filter" button; enabling 4 different filters (Diversity & Inclusion, Venue, Year, Level of Difficulty); opening/closing modal boxes to each teaching case +* Added HTML & jQuery & CSS codes for the preliminary versions of UI/UX design PR#1 +* Edited HTML & jQuery & CSS codes for the final version of UI/UX design +* Retrieved submissions and organized the infromation on modal contents +* Added codes for translation on i18n-relevant files ## Future Plan & Sustainability My future contribution plans -- Add Korean translation -- Add alt text to photos -- Publicize on Processing Foundation Forum and social media of p5.js and Processing Foundation to promote open recommendations & submissions -- Manage future recommendations & submissions, and the page updates + +* Add Korean translation +* Add alt text to photos +* Publicize on Processing Foundation Forum and social media of p5.js and Processing Foundation to promote open recommendations & submissions +* Manage future recommendations & submissions, and the page updates For Future Contributors: -- Add Spanish, Chinese, Japanese, Hindi translation -- Gather more teaching experiences from around the world! -- Bring more ideas to keep the page visible and useful +* Add Spanish, Chinese, Japanese, Hindi translation +* Gather more teaching experiences from around the world! +* Bring more ideas to keep the page visible and useful ## Acknowledgements First and foremost, I would like to deeply thank my mentor Qianqian for her fullest and cannot-be-better supports. I very much appreciate the fact that she embarked on our mentor meetings with reflections on the pedagogy of creative coding. Her introduction to related books and people who engage in teaching as their social and art practices led me to ponder on the notion and effects of "teaching" itself. In terms of technical mentorship, she has provided highly detail feedback to the prototypes of UI/UX design and interaction, and submission questionaire. She would even occasionally provie cares to my work-and-life balance with this project. Throughout this project, she taught me a true meaning of "mentorship". -I also feel especially grateful to Lauren McCarthy, who was my very first p5.js teacher and informed me of those amazing opportunities I could have with Processing Foundation for the last six months. I have spent a substantial amount of time with the organization and was indeed grateful of instant responses and supports from all the other members and organizers, as well. Evelyn Masso and Aarón Montoya-Moraga, to name a few, had also offered an insight to this project with detail feedback. Last but not least, I would like to thank Connie Liu for having me accompanyied throughout the GSoC program with our cheerful talks across the art & design & technology. - - \ No newline at end of file +I also feel especially grateful to Lauren McCarthy, who was my very first p5.js teacher and informed me of those amazing opportunities I could have with Processing Foundation for the last six months. I have spent a substantial amount of time with the organization and was indeed grateful of instant responses and supports from all the other members and organizers, as well. Evelyn Masso and Aarón Montoya-Moraga, to name a few, had also offered an insight to this project with detail feedback. Last but not least, I would like to thank Connie Liu for having me accompanyied throughout the GSoC program with our cheerful talks across the art & design & technology. diff --git a/src/content/contributor-docs/en/project_wrapups/jithinks_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/jithinks_gsoc_2018.mdx index 39d82fc557..1f26b58610 100644 --- a/src/content/contributor-docs/en/project_wrapups/jithinks_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/jithinks_gsoc_2018.mdx @@ -1,8 +1,5 @@ - ---- - ---- # Dynamic Learning + #### by Jithin KS ([@JithinKS97](https://github.com/JithinKS97)) For Google Summer of Code 2018, I worked on developing a webapp (Dynamic Learning) for STEM subject teachers with the help of my mentor [Saber Khan](https://github.com/saberkhaniscool). @@ -13,26 +10,26 @@ Dynamic Learning is meant to be an online platform where teachers and programmer The three core objectives of the web app are- -1) Teachers should be able to create, present, save and share lessons which make use of interactive visualisations. -2) Teachers should be able to collaborate with programmers to produce new visualisations. -3) Students should be able to view the video lessons prepared by teachers and should be able to use the simulations -the same time they watch it. +1. Teachers should be able to create, present, save and share lessons which make use of interactive visualisations. +2. Teachers should be able to collaborate with programmers to produce new visualisations. +3. Students should be able to view the video lessons prepared by teachers and should be able to use the simulations + the same time they watch it. ## Link to the webapp -http://dynamiclearning.io +[http://dynamiclearning.io](http://dynamiclearning.io) ## Link to Github repo -https://github.com/JithinKS97/dynamic-learning-app +[https://github.com/JithinKS97/dynamic-learning-app](https://github.com/JithinKS97/dynamic-learning-app) ## How to set up the development environment -1) Install Meteor.js - https://www.meteor.com/ -2) Install git -3) Clone the dynamic-learning-app repository -4) Install the node dependencies by executing the command `meteor npm install --save` from the root directory -5) Start the app with the command `meteor` and the app will start running in localhost:3000 (By default) +1. Install Meteor.js - [https://www.meteor.com/](https://www.meteor.com/) +2. Install git +3. Clone the dynamic-learning-app repository +4. Install the node dependencies by executing the command `meteor npm install --save` from the root directory +5. Start the app with the command `meteor` and the app will start running in localhost:3000 (By default) ## Frameworks used @@ -62,7 +59,7 @@ The login and sign up features are made by making use of the inbuilt authenticat ##### Components - LessonplansDirectories, LessonsDirectories, SimsDirectories -React Sortable tree component (https://github.com/frontend-collective/react-sortable-tree) is used for building the interface for the organization of lessonplans, lessons and the uploaded simulations. +React Sortable tree component ([https://github.com/frontend-collective/react-sortable-tree](https://github.com/frontend-collective/react-sortable-tree)) is used for building the interface for the organization of lessonplans, lessons and the uploaded simulations. ### 4) Request Forum @@ -74,7 +71,7 @@ For each lessonplan, a request forum can be created by the teacher where a reque ##### Components - SharedSims, SharedLessonPlans, SharedLessons -The users can share lessonplans, lessons and the simulations with the other users if they want. I've used the meteor easy search component for implementing the search (https://github.com/matteodem/meteor-easy-search) +The users can share lessonplans, lessons and the simulations with the other users if they want. I've used the meteor easy search component for implementing the search ([https://github.com/matteodem/meteor-easy-search](https://github.com/matteodem/meteor-easy-search)) ### 6) Creation of Lessons @@ -100,23 +97,23 @@ I've provided necessary documentations in the components' js files in all the ar ## Features that can be added -1) In GSoC 2018, my main target was to develop the overall basic structure of the application on top of which further development can be done. I haven't given much emphasis on the design aspects and didn't go much into the styling (The Components of Semantic UI React comes up with the essential styles that are needed). The app needs a general styling template. +1. In GSoC 2018, my main target was to develop the overall basic structure of the application on top of which further development can be done. I haven't given much emphasis on the design aspects and didn't go much into the styling (The Components of Semantic UI React comes up with the essential styles that are needed). The app needs a general styling template. -2) Unit testing - Apart from some server side tests, no tests have been written. Adequate test cases for the server side and client side code should be written, so that the future contributors can add features without breaking the existing code. +2. Unit testing - Apart from some server side tests, no tests have been written. Adequate test cases for the server side and client side code should be written, so that the future contributors can add features without breaking the existing code. -3) Enhancing the discussion forum- The forums area can be enhanced by providing more features like providing Avatars for each users and the ability to reply to the comments, voting for the comments etc. +3. Enhancing the discussion forum- The forums area can be enhanced by providing more features like providing Avatars for each users and the ability to reply to the comments, voting for the comments etc. -4) Adding Comments forum for the lessons. +4. Adding Comments forum for the lessons. -5) Profile page for the users and notifications. +5. Profile page for the users and notifications. -6) Login and Signup using Github, Google, email verification, password recovery. +6. Login and Signup using Github, Google, email verification, password recovery. -7) Smoothening of the canvas strokes- At present, there are no smoothening algorithms for the strokes in the canvas due to which they appear to be a little jagged. +7. Smoothening of the canvas strokes- At present, there are no smoothening algorithms for the strokes in the canvas due to which they appear to be a little jagged. -8) Making the webapp responsive. +8. Making the webapp responsive. -For feature enhancements, bug reports and contributions, email me to jithunni.ks@gmail.com +For feature enhancements, bug reports and contributions, email me to [jithunni.ks@gmail.com](mailto:jithunni.ks@gmail.com) ## Acknowledgement @@ -124,13 +121,4 @@ I'm extremely thankful to Processing Foundation for having the faith in me and g I've started this project and doing it with my friend [Anupam Asok](https://github.com/Anu-Asok). I'm so grateful to him for being with me in the development of this project. -I'm so grateful to [Andrew Mead](https://github.com/andrewjmead) and his course in udemy Full Stack Web Development using Meteor https://www.udemy.com/meteor-react/ for it has helped me greatly and Andrew has responded to each and every queries of mine. - - - - - - - - - \ No newline at end of file +I'm so grateful to [Andrew Mead](https://github.com/andrewjmead) and his course in udemy Full Stack Web Development using Meteor [https://www.udemy.com/meteor-react/](https://www.udemy.com/meteor-react/) for it has helped me greatly and Andrew has responded to each and every queries of mine. diff --git a/src/content/contributor-docs/en/project_wrapups/josephhong_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/josephhong_gsoc_2021.mdx deleted file mode 100644 index 923b704ec8..0000000000 --- a/src/content/contributor-docs/en/project_wrapups/josephhong_gsoc_2021.mdx +++ /dev/null @@ -1,170 +0,0 @@ - ---- - ---- -# Summer ‘21: Translations, Coding, and WebDev, Oh My! - -###### Note: There aren't any images in this markdown file because I wasn't sure how to get them to display from a different host/folder. There's a Medium post with the same details [here](https://medium.com/processing-foundation/summer-21-translations-coding-and-webdev-oh-my-cc1a2d6bc65f). - -By Joseph Hong -Mentored by Jiwon Shin -Advised by Inwha Yeom - -## Intro - -Hey there. I’m Joseph, a junior who participated in Google Summer of Code 2021. This documentation is about what I worked on over the summer–– Korean translations of the p5.js Reference section and a redesign of the p5.js website. I went into this not really sure (and somewhat worried about) what I was going to be doing, but it turned out to be an awesome opportunity for me to polish my Korean and build upon the web development skills I learned throughout my sophomore year. - -## Quick Links - -### Part 1: Korean Translations - -- [Pull Request](https://github.com/processing/p5.js-website/pull/1062) -- [Repository](https://github.com/jhongover9000/p5.js-website) -- [Documentation](#Part-One) - -### Part 2: New Website Design Proposal - -- [Prototype Site](https://jhongover9000.github.io/p5-testSite/homePage.html) -- [Repository](https://github.com/jhongover9000/jhongover9000.github.io/tree/main/p5-testSite) (contains finished .hbs files) -- [Documentation](#Part-Two) - -## Part One: Reference Section Translations - -This part was rather straightforward. It involved translating the untranslated lines in the JSON file for the p5.js website’s Reference section. My work was split mainly into 3 parts: translating fully untranslated pages, translating half-translated pages, and standardizing/optimizing the translations and the code for both readability and so that the auto-update script wouldn’t add already-translated lines to pages. [Here is the link]() to the repository with the changed files and [here is the link]() to the pull request. - -Translating most of the pages that were fully in English to Korean was somewhat difficult when considering that there have been multiple translators working on the file, which led to different terminology or sentence structure (as for the formal speech used in Korean). Deciding on which terms and structures to use was the main difficulty, but aside from that it wasn’t too difficult. - -Half-translated pages weren’t that hard to finish, but one issue was that often there would be a page that was almost fully translated except for a few bits (i.e., the return or the parameters). I ended up translating those as well. - -Optimizing the code was probably one of the more difficult parts of this project, as it involved having to go almost line by line in order to standardize the format of the pages. Often
would be used instead of creating a separate line/paragraph, which resulted in the auto-updating script getting confused and adding lines that were already translated because it registered the page as having only one paragraph translated. Finding these and changing them was part of the work. - -Another thing that I addressed was the differences in terminology used for parameters and the ‘(Optional)’ tag. Different sections had different terms for parameters and/or locations of the optional tag, so I went through the file and unified them. - -In addition, adding links to the functions mentioned in descriptions is a task that I started but did not complete. This bit was very manual, requiring me to go through each line to find a function/instance that didn’t have a link, compare it to the English JSON, then add a link if required. I also needed to change the external links (to other reference pages) to Korean versions or entirely new sites if the pre-existing ones no longer worked. - -## Part Two: p5.js Website Redesign Proposal - -### Preface - -I know this isn’t a book or anything, but I’d like to start by saying that I did not know that Processing.org was going to launch its new website (a week before my project ended; the day I write this is actually less than a week, but you get the idea). Though it is true that I drew inspiration from said new website for last-minute details, I didn’t know that the Processing website would get a makeover. It made me think about how the p5.js website may possibly already be in the works of creating a new design, but that I was too late to stop. - -So, with that said, here’s what I worked on for the last half of Google Summer of Code, and here’s the repository for the prototype website. (Note: the internal navigation links don’t work, as the homepage is the only page I was able to create in the time I had.) - -### Humble Beginnings - -The start of the project was a lot different than the result. Initially this bit was about restructuring the Learn section in a way that was more ‘user friendly’. I had also said that I was going to try to prototype new designs for a navigation bar. But after a discussion with Jiwon (bestest mentor btw), I realized that I could be as crazy bold as I wanted with the proposal since it was, well, a proposal, and so, uhh… I decided to redesign the website. - -### Choosing a Format and Theme - -When deciding the format in which I would present the proposal, I considered using wireframe applications like Figma or Adobe XD, but ultimately chose to write the HTML/CSS/JavaScript myself (copy/pasted from the original files to keep uniformity to a certain degree). This was because a) I had learned these skills last year and thought it was a great opportunity to put them to use and grow as a result and b) live demos with all those animations and interactions look really cool. -For the themes, fonts, and colors of the site, I tried to keep to the original website as much as possible (such as how the footer looks, as well as the logo for the website navigation bar). I also kept the centered style (which limits the maximum width) of the website. - -### The Result - -Once again, [this is the link](https://jhongover9000.github.io/p5-testSite/homePage.html) to the prototype website. The home page is all that’s there for now. It was a challenge to think of a new design for the home page as there were no images, but also because I didn’t have much time. For now, I’ll explain some new things that I was able to implement on the site. - - -#### Home Screen: An Opportunity for Community Engagement - -The homescreen is a work-in-progress. Currently, it’s an iframe that contains a quick script I threw together with p5.js, but it can be used to display artwork from submissions by p5.js users. A small div containing credits could also be displayed in the far bottom right corner, too. Having a list of links, then displaying a random one upon loading the site, could make opening the p5.js site more fun as well. Overall, this would be a great opportunity to increase community engagement, as users would be able to see their own work displayed on the site! - -#### Internal Navigation: More Than Meets The Eye - -One issue that I tried to address with the navigation was the sheer number of pages available on the website, and the problem that what each page entails might be ambiguous to new (or even old) users. My solution was to group the pages together by topic, split into 4 main categories along with the Home page: Get Started, Resources, Community, and Support Us. In addition, I tried to add descriptions to each of the pages to give users a summary of the page before they navigate to it. The website that gave me the inspiration for this kind of design was the Unity website, which contains detailed descriptions for each of its pages within the navigation bar via dropdown menus. - -Here’s a breakdown of each category and the pages they contain. (I’ll add any notes if a link/page is unique or new.) - -Get Started: clicking this will lead you to the Getting Started page -- Getting Started -- Download - -Resources: this link is not defined, as a new page will likely have to be created that contains links to the other resource pages -- Reference -- Libraries -- Examples -- Learn -- Books - -Community: clicking this will lead you to the Community Statement page -- Forum -- Showcase - -Meet Up: this leads to day.processing.org. It’s the link that originally is in the home page reading, “Organize a meet-up.” -- Twitter -- Instagram -- Discord - -Support Us: clicking this will lead you to the Donate page -- GitHub: this leads to the p5-website GitHub repository -- Donate -- Teach -- Share: this leads to the Google Form for submissions, the link that is originally in the home page reading, “Share something you’ve made!” - -The dropdown menu is made with an element that contains the links in li elements, as well as a div that contains the default description that appears when only hovering over the topic navigation link. - - - - -#### External Navigation & i18n - -The inspiration behind the external navigation bar is the new Processing.org website. I was having a lot of trouble trying to decide where the external navigation (sister sites) would go. I was debating whether or not to have yet another dropdown from the p5.js logo, but after I saw the Processing.org website, I realized that I could simply have it disappear once you start scrolling. And that’s exactly what happened. -As for the i18n button, it’s not super robust (it’s kind of hard-coded and a bit disappointing on mobile–– another thing I’ll get to) but it works. - - -#### To Top Button - -The “To Top” button appears when you scroll down and scrolls up when you click it. It’s a lifesaver for long pages such as Reference or Example entries where you want to go back to the top to look at the code/demonstration. - -#### Footer - -The footer is one of the things I tried to keep from the original design. It’s simple, and I like it. It’s the same dashed line, but I added a few more things, like the Follow Us and Contact us boxes. - - -### Mobile Version - -This bit is a work-in-progress despite how it seems. The language selection, if you don’t select a language, will stay on the screen even when deselected. It’s because of the way that I made the CSS on hover, rather than changing with click. I initially had it on click (hence the onclick function in the HTML), but I’m not sure why I undid it. I think it may have had to do with how it displayed on desktop screens. However, I can imagine a solution using a click function where the CSS is reset (the class is changed back) upon scroll (in other words, a simple fix). - -Making the navigation for the site was difficult for me, especially understanding how @media worked and how to change the site’s navigation bar from horizontal to vertical. It took (a lot of) errors and (many) frustrating nights to get it to finally work, along with the display of the site’s home page on a mobile screen. I think it still needs some more flair (the navigation contents seem a bit plain), but it displays properly now and I’m more than grateful for that. - - - -### Moving Forward: Things to Address, Add, and Improve - -#### Integration -I know that this site isn’t perfect, and there are a few issues that are already foreseeable, such as the integration with the existing site. There will have to be changes made in the CSS files for column-span and main, I think. I already attempted an integration with the pre-existing files, which went rather poorly. Tweaking the CSS a bit on the site fixed the issues, which means that it’s mainly a CSS issue (since the main thing that the new website design changes is CSS, rather than the way that information is processed in the backend). In other words, it shouldn’t be too hard. But that would mean that content in the other pages should change, too. This would mean one would need to decide which parts to keep and which parts to change. Also, new additions to the site would mean new entries in the .YML files (i.e., for new headers and descriptions for nav links, etc.), meaning new translations as well. - -#### Search Bar -The search bar is something that I didn’t add due to time and not really knowing where to place it. I know that it is useful, so it should go somewhere. I was thinking about placing it in the external navigation bar, but for some resolutions it might be too small to notice. Most likely, placing it in the internal navigation bar and having it expand when clicked on, or having it on the home page screen (which would then create the need for it on the nav bar for different pages) would be ideal. - -#### Accessibility -First off, the font that’s used is rather light and so there’s the issue with contrast (this also includes the links for the navigation bar but that was the case for the original site so I’ll put that aside). This can easily be fixed by using the font with greater weight. -On the other hand, there’s Screen Reader accessibility that needs to be considered here. I tried to keep a lot of the aria labels and the sr-only elements, but since a lot of it is hidden (in order to minimize the user interface), I’m not sure how that will affect accessibility in that area. - -#### Images and Background -Images can speak a thousand words. They also look prettier than a thousand words of text. I think that adding images (or even live canvases) of projects from the Showcase, and also the Examples (take a leaf out of Processing.org hehe) on the homepage would be a great addition to the site. - - -## Afterward -All in all, this was a project that was fun, interesting, and frustrating (mostly fun and interesting though). I learned a lot about things in HTML that I didn’t know. If I had the time, I would definitely have kept going to try and standardize all the pages (via CSS) to fit the new theme. I tried to integrate the files (as I mentioned before) but saw that it would take maybe another week to a month of work, then some more to add all the features I want to (and more). I don’t know if this will be finished any time soon because the new semester is starting, but if this new design is good then I’m willing to continue working on it! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/junshern_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/junshern_gsoc_2018.mdx index 20b2adbcb8..f94dae5500 100644 --- a/src/content/contributor-docs/en/project_wrapups/junshern_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/junshern_gsoc_2018.mdx @@ -1,8 +1,5 @@ - ---- - ---- # A Platform for Algorithmic Composition on p5.js-sound + #### by Chan Jun Shern ([@junshern](https://github.com/JunShern)) ![tutorial-homepage](https://raw.githubusercontent.com/JunShern/algorithmic-music-tutorial/main/screenshots/home.png) @@ -16,53 +13,57 @@ In line with this objective, work for the project involved building up features, To encourage the use of these features and resources we've built for algorithmic composition, the project culminates in an [online tutorial](https://junshern.github.io/algorithmic-music-tutorial/) which walks through a number of examples and best practices for algorithmic composition on p5.js-sound. ## Contributions + Note that most contributions for this project are on the [p5.js-sound repository](https://github.com/processing/p5.js-sound), unless otherwise stated. Links should link to the correct issues and pull requests in any case. ### Bug fixes -- Fix errors and add documentation in p5.js-sound gh-pages [#263](https://github.com/processing/p5.js-sound/issues/263) -- Fix bug in SoundLoop.pause() [#287](https://github.com/processing/p5.js-sound/pull/287) -- Fix issue with PolySynth voice distortion (with help from @therewasaguy) [#301](https://github.com/processing/p5.js-sound/issues/301) -- Fix error in documentation for MonoSynth [#262](https://github.com/processing/p5.js-sound/pull/262) -- Fix error in documentation for setADSR [#285](https://github.com/processing/p5.js-sound/pull/285) -- Rename Env class to Envelope for clarity and consistency [#288](https://github.com/processing/p5.js-sound/pull/288) + +* Fix errors and add documentation in p5.js-sound gh-pages [#263](https://github.com/processing/p5.js-sound/issues/263) +* Fix bug in SoundLoop.pause() [#287](https://github.com/processing/p5.js-sound/pull/287) +* Fix issue with PolySynth voice distortion (with help from @therewasaguy) [#301](https://github.com/processing/p5.js-sound/issues/301) +* Fix error in documentation for MonoSynth [#262](https://github.com/processing/p5.js-sound/pull/262) +* Fix error in documentation for setADSR [#285](https://github.com/processing/p5.js-sound/pull/285) +* Rename Env class to Envelope for clarity and consistency [#288](https://github.com/processing/p5.js-sound/pull/288) ### New features -- Explore possibilities for a new SoundFont synth class [#289](https://github.com/processing/p5.js-sound/issues/289) + +* Explore possibilities for a new SoundFont synth class [#289](https://github.com/processing/p5.js-sound/issues/289) ### New examples -- Add example to demonstrate ADSR envelope [#279](https://github.com/processing/p5.js-sound/pull/279) -- Add 5 new examples on timing and visualization for interactive music sketches [#302](https://github.com/processing/p5.js-sound/pull/302) - - Static note scheduling - - Dynamic note scheduling - - Instantaneous playback - - Note-by-note visualization - - Step sequencer example -- Add example for algorithmic composition using Fractals [#308](https://github.com/processing/p5.js-sound/pull/308) -- Add example for algorithmic composition using Markov chains [#309](https://github.com/processing/p5.js-sound/pull/309) -- Add example for algorithmic composition using Genetic algorithms [#311](https://github.com/processing/p5.js-sound/pull/311) + +* Add example to demonstrate ADSR envelope [#279](https://github.com/processing/p5.js-sound/pull/279) +* Add 5 new examples on timing and visualization for interactive music sketches [#302](https://github.com/processing/p5.js-sound/pull/302) + * Static note scheduling + * Dynamic note scheduling + * Instantaneous playback + * Note-by-note visualization + * Step sequencer example +* Add example for algorithmic composition using Fractals [#308](https://github.com/processing/p5.js-sound/pull/308) +* Add example for algorithmic composition using Markov chains [#309](https://github.com/processing/p5.js-sound/pull/309) +* Add example for algorithmic composition using Genetic algorithms [#311](https://github.com/processing/p5.js-sound/pull/311) ![genetic-music-example](https://raw.githubusercontent.com/JunShern/algorithmic-music-tutorial/main/screenshots/sketch-fullscreen.PNG) ### Tutorial -- Create an online tutorial which encapsulates new examples and best practices developed for algorithmic composition on p5.js-sound. The tutorial consists of narrative + interactive examples embedded within the page which users can interact with directly. -- [Tutorial repository](https://github.com/JunShern/explorable-algcomp) -- [Tutorial website](https://junshern.github.io/algorithmic-music-tutorial/) + +* Create an online tutorial which encapsulates new examples and best practices developed for algorithmic composition on p5.js-sound. The tutorial consists of narrative + interactive examples embedded within the page which users can interact with directly. +* [Tutorial repository](https://github.com/JunShern/explorable-algcomp) +* [Tutorial website](https://junshern.github.io/algorithmic-music-tutorial/) ![tutorial-screenshot](https://raw.githubusercontent.com/JunShern/algorithmic-music-tutorial/main/screenshots/sketch1.PNG) ## Conclusion -All in all, it has been a highly satisfying summer. When we first started work, there were a lot of questions up in the air about the best way to go about implementing algorithmic music in p5.js-sound. Fortunately, we were able to build off the excellent work from past contributors (including work from previous GSoC participants!) to get all the functionality we needed. + +All in all, it has been a highly satisfying summer. When we first started work, there were a lot of questions up in the air about the best way to go about implementing algorithmic music in p5.js-sound. Fortunately, we were able to build off the excellent work from past contributors (including work from previous GSoC participants!) to get all the functionality we needed. At the end of this project, we can now confidently recommend p5.js-sound as a capable and reliable library for developing algorithmic music. The examples and final tutorial show these capabilities quite well, and hopefully the work done in this project will inspire and encourage many users to create their own algorithmic music applications! ## Support -Any questions pertaining to this project may be addressed via Issues on the [p5.js-sound repository](https://github.com/processing/p5.js-sound), or on the [tutorial repository](https://github.com/JunShern/explorable-algcomp) if directly related to tutorial content. Simply create a new Issue and either assign or tag me in the conversation with @junshern. For anything else, don't hesitate to get in touch at chanjunshern@gmail.com! +Any questions pertaining to this project may be addressed via Issues on the [p5.js-sound repository](https://github.com/processing/p5.js-sound), or on the [tutorial repository](https://github.com/JunShern/explorable-algcomp) if directly related to tutorial content. Simply create a new Issue and either assign or tag me in the conversation with @junshern. For anything else, don't hesitate to get in touch at [chanjunshern@gmail.com](mailto:chanjunshern@gmail.com)! ## Acknowledgements -Huge thanks goes to my mentor Jason Sigal for all his support and guidance throughout the project, as well as to all developers and community members of p5.js and the Processing Foundation who made all of this possible. +Huge thanks goes to my mentor Jason Sigal for all his support and guidance throughout the project, as well as to all developers and community members of p5.js and the Processing Foundation who made all of this possible. Thank you so much! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/katiejliu_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/katiejliu_gsoc_2021.mdx index 0a349fceb2..a7369f19d0 100644 --- a/src/content/contributor-docs/en/project_wrapups/katiejliu_gsoc_2021.mdx +++ b/src/content/contributor-docs/en/project_wrapups/katiejliu_gsoc_2021.mdx @@ -1,17 +1,17 @@ +# Adding Alt Text to the p5.js Website (GSoC 2021) ---- +#### By Katie Liu ([@katiejliu](https://github.com/katiejliu)) ---- - # Adding Alt Text to the p5.js Website (GSoC 2021) - #### By Katie Liu ([@katiejliu](https://github.com/katiejliu)) - #### Mentors: Rachel Lim and Claire Kearney-Volpe - - ### Overview - For my Google Summer of Code project, I added alt text to the visual elements of the p5.js website, specfically to all of the examples. With the help of my mentors Rachel and Claire, I was able to improve the accessibility of the p5.js website for users with visually impairment. - - ### Process - To begin, I did a lot of research on best alt text practices. I read about web accessibility through sources such as articles from WebAIM and the Web Content Accessibility Guidelines from W3C. I also familiarized myself with navigating and using the built-in screen reader on my Mac. -In determining what part of the p5.js website I would focus my project on, I explored the p5.js website and its current accessibility. I learned that alt text had already been added to all of the reference pages so I decided to focus my efforts on the examples pages. +#### Mentors: Rachel Lim and Claire Kearney-Volpe + +### Overview + +For my Google Summer of Code project, I added alt text to the visual elements of the p5.js website, specfically to all of the examples. With the help of my mentors Rachel and Claire, I was able to improve the accessibility of the p5.js website for users with visually impairment. + +### Process + +To begin, I did a lot of research on best alt text practices. I read about web accessibility through sources such as articles from WebAIM and the Web Content Accessibility Guidelines from W3C. I also familiarized myself with navigating and using the built-in screen reader on my Mac. +In determining what part of the p5.js website I would focus my project on, I explored the p5.js website and its current accessibility. I learned that alt text had already been added to all of the reference pages so I decided to focus my efforts on the examples pages. Then, I spent time writing all of the alt text for the images, which I would later implement. My mentors Rachel Lim and Claire Kearney-Volpe reviewed, edited, and gave me feedback for these alt text descriptions. I then added the alt text via an aria-label attached to the iframe of the image on each of the pages. @@ -25,16 +25,16 @@ Here is an example of the aria-label for [Comments and Statements](https://p5js. */ ``` -I ended up being able to write alt text for all of the examples. In total, I wrote and implemented 203 descriptions. This covers all of the examples pages with the exception of the 5 under the mobile section because the images do not appear in this section. +I ended up being able to write alt text for all of the examples. In total, I wrote and implemented 203 descriptions. This covers all of the examples pages with the exception of the 5 under the mobile section because the images do not appear in this section. ### Next Steps + I have conducted testing on Chrome and Safari using the built-in screen reader on Macs. While the alt text works fairly well on Chrome, there are issues getting it to read out with the screen reader on Safari. Additional testing using different screen readers as well as browsers would be useful. ## Final Pull Request + [GSoC Aria labels #1064](https://github.com/processing/p5.js-website/pull/1075) ## Acknowledgements -I am so grateful towards the Processing Foundation for picking my proposal and giving me this opportunity. I am also thankful for my mentors Rachel Lim and Claire Kearney-Volpe for teaching me so much about web accessibility and for helping me with my project. I would also like to thank Qianqian Ye. Q is my professor at USC and first introduced me to creative coding and to p5.js. She also was the one who encouraged me to apply to GSoC. This is my first time contributing to the open source community and I am so grateful for such a supportive and caring environment. - - \ No newline at end of file +I am so grateful towards the Processing Foundation for picking my proposal and giving me this opportunity. I am also thankful for my mentors Rachel Lim and Claire Kearney-Volpe for teaching me so much about web accessibility and for helping me with my project. I would also like to thank Qianqian Ye. Q is my professor at USC and first introduced me to creative coding and to p5.js. She also was the one who encouraged me to apply to GSoC. This is my first time contributing to the open source community and I am so grateful for such a supportive and caring environment. diff --git a/src/content/contributor-docs/en/project_wrapups/liang_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/liang_gsoc_2018.mdx index 4c698ca8b9..7ea3ee7dc0 100644 --- a/src/content/contributor-docs/en/project_wrapups/liang_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/liang_gsoc_2018.mdx @@ -1,7 +1,3 @@ - ---- - ---- # New JavaScript console in p5.js web editor #### by [@shinytang6](https://github.com/shinytang6) @@ -12,13 +8,12 @@ My project for GSoC 2018 was to integrate a new console to p5.js web editor. The 1. Improve the current console in p5.js web editor. The web editor has already included a console which displays console messages as plain text. l implemented the following features to the console: - * Folding / unfolding of console logged objects. - * Repeated console logs are not duplicated (but displayed with a number displaying times logged). - * Support the presentation of different data formats. - + * Folding / unfolding of console logged objects. + * Repeated console logs are not duplicated (but displayed with a number displaying times logged). + * Support the presentation of different data formats. 2. Make the console interactive. Like the browser developer tools, a user-friendly console should be interactive. -As of now, both of them are completed. The second one is still being polished. Apart from these, l also worked on +As of now, both of them are completed. The second one is still being polished. Apart from these, l also worked on some other things to make the editor better. ### Most notable PRs @@ -29,7 +24,7 @@ some other things to make the editor better. * [#656 Improve current console](https://github.com/processing/p5.js-web-editor/pull/656) * [#667 Make console interactive](https://github.com/processing/p5.js-web-editor/pull/667) -[View all merged PRs on Github](https://github.com/processing/p5.js-web-editor/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Ashinytang6) +[View all merged PRs on Github](https://github.com/processing/p5.js-web-editor/pulls?utf8=%E2%9C%93\&q=is%3Apr+author%3Ashinytang6) ## Experiences @@ -54,4 +49,3 @@ Any questions pertaining to this project may be addressed via Issues on the [p5. l would like to express my great gratitude to the Processing foundation for giving me the opportunity to work on this project and again my mentor for helping me! Thank you so much to make it possible! - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/lichlyter_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/lichlyter_gsoc_2023.mdx index e6e8522ee0..b36f9cc760 100644 --- a/src/content/contributor-docs/en/project_wrapups/lichlyter_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/lichlyter_gsoc_2023.mdx @@ -1,61 +1,64 @@ - ---- - ---- # Updating p5js.org Site Documentation and Accessibility + Project by Kathryn Lichlyter, mentored by Caleb Foss and Paula Isabel Signo ## Overview + This summer, I assisted the Processing Foundation with the navigational and visual accessibility of their p5.js documentation site by by conducting an accessibility audit to gauge the current deficits of the platform, prioritizing what changes and/or additions need to be made to improve accessibility, inclusion, and usability, and seeing those changes through by re-coding and/or re-designing the appropriate aspects of the site. I also contributed a new learn guide for their ARIA labeling functions to assist with screen reader accessibility. During this GSoC program, I have submitted the following PRs: -- [#1382 Added side-menu links to footer and applied flex-wrap to footer](https://github.com/processing/p5.js-website/pull/1382) -- [#1383 Added label to email input on Community page](https://github.com/processing/p5.js-website/pull/1383) -- [#1384 Added CSS styling for Language button focus state](https://github.com/processing/p5.js-website/pull/1384) -- [#1386 Reference page keyboard accessibility code block fix](https://github.com/processing/p5.js-website/pull/1386) -- [#1407 UI consistency](https://github.com/processing/p5.js-website/pull/1407) -- [#1409 Alt text revisions for non decorative photos](https://github.com/processing/p5.js-website/pull/1409) -- [#1410 Example pages codeblock keyboard trap fix](https://github.com/processing/p5.js-website/pull/1410) -- [#1412 How to label your p5 canvas tutorial](https://github.com/processing/p5.js-website/pull/1412) +* [#1382 Added side-menu links to footer and applied flex-wrap to footer](https://github.com/processing/p5.js-website/pull/1382) +* [#1383 Added label to email input on Community page](https://github.com/processing/p5.js-website/pull/1383) +* [#1384 Added CSS styling for Language button focus state](https://github.com/processing/p5.js-website/pull/1384) +* [#1386 Reference page keyboard accessibility code block fix](https://github.com/processing/p5.js-website/pull/1386) +* [#1407 UI consistency](https://github.com/processing/p5.js-website/pull/1407) +* [#1409 Alt text revisions for non decorative photos](https://github.com/processing/p5.js-website/pull/1409) +* [#1410 Example pages codeblock keyboard trap fix](https://github.com/processing/p5.js-website/pull/1410) +* [#1412 How to label your p5 canvas tutorial](https://github.com/processing/p5.js-website/pull/1412) ## Auditing the p5.js documentation site + During the first weeks of my GSoC project, I audited the existing p5.js documentation site and took note of any features or UI components that did not comply with WCAG AA and COGA standards. As requested by the Processing Foundation team, I took extra care to audit the keyboard and screen reader accessibility of the site. Here is an abridged list of the high-priority issues I found: ### Inaccessible brand colors -The pink brand color (#ED225D) does not have enough contrast on the site’s white background (WCAG 1.4.3). The light gray applied to buttons and the search input is also inaccessible. + +The pink brand color (#ED225D) does not have enough contrast on the site’s white background (WCAG 1.4.3). The light gray applied to buttons and the search input is also inaccessible. ### Inconsistent UI styling -Across the site, there are at least two different secondary button designs-- one of which has insufficient contrast against its background. When I first saw the buttons on the Reference page, I thought they were disabled with how invisible they were against the background. -Providing a consistent button design to use across the site will help with brand cohesion, predictability, and overall improved navigation. This may involve modifying, improving, or publicizing a design system for all contributors to easily access. +Across the site, there are at least two different secondary button designs-- one of which has insufficient contrast against its background. When I first saw the buttons on the Reference page, I thought they were disabled with how invisible they were against the background. + +Providing a consistent button design to use across the site will help with brand cohesion, predictability, and overall improved navigation. This may involve modifying, improving, or publicizing a design system for all contributors to easily access. ### Keyboard navigation traps -When navigating the Reference page examples via keyboard or screen reader, the code blocks, if you edit the code, results in a keyboard trap where the user can’t exit the text box. + +When navigating the Reference page examples via keyboard or screen reader, the code blocks, if you edit the code, results in a keyboard trap where the user can’t exit the text box. Using the Accessibility Insights for Web plugin, I discovered that once someone "tabs" into a code block, they cannot escape (the 'tab' key is re-targeted to a different purpose in the textbox). ### Keyboard navigation reorienting traps + If you select the “Skip to Main Content” button on the Reference example pages, this button redirects a user viewing a function’s Reference page back to the overarching Reference index. My theory is because all of the Reference content exists on the same HTML file, and because the display styling of the item-wrapper apidocs div is changed when the user selects a specific function’s reference, the “Skip to main content page” somehow refreshes any JS-related styling changes and redirects the user back to the Reference index. The same issue with the “lost” tabbing sequence exists on this page as well. After presenting my audit to the p5.js lead team, we created a list of issues that would be fixable within my GSoC project’s scope (you may view that issue list at [#1372 p5.js Accessibility Audit Discussion](https://github.com/processing/p5.js-website/issues/1372)). ## Expanding the community’s knowledge of web accessibility -The describe() and describeElement() functions provide screen-reader accessible text that explain the p5 canvas and elements inside the p5 canvas. Since this is a fairly recent addition to the p5 library, no existing documentation (outside their References pages) about proper use of these functions is available. This has been brought up in multiple issues in the GitHub Issues page and is currently a part of the Web accessibility next steps page. -After completing the accessibility audit and submitting my code revisions, I then pivoted my attention to writing a tutorial that would help the p5.js community make their written code more accessible and accommodating for screen readers and other assistive technology. +The describe() and describeElement() functions provide screen-reader accessible text that explain the p5 canvas and elements inside the p5 canvas. Since this is a fairly recent addition to the p5 library, no existing documentation (outside their References pages) about proper use of these functions is available. This has been brought up in multiple issues in the GitHub Issues page and is currently a part of the Web accessibility next steps page. + +After completing the accessibility audit and submitting my code revisions, I then pivoted my attention to writing a tutorial that would help the p5.js community make their written code more accessible and accommodating for screen readers and other assistive technology. The overall objectives of this tutorial were to: -- Make people aware of these new features -- Let people know how to use them -- Indicate the best practices for ARIA labeling, from very simple to very complex and dynamic canvases. (There could also be a section about proper alternative text for highly-interactive and highly-animated sketches and how to best use describeElement() to explain the sketch’s changes.) +* Make people aware of these new features +* Let people know how to use them +* Indicate the best practices for ARIA labeling, from very simple to very complex and dynamic canvases. (There could also be a section about proper alternative text for highly-interactive and highly-animated sketches and how to best use describeElement() to explain the sketch’s changes.) At this moment, this tutorial is still going through the process of approval, from both the p5.js lead team and Processing Foundation community. More on this tutorial to come after its approval. ## Next steps -In the future, I will help the p5.js team conduct more usability testing (specifically usability testing with screen readers) and resolve any accessibility issues within my ability. -Thank you to the whole Processing Foundation team for this wonderful opportunity, and thank you to Claire Kearney-Volpe, Paula Isabel Signo, and Caleb Foss for the great mentoring! +In the future, I will help the p5.js team conduct more usability testing (specifically usability testing with screen readers) and resolve any accessibility issues within my ability. - \ No newline at end of file +Thank you to the whole Processing Foundation team for this wonderful opportunity, and thank you to Claire Kearney-Volpe, Paula Isabel Signo, and Caleb Foss for the great mentoring! diff --git a/src/content/contributor-docs/en/project_wrapups/luismn_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/luismn_gsoc_2020.mdx index 394ef54a2d..ff4894f4e0 100644 --- a/src/content/contributor-docs/en/project_wrapups/luismn_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/luismn_gsoc_2020.mdx @@ -1,18 +1,18 @@ - ---- - ---- # p5.js accessibility and canvas descriptions + GSoC 2020 | [Luis Morales-Navarro](https://luismn.com/) ### Overview: + During this Google Summer of Code, I worked with [Kate Hollenbach](https://github.com/kjhollen) to improve the accessibility features of p5.js. We focused on merging the text output and table output functionalities of [p5.accessibility](https://github.com/processing/p5.accessibility) into p5.js and created functions that support p5.js users in writing their own screen reader accessible canvas descriptions. ### Background: + #### p5.js and Accessibility: from an editor feature to an add-on to the library + The work done during this summer is part of the project's [efforts to make p5.js more accessible for persons with dissabilities](https://contributors-zine.p5js.org/#reflection-claire-kearney-volpe). Early work by Claire Kearney-Volpe, Taeyoon Choi, and Atul Varma identified the need to make p5.js sketches and the canvas accessible to screen readers and people who are blind. I met Claire in late 2016 when @@ -21,7 +21,7 @@ and together with the support of dedicated contributors and advisors (including Josh Mielle, Sina Bahram, and Chancey Fleet) we implemented three accessible canvas outputs (a text output, a grid output and a sound output) on the alpha editor. -Later on, through a 2018 Processing Foundation Fellowship Claire, Mathura and I developed p5.accessibility.js a p5.js add-on. +Later on, through a 2018 Processing Foundation Fellowship Claire, Mathura and I developed p5.accessibility.js a p5.js add-on. p5.accessibility.js (developed with contributions from Antonio Guimaraes, Elizabeth G Betts, Mithru Vigneshwara, and Yossi Spira) helped us bring the work we had done with accessible outputs in the editor to any p5.js sketch that included the add-on. However, the add-on was still an add-on that required users to include an extra file and edit their html. @@ -32,28 +32,29 @@ Among short-term actions, we identified the need for functions that allow users and the importance of merging the add-on into the p5.js library. ### Contributions: + During the course of Summer of Code, my work focused on creating library generated screen reader accessible outputs for basic shapes on the canvas and functions to support user-generated screen reader accessible descriptions of canvas content. I worked on the following PRs: -- [Add describe() and describeElement() #4654](https://github.com/processing/p5.js/pull/4654): This PR adds the functions describe() and describeElement(), tests for these functions, documentation and examples. -- [Merge Accessibility Add-On into p5.js #4703](https://github.com/processing/p5.js/pull/4703): This PR adds the functions textOutput() and gridOutput(), helper functions to create and update, the outputs and tests, documentation and examples. At first the plan was to update the add-on and prepare it for merging it with p5.js in the near future. However, we realized it was more time effective to recreate the functionality of the text output and grid output in p5.js than upgrading the add-on which relied on ["monkey patching," entities and interceptors](https://medium.com/processing-foundation/making-p5-js-accessible-e2ce366e05a0). Now, the outputs are fully integrated to the library. + +* [Add describe() and describeElement() #4654](https://github.com/processing/p5.js/pull/4654): This PR adds the functions describe() and describeElement(), tests for these functions, documentation and examples. +* [Merge Accessibility Add-On into p5.js #4703](https://github.com/processing/p5.js/pull/4703): This PR adds the functions textOutput() and gridOutput(), helper functions to create and update, the outputs and tests, documentation and examples. At first the plan was to update the add-on and prepare it for merging it with p5.js in the near future. However, we realized it was more time effective to recreate the functionality of the text output and grid output in p5.js than upgrading the add-on which relied on ["monkey patching," entities and interceptors](https://medium.com/processing-foundation/making-p5-js-accessible-e2ce366e05a0). Now, the outputs are fully integrated to the library. More information on how these accessibility features work is available in the [web accessibility contributor docs](https://github.com/processing/p5.js/blob/main/contributor_docs/web_accessibility/). ### Future -- There is a lot of work that can be done to improve the accessibility of p5.js sketches. In the [Web accessibility next steps conversation #4721 Issue](https://github.com/processing/p5.js/issues/4721) we have outlined some ideas and questions. -- The work done during the summer focused on code and code issues but it is important to iteratively test these features with members of the community, particularly novices and learners who are blind. It is also important to create more resources for learning and teaching that support accessibility. -- Immediate next steps include: - - A tutorial on how to describe things on the canvas. - - Changes in the way screen-reader descriptions are created in the reference. Using the describe() function instead of relying on @alt - - Maybe adding describe() to the templates on the website and editor - - Upgrading the tutorial on using p5 with a screen reader - - Changing the way the accessibility settings work on the editor -### Acknowledgements -I am grateful to Kate Hollenbach for their guidance, feedback and assistance, to Lauren McCarthy for their feedback and to Claire Kearney-Volpe for helping me come up with this project. Thanks to Sina Bahram for their input —our conversations at 2019 p5.js Contributors Conference inspired the describe() and describeElement() functions—, and to Akshay Padte for their advice on unit testing. This GSoC project would not have been possible without Chancey Fleet and Claire (who started thinking of ways to make p5.js sketches screen reader accessible in late 2015), the work of Mathura Govindarajan, and of many other contributors and supporters in the p5.js community. +* There is a lot of work that can be done to improve the accessibility of p5.js sketches. In the [Web accessibility next steps conversation #4721 Issue](https://github.com/processing/p5.js/issues/4721) we have outlined some ideas and questions. +* The work done during the summer focused on code and code issues but it is important to iteratively test these features with members of the community, particularly novices and learners who are blind. It is also important to create more resources for learning and teaching that support accessibility. +* Immediate next steps include: + * A tutorial on how to describe things on the canvas. + * Changes in the way screen-reader descriptions are created in the reference. Using the describe() function instead of relying on @alt + * Maybe adding describe() to the templates on the website and editor + * Upgrading the tutorial on using p5 with a screen reader + * Changing the way the accessibility settings work on the editor -:heart: +### Acknowledgements +I am grateful to Kate Hollenbach for their guidance, feedback and assistance, to Lauren McCarthy for their feedback and to Claire Kearney-Volpe for helping me come up with this project. Thanks to Sina Bahram for their input —our conversations at 2019 p5.js Contributors Conference inspired the describe() and describeElement() functions—, and to Akshay Padte for their advice on unit testing. This GSoC project would not have been possible without Chancey Fleet and Claire (who started thinking of ways to make p5.js sketches screen reader accessible in late 2015), the work of Mathura Govindarajan, and of many other contributors and supporters in the p5.js community. - \ No newline at end of file +:heart: diff --git a/src/content/contributor-docs/en/project_wrapups/malayvasa_gsoc_2022.mdx b/src/content/contributor-docs/en/project_wrapups/malayvasa_gsoc_2022.mdx index 872d3a2e5d..119191b4de 100644 --- a/src/content/contributor-docs/en/project_wrapups/malayvasa_gsoc_2022.mdx +++ b/src/content/contributor-docs/en/project_wrapups/malayvasa_gsoc_2022.mdx @@ -1,12 +1,8 @@ - ---- - ---- ## Reworked and New Examples - GSoC 2022 This year with my mentor @tyler-yin, I’ve worked on updating the examples section of the p5js website. My goal with the project was to introduce examples which focus on programming constructs alongside concepts of art & design. My hope is that by showcasing how the tool can be used visually, I can bridge the gap that beginners often face between conceptualising an artwork and coding it. -I also propose a set of layout and functionality changes to the website that enhance the user experience. I believe the way the examples is currently structured can intimidate a lot of beginners from exploring and learning. +I also propose a set of layout and functionality changes to the website that enhance the user experience. I believe the way the examples is currently structured can intimidate a lot of beginners from exploring and learning. You can find my full proposal [here](https://summerofcode.withgoogle.com/media/user/bad5e07f0969/proposal/gAAAAABjD1624v_zls-M-HNtpmsqjHRz0xzwXQuSzMLP3JgcdJ2uEMqJ5r4URH1Gk4qmJFMhS3f2zuuAvFglM-TFS2VWbtQGjccnF3FzmW6FwG1T4l6Y9I4=.pdf). @@ -14,107 +10,123 @@ You can find my full proposal [here](https://summerofcode.withgoogle.com/media/u I have so far been working on 5 of the 25+ categories present in the examples section. -These mainly involve : Color, Math, Image, Motion, Drawing, and Input. +These mainly involve : Color, Math, Image, Motion, Drawing, and Input. I have structured my work in this notion document ([https://malayvasa.notion.site/GSoC-2022-Examples-Project-ffee1e56ab1a4d7bb27b40ea7a145555](https://www.notion.so/GSoC-2022-Examples-Project-ffee1e56ab1a4d7bb27b40ea7a145555)) where you can view it category wise. There are two broad categories : -## Reworked Examples +## Reworked Examples + These are existing examples that I felt needed to be simplified or modified to make them easy to understand and inviting beginners to play with the code. ### Color -- Saturation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/D_diJGx3z) -- Hue : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/cp-vOyVaN) -- Brightness : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/ePCMD0Qva) -- Lerp Color HSB : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/MXJuQ6PXQ) -- Radial Gradient HSB : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/oLbAZAYiu) + +* Saturation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/D_diJGx3z) +* Hue : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/cp-vOyVaN) +* Brightness : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/ePCMD0Qva) +* Lerp Color HSB : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/MXJuQ6PXQ) +* Radial Gradient HSB : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/oLbAZAYiu) ### Math -- Random : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/q4UHuGgOf) -- Noise 2D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/vMJrphk9M) -- Noise 3D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/lk1oVQzbx) -- Arctangent (Simple) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/jaiw_N5sb) -- Arctangent (Advanced) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/2yRK0w1q6) -- Distance 1D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/UL3NmUPa6) -- Sine Cosine : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/pGHOS_8ks) -- Sine : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/fP-4RSNHR) -- Parametric Equations (Simple) : [Editor Link](https://editor.p5js.org/malayvasa/sketches/7oeYm1cPy) -- Additive Wave : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/O_mktBiqU) -### Others +* Random : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/q4UHuGgOf) +* Noise 2D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/vMJrphk9M) +* Noise 3D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/lk1oVQzbx) +* Arctangent (Simple) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/jaiw_N5sb) +* Arctangent (Advanced) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/2yRK0w1q6) +* Distance 1D : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/UL3NmUPa6) +* Sine Cosine : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/pGHOS_8ks) +* Sine : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/fP-4RSNHR) +* Parametric Equations (Simple) : [Editor Link](https://editor.p5js.org/malayvasa/sketches/7oeYm1cPy) +* Additive Wave : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/O_mktBiqU) -- Image -Transparency : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/FHFm3jHQv) -Alpha Mask : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/CARbnWpzw) -- Motion -Reflection (Simple) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/jtmKm8sRx) -- Input -Keyboard : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/Pi2EyKvlg) -- Form -Lines : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/MgithbMo6) -- Text -Rotation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/QkPp1hvsd) +### Others +* Image + Transparency : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/FHFm3jHQv) + Alpha Mask : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/CARbnWpzw) +* Motion + Reflection (Simple) : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/jtmKm8sRx) +* Input + Keyboard : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/Pi2EyKvlg) +* Form + Lines : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/MgithbMo6) +* Text + Rotation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/QkPp1hvsd) ## New Examples + These are the examples that are not on the website, but I feel should be there. They broadly introduce new concepts that I’ve myself encountered. ### Color -- Color Wheel : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/9K5GEkGT9) -- Monochromatic Color Sceme : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/lomRnGCUd) -- Responsive Text Fill : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/wAO-2_vcL) + +* Color Wheel : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/9K5GEkGT9) +* Monochromatic Color Sceme : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/lomRnGCUd) +* Responsive Text Fill : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/wAO-2_vcL) ### Image -- Pixel Array Manipulation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/YTy8LlSFq) -- Dot Matrix Animation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/nDxraaJ8u) + +* Pixel Array Manipulation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/YTy8LlSFq) +* Dot Matrix Animation : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/nDxraaJ8u) ### Motion -- Circular : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/vpNF676Z5) -- Wave Maker : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/zNeDx6t7M) + +* Circular : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/vpNF676Z5) +* Wave Maker : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/zNeDx6t7M) ### Text -- Lyric Poem : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/aC1oUxpAo) + +* Lyric Poem : [Editor Link](https://editor.p5js.org/malayvasa2001/sketches/aC1oUxpAo) ## Guidelines for a great example + Working on these I’ve developed guidelines to write a great example that anyone can follow as well : ### Be Correct -Example code is an opportunity to directly influence how your users write code. Therefore, examples should showcase the best way to use your product + +Example code is an opportunity to directly influence how your users write code. Therefore, examples should showcase the best way to use your product Example code should meet the following criteria: + 1. Free of any errors. 2. Perform the task it claims to perform. 3. Be as production-ready as possible. 4. Follow language-specific conventions. ### Be General + Examples should focus on explaining or demonstrating concepts that can be applied to a wide variety of scenarios. If you find writing a super specific example, ask yourself if writing a tutorial would be a better way to address it. - Examples are not tutorials. People already know what they are seeking from a tutorial, examples instead introduce people to what's possible. +Examples are not tutorials. People already know what they are seeking from a tutorial, examples instead introduce people to what's possible. #### Be Simple -As a beginner, seeing a page full of code can be very intimidating. To avoid this, examples should be kept as simple as possible. -Try and keep the pre-requisite knowledge to a minimum. Since an example is ideally being used to introduce a new concept or framework, the reader shouldn't have the added burden of figuring out other stuff which could be avoided. +As a beginner, seeing a page full of code can be very intimidating. To avoid this, examples should be kept as simple as possible. + +Try and keep the pre-requisite knowledge to a minimum. Since an example is ideally being used to introduce a new concept or framework, the reader shouldn't have the added burden of figuring out other stuff which could be avoided. In some cases, an example will require more complexity. Break it down further into three separate examples that address different experience levels Beginner, Intermediate & Advanced. #### Be Well Commented -In the case of examples, comments almost form a dialogue with the code. This gives the reader a sense that someone is explaining the code to them. + +In the case of examples, comments almost form a dialogue with the code. This gives the reader a sense that someone is explaining the code to them. Comments are also extremely helpful in introducing additional context. Clarity and understanding of the purpose of a particular line of code are important to avoid unwanted confusion. Moreover, since the reader is exposed to well-documented code this will encourage them to add comments to their code as well. #### Be Inviting -This one is pretty simple, the example should invite the user to play around with the code. + +This one is pretty simple, the example should invite the user to play around with the code. This can be achieved by : + 1. Making the example intriguing, to invoke the thought "How did it do that?!" 2. Using easy to understand variable names, although they might seem a bit verbose at times. 3. Making the example editable, without the need of setting up a coding environment. #### Be Discoverable -It doesn't matter how great your example is, if it isn't easy for the reader to find it. There are a few things you can do to improve discoverability : + +It doesn't matter how great your example is, if it isn't easy for the reader to find it. There are a few things you can do to improve discoverability : 1. Have a descriptive name, it is possible many beginners aren't aware of a concept at all and using a technical name might hinder the process of discovery. 2. Link your examples to the relevant sections of the documentation, and to other similar examples. @@ -123,4 +135,3 @@ It doesn't matter how great your example is, if it isn't easy for the reader to ## Acknowledgements I would like to thank Tyler, Saber and Qianqian. The project would not have reached this stage without the amazing guidance and support from them. - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/munusshih_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/munusshih_gsoc_2023.mdx index 38ce88ffd3..12eff72d47 100644 --- a/src/content/contributor-docs/en/project_wrapups/munusshih_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/munusshih_gsoc_2023.mdx @@ -1,7 +1,3 @@ - ---- - ---- # A Typographic Revamp for p5.js ```jsx @@ -59,16 +55,16 @@ In hindsight, it seems that a more comprehensive approach, involving robust meet In conclusion, I am grateful for my time working with p5.js typography during GSoC. It marked the beginning of a journey towards addressing complex typographic issues and highlights the need for continued collaboration and exploration in this domain. ---- +*** ## Existing Issues -| Topic | Status | Coded? | PR? | Pushed? | -| --- | --- | --- | --- | --- | -| Slow rendering | Done | De-prioritize | | | -| textBounds not in ref | Done | Not Typographic related | | | -| textWidth() wrong line break | Done | V | | V | -| textToPoints() | Done | V | | V | +| Topic | Status | Coded? | PR? | Pushed? | +| ---------------------------- | ------ | ----------------------- | --- | ------- | +| Slow rendering | Done | De-prioritize | | | +| textBounds not in ref | Done | Not Typographic related | | | +| textWidth() wrong line break | Done | V | | V | +| textToPoints() | Done | V | | V | ## Features Requested @@ -76,14 +72,14 @@ In conclusion, I am grateful for my time working with p5.js typography during GS If they're not dependent/relevant, we should do seperate PRs. ``` -| Topic | Status | Coded? | PR? | Pushed? | -| --- | --- | --- | --- | --- | -| textLineHeight | Done | | | x | -| textHeight() | Done | | x | x | -| variableFonts() | Processing | | | x | -| textAlign(JUSTIFIED) | Processing | | x | x | -| miterLimits() -a triangle with mouseX… | Example | V | | x | +| Topic | Status | Coded? | PR? | Pushed? | +| ----------------------- | ---------- | ------ | --- | ------- | +| textLineHeight | Done | | | x | +| textHeight() | Done | | x | x | +| variableFonts() | Processing | | | x | +| textAlign(JUSTIFIED) | Processing | | x | x | +| miterLimits() | | | | | +| a triangle with mouseX… | Example | V | | x | ## Discussions @@ -104,4 +100,3 @@ a triangle with mouseX… | Example | V | | x | ### TextHeight [p5.js Web Editor](https://editor.p5js.org/munusshih/sketches/4BwL7q2Fe) - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/nikiito_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/nikiito_gsoc_2021.mdx deleted file mode 100644 index 69088397a3..0000000000 --- a/src/content/contributor-docs/en/project_wrapups/nikiito_gsoc_2021.mdx +++ /dev/null @@ -1,40 +0,0 @@ - ---- - ---- -# Acitvism Through Storytelling with Code -The project “Activism Through Storytelling with Code” was created by Niki Ito as a part of the Google Summer of Code 2021. Google Summer of Code is a global program that pairs students with mentors to develop a 10-week programming project and learn about open-source software development. - -For this project, she worked with the Processing Foundation to help develop and expand Processing and p5.js to be more accessible and inclusive for artists, designers, educators, and beginner coders. With guidance from her mentors Elgin-Skye McLaren and Grace Kwon, Niki developed this project which focuses on art, coding, and identity/community. The project includes a visual narrative website “about Me You & Us,” a Project Handbook, and this GitHub Repository with all the project files.
- -Go to this project repository to view and access the project files. -## Examples -p5.js sketches:
-Example 1: Still-Life
-Example 2: Key Pressed with Sound
-Example 3: Interactive Portrait
-Example 4: Visual Narrative Draft
- -## Visual Narrative Website -![Website Screenshot](https://github.com/niki-ito/activism-through-storytelling-with-code/blob/main/assets/images/handbook/visual-narrative-website.gif)
-### About Me, You, & Us
-The visual narrative website includes audio-based p5.js sketches that showcase intimate narratives collected from conversations within the Japanese diaspora in the United States. - -## Project Handbook -![Website Screenshot](https://github.com/niki-ito/activism-through-storytelling-with-code/blob/main/assets/images/handbook/handbook.jpg)
-### Activism Through Storytelling with Code: a step-by-step guide
-The handbook is organized into two main chapters: concepts and technical strategies for the visual narrative website “about Me You & Us.” The concepts chapter includes the purpose, struggles & solutions, and research. The technical strategies chapter includes visual strategies such as audio, photography, illustration as well as coding strategies within the p5.js editor and on the website. - -## Getting Started -To run the code locally: -- Download this project repository. -- Use Visual Studio Code and download the Live Server extention to view the website on your local development environment. - -## Acknowledgments -I feel very grateful to have had such amazing support during the development of this project. First and foremost, I would like to extend my deepest gratitude to my mentors Elgin-Skye McLaren and Grace Kwon who have been extremely helpful from start to finish. Every time after meetings with my mentors, I felt so inspired and motivated to move forward. - -Furthermore, I would like to thank Japanese American photographer HATSUE and Japanese American art historian Joe who volunteered their time and thoughts to my project and became a part of the recorded conversations and visual narratives. I would also like to thank Japanese ceramic artist Miwa Neishi who introduced me to my new HATSUE and supported me from the very beginning. Additionally, I would like to thank professor Sherry Muyuan He who would spend long meeting sessions with me to support and inspire me when I felt unsure. I would also like to thank photographer Kestin Mica who contributed his amazing photography skills and became a partner in this project. Finally, I am extremely grateful for my programming professor Stalgia Grigg who introduced me to creative coding and Google Summer of Code. - -I am very appreciative of this wonderful experience provided by Google and my mentor organization, The Processing Foundation. I look forward to continuing my contribution to open-source and the processing community. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/orenshoham_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/orenshoham_gsoc_2019.mdx index e290dc8885..3f0bcb2137 100644 --- a/src/content/contributor-docs/en/project_wrapups/orenshoham_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/orenshoham_gsoc_2019.mdx @@ -1,7 +1,3 @@ - ---- - ---- # AudioWorklet Support in p5.js-sound For my Google Summer of Code 2019 project, I worked with my mentor [Jason Sigal](https://github.com/therewasaguy) to add [AudioWorklet](https://developers.google.com/web/updates/2017/12/audio-worklet) support to [p5.js-sound](https://github.com/processing/p5.js-sound), allowing certain parts of the library to run more efficiently by moving custom audio processing to a separate audio thread. I also helped Jason integrate [Webpack](https://webpack.js.org/) and [Babel](https://babeljs.io/) into the p5.js-sound [Grunt](https://gruntjs.com/) build pipeline, allowing the library's developers to use ES6 JavaScript features and laying the groundwork for modernizing the codebase and examples. @@ -12,9 +8,9 @@ The AudioWorklet API consists of two classes: [AudioWorkletProcessor](https://de AudioWorklet replaces [ScriptProcessorNode](https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode), a now-deprecated Web Audio node that runs audio code in the browser's main thread. p5.js-sound used ScriptProcessorNode internally in three classes: -- [p5.SoundFile](https://p5js.org/reference/#/p5.SoundFile), which used a ScriptProcessorNode to keep track of a SoundFile's current playback position. -- [p5.Amplitude](https://p5js.org/reference/#/p5.Amplitude), which used a ScriptProcessorNode to perform amplitude analysis. -- [p5.SoundRecorder](https://p5js.org/reference/#/p5.SoundRecorder), which used a ScriptProcessorNode to concatenate audio buffers together during the recording process. +* [p5.SoundFile](https://p5js.org/reference/#/p5.SoundFile), which used a ScriptProcessorNode to keep track of a SoundFile's current playback position. +* [p5.Amplitude](https://p5js.org/reference/#/p5.Amplitude), which used a ScriptProcessorNode to perform amplitude analysis. +* [p5.SoundRecorder](https://p5js.org/reference/#/p5.SoundRecorder), which used a ScriptProcessorNode to concatenate audio buffers together during the recording process. For each of these classes, I created new AudioWorkletProcessors for [p5.SoundFile](https://github.com/processing/p5.js-sound/blob/4d3a3833de4d30f6770740052a82586444a4482a/src/audioWorklet/soundFileProcessor.js), [p5.Amplitude](https://github.com/processing/p5.js-sound/blob/4d3a3833de4d30f6770740052a82586444a4482a/src/audioWorklet/amplitudeProcessor.js), and [p5.SoundRecorder](https://github.com/processing/p5.js-sound/blob/4d3a3833de4d30f6770740052a82586444a4482a/src/audioWorklet/recorderProcessor.js) that replicated the corresponding ScriptProcessorNode's [onaudioprocess](https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode/onaudioprocess) function. @@ -73,20 +69,18 @@ Unfortunately, the additional comments inserted by Webpack into the compiled bun ## Contributions -- [Add tests for p5.SoundRecorder and lint existing tests (#364)](https://github.com/processing/p5.js-sound/pull/364) +* [Add tests for p5.SoundRecorder and lint existing tests (#364)](https://github.com/processing/p5.js-sound/pull/364) -- [Replace requirejs with webpack to enable ES6+ and non-AMD modules (#366)](https://github.com/processing/p5.js-sound/pull/366) +* [Replace requirejs with webpack to enable ES6+ and non-AMD modules (#366)](https://github.com/processing/p5.js-sound/pull/366) -- [Replace ScriptProcessorNode in p5.SoundRecorder with AudioWorkletNode (#369)](https://github.com/processing/p5.js-sound/pull/369) +* [Replace ScriptProcessorNode in p5.SoundRecorder with AudioWorkletNode (#369)](https://github.com/processing/p5.js-sound/pull/369) -- [Replace ScriptProcessorNode with AudioWorkletNode in p5.SoundFile and p5.Amplitude (#373)](https://github.com/processing/p5.js-sound/pull/373) +* [Replace ScriptProcessorNode with AudioWorkletNode in p5.SoundFile and p5.Amplitude (#373)](https://github.com/processing/p5.js-sound/pull/373) -- [Add ring buffers to AudioWorklet processors to support variable buffer sizes (#376)](https://github.com/processing/p5.js-sound/pull/376) +* [Add ring buffers to AudioWorklet processors to support variable buffer sizes (#376)](https://github.com/processing/p5.js-sound/pull/376) -- [Bugfixes for p5.Amplitude and p5.Soundfile for browsers without AudioWorklet support (#380)](https://github.com/processing/p5.js-sound/pull/380) +* [Bugfixes for p5.Amplitude and p5.Soundfile for browsers without AudioWorklet support (#380)](https://github.com/processing/p5.js-sound/pull/380) ## Acknowledgements I'm extremely grateful to the Processing Foundation for giving me the opportunity to contribute to p5.js, as well as to my mentor Jason Sigal for all of his support over the course of this project. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/rachellim_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/rachellim_gsoc_2019.mdx index e88ba2adb1..642ba0f290 100644 --- a/src/content/contributor-docs/en/project_wrapups/rachellim_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/rachellim_gsoc_2019.mdx @@ -1,38 +1,26 @@ - ---- - ---- # Search Bar for Sketches in the p5.js Web Editor -For my Google Summer of Code 2019 project for The Processing Foundation, I worked with Cassie Tarakajian to create a search bar for the p5.js Web Editor. You can search within your own sketches and other user’s sketches. +For my Google Summer of Code 2019 project for The Processing Foundation, I worked with Cassie Tarakajian to create a search bar for the p5.js Web Editor. You can search within your own sketches and other user’s sketches. ## Contributions Before this project, I had never been involved with open source or programmed outside of a classroom setting. I began the summer learning best contribution practices, how the web editor is structured, and why it was organized that way. Afterwards, I was introduced to [Git](https://git-scm.com/), [React](https://reactjs.org/), and [Sass](https://sass-lang.com/). I worked with two issues ([#989](https://github.com/processing/p5.js-web-editor/issues/989), [#1109](https://github.com/processing/p5.js-web-editor/pull/1109#pullrequestreview-253008128)) to learn how to make visual and functional changes within the web editor. The first issue had a design that led to questions about its intention and implementation within the code, and was put on hold for further discussion. Although it was unable to be resolved, I learned that implementing design through code was not always straightforward; frequent communication between the programmer and designer is very pivotal to the process. - -![Example of portfolio site with overlays](https://drive.google.com/uc?export=view&id=19J9j3Bj8EmyxAgaorsrrYSmbngsnkofh) ![Example of mock search bar searching through list of hearthstone cards](https://drive.google.com/uc?export=view&id=1pZ_MYdn6rSlSgXTs9e6xCm2x_nP41ftm) - +![Example of portfolio site with overlays](https://drive.google.com/uc?export=view\&id=19J9j3Bj8EmyxAgaorsrrYSmbngsnkofh) ![Example of mock search bar searching through list of hearthstone cards](https://drive.google.com/uc?export=view\&id=1pZ_MYdn6rSlSgXTs9e6xCm2x_nP41ftm) I created a portfolio site with pop-up modals to understand React components and how data is being passed between them. I also made a mock search bar that searched within a list of [Hearthstone cards](https://hearthstonejson.com/). I first created one with only React and then re-made it using [Redux](https://redux.js.org/) and [Reselect](https://github.com/reduxjs/reselect). Assembling these examples was extremely helpful in learning these libraries and repeating the same process for the web editor. - -![Neutral search bar](https://drive.google.com/uc?export=view&id=1ZotyuZ7Gvha_Knz-37PVS8v-Dsq7R4pU) -![Active search bar](https://drive.google.com/uc?export=view&id=1VN2abuO6eaC_Yq4y7VM6Z_nQfteFbRvm) - +![Neutral search bar](https://drive.google.com/uc?export=view\&id=1ZotyuZ7Gvha_Knz-37PVS8v-Dsq7R4pU) +![Active search bar](https://drive.google.com/uc?export=view\&id=1VN2abuO6eaC_Yq4y7VM6Z_nQfteFbRvm) I used designs uploaded to Zeplin as visual guides for how the search bar would appear in its [neutral](https://app.zeplin.io/project/55f746c54a02e1e50e0632c3/screen/59413d89c2b5318d69be12d3) and [active](https://app.zeplin.io/project/55f746c54a02e1e50e0632c3/screen/59413d88cda26c1669f83fea) state. I ran into some questions involving other aspects of the designs, which showed the search icon as a toggle for hiding and viewing the search bar. I was also unsure as to whether a search button would also be necessary as the results would be presented live. I turned to some resources on[ best practices for a search bar](https://uxplanet.org/design-a-perfect-search-box-b6baaf9599c) to finalize decisions, which advised providing prominent access, a search button, and a magnifying-glass icon. The search bar, placed within the modal that displays a list of the user’s sketches, has a search icon that serves as a search button, a text input area, and clear button. The color scheme of the buttons and border are dependent on the theme. - -![Live search demonstration](https://drive.google.com/uc?export=view&id=1KCRF66qkTUnsFe_dvzO2FNqh9jl7zJ6M) - +![Live search demonstration](https://drive.google.com/uc?export=view\&id=1KCRF66qkTUnsFe_dvzO2FNqh9jl7zJ6M) The search bar is live, which means that the sketchlist is filtered as the user types. To prevent the list from getting filtered after every keystroke, this filter function was throttled, or arranged to happen periodically after every set time frame. The search icon button will also call the filtering to happen if pressed. If the user wishes to clear their query, the clear button will reset it to an empty string. The search query also gets refreshed whenever the sketch list overlay is re-opened. ## Acknowledgements I deeply express my gratitude to the Processing foundation for giving me such a wonderful opportunity and to my mentor, Cassie Tarakajian, for her education, patience, and support! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/sai_bhushan_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/sai_bhushan_gsoc_2021.mdx index 23013d300b..98d6a7186f 100644 --- a/src/content/contributor-docs/en/project_wrapups/sai_bhushan_gsoc_2021.mdx +++ b/src/content/contributor-docs/en/project_wrapups/sai_bhushan_gsoc_2021.mdx @@ -1,91 +1,90 @@ - ---- - ----

- gsoc logo + gsoc logo

+ # Project Overview + + This project aimed at - -# Project Overview - This project aimed at - + Improving Test Coverage of p5.js sound library which includes - Improving Test Coverage of p5.js sound library which includes - * correcting the current tests * Writing new tests * Improving the testing architecture and implementing headless-tesing to the library * Adding documentation to the library regarding testing. -

## 1. Improving Current tests - At the beginning of the project, some of the tests written in the library seem to be broken(like 20 %). Some of these are due to the problems in code which went by unnoticed as testing is not frequently performed to the library. Some of these are due to the tests for which most of them were solved by using `setTimeout function`. - -[Week-1 's PR](https://github.com/processing/p5.js-sound/pull/626) + +At the beginning of the project, some of the tests written in the library seem to be broken(like 20 %). Some of these are due to the problems in code which went by unnoticed as testing is not frequently performed to the library. Some of these are due to the tests for which most of them were solved by using `setTimeout function`. + +[Week-1 's PR](https://github.com/processing/p5.js-sound/pull/626)\ At the end of week-1, I've fixed all the failing tests except one. Which I came back to in week-2. -I've fixed some bugs in week-2 that caused that one test to fail and also corrected an example related to that issue. - -[Week-2 issue](https://github.com/processing/p5.js-sound/issues/627) -[Week-2 PR](https://github.com/processing/p5.js-sound/pull/628) +I've fixed some bugs in week-2 that caused that one test to fail and also corrected an example related to that issue. -## 2. Writing new tests - Most of my time during this period is spent on writing new tests to the library and improving it's testing range. -In weeks-3,4 I've added tests to the files which are not yet covered(16 files). At this week, I've decided on the style/suite design of the library's tests, which I followed for the rest of the project's period with some minor changes +[Week-2 issue](https://github.com/processing/p5.js-sound/issues/627)\ +[Week-2 PR](https://github.com/processing/p5.js-sound/pull/628) -[Week-3,4 PR](https://github.com/processing/p5.js-sound/pull/632) -At this point, all the files of the library were covered. +## 2. Writing new tests -In weeks-6,7 I've added tests to files which are already coverd(15 files). This is a larger work than week-3,4's as some of the files were massive and needed like 1000 lines of code to test the entire file. During these weeks(3-7), I also fixed some bugs which I came across this period. Later I raised a PR regarding these bugs. +Most of my time during this period is spent on writing new tests to the library and improving it's testing range.\ +In weeks-3,4 I've added tests to the files which are not yet covered(16 files). At this week, I've decided on the style/suite design of the library's tests, which I followed for the rest of the project's period with some minor changes -[Week-6-7 PR](https://github.com/processing/p5.js-sound/pull/636) -[Bug fixing PR](https://github.com/processing/p5.js-sound/pull/639) +[Week-3,4 PR](https://github.com/processing/p5.js-sound/pull/632)\ +At this point, all the files of the library were covered. + +In weeks-6,7 I've added tests to files which are already coverd(15 files). This is a larger work than week-3,4's as some of the files were massive and needed like 1000 lines of code to test the entire file. During these weeks(3-7), I also fixed some bugs which I came across this period. Later I raised a PR regarding these bugs. + +[Week-6-7 PR](https://github.com/processing/p5.js-sound/pull/636)\ +[Bug fixing PR](https://github.com/processing/p5.js-sound/pull/639) ## 3.Headless testing - I spent the last 3 weeks or so on implementing headless testing. During this period, I did some minor changes in testing architecture. -I also implemented headless testing of mocha by using puppeteer, which is inspired by p5.js's testing. + +I spent the last 3 weeks or so on implementing headless testing. During this period, I did some minor changes in testing architecture.\ +I also implemented headless testing of mocha by using puppeteer, which is inspired by p5.js's testing. + ### Problems faced: + * I took some time figuring out the testing of mic in headless mode and figured out that it can be solved by mocking the microphone to use the buffer from a sound file * I also fumbled upon the problem that some user interaction is required to start some audio nodes and later figured out that it can be solved by adding a flag while initialising puppeteer. * After implementing the headless testing using puppeteer, I figured out that testing in that way is not consistent for this library. Some audio nodes are not being properly initialised and the tests were failing. So, I've implemented Karma to solve this problem. * As the tests in karma were also not consistent, I used karma-webpack to bundle the test files, which seemed more consistent. -* As I found out even then some tests were failing, I implemented mocha's retry functionality to some test cases. +* As I found out even then some tests were failing, I implemented mocha's retry functionality to some test cases. +At the start of the project, I thought of implementing the headless testing and using it in github automations, but did not do it as even after implementing all these, some tests were failing in karma-js. Not always, but very rarely. As we cannot take risks on github automations, I refrained from implementing it. -At the start of the project, I thought of implementing the headless testing and using it in github automations, but did not do it as even after implementing all these, some tests were failing in karma-js. Not always, but very rarely. As we cannot take risks on github automations, I refrained from implementing it. - -Also, at the time of writing this document, the last PR is not yet merged. But will hopefully merged whithin a couple of days. +Also, at the time of writing this document, the last PR is not yet merged. But will hopefully merged whithin a couple of days.\ [Week-8,9,10 PR](https://github.com/processing/p5.js-sound/pull/641) - + ## 4.Documenting - During the last week of my project, I used my time to merge the work done and write a wiki page about the current testing architecture and on how to write tests, focused on beginners. The wiki can be found in library's wiki page. +During the last week of my project, I used my time to merge the work done and write a wiki page about the current testing architecture and on how to write tests, focused on beginners. The wiki can be found in library's wiki page. + +# Future of p5.js-sound's testing + +I've done almost every thing I thought of doing at the beginning of the project. But, there were some things that can be improved/implemented in the future: -# Future of p5.js-sound's testing -I've done almost every thing I thought of doing at the beginning of the project. But, there were some things that can be improved/implemented in the future: * We should figure out a way to visualise to the coverage of test files. * Some failing tests need to be corrected and the github automations needs to be implemented. * If any file/functionality is added in the future, tests for those should be added. * After the coverage is implemented, we should write test cases for files which are poorly covered. # Acknowledgements: -During this period of 10 weeks, I've done a lot of work and learnt a lot in my way. + +During this period of 10 weeks, I've done a lot of work and learnt a lot in my way.\ As you can see below, the before and after images, I've implemented more than 300 test cases and increased the test coverage 5 folds. ### before : -

- a picture showing the result of running testcases before the project -

-### after :

- a picture showing the result of running testcases after the project + a picture showing the result of running testcases before the project

+### after : - +

+ a picture showing the result of running testcases after the project +

I am extremely grateful to the community and Gsoc. I sincerely appreciate my mentor [Guillermo](https://github.com/guillemontecinos) for his constant support and motivation provided throughout the period. I had a great time!! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/sakshamsaxena_gsoc_2017.mdx b/src/content/contributor-docs/en/project_wrapups/sakshamsaxena_gsoc_2017.mdx index f6c5087e19..4030457850 100644 --- a/src/content/contributor-docs/en/project_wrapups/sakshamsaxena_gsoc_2017.mdx +++ b/src/content/contributor-docs/en/project_wrapups/sakshamsaxena_gsoc_2017.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Wrapping up GSoC 2017 with p5.js (by [@sakshamsaxena](https://github.com/sakshamsaxena)) ## Summary @@ -14,7 +10,7 @@ There were 3 major tasks that were proposed to pursue this summer under Google S Reporting Bugs or Feature Suggestions by the Community through Issues is also a significant contribution to the Project and it catalyses the growth of Project through them. Relevant responses and discussions in context to those, delivered in a short time, further engages the community into the Project. The GitHub Issue Template was [added](https://github.com/processing/p5.js/commits/main/ISSUE_TEMPLATE.md?author=sakshamsaxena) as my first contribution under GSoC on June 12, and till date it has been proven to be extremely helpful to both the reporter as well as responder, meanwhile aligning to it's original aim. -Preview of the complete template : +Preview of the complete template : ![Preview of the complete template](http://www.clipular.com/c/4631172675272704.png?k=gQwp7j5erUp9iZDrZvlEWY-27KY) Some helpful comments are added alongside to make the experience of reporting an issue significantly lucid to a complete beginner. You can see the same when you [open a new issue](https://github.com/processing/p5.js/issues/new). @@ -24,10 +20,13 @@ Some helpful comments are added alongside to make the experience of reporting an This task was inspired by [Issue #94](https://github.com/processing/p5.js/issues/94). The goal was to implement such a functionality which enables users to select the desired components/modules which they want to use, and only those components would be bundled then itself to generate a custom build of p5.js. Currently, the usage is through invoking a Grunt task manually from the command line : + ```shell $ grunt combineModules:module_a[:module_b][:module_c] ``` -where `module_X` refers to the name of the _*folder*_ of the desired component, viz. : + +where `module_X` refers to the name of the **folder** of the desired component, viz. : + ``` color core @@ -38,18 +37,19 @@ utilities math typography ``` + Core is included by default in all cases. The output bundle is found in `lib/modules` directory. ### 3. Automating the Release Process -A dedicated and detailed Grunt Task was written which handles the release process end to end. It covers Testing, Version Bump, Building Library and Docs, Creating a new Commit and Tag with the bumped package.json, Pushing these changes to GitHub (to this p5.js repo), Release the library files only on NPM, and Bower (by updating the release repo maintained by @lmccart), Updating the docs in the website repo with newly generated ones, Drafting a GitHub Release (on this repo) with the JS files and the Zip as mentioned. +A dedicated and detailed Grunt Task was written which handles the release process end to end. It covers Testing, Version Bump, Building Library and Docs, Creating a new Commit and Tag with the bumped package.json, Pushing these changes to GitHub (to this p5.js repo), Release the library files only on NPM, and Bower (by updating the release repo maintained by @lmccart), Updating the docs in the website repo with newly generated ones, Drafting a GitHub Release (on this repo) with the JS files and the Zip as mentioned. The owner is required to provide the following beforehand initiating the process : -* Exporting an environment variable (only for the first time) which would hold the [GitHub Access Token](https://github.com/settings/tokens) for publishing a GitHub Release. -```export GITHUB_TOKEN=``` +* Exporting an environment variable (only for the first time) which would hold the [GitHub Access Token](https://github.com/settings/tokens) for publishing a GitHub Release. + `export GITHUB_TOKEN=` * Invoking the Grunt Task with the minor/major/patch/tag name as argument. Default is patch. -```grunt release-p5:minor``` + `grunt release-p5:minor` Intermediate pulling or pushing is performed over HTTPS, so it might need user input for authentication (username/password). @@ -59,9 +59,8 @@ New features were implemented in p5.js which would receive user feedback once th ## Support -Any questions pertaining to the above mentioned tasks may be addressed via Issues. Simply create a new Issue and either assign or tag me in the conversation with [@sakshamsaxena](https://github.com/sakshamsaxena). For shout-outs and shout-downs, tweet me [@TopGunDoggo](https://twitter.com/TopGunDoggo), or if you're old school like me, email me at [saksham_saxena@outlook.com](mailto:saksham_saxena@outlook.com). +Any questions pertaining to the above mentioned tasks may be addressed via Issues. Simply create a new Issue and either assign or tag me in the conversation with [@sakshamsaxena](https://github.com/sakshamsaxena). For shout-outs and shout-downs, tweet me [@TopGunDoggo](https://twitter.com/TopGunDoggo), or if you're old school like me, email me at [saksham\_saxena@outlook.com](mailto:saksham_saxena@outlook.com). ## Acknowledgements -Thanks to Lauren McCarthy, my mentor, and Adam, Kenneth, dhowe and other contributors of p5.js for showing immense support and encouraging environment which helped me exceed my own expectations! Thank you so much :smile: - \ No newline at end of file +Thanks to Lauren McCarthy, my mentor, and Adam, Kenneth, dhowe and other contributors of p5.js for showing immense support and encouraging environment which helped me exceed my own expectations! Thank you so much :smile: diff --git a/src/content/contributor-docs/en/project_wrapups/sanjay_singh_rajpoot_gsoc2020.mdx b/src/content/contributor-docs/en/project_wrapups/sanjay_singh_rajpoot_gsoc2020.mdx index 3ea63f99d4..0178080ba5 100644 --- a/src/content/contributor-docs/en/project_wrapups/sanjay_singh_rajpoot_gsoc2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/sanjay_singh_rajpoot_gsoc2020.mdx @@ -1,23 +1,21 @@ - ---- - ---- - # Internationalization(i18n) and Deployment of p5.js website +# Internationalization(i18n) and Deployment of p5.js website #### By Sanjay Singh Rajpoot ([@SanjaySinghRajpoot](https://github.com/SanjaySinghRajpoot) | GSoC 2021 ### Overview + The p5.js website has all the features but it lacked Translation features. In this project, I have added the new translation feature to the P5.js website. Due to internationalization (i18n), the p5.js website is built from templates that retrieve the text content from data files. The entire site is built with Node JS, Handlebars, and Grunt. There are three kinds of pages and each works differently: References, examples, and other web pages. References Pages are built-in English and swapped to other languages using JS on the front-end. Translation content is stored in a JSON object. For every new page, we need to create a key-value pair in the hi.yml file. A single JS template is also needed. Examples pages are built from templates with handlebars, while examples are stored in JS files. To implement i18n, new templates were created specifically for the Hindi language, so that Examples were rendered properly. Other pages are built from templates in which Handlebars point to the content in the actual language when rendered. The major goals of this project were: -1. Adding new translation feature and new hindi language to p5.js website. -2. Making sure that the website is ready for production use. +1. Adding new translation feature and new hindi language to p5.js website. +2. Making sure that the website is ready for production use. ### Workflow -#### Task 1: First Page Test -Running a small test of my proposal solution by translating `get-started` page and then analyzing page performance. +#### Task 1: First Page Test + +Running a small test of my proposal solution by translating `get-started` page and then analyzing page performance. Process followed: @@ -27,7 +25,6 @@ Process followed: 4. Creating a new `hi.json` which will store all the references. 5. Creating a new menu entry in the `src/templates/partials/i18n.hbs` and creating a new button to toggle between different languages. - #### Task 2: Migrating the entire website to p5.js current version There were many PR’s which were merged into the English format of the p5.js website but the Hindi version was outdated and obsolete. To fix these problems a separate new `main-hindi`branch was created so that it up to date with the current English version. @@ -37,12 +34,12 @@ There were many PR’s which were merged into the English format of the p5.js we There are three kinds of pages and each works differently: References, examples, and other web pages. References Pages are built-in English and swapped to other languages using JS on the front-end. Translation content is stored in a JSON object. For every new page, we need to create a key-value pair in the `hi.yml` file. A single JS template is also needed. Examples pages are built from templates with handlebars, while examples are stored in JS files. To implement `i18n`, new templates were created specifically for the Hindi language, so that Examples were rendered properly. Other pages are built from templates in which Handlebars point to the content in the actual language when rendered. P5.js website has over 100+ examples and 200+ References each individual has their own website with code examples and documentation. Each of them was translated to Hindi using handlebars and YAML file formats. - ## PRs made -### Final PR +### Final PR + [GSoC'21: New Hindi Branch #1071](https://github.com/processing/p5.js-website/pull/1071) + ### i18n and new webpages -[GSoC'21: i18n of p5.js website, Translated pages for Hindi Language #1041](https://github.com/processing/p5.js-website/pull/1041) - \ No newline at end of file +[GSoC'21: i18n of p5.js website, Translated pages for Hindi Language #1041](https://github.com/processing/p5.js-website/pull/1041) diff --git a/src/content/contributor-docs/en/project_wrapups/sanket_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/sanket_gsoc_2019.mdx index f43cd293f9..069901c0fc 100644 --- a/src/content/contributor-docs/en/project_wrapups/sanket_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/sanket_gsoc_2019.mdx @@ -1,49 +1,56 @@ - ---- - ---- # Improving WebGL functionality + #### By Sanket Singh([@sanketsingh24](https://github.com/sanketsingh24)) ### Overview + During this Google Summer of Code, I worked with my mentor [Adam Ferriss](https://github.com/aferriss) to improve the current functionality of p5.js. I mainly focused on the lighting functionalities, and implemented five new functions for the artists, along with one new function related to camera functionality. I also tried to improve the shaders and modified them heavily. ### Contributions + During the course of Summer of Code, I submitted 7 pull requests which were related to my work. Those are- -- [A new parser to load STL files using loadModel()](https://github.com/processing/p5.js/pull/3675) -- [lightFalloff()](https://github.com/processing/p5.js/pull/3786) -- [emissiveMaterial()](https://github.com/processing/p5.js/pull/3820) -- [specularColor()](https://github.com/processing/p5.js/pull/3843) -- [spotLight()](https://github.com/processing/p5.js/pull/3913) -- [frustum()](https://github.com/processing/p5.js/pull/3927) -- [noLights()](https://github.com/processing/p5.js/pull/3955) + +* [A new parser to load STL files using loadModel()](https://github.com/processing/p5.js/pull/3675) +* [lightFalloff()](https://github.com/processing/p5.js/pull/3786) +* [emissiveMaterial()](https://github.com/processing/p5.js/pull/3820) +* [specularColor()](https://github.com/processing/p5.js/pull/3843) +* [spotLight()](https://github.com/processing/p5.js/pull/3913) +* [frustum()](https://github.com/processing/p5.js/pull/3927) +* [noLights()](https://github.com/processing/p5.js/pull/3955) Apart from implementing these functions, I also added unit tests, manual tests, documentation, and inline example for each of these functions. While documentation and inline example for each function can be found [here](https://p5js.org/reference/), [unit tests](https://github.com/processing/p5.js/tree/main/test/unit) and [manual tests](https://github.com/processing/p5.js/tree/main/test/manual-test-examples) are present in the codebase and are evaluated every time the library is built. -Before and during the Summer of Code, I fixed minor bugs unrelated to my project, which helped me immensely to understand and get around the codebase and the workflow of p5.js. They are listed [here](https://github.com/processing/p5.js/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Asanketsingh24). +Before and during the Summer of Code, I fixed minor bugs unrelated to my project, which helped me immensely to understand and get around the codebase and the workflow of p5.js. They are listed [here](https://github.com/processing/p5.js/pulls?utf8=%E2%9C%93\&q=is%3Apr+author%3Asanketsingh24). ### [lightFalloff()](https://p5js.org/reference/#/p5/lightFalloff) + This function allows the user to set the attenuation values, which are used in shaders to restrict the spread of light. Earlier, this was a constant value. Now, the artists can use this function to set the value themselves. Implementing this function required me to add three new uniforms, as well as modifying the light shader and light.js. The default was set to 1. ### [emissiveMaterial()](https://github.com/processing/p5.js/pull/3820) + This function adds a new type of material to p5.js. This material doesn't react to lights and behaves in a way which makes it seem the material is glowing. This function doesn't make the material to emit light itself. Implementation required a new uniform to store the color of the material and modifying the shaders. The function itself is implemented in material.js. ### [specularColor()](https://github.com/processing/p5.js/pull/3843) + This function attempts to divide the diffuse color and specular color for the materials. If the artist wants to use specific colors for the specular highlight, they can call this function before the actual light function to affect it. Earlier, the specular highlight's color could only be effected by modifying the material's color, which is not the case now. Specular color can be attached to the light itself. Implementation required four new uniforms. The function was implemented in light.js. If this function is not used before any lighting method, the default value was set to (255, 255, 255) so to not make this a breaking change. ### [spotLight()](https://github.com/processing/p5.js/pull/3913) + This function implements a new kind of light for p5.js which was not present before. This light emits from a point in a specified direction, with the light having a spread, calculated from a given angle, and a concentration value, which concentrates the light towards the center. Angle and concentration were set to default to PI/3 and 100 respectively. The function was implemented in light.js and six new uniforms were added. One of the challenges I faced was to parse the input, not only due to several parameters, but the format of color, location, and direction of light can be provided as p5.Color and p5.Vector objects. ### [frustum()](https://github.com/processing/p5.js/pull/3927) + This function helps you to change the camera perspective. Earlier, the artists could use perspective() to set the camera, but the new camera would always be symmetric. This function can help you to set asymmetric cameras. Implemented in p5.Camera.js, this function is extended as a prototype of p5.Camera object. ### [noLights()](https://github.com/processing/p5.js/pull/3955) + This function removes all the lighting from the sketch which were called before this method. It will reset the lighting from the sketch for the subsequent materials. Calling the lighting methods will re-enable the lighting. It affects `ambientLight()`, `specularColor()`, `directionalLight()`, `pointLight()`, `spotLight()`, `lightFalloff()`, and `shininess()`. It was implemented in light.js. ### Future -- Currently, the library can only make WebGL geometries of a single material. We can expand the shaders so that geometries can be made up of multiple materials and their property. This suggestion is filed as a [issue](https://github.com/processing/p5.js/issues/3806) in the repository. -- p5 Object can be simplified to make it easier for contributors can go through. [For example, all the lighting variables can be bundled inside of a single property which is easier to interpret](https://github.com/processing/p5.js/pull/3843#pullrequestreview-270874570). + +* Currently, the library can only make WebGL geometries of a single material. We can expand the shaders so that geometries can be made up of multiple materials and their property. This suggestion is filed as a [issue](https://github.com/processing/p5.js/issues/3806) in the repository. +* p5 Object can be simplified to make it easier for contributors can go through. [For example, all the lighting variables can be bundled inside of a single property which is easier to interpret](https://github.com/processing/p5.js/pull/3843#pullrequestreview-270874570). ### Acknowledgement -The success and outcome of this project required a lot of guidance and assistance from my mentor, [Adam Ferriss]((https://github.com/aferriss)) and I am extremely privileged to have got this all along with the completion of my project. All that I have done is only due to such supervision and assistance and I would not forget to thank him. Also, kudos to all the members of the Processing Foundation and my fellow contributors for making this summer enjoyable and contributing to open source a pleasure. Also, a big thanks to Google for this wonderful program. - \ No newline at end of file + +The success and outcome of this project required a lot of guidance and assistance from my mentor, [Adam Ferriss](\(https://github.com/aferriss\)) and I am extremely privileged to have got this all along with the completion of my project. All that I have done is only due to such supervision and assistance and I would not forget to thank him. Also, kudos to all the members of the Processing Foundation and my fellow contributors for making this summer enjoyable and contributing to open source a pleasure. Also, a big thanks to Google for this wonderful program. diff --git a/src/content/contributor-docs/en/project_wrapups/shantanuKaushik_gsoc_2021.mdx b/src/content/contributor-docs/en/project_wrapups/shantanuKaushik_gsoc_2021.mdx index e3bed9ace5..2696c67489 100644 --- a/src/content/contributor-docs/en/project_wrapups/shantanuKaushik_gsoc_2021.mdx +++ b/src/content/contributor-docs/en/project_wrapups/shantanuKaushik_gsoc_2021.mdx @@ -1,22 +1,20 @@ - ---- - ---- - # Adding to p5.js Friendly Error System +# Adding to p5.js Friendly Error System #### By Shantanu Kaushik ([@Aloneduckling](https://github.com/Aloneduckling)) | GSoC 2021 ### Overview + Throughout this summer, I worked on p5.js's Friendly Error System (FES in short) under the mentorship of Thales Grilo and Luis Morales-Navarro. The FES is a p5.js feature which supports beginners when encountering common errors, checking for common mistakes and providing simple and easy to understand error messages. This project aimed to further improve FES by further building on an existing feature and adding new features. The major goals of this project were: -1. Additions to FES's `fesErrorMonitor`. -2. Allowing FES to detect redeclaration of p5.js reserved variables and functions +1. Additions to FES's `fesErrorMonitor`. +2. Allowing FES to detect redeclaration of p5.js reserved variables and functions ### Work + #### Phase 1: Adding to FES's `fesErrorMonitor` `fesErrorMonitor` functionality of FES shows the error given by the browsers and its details in a simple form. This feature was introduced to FES in GSoC 2020 by Akshay Padte. @@ -46,6 +44,7 @@ let text = function(){ } //if the user intends to user p5.js text function somewhere in their code then it won't work ``` + The new feature `sketch_reader.js` tackles this problem. `sketch_reader.js` does the following: @@ -53,27 +52,29 @@ The new feature `sketch_reader.js` tackles this problem. (I) Checks if any p5.js constant or function is declared by the user outside the `setup` and `draw` function and reports it. (II) In `setup` and `draw` function it performs: - 1. Extraction of the code written by the user - 2. Conversion of the code to an array of lines of code - 3. Catching variable and function declaration - 4. Checking if the declared function/variable is a reserved p5.js constant or function and report it. -While working on this feature I learned a lot of new things about p5.js and the working of the FES. +1. Extraction of the code written by the user +2. Conversion of the code to an array of lines of code +3. Catching variable and function declaration +4. Checking if the declared function/variable is a reserved p5.js constant or function and report it. + +While working on this feature I learned a lot of new things about p5.js and the working of the FES. This feature was a necessary addition as it resolves a common problem which the new p5.js users might encounter. All the work in this phase can be viewed here: [Detecting redeclaration of p5.js reserved constants and functions #5351](https://github.com/processing/p5.js/pull/5351) ### Conclusion and Acknowledgements -I enjoyed working on this project and learned a lot of things this summer. +I enjoyed working on this project and learned a lot of things this summer. -I would like to thank my mentors **Thales Grilo** and **Luis Morales-Navarro** for their invaluable help and guidance throughout this summer of code. I would like to thank the **Processing Foundation** for creating such an awesome library. I would also like to thank **Google the GSoC team** for giving student developers like me a chance to work on awesome projects and make our summer productive. +I would like to thank my mentors **Thales Grilo** and **Luis Morales-Navarro** for their invaluable help and guidance throughout this summer of code. I would like to thank the **Processing Foundation** for creating such an awesome library. I would also like to thank **Google the GSoC team** for giving student developers like me a chance to work on awesome projects and make our summer productive. ## PRs made ### Phase 1 + [GSoC'21: adding to FES phase 1 #5305](https://github.com/processing/p5.js/pull/5305) + ### Phase 2 -[Detecting redeclaration of p5.js reserved constants and functions #5351](https://github.com/processing/p5.js/pull/5351) - \ No newline at end of file +[Detecting redeclaration of p5.js reserved constants and functions #5351](https://github.com/processing/p5.js/pull/5351) diff --git a/src/content/contributor-docs/en/project_wrapups/shubham_sharma_gsoc_2022.mdx b/src/content/contributor-docs/en/project_wrapups/shubham_sharma_gsoc_2022.mdx index 077df0c907..b5421729be 100644 --- a/src/content/contributor-docs/en/project_wrapups/shubham_sharma_gsoc_2022.mdx +++ b/src/content/contributor-docs/en/project_wrapups/shubham_sharma_gsoc_2022.mdx @@ -1,7 +1,3 @@ - ---- - ---- # GSoC-2022-Wrap-Up ## Improving p5.js WebGL functionality @@ -10,14 +6,15 @@ ### Overview -The primary purpose over the course of this summer through GSoC 2022 was to focus on the refactoring of the WebGL rendering pipeline so that multiple materials can be applied to geometry simultaneously and implementing the missing feature of certain geometry in WebGL mode like corner radius is not accepted for the rectangle in WebGL mode, etc. +The primary purpose over the course of this summer through GSoC 2022 was to focus on the refactoring of the WebGL rendering pipeline so that multiple materials can be applied to geometry simultaneously and implementing the missing feature of certain geometry in WebGL mode like corner radius is not accepted for the rectangle in WebGL mode, etc. Key areas of my proposals were - -- Correcting the inappropriate behavior of certain geometry in WebGL mode. -- Refactoring of the WebGL rendering pipeline so that multiple materials can be applied to geometry. +* Correcting the inappropriate behavior of certain geometry in WebGL mode. +* Refactoring of the WebGL rendering pipeline so that multiple materials can be applied to geometry. ### Task Details + ## Correcting the inappropriate behavior of rect() in WebGL: [PR](https://github.com/processing/p5.js/pull/5789) I started my GSoC 2022 work by addressing [#issue5001](https://github.com/processing/p5.js/issues/5001), rect() function takes eight parameters in which the last four parameters define the determined corner radius for the top-left, top-right, lower-right, and lower-left corners, respectively. But, even after passing these parameters, the rect() does nothing in WebGL mode. It could be confusing for beginners as, currently, p5.js doesn’t show errors related to it. @@ -48,13 +45,14 @@ After: ![image](https://user-images.githubusercontent.com/47415702/189298948-55e9306a-8a5e-4a82-b208-dbdc725365d8.png) ### Future Work: + While using higher strokeWeight, it starts showing artifacts, for more minor strokeWeight it looks fine; this issue actually exists while using the thicker strokeWeight, so for this, we need to look upon the stroke renderer much more closely. ![image](https://user-images.githubusercontent.com/47415702/189299200-25d111b6-b135-4573-8659-f24f6ea8d67c.png) - ## Multiple Materials applied to Geometry: [PR](https://github.com/processing/p5.js/pull/5774) -Each object reacts to light differently in the real world. Steel items, for example, are often shinier than clay vases, and wooden containers do not respond to light in the same way that steel containers do. Some objects absorb light with little scattering, resulting in small specular highlights, while others scatter widely, resulting in a greater radius for the highlight. + +Each object reacts to light differently in the real world. Steel items, for example, are often shinier than clay vases, and wooden containers do not respond to light in the same way that steel containers do. Some objects absorb light with little scattering, resulting in small specular highlights, while others scatter widely, resulting in a greater radius for the highlight. So finally, we have decided to move away from the current overwriting of fill colors to the geometry towards the approach that Processing uses where the material has different color properties (ambient, emissive, specular) that all contribute separately to the lighting of the surface. @@ -96,6 +94,7 @@ function draw() { ``` + Before: ![image](https://user-images.githubusercontent.com/47415702/189299616-9e047451-0d3c-4cb8-b04d-aa37ae1f3572.png) @@ -104,16 +103,16 @@ After: ![image](https://user-images.githubusercontent.com/47415702/189299695-92683040-c3e8-46e8-9fe3-331681535e33.png) - Effect of combining all the material propertied like fill(), ambientMaterial(), SpecularMaterial() and emissiveMaterial() over geometry now results in: ![image](https://user-images.githubusercontent.com/47415702/189299930-430735df-3aaa-46b5-8b4c-7fb1c7db6362.png) ### Pull Requests: -- Added round corner property for rect() in WebGL mode. [PR#5789](https://github.com/processing/p5.js/pull/5789) -- Feature Implemented -- Multiple Material support for geometry [PR#5774](https://github.com/processing/p5.js/pull/5774) +* Added round corner property for rect() in WebGL mode. [PR#5789](https://github.com/processing/p5.js/pull/5789) + +* Feature Implemented -- Multiple Material support for geometry [PR#5774](https://github.com/processing/p5.js/pull/5774) ## Conclusion & Acknowledgements + Thanks to my mentor [@calebfoss](https://github.com/calebfoss) for all the guidance and feedback throughout the project, other contributors of p5.js, and the whole processing community for showing immense support and an encouraging environment, which helped me exceed my own expectations! Thank you so much 😄 - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/sithencube_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/sithencube_gsoc_2018.mdx index 0244846a4a..fb617e1ce0 100644 --- a/src/content/contributor-docs/en/project_wrapups/sithencube_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/sithencube_gsoc_2018.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Designing a test strategy to maintain and update mobile usability of p5.js (by [@LadySith](https://github.com/LadySith)) ## Summary @@ -12,7 +8,6 @@ Part of this project included a testing event in the form of a creative coding w As part of the project I also attended to some minor issues on Github. - ## Sumbission contains: ### 1. [Attending to p5.js mobile issues](https://github.com/processing/p5.js/labels/area%3Amobile) @@ -28,21 +23,23 @@ This folder contains visual screenshots of each example from the p5.js reference This serves as a guideline to what was extensively tested and what new issues were and will be created from performing mobile tests on given sets of data. ### 4. Medium articles reporting work done during first and second month -- [1st month](https://medium.com/@_LadySith/designing-a-test-strategy-for-updating-mobile-functionality-of-p5-js-part-1-a8fe5a212e96) -- [2nd month](https://medium.com/@_LadySith/a-test-strategy-for-updating-mobile-functionality-of-p5-js-part-2-71c9f8f9af25) +* [1st month](https://medium.com/@_LadySith/designing-a-test-strategy-for-updating-mobile-functionality-of-p5-js-part-1-a8fe5a212e96) +* [2nd month](https://medium.com/@_LadySith/a-test-strategy-for-updating-mobile-functionality-of-p5-js-part-2-71c9f8f9af25) ### 5. [Content created for creative coding workshop](https://drive.google.com/drive/folders/1fVq3ufqNyeAvFotNYLdKSXmKe0rko0cD) -This content was created for a creative coding workshop in Port Elizabeth South Africa teaching school girls of various backgrounds coding using p5.js on both desktop and tablet. +This content was created for a creative coding workshop in Port Elizabeth South Africa teaching school girls of various backgrounds coding using p5.js on both desktop and tablet. ## Impediments + I experienced a lot of trouble working with npm and grunt to resolve p5.js-website mobile issues. I am still trying to fix the dependencies so I can finish this part of the work. There are two issues that I feel are very necessary to close to improve the mobile usability of people accessing the p5.js website. ## To be completed after submission -- Closing of issues related to mobile website performance -- Recommended feature for addition to -- Completing final medium article after the closing of the above issues + +* Closing of issues related to mobile website performance +* Recommended feature for addition to +* Completing final medium article after the closing of the above issues ## Conclusion @@ -51,5 +48,3 @@ The project served to extensively test mobile usability of p5.js by going throug ## Acknowledgements Thanks to my mentor Lee Tusman for his support and insight as I worked through this project, to Lauren McCarthy for creating this library and assisting me with my work on the p5.js-website repository as well as all members of the p5.js community for allowing me to contribute and explore open source for the first time. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/slominski_gsoc_2022.mdx b/src/content/contributor-docs/en/project_wrapups/slominski_gsoc_2022.mdx index ac89442913..8f806e25e3 100644 --- a/src/content/contributor-docs/en/project_wrapups/slominski_gsoc_2022.mdx +++ b/src/content/contributor-docs/en/project_wrapups/slominski_gsoc_2022.mdx @@ -1,58 +1,53 @@ - ---- - ---- # Resolving Bugs and Expanding Documentation for WebGL in p5.js For my Google Summer of Code 2022 project I worked with my mentor, Kate Hollenbach to add to documentation concerning WebGL functionality in p5.js. Through discussions with my mentor, this project became primarily focused on the creation of four tutorials to be included in the p5.js website, in addition to some contributions concerning accessibility of WebGL website examples. ## Code -[PR for the addition of describe() to all WebGL references and examples] (https://github.com/processing/p5.js/pull/5706) -[PR containing all code and conversation relating to the tutorials] (https://github.com/processing/p5.js-website/pull/1268) -[PR for the standalone texture feedback example] (https://github.com/processing/p5.js-website/pull/1246) -[PR for the addition of .gitattributes] (https://github.com/processing/p5.js-website/pull/1238) -[PR for miscellaneous example fixes] (https://github.com/processing/p5.js-website/pull/1282) +\[PR for the addition of describe() to all WebGL references and examples] ([https://github.com/processing/p5.js/pull/5706](https://github.com/processing/p5.js/pull/5706)) +\[PR containing all code and conversation relating to the tutorials] ([https://github.com/processing/p5.js-website/pull/1268](https://github.com/processing/p5.js-website/pull/1268)) +\[PR for the standalone texture feedback example] ([https://github.com/processing/p5.js-website/pull/1246](https://github.com/processing/p5.js-website/pull/1246)) +\[PR for the addition of .gitattributes] ([https://github.com/processing/p5.js-website/pull/1238](https://github.com/processing/p5.js-website/pull/1238)) +\[PR for miscellaneous example fixes] ([https://github.com/processing/p5.js-website/pull/1282](https://github.com/processing/p5.js-website/pull/1282)) ## Contributions -Prior to my involvement with GSOC I didn’t have much experience or knowledge of the contribution process for projects like p5.js. I began the project by looking through the existing documentation and example content for WebGL features. This led to me making a number of improvements to the examples, primarily concerning tweaks to the examples to make them more illustrative and up-to-date, as well as the introduction of a texture feedback effect example. +Prior to my involvement with GSOC I didn’t have much experience or knowledge of the contribution process for projects like p5.js. I began the project by looking through the existing documentation and example content for WebGL features. This led to me making a number of improvements to the examples, primarily concerning tweaks to the examples to make them more illustrative and up-to-date, as well as the introduction of a texture feedback effect example. -This was followed by the addition of describe() text to all WebGL examples, making these examples more usable for people who rely on screen readers, as well as increasing the visibility of the describe() method so that more developers will know it exists and how it should be used. During this process I began to have issues with some of the developer tooling for p5.js-website, which I addressed by contributing a .gitattributes file that resolved some line ending issues that were making development on Windows difficult. +This was followed by the addition of describe() text to all WebGL examples, making these examples more usable for people who rely on screen readers, as well as increasing the visibility of the describe() method so that more developers will know it exists and how it should be used. During this process I began to have issues with some of the developer tooling for p5.js-website, which I addressed by contributing a .gitattributes file that resolved some line ending issues that were making development on Windows difficult. -Through discussions with my mentor, it became clear that the existing WebGL tutorials were in need of expansion and updating. I began writing a "Getting Started with WebGL" tutorial that covers introductory concepts for working with WebGL and 3D within p5.js. This tutorial covered setup, 3D transformations, lighting, materials, geometry, and basic shader programming. After the addition of further content and examples it became clear that this tutorial should be broken into four separate tutorials with the following structure: +Through discussions with my mentor, it became clear that the existing WebGL tutorials were in need of expansion and updating. I began writing a "Getting Started with WebGL" tutorial that covers introductory concepts for working with WebGL and 3D within p5.js. This tutorial covered setup, 3D transformations, lighting, materials, geometry, and basic shader programming. After the addition of further content and examples it became clear that this tutorial should be broken into four separate tutorials with the following structure: Introduction to WebGL in p5.js -* Getting Started in 3D - * Basic concepts - * Coordinates - * Transformations - * Basic geometry and primitives -* Creating Custom Geometry - * Loading models from files - * Creating geometry procedurally -* Styling and Appearance - * Camera - * Material - * Lighting - * Textures + +* Getting Started in 3D + * Basic concepts + * Coordinates + * Transformations + * Basic geometry and primitives +* Creating Custom Geometry + * Loading models from files + * Creating geometry procedurally +* Styling and Appearance + * Camera + * Material + * Lighting + * Textures * Introduction to Shaders - * Background - * Basic syntax and concepts - * Basic use in p5.js - * Uniforms - * Further reading + * Background + * Basic syntax and concepts + * Basic use in p5.js + * Uniforms + * Further reading -Each of these tutorials include various illustrations, interactive examples, and text. While writing these tutorials I also spent time becoming more familiar with the library, as well as reading similar tutorials for other libraries and toolkits. +Each of these tutorials include various illustrations, interactive examples, and text. While writing these tutorials I also spent time becoming more familiar with the library, as well as reading similar tutorials for other libraries and toolkits. -Following the writing of these tutorials I also prepared them for internationalization, which involved the creation of template files with tags that can be updated by translators in other languages. +Following the writing of these tutorials I also prepared them for internationalization, which involved the creation of template files with tags that can be updated by translators in other languages. The tutorials can be found on the p5.js websites Learn section here (to be added): And the code and commits for these contributions can be found at (to be added): -##Acknowledgements - -I want to express my gratitude towards my mentor Kate Hollenbach for her guidance throughout this project, as well as towards the p5.js community for its openness and helpfulness. +\##Acknowledgements - \ No newline at end of file +I want to express my gratitude towards my mentor Kate Hollenbach for her guidance throughout this project, as well as towards the p5.js community for its openness and helpfulness. diff --git a/src/content/contributor-docs/en/project_wrapups/smrghsh_gsoc_2022.mdx b/src/content/contributor-docs/en/project_wrapups/smrghsh_gsoc_2022.mdx index 2f8c386c25..1393d86a03 100644 --- a/src/content/contributor-docs/en/project_wrapups/smrghsh_gsoc_2022.mdx +++ b/src/content/contributor-docs/en/project_wrapups/smrghsh_gsoc_2022.mdx @@ -1,13 +1,10 @@ - ---- - ---- # GSOC 22 Work Summary + To quickly view contributions please visit this link: [https://github.com/stalgiag/p5.xr/commits?author=smrghsh](https://github.com/stalgiag/p5.xr/commits?author=smrghsh) - # Enter VR button -- Immersive Session Process Update + The first goal of my work with p5xr was to improve the process by which a user enters a VR app. I was inspired by the way Three.js VR projects offer a scene preview and a VR button. This offers significant improvements for use, for distribution, and for development. For the user - Immersive environments can be very intense experiences. By providing the user with a preview of the scene, a user can be primed with an expectation of experience, increasing comfort and safety. @@ -24,6 +21,7 @@ This is how p5xr would display a VR scene has a green cube with a magenta backgr [https://github.com/stalgiag/p5.xr/issues/169](https://github.com/stalgiag/p5.xr/issues/169) ## Process Analysis + Working with WebXR Sessions and Devices was new to me, so under the advice of my mentor, I undertook a process analysis to learn about how three.js accomplished this goal and how p5js worked with WebXR. WebXR documentation feels quite sparse with regards to best practices and procedures, and it took me some time to learn. ![Process diagram of Three.js](https://user-images.githubusercontent.com/22751315/179166072-0982e2b6-8fb3-4305-9727-c48f39cd6ad9.png) @@ -38,36 +36,34 @@ p5xr accounted for this, but creating a process diagram revealed opportunities t [Figma link](https://www.figma.com/file/MO8ffPGo90uwwua4qqyT4W/three.js-vs-p5xr-vs-new-p5xr-XR-launcher?node-id=0%3A1) ### Challenges with implementation -One challenge that I struggled with was dealing with resetting the [reference space](https://immersive-web.github.io/webxr/spatial-tracking-explainer.html) in between launching a VR experience for the user and returning to an inline session in an HMD’s 2D web browser. This is needed because the physical space that a user navigates in an HMD is different than how they would interact in 2D. During this reset it’s necessary to set this, as well as a particular subset of `XR` properties to `null` in order to completely clear this, Examining a [similar issue with Aframe’s development](https://github.com/aframevr/aframe/issues/4406) helped in the solution. + +One challenge that I struggled with was dealing with resetting the [reference space](https://immersive-web.github.io/webxr/spatial-tracking-explainer.html) in between launching a VR experience for the user and returning to an inline session in an HMD’s 2D web browser. This is needed because the physical space that a user navigates in an HMD is different than how they would interact in 2D. During this reset it’s necessary to set this, as well as a particular subset of `XR` properties to `null` in order to completely clear this, Examining a [similar issue with Aframe’s development](https://github.com/aframevr/aframe/issues/4406) helped in the solution. **View the pull request:** [https://github.com/stalgiag/p5.xr/pull/171](https://github.com/stalgiag/p5.xr/pull/171) # Controller API Update -https://user-images.githubusercontent.com/22751315/186528906-cf60441d-1cab-431e-b950-fecd9eb41ce2.mp4 -- Including the [Quaternion.js](https://github.com/infusion/Quaternion.js/) library as a dependency. -- Exposing the rotation as Euler angles (while respecting the `angleMode`) for progress for [Controller Input Rotation Data #158](https://github.com/stalgiag/p5.xr/issues/158). There is some gimbal-locking type behavior that is persisting. -- Updating the manual input test to show controller tracking with orientation as well as primary and second button presses -- Added notice about gimbal locking to documentation +[https://user-images.githubusercontent.com/22751315/186528906-cf60441d-1cab-431e-b950-fecd9eb41ce2.mp4](https://user-images.githubusercontent.com/22751315/186528906-cf60441d-1cab-431e-b950-fecd9eb41ce2.mp4) + +* Including the [Quaternion.js](https://github.com/infusion/Quaternion.js/) library as a dependency. +* Exposing the rotation as Euler angles (while respecting the `angleMode`) for progress for [Controller Input Rotation Data #158](https://github.com/stalgiag/p5.xr/issues/158). There is some gimbal-locking type behavior that is persisting. +* Updating the manual input test to show controller tracking with orientation as well as primary and second button presses +* Added notice about gimbal locking to documentation **View the pull request** [https://github.com/stalgiag/p5.xr/pull/181](https://github.com/stalgiag/p5.xr/pull/181) - ## Minor Contributions -- Small note to help Windows users with development, suggesting Git Bash to prevent errors with launching a local development server. Through this commit, Stalgia taught me contribution norms. + +* Small note to help Windows users with development, suggesting Git Bash to prevent errors with launching a local development server. Through this commit, Stalgia taught me contribution norms. [https://github.com/stalgiag/p5.xr/pull/168](https://github.com/stalgiag/p5.xr/pull/168) -- p5xr development has a set of manual tests in which the tester verifies app state manually; this pull request moves the objects in front of the tester, so they don’t have to turn their neck. I intended to increase usability and iteration speed with these changes +* p5xr development has a set of manual tests in which the tester verifies app state manually; this pull request moves the objects in front of the tester, so they don’t have to turn their neck. I intended to increase usability and iteration speed with these changes [https://github.com/stalgiag/p5.xr/pull/170](https://github.com/stalgiag/p5.xr/pull/170) - # Acknowledgements -Under the mentorship of Stalgia Grigg, I have learned invaluable methods of development and technical communication. This is my first time contributing to open source, and my first time interfacing with the WebXR API. At present, WebXR adoption is still growing, and the lack of best practices make development complex for new open source contributors. Stalgia has a unique ability to elucidate complex processes, and has fostered my interest on how to remove technical barriers to VR development. p5.js has shaped me as an artist, a developer, and an educator-- it is the basis on which I have built my technical skill. The opportunity to engage with how this library approaches VR is an honor. Thank you for this mentorship and opportunity. - - - \ No newline at end of file +Under the mentorship of Stalgia Grigg, I have learned invaluable methods of development and technical communication. This is my first time contributing to open source, and my first time interfacing with the WebXR API. At present, WebXR adoption is still growing, and the lack of best practices make development complex for new open source contributors. Stalgia has a unique ability to elucidate complex processes, and has fostered my interest on how to remove technical barriers to VR development. p5.js has shaped me as an artist, a developer, and an educator-- it is the basis on which I have built my technical skill. The opportunity to engage with how this library approaches VR is an honor. Thank you for this mentorship and opportunity. diff --git a/src/content/contributor-docs/en/project_wrapups/tanvi_gsoc_2018.mdx b/src/content/contributor-docs/en/project_wrapups/tanvi_gsoc_2018.mdx index 12240f099f..7695d77483 100644 --- a/src/content/contributor-docs/en/project_wrapups/tanvi_gsoc_2018.mdx +++ b/src/content/contributor-docs/en/project_wrapups/tanvi_gsoc_2018.mdx @@ -1,8 +1,5 @@ +# Improvements to existing I/O Methods of p5.js ---- - ---- -# Improvements to existing I/O Methods of p5.js ### by Tanvi Kumar ([@TanviKumar](https://github.com/TanviKumar)) ## Summary @@ -11,24 +8,24 @@ My project for GSoC'18 initially revolved around looking into the I/O methods an Throughout the three months, I've been able to modify code, add new features, add examples and make changes to documentation. A lot of my time was spent testing the methods on different browsers, replicating open issues to help resolve them and finding solutions for issues. -## Contributions during GSoC'18 +## Contributions during GSoC'18 ### Testing I/O methods The first coding period of GSoC'18 was spent analysing and testing the I/O methods on different browsers and also testing their examples. -On testing these methods, a common issue regarding the size of files to be fetched was found for the loading methods of p5.js. -[#2981](https://github.com/processing/p5.js/issues/2981) clearly encapsulated the other issues [#2661](https://github.com/processing/p5.js/issues/2661) and [#2216](https://github.com/processing/p5.js/issues/2216) regarding this. +On testing these methods, a common issue regarding the size of files to be fetched was found for the loading methods of p5.js. +[#2981](https://github.com/processing/p5.js/issues/2981) clearly encapsulated the other issues [#2661](https://github.com/processing/p5.js/issues/2661) and [#2216](https://github.com/processing/p5.js/issues/2216) regarding this. It was found that browsers like Chrome can easily fetch large files despite taking a lot of time, however old versions of browsers like Firefox can fetch files up to a maximum of 64MB in one request. A size allocation limit error would be reached if the file is too big. Various ideas were looked into to try and find appropriate solutions to these issues. -These included - +These included - Adding the knowledge of the size limit of browsers to the documentation, Generating errors before fetching lare files -Using HEAD requests to get the size of the file then producing an error if limit was exceeded and finally, -To fetch the file anyway in case a certain browser can handle it and issue a warning to the user. +Using HEAD requests to get the size of the file then producing an error if limit was exceeded and finally, +To fetch the file anyway in case a certain browser can handle it and issue a warning to the user. The final discussions have led to [#3217](https://github.com/processing/p5.js/pull/3127). The documentation for the loading methods will now warn the users regarding the issue about size limit and also give the user a friendly error if a large file is being fetched just so they may be informed. -The friendly error system (FES) of p5.js was used to do this. +The friendly error system (FES) of p5.js was used to do this. Some issues involved trying to replicate them so they may be fixed, including issue [#2842](https://github.com/processing/p5.js/issues/2842) and [#1829](https://github.com/processing/p5.js/issues/1829). @@ -40,9 +37,9 @@ It can give the user the hex string color value of the input element and also a ### New examples and documentation -- Added a new example and fixed the old example of the loadModel method in [#2968](https://github.com/processing/p5.js/pull/2968). This was to close the[#2904](https://github.com/processing/p5.js/issues/2904) . -- Changed the model() example in [#3074](https://github.com/processing/p5.js/pull/3074) -- Added the example and manual test example for createColorPicker method in [#3089](https://github.com/processing/p5.js/pull/3089) +* Added a new example and fixed the old example of the loadModel method in [#2968](https://github.com/processing/p5.js/pull/2968). This was to close the[#2904](https://github.com/processing/p5.js/issues/2904) . +* Changed the model() example in [#3074](https://github.com/processing/p5.js/pull/3074) +* Added the example and manual test example for createColorPicker method in [#3089](https://github.com/processing/p5.js/pull/3089) ## Conclusion @@ -51,4 +48,3 @@ GSoC'18 was an incredibly enriching experience. I'm happy to know that I was abl ## Acknowledgements I'd like to thank my mentor, [Alice Mira Chung](https://github.com/almchung) for her guidance, patience and support. I'd also like to thank Lauren McCarthy and others in the p5.js community who helped me successfuly close issues and guided me when I stumbled. Really grateful for having had this oppurtunity and such an encouraging environment. - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/urvashi_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/urvashi_gsoc_2019.mdx index 561f22696c..99a38a8f2a 100644 --- a/src/content/contributor-docs/en/project_wrapups/urvashi_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/urvashi_gsoc_2019.mdx @@ -1,45 +1,52 @@ - ---- - ---- - # Improve p5.js unit tests + ### by Urvashi Verma ([@ihsavru](https://github.com/ihsavru)) ## Overview -This project focused on improving the unit tests for different modules of p5.js. I spent my summer writing unit tests for different modules. I also worked on integrating the code coverage reports with Codecov through Travis CI. + +This project focused on improving the unit tests for different modules of p5.js. I spent my summer writing unit tests for different modules. I also worked on integrating the code coverage reports with Codecov through Travis CI. ## Contributions during GSoC'19 + I divided the timeline into smaller periods of a week or two to handle unit tests for each module. Following is a list of PRs submitted: + #### Core -- https://github.com/processing/p5.js/pull/3772 -- https://github.com/processing/p5.js/pull/3865 + +* [https://github.com/processing/p5.js/pull/3772](https://github.com/processing/p5.js/pull/3772) +* [https://github.com/processing/p5.js/pull/3865](https://github.com/processing/p5.js/pull/3865) #### Events -- https://github.com/processing/p5.js/pull/3824 -- https://github.com/processing/p5.js/pull/3814 -- https://github.com/processing/p5.js/pull/3810 -- https://github.com/processing/p5.js/pull/3809 + +* [https://github.com/processing/p5.js/pull/3824](https://github.com/processing/p5.js/pull/3824) +* [https://github.com/processing/p5.js/pull/3814](https://github.com/processing/p5.js/pull/3814) +* [https://github.com/processing/p5.js/pull/3810](https://github.com/processing/p5.js/pull/3810) +* [https://github.com/processing/p5.js/pull/3809](https://github.com/processing/p5.js/pull/3809) #### Image -- https://github.com/processing/p5.js/pull/3828 -- https://github.com/processing/p5.js/pull/3829 -- https://github.com/processing/p5.js/pull/3838 + +* [https://github.com/processing/p5.js/pull/3828](https://github.com/processing/p5.js/pull/3828) +* [https://github.com/processing/p5.js/pull/3829](https://github.com/processing/p5.js/pull/3829) +* [https://github.com/processing/p5.js/pull/3838](https://github.com/processing/p5.js/pull/3838) #### Typography -- https://github.com/processing/p5.js/pull/3839 -- https://github.com/processing/p5.js/pull/3844 + +* [https://github.com/processing/p5.js/pull/3839](https://github.com/processing/p5.js/pull/3839) +* [https://github.com/processing/p5.js/pull/3844](https://github.com/processing/p5.js/pull/3844) #### Utilities -- https://github.com/processing/p5.js/pull/3864 + +* [https://github.com/processing/p5.js/pull/3864](https://github.com/processing/p5.js/pull/3864) #### WebGL -- https://github.com/processing/p5.js/pull/3896 -- https://github.com/processing/p5.js/pull/3902 + +* [https://github.com/processing/p5.js/pull/3896](https://github.com/processing/p5.js/pull/3896) +* [https://github.com/processing/p5.js/pull/3902](https://github.com/processing/p5.js/pull/3902) ## Code Coverage + As of writing this report, the code coverage has been increased to 62.52% (along with an increase of total lines of code) from 50.41%. A summary is given below: Before summer of code: + ``` =============================== Coverage summary =============================== Statements : 50.41% ( 4598/9122 ) @@ -48,7 +55,9 @@ Functions : 56.49% ( 509/901 ) Lines : 50.95% ( 4541/8912 ) ================================================================================ ``` + After summer of code: + ``` =============================== Coverage summary =============================== Statements : 62.04% ( 6579/10604 ) @@ -57,12 +66,13 @@ Functions : 66.82% ( 707/1058 ) Lines : 62.53% ( 6444/10306 ) ================================================================================ ``` + You can find more detailed coverage reports for p5.js on [Codecov](https://codecov.io/gh/processing/p5.js) ### Documentation + I have documented about how to approach writing a unit test in the [developer docs for unit testing](https://github.com/processing/p5.js/blob/main/contributor_docs/unit_testing/) which was created by my mentor [Evelyn](https://github.com/outofambit). ## Acknowledgements -I am glad to be able to spend my summer contributing to p5.js. I would like to thank my mentor [Evelyn Masso](https://github.com/outofambit), for her support throughout the summer and for making sure that I had enough opportunities to grow during the project. I would also like to thank other members of the Processing Foundation for this opportunity and their help in making this project successful. - \ No newline at end of file +I am glad to be able to spend my summer contributing to p5.js. I would like to thank my mentor [Evelyn Masso](https://github.com/outofambit), for her support throughout the summer and for making sure that I had enough opportunities to grow during the project. I would also like to thank other members of the Processing Foundation for this opportunity and their help in making this project successful. diff --git a/src/content/contributor-docs/en/project_wrapups/vedhant_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/vedhant_gsoc_2019.mdx index a34cb36020..22acfbb670 100644 --- a/src/content/contributor-docs/en/project_wrapups/vedhant_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/vedhant_gsoc_2019.mdx @@ -1,39 +1,28 @@ - ---- - ---- # **Stabilizing and improving p5.xr during Alpha release** - ### **by Vedhant Agarwal ([@Vedhant](https://github.com/vedhant))** Over the course of the Google Summer of Code 2019 program for The Processing Foundation, I worked along with my mentor [Stalgia Grigg](https://github.com/stalgiag) on the p5.xr library in its pre-alpha stage. p5.xr is a library for p5.js that enables WebXR capabilities with p5 sketches. My work included stabilizing the library, adding unit tests and implementing raycasting feature along with sticky() function to allow rendering a reticle for gaze tracking. - ## **Contribution to p5 library** I started out my open source experience with p5.js during December 2018. To get myself familiarised with p5.js codebase I tried debugging few open issues like [#3571](https://github.com/processing/p5.js/issues/3571) and [#3346](https://github.com/processing/p5.js/issues/3346). My first successful [PR](https://github.com/processing/p5.js/pull/3405) which was merged was a documentation modification. As I was getting more comfortable with p5’s codebase, I got my first [PR](https://github.com/processing/p5.js/pull/3634) merged which implemented a new feature. The feature was the image() function for WEBGL mode. Later, during the community bonding period, I implemented tint feature for WEBGL mode in this [PR](https://github.com/processing/p5.js/pull/3709). Working with this PR made me comfortable with the WEBGL architecture of p5.js. - ## **Contribution to p5.xr library** - ### **Stabilization and unit testing solution** I helped solve a bunch of open issues which were crucial to the working of p5.xr library. These issues helped me get absolutely comfortable with p5.xr codebase and get me started with the WEBXR api. - - -* [Replacing _update() with _updatexr()](https://github.com/stalgiag/p5.xr/pull/21) \ -The library was replacing p5.RendererGL.prototype._update to keep the model view matrix from being reset after ever frame . In order to make sure that p5’s methods are not modified, I made an equivalent function _updatexr() for p5xr. -* [Pixelation](https://github.com/stalgiag/p5.xr/pull/24) \ -This was a critical bug where VR content was not rendering with proper scale on most of the phones. Solving this took a lot of debugging and a little bit of patience. -* [p5xr Viewer class](https://github.com/stalgiag/p5.xr/pull/28) \ -This class provides the feature of specifying the starting position of the viewer and helps in extending features in future. This class served as a template for new classes and functionality to be added in the future. +* [Replacing \_update() with \_updatexr()](https://github.com/stalgiag/p5.xr/pull/21) \ + The library was replacing p5.RendererGL.prototype.\_update to keep the model view matrix from being reset after ever frame . In order to make sure that p5’s methods are not modified, I made an equivalent function \_updatexr() for p5xr. +* [Pixelation](https://github.com/stalgiag/p5.xr/pull/24) \ + This was a critical bug where VR content was not rendering with proper scale on most of the phones. Solving this took a lot of debugging and a little bit of patience. +* [p5xr Viewer class](https://github.com/stalgiag/p5.xr/pull/28) \ + This class provides the feature of specifying the starting position of the viewer and helps in extending features in future. This class served as a template for new classes and functionality to be added in the future. I also added unit testing environment to p5.xr. I experimented with different unit testing environments and finally decided upon mocha with chai as assertion library and karma as the test runner. The tests run on headless Chrome browser. It was quite challenging because of unexpected errors which was popping out due to WEBXR api in both polyfill and non-polyfill versions. I also wrote a few unit tests to serve as a template for any future unit testing code. - ### **Raycasting** In p5.js, there are no helper functions for raycasting so users must create their own interaction systems. So, I have added raycasting functionality to p5.xr in order to offer interactivity. For instance, gaze tracking becomes possible with the addition of raycasting. Coming up with an api at the beginning was challenging because of the fact that p5 does not keep track of objects. However, a simpler api was then chosen which was inspired from Processing-Android’s api for XR. @@ -42,22 +31,19 @@ In this feature, a ray is cast either from viewer’s eye or user specified posi The following are the functions for raycasting : - - -* [intersectsBox()](https://github.com/stalgiag/p5.xr/pull/49) \ -This function checks whether or not the ray intersects a box (with specified dimensions). The box is imaginary and can be thought of as the box which would have been rendered if box() was called in place of intersectsBox(). -* [intersectsSphere()](https://github.com/stalgiag/p5.xr/pull/48) \ -This function checks whether or not the ray intersects a sphere (with specified radius). The sphere is imaginary and can be thought of as the sphere which would have been rendered if sphere() was called in place of intersectsSphere(). -* [getRayFromScreen()](https://github.com/stalgiag/p5.xr/pull/48) \ -If user does not specify any ray, this function is called to generate a ray emerging from the viewer's eye. The direction of the ray can still be specified by the user. -* [generateRay()](https://github.com/stalgiag/p5.xr/pull/48) \ -Users use this function to create a custom ray which is to be used for raycasting. It will create a ray under the transforms present at the time of this function call. This function allows a ray to be created with respect to a transform and can be used everywhere in the code where the transforms could vary. -* [intersectsPlane()](https://github.com/stalgiag/p5.xr/pull/50) \ -Checks whether a ray intersects a plane and returns the point of intersection. The plane will be the same as calling plane() at the place of this function call but with infinite dimensions. +* [intersectsBox()](https://github.com/stalgiag/p5.xr/pull/49) \ + This function checks whether or not the ray intersects a box (with specified dimensions). The box is imaginary and can be thought of as the box which would have been rendered if box() was called in place of intersectsBox(). +* [intersectsSphere()](https://github.com/stalgiag/p5.xr/pull/48) \ + This function checks whether or not the ray intersects a sphere (with specified radius). The sphere is imaginary and can be thought of as the sphere which would have been rendered if sphere() was called in place of intersectsSphere(). +* [getRayFromScreen()](https://github.com/stalgiag/p5.xr/pull/48) \ + If user does not specify any ray, this function is called to generate a ray emerging from the viewer's eye. The direction of the ray can still be specified by the user. +* [generateRay()](https://github.com/stalgiag/p5.xr/pull/48) \ + Users use this function to create a custom ray which is to be used for raycasting. It will create a ray under the transforms present at the time of this function call. This function allows a ray to be created with respect to a transform and can be used everywhere in the code where the transforms could vary. +* [intersectsPlane()](https://github.com/stalgiag/p5.xr/pull/50) \ + Checks whether a ray intersects a plane and returns the point of intersection. The plane will be the same as calling plane() at the place of this function call but with infinite dimensions. ![dragging](https://vedhant.github.io/gsoc_wpr/grid.gif) - ### **sticky() and noSticky()** The need for this feature came up when I was wondering how to render a circle permanently in the center of the screen to act as a reticle for gaze tracking. The reticle had to be in front of the viewer at all times. So, I made this feature so that any code between [sticky()](https://github.com/stalgiag/p5.xr/pull/52) and noSticky() is rendered in front of the viewer at all times. @@ -66,11 +52,8 @@ This feature can become immensely useful. Reticle for gaze tracking is one examp ![gaze-tracking](https://vedhant.github.io/gsoc_wpr/reticle.gif) - ## **Summary** -A full list of my commits to p5.xr can be found [here](https://www.google.com/url?q=https://github.com/stalgiag/p5.xr/commits?author%3Dvedhant&source=gmail&ust=1566566535693000&usg=AFQjCNG5U-KdJSpW0v_3ouqCLTnfYm9Vxw) and my merged pull requests can be found [here](https://github.com/stalgiag/p5.xr/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+author%3Avedhant+is%3Amerged). +A full list of my commits to p5.xr can be found [here](https://www.google.com/url?q=https://github.com/stalgiag/p5.xr/commits?author%3Dvedhant\&source=gmail\&ust=1566566535693000\&usg=AFQjCNG5U-KdJSpW0v_3ouqCLTnfYm9Vxw) and my merged pull requests can be found [here](https://github.com/stalgiag/p5.xr/pulls?utf8=%E2%9C%93\&q=is%3Apr+is%3Aclosed+author%3Avedhant+is%3Amerged). I had an incredible learning experience with working on p5.xr library. The prominent reason being that as this library was in pre-alpha stage, I was able to contribute a big fraction of the codebase and learned how a library should be developed at early stages. I am immensely grateful to my mentor, [Stalgia Grigg](https://github.com/stalgiag), for providing all the valuable guidance and help throughout the summer as well as the p5 community for providing me such an opportunity. Thank you! - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/wong_gsoc_2023.mdx b/src/content/contributor-docs/en/project_wrapups/wong_gsoc_2023.mdx index 96c59b56ff..2e6ad1ba93 100644 --- a/src/content/contributor-docs/en/project_wrapups/wong_gsoc_2023.mdx +++ b/src/content/contributor-docs/en/project_wrapups/wong_gsoc_2023.mdx @@ -1,26 +1,22 @@ - ---- - ---- # Supporting shader-based filters in p5js By [Justin Wong](https://wonger.dev) -| Faster image filters | Less boilerplate for shader code | -|-|-| +| Faster image filters | Less boilerplate for shader code | +| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | | ![2D shader setup, before and after](https://github.com/wong-justin/p5.js/assets/28441593/6bbd1627-3a01-4911-8c5c-992d63538b96) | -| [old filter() sketch](https://editor.p5js.org/jwong/sketches/oG9AOomYm) | [old 2D shader sketch](https://editor.p5js.org/jwong/sketches/ehXcWtycm) | -| [new filter() sketch](https://editor.p5js.org/jwong/sketches/nWmTF8UED) | [new 2D shader sketch](https://editor.p5js.org/jwong/sketches/T96caQxWq) | +| [old filter() sketch](https://editor.p5js.org/jwong/sketches/oG9AOomYm) | [old 2D shader sketch](https://editor.p5js.org/jwong/sketches/ehXcWtycm) | +| [new filter() sketch](https://editor.p5js.org/jwong/sketches/nWmTF8UED) | [new 2D shader sketch](https://editor.p5js.org/jwong/sketches/T96caQxWq) | My work centered around the `filter()` function because it was too slow. -I made it faster by using shaders, which are programs that use the GPU for image processing. +I made it faster by using shaders, which are programs that use the GPU for image processing. Now people can use effects like blur without noticing such a drop in performance. There were some secondary accomplishments as well. There's a new function `createFilterShader()` that makes writing shaders easier. I helped revise a few documentation pages. I also tried to contribute some benchmarking tools, but that was a bit ambitious. -All of these changes make shaders and image filters more accessible. +All of these changes make shaders and image filters more accessible. I enjoyed the experience and learned a lot. In fact, I learned so much that I wrote [another post](https://wonger.dev/posts/gsoc.html) on my website. @@ -30,23 +26,22 @@ Many thanks to my mentors for all their support: Adam Ferriss, Austin Slominski, ## Work Completed -- [Initial pull request](https://github.com/processing/p5.js/pull/6167), just some documentation. Status: merged -- [Second pull request](https://github.com/processing/p5.js/pull/6237), mostly internal changes to enable new shaders. Status: merged -- [Third pull request](https://github.com/processing/p5.js/pull/6324), replacing the old filters with new shader filters. Status: merged +* [Initial pull request](https://github.com/processing/p5.js/pull/6167), just some documentation. Status: merged +* [Second pull request](https://github.com/processing/p5.js/pull/6237), mostly internal changes to enable new shaders. Status: merged +* [Third pull request](https://github.com/processing/p5.js/pull/6324), replacing the old filters with new shader filters. Status: merged ### Public documentation pages: -- [WEBGL](https://p5js.org/reference/#/p5/WEBGL) - Status: merged, page created -- [filter()](https://p5js.org/reference/#/p5/filter) - Status: merged, page not updated yet -- [createFilterShader()](https://p5js.org/reference/#/p5/createFilterShader) - Status: merged, page not created yet + +* [WEBGL](https://p5js.org/reference/#/p5/WEBGL) - Status: merged, page created +* [filter()](https://p5js.org/reference/#/p5/filter) - Status: merged, page not updated yet +* [createFilterShader()](https://p5js.org/reference/#/p5/createFilterShader) - Status: merged, page not created yet ### Performance measuring helpers: -- [JSPerf benchmarks](https://jsperf.app/sideci) for comparing two different p5js builds. Status: flopped. It was difficult to set up the tests inside the sketch, and results were inconclusive +* [JSPerf benchmarks](https://jsperf.app/sideci) for comparing two different p5js builds. Status: flopped. It was difficult to set up the tests inside the sketch, and results were inconclusive ## Potential improvements: -1. I think there should be some refactoring to cut down on all the graphics layers swimming around - maybe by using framebuffers, or maybe just by understanding and wrangling the canvases better. +1. I think there should be some refactoring to cut down on all the graphics layers swimming around - maybe by using framebuffers, or maybe just by understanding and wrangling the canvases better. 2. There's some alternative blur filters worth investigating. There's an issue opened now to try for a better quality gaussian blur shader that still adjusts according to user input. 3. Performance could still be improved. Filters in WEBGL mode work well, getting 60 fps on my machine. But transferring filtered content to a default P2D renderer from a hidden WEBGL renderer results in about 20 fps. It also seems like performance suffers on mobile GPUs. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/xu_gsoc_2019.mdx b/src/content/contributor-docs/en/project_wrapups/xu_gsoc_2019.mdx index c5be457598..6bdeaaadcf 100644 --- a/src/content/contributor-docs/en/project_wrapups/xu_gsoc_2019.mdx +++ b/src/content/contributor-docs/en/project_wrapups/xu_gsoc_2019.mdx @@ -1,10 +1,6 @@ - ---- - ---- # Code Slang! -During GSoC 2019, Sharon De La Cruz and Jenna Xu worked on developing *Code Slang*, a project where slang words are presented as functions as a way to make math and functional programming more accessible to high school-age students. +During GSoC 2019, Sharon De La Cruz and Jenna Xu worked on developing *Code Slang*, a project where slang words are presented as functions as a way to make math and functional programming more accessible to high school-age students. Building on an [earlier prototype by Aatish Bhatia](https://aatishb.com/experiments/compose/), one of Sharon's students, we decided that chaining slang adjectives could be a fun way to demonstrate and teach functional programming. The results of one slang function feeds into the next, creating new and unexpected results depending on the order. @@ -21,4 +17,3 @@ Based on the students' illustrations, we [codified the slang words in an interfa We had created an interesting interactive, but realized that we couldn't assume knowledge of basic programming and math—skills necessary for users to create their own slang functions. So we decided to create a short tutorial to supplement the interactive. After user testing with high school students, we landed on [the current iteration of *Code Slang*](https://xujenna.github.io/codeslang/). - \ No newline at end of file diff --git a/src/content/contributor-docs/en/project_wrapups/yukienomiya_gsoc_2020.mdx b/src/content/contributor-docs/en/project_wrapups/yukienomiya_gsoc_2020.mdx index 7c48244466..0bc9e29fe2 100644 --- a/src/content/contributor-docs/en/project_wrapups/yukienomiya_gsoc_2020.mdx +++ b/src/content/contributor-docs/en/project_wrapups/yukienomiya_gsoc_2020.mdx @@ -1,7 +1,3 @@ - ---- - ---- # i18n improvements and Italian translation ## Introduction @@ -16,49 +12,50 @@ My contributions mostly concern the [p5.js-website](https://github.com/processin ## Contributions -- **[PR #836](https://github.com/processing/p5.js-website/pull/836) - Extended p5.js-website translation render mechanism to support translation of p5.js Class pages** +* **[PR #836](https://github.com/processing/p5.js-website/pull/836) - Extended p5.js-website translation render mechanism to support translation of p5.js Class pages** + + The Reference section of the p5.js-website displays the library documentation on Classes, Methods, and Fields. The [updateLanguage()](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/index.hbs#L61) function is responsible for swapping the original English text of the website's Reference section with its translated version. - The Reference section of the p5.js-website displays the library documentation on Classes, Methods, and Fields. The [updateLanguage()](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/index.hbs#L61) function is responsible for swapping the original English text of the website's Reference section with its translated version. - The `updateLanguage()` function used to translate only Method and Field pages, but not Class pages; So even if the description of a p5 Class (i.e., `p5.Color`) was translated in the translation files, the translation wasn't rendered on the webpage. I, therefore, added an extra section to the `updateLanguage()` function that swaps text from Class pages of the Reference to complete the script. -- **[PR #837](https://github.com/processing/p5.js-website/pull/837) - Developed a script that parses data from the p5.js inline documentation and generates the English version of the Reference translation files** +* **[PR #837](https://github.com/processing/p5.js-website/pull/837) - Developed a script that parses data from the p5.js inline documentation and generates the English version of the Reference translation files** + + The Reference section of the website is built in English with the data from a JSON file that gets generated from the p5.js repository ([data.json](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/data.json). This English documentation file has a completely different structure compared to the files that contain the translated strings needed for the swapping. This made the process of comparing them to make sure they are synced very tedious. - The Reference section of the website is built in English with the data from a JSON file that gets generated from the p5.js repository ([data.json](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/data.json). This English documentation file has a completely different structure compared to the files that contain the translated strings needed for the swapping. This made the process of comparing them to make sure they are synced very tedious. - I wrote a script that generates the English Reference file ([en.json](https://github.com/processing/p5.js-website/blob/main/src/data/reference/en.json): a file containing all the English documentation needed in the website, but with the same structure as the other translation files. -- **[PR #4733](https://github.com/processing/p5.js/pull/4733) - Setup a GitHub workflow in the p5.js repository that triggers a second workflow in the p5.js-website repository every time a new p5.js release gets published** +* **[PR #4733](https://github.com/processing/p5.js/pull/4733) - Setup a GitHub workflow in the p5.js repository that triggers a second workflow in the p5.js-website repository every time a new p5.js release gets published** **[PR #841](https://github.com/processing/p5.js-website/pull/841) - Setup a GitHub workflow in the p5.js-website repository that updates the p5.js documentation files** The English documentation file ([data.json](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/data.json)) had to be manually generated from the p5.js repository and committed to the p5.js-website repository every time a new p5.js release was published. - I automated this process using two Github workflows: - - the `update-p5jswebsite` workflow (in the p5.js repository) gets triggered every time a new p5.js release gets published and it, in turn, triggers the update-documentation workflow - - the `update-documentation` workflow (in the p5.js-website repository) runs a Grunt task that updates both the English documentation file ([data.json](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/data.json)) and the English Reference file (en.json) in the p5.js-website repository. + I automated this process using two Github workflows: + + * the `update-p5jswebsite` workflow (in the p5.js repository) gets triggered every time a new p5.js release gets published and it, in turn, triggers the update-documentation workflow + * the `update-documentation` workflow (in the p5.js-website repository) runs a Grunt task that updates both the English documentation file ([data.json](https://github.com/processing/p5.js-website/blob/main/src/templates/pages/reference/data.json)) and the English Reference file (en.json) in the p5.js-website repository. -- **[PR #854](https://github.com/processing/p5.js-website/pull/854) - Update the existing translation files for the Reference section to match the structure of the English Reference file generated in PR #837** - - Added the missing elements to the translated Reference files. - - Converted the “description” elements from strings to arrays of strings. - - Saved the “parameter” elements by name. +* **[PR #854](https://github.com/processing/p5.js-website/pull/854) - Update the existing translation files for the Reference section to match the structure of the English Reference file generated in PR #837** + * Added the missing elements to the translated Reference files. + * Converted the “description” elements from strings to arrays of strings. + * Saved the “parameter” elements by name. -- **[PR #856](https://github.com/processing/p5.js-website/pull/856) - Created a script that merges the keys of a translated file (in either the JSON or YAML format) with its English version and removes the obsolete keys** +* **[PR #856](https://github.com/processing/p5.js-website/pull/856) - Created a script that merges the keys of a translated file (in either the JSON or YAML format) with its English version and removes the obsolete keys** **[PR #856](https://github.com/processing/p5.js-website/pull/856) - Set up a GitHub workflow in the p5.js-website repository that runs the updateJSON() or updateYAML() functions on the p5.js-website translation files every time one of them is modified.** The script contains the `updateJSON()` and `updateYAML()` functions. - + This ensures that all the translation files always contain the same keys. -- **[PR #865](https://github.com/processing/p5.js-website/pull/865) - Translated the YAML file in Italian** +* **[PR #865](https://github.com/processing/p5.js-website/pull/865) - Translated the YAML file in Italian** I translated in Italian the YAML file containing all the text from the p5.js website (excluding the Reference and the Examples section). This makes up for approximately ⅓ of the translation of the whole website. -- **[p5.js-website-translator](https://github.com/processing/p5.js-website-translator) - Built a Nuxt.js web app to simplify the translation process for contributors** +* **[p5.js-website-translator](https://github.com/processing/p5.js-website-translator) - Built a Nuxt.js web app to simplify the translation process for contributors** (last commit [#51a29bd](https://github.com/processing/p5.js-website-translator/commit/51a29bd877ef671f130e53b2aeeeea1f9f7fc788)) @@ -73,9 +70,10 @@ My contributions mostly concern the [p5.js-website](https://github.com/processin ![image](https://user-images.githubusercontent.com/49163604/91746362-c5046500-ebbc-11ea-8fb2-b904b1444d2f.png) The user can: - - **edit** the translated string - - **compare** the edited version with the original one - - **restore** the original value, therefore deleting the edit on that key + + * **edit** the translated string + * **compare** the edited version with the original one + * **restore** the original value, therefore deleting the edit on that key The p5.js-website-translator app is serverless, so the edits made by the user are saved in the browser’s local storage. @@ -92,12 +90,12 @@ As I mentioned above, halfway through the coding period, the project strayed a b Nonetheless, I'm very happy we decided to work on the p5.js-website-translator, as I believe it can really help to complete and maintain the existing translation and even create new ones. - From a technical point of view, working on the web app was fun and challenging at the same time: this was my first time using a frontend framework, which means that I learned a lot, but also that I was going quite slowly due to every little thing taking tons of time and google searches. There is definitely still work that can be done/features that can be added to it, for instance: -- the option to filter translation cards (i.e., only view the ones that still need to be translated, or the ones that have been edited, etc.) -- a simple way to update the translation file in use with the latest version on the repository + +* the option to filter translation cards (i.e., only view the ones that still need to be translated, or the ones that have been edited, etc.) +* a simple way to update the translation file in use with the latest version on the repository I intend to keep working on the p5.js-website-translator and implement the missing features, but any help is very welcome! @@ -111,4 +109,3 @@ To Lauren McCarthy, thank you for creating such a constructive, positive, and we And of course, thank you to my awesome mentor Evelyn Masso for guiding me through this amazing experience, for supporting my ideas and helping me develop them, and finally for somehow understanding all of my often twisted and unclear explanations. ❤️ Last but not least, I need to thank my friend Simone Primarosa for well, everything. From explaining what "source code" meant a few years ago to helping me deploying the p5.js-website-translator on GitHub pages, but mostly for telling me about Google Summer of Code last year and believing so much that I could do this, to convince me too. - \ No newline at end of file diff --git a/src/content/contributor-docs/en/release_process.mdx b/src/content/contributor-docs/en/release_process.mdx index 451f2ea506..e5620de026 100644 --- a/src/content/contributor-docs/en/release_process.mdx +++ b/src/content/contributor-docs/en/release_process.mdx @@ -1,37 +1,39 @@ - ---- - ---- # Release process ## Approach + * We follow the [semver](https://semver.org/) versioning pattern, which means we follow this versioning pattern: `MAJOR:MINOR:PATCH`. ## Requirements + * Git, node.js and NPM installed on your system * You are able to build the library and have push access to the remote repository * Secret `NPM_TOKEN` value is set on the remote repository * Secret `ACCESS_TOKEN` value is set on the remote repository ## Security tokens + For the release steps to run fully, two [repository secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository) must be set as below. * `NPM_TOKEN` can be created by following the steps [here](https://docs.npmjs.com/creating-and-viewing-access-tokens) to create a read and publish token. The user the token belongs to must have publish access to the project on NPM. * `ACCESS_TOKEN` is a personal access token for a user that has access to `p5.js`, `p5.js-website`, and `p5.js-release` repositories. The token can be generated using the steps [here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) and for scopes, choose only `repo` and `workflow`. It is recommended to use an organization specific account for this (ie. not from a personal account) and limit the account's write access to only the required repositories. ## Usage + ```sh $ git checkout main $ npm version [major|minor|patch] # Choose the appropriate version tag $ git push origin main $ git push origin v1.4.2 # Replace the version number with the one just created above ``` + The actual release steps are all run on GitHub Actions CI. ## Monitor and check results + Once the above commands have been executed, the build and release action can be monitored from the ["Actions" tab](https://github.com/processing/p5.js/actions) on the p5.js GitHub repo page (look for a job that says "New p5.js release"), clicking into the job can give a more detailed job log of what's running. -![Screenshot of GitHub action running the "New p5.js release" job](images/contributor-docs/release-action.png) +![Screenshot of GitHub action running the "New p5.js release" job](/images/contributor-docs/release-action.png) Once the job has completed, the library will have been released on GitHub and NPM. Check the [release](https://github.com/processing/p5.js/releases) and [NPM](https://www.npmjs.com/package/p5) pages to see that the latest version is released. You should view the draft release on GitHub, make changes to changelog if necessary, then publish the release. @@ -39,9 +41,10 @@ The website will be updated as soon as its own build and deploy job is completed CDNs will take a bit more time (a day or two) to update but they will automatically pull from NPM upon release so no specific action is required. ---- +*** ## What's actually happening + The GitHub Action ["New p5.js release"](../.github/workflows/release.yml) is triggered on a tag that matches the pattern `v*.*.*` which is created by the `npm version ___` command. Once triggered, it will run the following steps: @@ -50,24 +53,23 @@ Once triggered, it will run the following steps: 2. Create the release files that will be uploaded to GitHub releases. 3. Create a release on GitHub and publish latest version on NPM. 4. Update website files - 1. Clone the website repository - 2. Copy `data.json` and `data.min.json` to the right location - 3. Copy `p5.min.js` and `p5.sound.min.js` to the right location - 4. Update `data.yml` file with latest version number - 5. Update `en.json` file based on `data.min.json` - 6. Commit and push the changes back to the website repository + 1. Clone the website repository + 2. Copy `data.json` and `data.min.json` to the right location + 3. Copy `p5.min.js` and `p5.sound.min.js` to the right location + 4. Update `data.yml` file with latest version number + 5. Update `en.json` file based on `data.min.json` + 6. Commit and push the changes back to the website repository 5. Update Bower files - 1. Clone the Bower release repository - 2. Copy all libraries files to the right location - 3. Commit and push the changes back to the website repository + 1. Clone the Bower release repository + 2. Copy all libraries files to the right location + 3. Commit and push the changes back to the website repository In principle, we try to concentrate as many steps as possible to be run in one place, ie. in the CI environment. If a new step that is only run on release is required, it should probably be defined in the CI workflow and not as part of the build configuration. ## Testing + As the release steps are run in CI, testing them can be difficult. Using [act](https://github.com/nektos/act) to test running of the steps locally is possible (and was how they were tested while being developed) but require some temporary modifications to the workflow definition, we'll roughly document here as the precise steps will likely change over time. The test steps will not run because not all system requirements are present to run the mocha Chrome tests. Some system dependencies will likely be needed to be installed with `apt` before setting up the rest of the environment. Keep an eye on the error messages which should give some information on what packages are missing. The steps concerning pushing changes to remote repositories should be commented out to avoid accidentally pushing unintended changes. - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/repo_structure.mdx b/src/content/contributor-docs/en/repo_structure.mdx index 7bb5d09088..bec2a98803 100644 --- a/src/content/contributor-docs/en/repo_structure.mdx +++ b/src/content/contributor-docs/en/repo_structure.mdx @@ -1,36 +1,29 @@ - ---- - ---- # Where our code lives The overarching p5.js project includes some repositories other than this one: -- **[p5.js](https://github.com/processing/p5.js)**: This repository contains the source code for the p5.js library. The [user-facing p5.js reference manual](https://p5js.org/reference/) is also generated from the [JSDoc](https://jsdoc.app/) comments included in this source code. It is maintained by [Qianqian Ye](https://github.com/qianqianye) and a group of [stewards](https://github.com/processing/p5.js#stewards). -- **[p5.js-website](https://github.com/processing/p5.js-website)**: This repository contains most of the code for the [p5.js website](http://p5js.org), with the exception of the reference manual. It is maintained by [Qianqian Ye](https://github.com/qianqianye), [Kenneth Lim](https://github.com/limzykenneth), and a group of [stewards](https://github.com/processing/p5.js-website#stewards). -- **[p5.js-sound](https://github.com/processing/p5.js-sound)**: This repository contains the p5.sound.js library. It is maintained by [Jason Sigal](https://github.com/therewasaguy). -- **[p5.js-web-editor](https://github.com/processing/p5.js-web-editor)**: This repository contains the source code for the [p5.js web editor](https://editor.p5js.org). It is maintained by [Cassie Tarakajian](https://github.com/catarak). -- Other add-on libraries not listed above usually have their own repository and maintainers and are not maintained by the p5.js project directly. - +* **[p5.js](https://github.com/processing/p5.js)**: This repository contains the source code for the p5.js library. The [user-facing p5.js reference manual](https://p5js.org/reference/) is also generated from the [JSDoc](https://jsdoc.app/) comments included in this source code. It is maintained by [Qianqian Ye](https://github.com/qianqianye) and a group of [stewards](https://github.com/processing/p5.js#stewards). +* **[p5.js-website](https://github.com/processing/p5.js-website)**: This repository contains most of the code for the [p5.js website](http://p5js.org), with the exception of the reference manual. It is maintained by [Qianqian Ye](https://github.com/qianqianye), [Kenneth Lim](https://github.com/limzykenneth), and a group of [stewards](https://github.com/processing/p5.js-website#stewards). +* **[p5.js-sound](https://github.com/processing/p5.js-sound)**: This repository contains the p5.sound.js library. It is maintained by [Jason Sigal](https://github.com/therewasaguy). +* **[p5.js-web-editor](https://github.com/processing/p5.js-web-editor)**: This repository contains the source code for the [p5.js web editor](https://editor.p5js.org). It is maintained by [Cassie Tarakajian](https://github.com/catarak). +* Other add-on libraries not listed above usually have their own repository and maintainers and are not maintained by the p5.js project directly. ## Repository File Structure There are a lot of files here! Here's a brief overview. It can be confusing, but you don't need to understand every file in the repository to get started. We recommend beginning in one area (for example, fixing some inline documentation), and working your way outwards to exploring more. Luisa Pereira's [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) also gives a video tour of the tools and files used in the p5.js workflow. -- 📁`contributor_docs/` contains documents that explain practices and principles for contributors -- 📁`docs/` does not actually contain docs! Rather, it contains the code used to *generate* the [online reference manual](https://p5js.org/reference/). -- 📁`lib/` contains an empty example and the p5.sound add-on, which is periodically updated via pull request from the [p5.js-sound repository](https://github.com/processing/p5.js-sound). This is also where the built p5.js library gets placed after being compiled to a single file using [Grunt](https://gruntjs.com/). It does not need to be checked into the GitHub repository when you make a pull request. -- 📁`src/` contains all the source code for the library, which is topically organized into separated modules. This is what you'll work on if you are changing p5.js. Most folders have their own readme.md files inside to help you find your way around. -- 📁`tasks/` contains scripts which perform automated tasks related to the build, deployment, and release of new versions of p5.js. -- 📁`tests/` contains unit tests which ensure the library continues to function correctly as changes are made. -- 📁`utils/` might contain additional files useful for the repository, but generally you can ignore this directory. - +* 📁`contributor_docs/` contains documents that explain practices and principles for contributors +* 📁`docs/` does not actually contain docs! Rather, it contains the code used to *generate* the [online reference manual](https://p5js.org/reference/). +* 📁`lib/` contains an empty example and the p5.sound add-on, which is periodically updated via pull request from the [p5.js-sound repository](https://github.com/processing/p5.js-sound). This is also where the built p5.js library gets placed after being compiled to a single file using [Grunt](https://gruntjs.com/). It does not need to be checked into the GitHub repository when you make a pull request. +* 📁`src/` contains all the source code for the library, which is topically organized into separated modules. This is what you'll work on if you are changing p5.js. Most folders have their own readme.md files inside to help you find your way around. +* 📁`tasks/` contains scripts which perform automated tasks related to the build, deployment, and release of new versions of p5.js. +* 📁`tests/` contains unit tests which ensure the library continues to function correctly as changes are made. +* 📁`utils/` might contain additional files useful for the repository, but generally you can ignore this directory. ## Miscellaneous -- There are other files in the 📁[`contributor_docs/`](https://github.com/processing/p5.js/tree/main/contributor_docs) folder that you might explore. They pertain to contributing to specific areas of this project, both technical and non-technical. -- [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) is a video tour of the tools and files used in the p5.js development workflow. -- [This video from The Coding Train](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: gives an overview of getting started with technical contribution to p5.js. -- The p5.js [Docker image](https://github.com/toolness/p5.js-docker) can be mounted in [Docker](https://www.docker.com/) and used to develop p5.js without requiring manual installation of requirements like [Node](https://nodejs.org/) or otherwise affecting the host operating system in any way, aside from the installation of Docker. -- The build process for the p5.js library generates a [JSON data file](https://p5js.org/reference/data.json) which contains the public API of p5.js and can be used in automated tooling, such as for autocompleting p5.js methods in an editor. This file is hosted on the p5.js website, but it is not included as part of the repository. - \ No newline at end of file +* There are other files in the 📁[`contributor_docs/`](https://github.com/processing/p5.js/tree/main/contributor_docs) folder that you might explore. They pertain to contributing to specific areas of this project, both technical and non-technical. +* [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) is a video tour of the tools and files used in the p5.js development workflow. +* [This video from The Coding Train](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: gives an overview of getting started with technical contribution to p5.js. +* The p5.js [Docker image](https://github.com/toolness/p5.js-docker) can be mounted in [Docker](https://www.docker.com/) and used to develop p5.js without requiring manual installation of requirements like [Node](https://nodejs.org/) or otherwise affecting the host operating system in any way, aside from the installation of Docker. +* The build process for the p5.js library generates a [JSON data file](https://p5js.org/reference/data.json) which contains the public API of p5.js and can be used in automated tooling, such as for autocompleting p5.js methods in an editor. This file is hosted on the p5.js website, but it is not included as part of the repository. diff --git a/src/content/contributor-docs/en/sidebar.mdx b/src/content/contributor-docs/en/sidebar.mdx index 174e1c4f7f..1078c49853 100644 --- a/src/content/contributor-docs/en/sidebar.mdx +++ b/src/content/contributor-docs/en/sidebar.mdx @@ -1,29 +1,23 @@ +{/* docs/_sidebar.md */} ---- - ---- - - -- [__CONTRIBUTORS INTRO__](README/) -- [__CONTRIBUTOR GUIDELINES__](contributor_guidelines/) -- [__STEWARD GUIDELINES__](steward_guidelines/) -- __CONTRIBUTING DOCS__ - - [Contributing Documentation](contributing_documentation/) - - [Issue Labels](issue_labels/) -- __CONTRIBUTING THOUGHTS__ - - [Design Principles](design_principles/) - - [How Contributions are Organized](organization/) -- __CONTRIBUTING CODE__ - - [Creating Libraries](creating_libraries/) - - [Inline Documentation](inline_documentation/) - - [Unit Testing](unit_testing/) - - [Friendly-Error System](friendly_error_system/) -- __RELATED INFO__ - - [Repository Structure](repo_structure/) - - [WebGL Architecture](webgl_mode_architecture/) - - [Supported Browsers](supported_browsers/) - - [Web Accessibility](web_accessibility/) - - [Custom Builds](custom_p5_build/) - - [Release Process](release_process/) - - \ No newline at end of file +* [**CONTRIBUTORS INTRO**](README/) +* [**CONTRIBUTOR GUIDELINES**](contributor_guidelines/) +* [**STEWARD GUIDELINES**](steward_guidelines/) +* **CONTRIBUTING DOCS** + * [Contributing Documentation](contributing_documentation/) + * [Issue Labels](issue_labels/) +* **CONTRIBUTING THOUGHTS** + * [Design Principles](design_principles/) + * [How Contributions are Organized](organization/) +* **CONTRIBUTING CODE** + * [Creating Libraries](creating_libraries/) + * [Inline Documentation](inline_documentation/) + * [Unit Testing](unit_testing/) + * [Friendly-Error System](friendly_error_system/) +* **RELATED INFO** + * [Repository Structure](repo_structure/) + * [WebGL Architecture](webgl_mode_architecture/) + * [Supported Browsers](supported_browsers/) + * [Web Accessibility](web_accessibility/) + * [Custom Builds](custom_p5_build/) + * [Release Process](release_process/) diff --git a/src/content/contributor-docs/en/steward_guidelines.mdx b/src/content/contributor-docs/en/steward_guidelines.mdx index 2695d25c8c..6f41258abb 100644 --- a/src/content/contributor-docs/en/steward_guidelines.mdx +++ b/src/content/contributor-docs/en/steward_guidelines.mdx @@ -1,177 +1,165 @@ - ---- - ---- # Steward Guidelines Whether you have just joined us as a steward, are a seasoned maintainer of p5.js, or are somewhere in between, this guide contains information as well as tips and tricks that will help you effectively contribute to p5.js. Most of what is written here are guidelines unless otherwise stated, which means you can adapt the practices shown here to suit your workflow. - ## Table of Contents -- [Issues](steward_guidelines.md#issues) - - [Bug report](steward_guidelines.md#bug-report) - - [Feature request](steward_guidelines.md#feature-request) - - [Feature enhancement](steward_guidelines.md#feature-enhancement) - - [Discussion](steward_guidelines.md#discussion) -- [Pull Requests](steward_guidelines.md#pull-requests) - - [Simple fix](steward_guidelines.md#simple-fix) - - [Bug fix](steward_guidelines.md#bug-fix) - - [New feature/feature enhancement](steward_guidelines.md#new-feature-feature-enhancement) - - [Dependabot](steward_guidelines.md#dependabot) -- [Build Process](steward_guidelines.md#build-process) - - [Main build task](steward_guidelines.md#main-build-task) - - [Miscellaneous tasks](steward_guidelines.md#miscellaneous-tasks) -- [Release Process](steward_guidelines.md#release-process) -- [Tips & Tricks](steward_guidelines.md#tips--tricks) - - [Reply templates](steward_guidelines.md#reply-templates) - - [GitHub CLI](steward_guidelines.md#github-cli) - - [Managing notifications](steward_guidelines.md#managing-notifications) - ---- - +* [Issues](steward_guidelines.md#issues) + * [Bug report](steward_guidelines.md#bug-report) + * [Feature request](steward_guidelines.md#feature-request) + * [Feature enhancement](steward_guidelines.md#feature-enhancement) + * [Discussion](steward_guidelines.md#discussion) +* [Pull Requests](steward_guidelines.md#pull-requests) + * [Simple fix](steward_guidelines.md#simple-fix) + * [Bug fix](steward_guidelines.md#bug-fix) + * [New feature/feature enhancement](steward_guidelines.md#new-feature-feature-enhancement) + * [Dependabot](steward_guidelines.md#dependabot) +* [Build Process](steward_guidelines.md#build-process) + * [Main build task](steward_guidelines.md#main-build-task) + * [Miscellaneous tasks](steward_guidelines.md#miscellaneous-tasks) +* [Release Process](steward_guidelines.md#release-process) +* [Tips & Tricks](steward_guidelines.md#tips--tricks) + * [Reply templates](steward_guidelines.md#reply-templates) + * [GitHub CLI](steward_guidelines.md#github-cli) + * [Managing notifications](steward_guidelines.md#managing-notifications) + +*** ## Issues We encourage most source code contributions to start with an issue, and as such, issues are the place where most of the discussions will take place. The steps to take when reviewing an issue will depend on what kind of issue it is. The repo uses [GitHub issue templates](https://github.com/processing/p5.js/blob/main/.github/ISSUE_TEMPLATE) in order to better organize different kinds of issues and encourage issue authors to provide all relevant information about their problems. The first step in reviewing the issue will often be looking through the filled-out template and determining if you need additional information (e.g., because some fields weren't filled in or the incorrect template was used). - ### Bug report Bug report issues should use the "Found a bug" issue template. The following workflow is typical for addressing bug reports: 1. Replicate the bug - - The goal of the template is to provide enough information for a reviewer to attempt to replicate the bug in question. - - If the reported bug is not relevant to the repo it is opened in (p5.js, p5.js-website, or otherwise): - - Transfer the issue to the relevant repo if you have access to it. - - Otherwise, leave a comment about where the bug report should be filed (with a direct link provided) and close the issue. - - The first step in reviewing a bug report is to see if enough information is provided for a bug replication, and if so, attempt to replicate the bug as described. + * The goal of the template is to provide enough information for a reviewer to attempt to replicate the bug in question. + * If the reported bug is not relevant to the repo it is opened in (p5.js, p5.js-website, or otherwise): + * Transfer the issue to the relevant repo if you have access to it. + * Otherwise, leave a comment about where the bug report should be filed (with a direct link provided) and close the issue. + * The first step in reviewing a bug report is to see if enough information is provided for a bug replication, and if so, attempt to replicate the bug as described. 2. If the bug can be replicated: - - Some discussion may be required to determine the best way to fix a particular bug. Sometimes, it may be straightforward; sometimes, it may be tricky. Please refer to [p5.js' design principles](design_principles/) when making this decision on a case-by-case basis. - - If the issue author indicated in the issue they are willing to contribute a fix: - - Approve the issue for fixing by the issue author by leaving a comment and assigning them to the issue. Use the cog button on the right side next to "Assignee". - - If the issue author does not wish to contribute a fix: - - Leave a comment recognizing the bug is replicable. - - Attempt to fix yourself or add the `help wanted` label to signal an issue needing a fix. + * Some discussion may be required to determine the best way to fix a particular bug. Sometimes, it may be straightforward; sometimes, it may be tricky. Please refer to [p5.js' design principles](design_principles/) when making this decision on a case-by-case basis. + * If the issue author indicated in the issue they are willing to contribute a fix: + * Approve the issue for fixing by the issue author by leaving a comment and assigning them to the issue. Use the cog button on the right side next to "Assignee". + * If the issue author does not wish to contribute a fix: + * Leave a comment recognizing the bug is replicable. + * Attempt to fix yourself or add the `help wanted` label to signal an issue needing a fix. 3. If the bug cannot be replicated: - - Ask for additional info if not already provided in the template (p5.js version, browser version, OS version, etc.). - - If your testing environment differs from what is reported in the issue (e.g., a different browser or OS): - - Leave a comment saying you are not able to replicate in your specific environment. - - Add a `help wanted` label to the issue and ask for someone else with the setup specified in the issue to try to replicate the bug. - - Sometimes, bugs only occur when using the web editor and not when testing locally. In this case, the issue should be redirected to the [web editor repo](https://github.com/processing/p5.js-web-editor). - - If replication is possible later, go back to step 2. + * Ask for additional info if not already provided in the template (p5.js version, browser version, OS version, etc.). + * If your testing environment differs from what is reported in the issue (e.g., a different browser or OS): + * Leave a comment saying you are not able to replicate in your specific environment. + * Add a `help wanted` label to the issue and ask for someone else with the setup specified in the issue to try to replicate the bug. + * Sometimes, bugs only occur when using the web editor and not when testing locally. In this case, the issue should be redirected to the [web editor repo](https://github.com/processing/p5.js-web-editor). + * If replication is possible later, go back to step 2. 4. If the bug stems from the code the user provided in the bug report and not p5.js' behavior: - - Determine if p5.js' documentation, code implementation, or friendly error system can be improved to prevent the same mistake from being made. - - Kindly redirect any further questions to the [forum](https://discourse.processing.org/) or [Discord](https://discord.com/invite/SHQ8dH25r9) and close the issue if no further changes are to be made to p5.js. - + * Determine if p5.js' documentation, code implementation, or friendly error system can be improved to prevent the same mistake from being made. + * Kindly redirect any further questions to the [forum](https://discourse.processing.org/) or [Discord](https://discord.com/invite/SHQ8dH25r9) and close the issue if no further changes are to be made to p5.js. ### Feature request Feature request issues should use the "New Feature Request" issue template. The following workflow is typical for addressing feature requests: 1. As part of p5.js' commitment to increase access, a feature request must make a case for how it increases access of p5.js to communities that are historically marginalized in the field. More details are available [here](access/). - - If a feature request does not have the "Increasing Access" field sufficiently filled out, you can ask the issue author how the feature increases access. - - The access statement of a feature can be provided by a different member of the community, including the issue reviewers. + * If a feature request does not have the "Increasing Access" field sufficiently filled out, you can ask the issue author how the feature increases access. + * The access statement of a feature can be provided by a different member of the community, including the issue reviewers. 2. The new feature request can be assessed for inclusion based on the following criteria. - - Does the feature fit into the project scope and [design principles](design_principles/) of p5.js? - - For example, a request to add a new drawing primitive shape may be considered, but a request to adopt a browser-based IOT protocol will likely be out of scope. - - Overall, the scope of p5.js should be relatively narrow in order to avoid excessive bloat from rarely used features. - - If a feature does not fit into the scope of p5.js, suggest that the issue author implement the feature as as an addon library. - - If it is unclear whether or not it fits, it can be a good idea to suggest making an addon library as a proof-of-concept. This helps give users a way to use the feature, provides a much more concrete example of its usage and importance, and does not necessarily need to be as complete of a solution as a fully integrated feature. It can be integrated into the core of p5.js later if appropriate. - - Is the feature likely to cause a breaking change? - - Will it conflict with existing p5.js functions and variables? - - Will it conflict with typical sketches already written for p5.js? - - Features that are likely to cause conflicts such as  the ones above  are  considered breaking changes. Without a [major version release](https://docs.npmjs.com/about-semantic-versioning), we should not make breaking changes to p5.js. - - Can the proposed new feature be achieved using existing functionalities already in p5.js, relatively simple native JavaScript code, or existing easy-to-use libraries? - - For example, instead of providing a p5.js function to join an array of strings such as `join(["Hello", "world!"])`, the native JavaScript `["Hello", "world!"].join()` should be preferred instead. + * Does the feature fit into the project scope and [design principles](design_principles/) of p5.js? + * For example, a request to add a new drawing primitive shape may be considered, but a request to adopt a browser-based IOT protocol will likely be out of scope. + * Overall, the scope of p5.js should be relatively narrow in order to avoid excessive bloat from rarely used features. + * If a feature does not fit into the scope of p5.js, suggest that the issue author implement the feature as as an addon library. + * If it is unclear whether or not it fits, it can be a good idea to suggest making an addon library as a proof-of-concept. This helps give users a way to use the feature, provides a much more concrete example of its usage and importance, and does not necessarily need to be as complete of a solution as a fully integrated feature. It can be integrated into the core of p5.js later if appropriate. + * Is the feature likely to cause a breaking change? + * Will it conflict with existing p5.js functions and variables? + * Will it conflict with typical sketches already written for p5.js? + * Features that are likely to cause conflicts such as  the ones above  are  considered breaking changes. Without a [major version release](https://docs.npmjs.com/about-semantic-versioning), we should not make breaking changes to p5.js. + * Can the proposed new feature be achieved using existing functionalities already in p5.js, relatively simple native JavaScript code, or existing easy-to-use libraries? + * For example, instead of providing a p5.js function to join an array of strings such as `join(["Hello", "world!"])`, the native JavaScript `["Hello", "world!"].join()` should be preferred instead. 3. If the access requirement and other considerations have been fulfilled, at least two stewards or maintainers must approve the new feature request before work should begin toward a PR. The PR review process for new features is documented below. - ### Feature enhancement Feature enhancement issues should use the "Existing Feature Enhancement" issue template. The process is very similar to new feature requests. The difference between a new feature request and feature enhancement can be blurry sometimes. Feature enhancement mainly deals with existing functions of p5.js while a new feature request could be requesting entirely new functions to be added. 1. Similar to new feature requests, feature enhancement should only be accepted if they increase access to p5.js. Please see point 1 of [section above](steward_guidelines.md#feature-request). 2. Inclusion criteria for feature enhancements are similar to those for feature requests, but particular attention should be paid to potential breaking changes. - - If modifying existing functions, all previous valid and documented function signatures must behave in the same way. + * If modifying existing functions, all previous valid and documented function signatures must behave in the same way. 3. Feature enhancements must be approved by at least one steward or maintainer before work should begin toward a PR. The PR review process for feature enhancement is documented below. - ### Discussion This type of issue has a minimal template ("Discussion") and should be used to gather feedback around a topic in general before coalescing it into something more specific, like a feature request. These sorts of discussion issues can be closed when the conversation finishes and the resulting more specific issues have been created:  -- If an issue is opened as a discussion but should be, for example, a bug report, the correct label should be applied and the "discussion" label removed. Additional info about the bug should also be requested from the author if not already included. -- If an issue is opened as a discussion but isn't relevant to source code contribution or otherwise relevant to the GitHub repositories/contribution process/contribution community, they should be redirected to the forum or Discord and the issue closed. -- If relevant, additional labels should be added to discussion issues to further signal what type of discussion it is at a glance. - ---- +* If an issue is opened as a discussion but should be, for example, a bug report, the correct label should be applied and the "discussion" label removed. Additional info about the bug should also be requested from the author if not already included. +* If an issue is opened as a discussion but isn't relevant to source code contribution or otherwise relevant to the GitHub repositories/contribution process/contribution community, they should be redirected to the forum or Discord and the issue closed. +* If relevant, additional labels should be added to discussion issues to further signal what type of discussion it is at a glance. +*** ## Pull Requests Almost all code contributions to the p5.js repositories happen through pull requests. Stewards and maintainers may have push access to the repositories but are still encouraged to follow the same issue > PR > review process when contributing code. Here are the steps to review a PR: -- Pull request template can be found [here](https://github.com/processing/p5.js/blob/main/.github/PULL_REQUEST_TEMPLATE/). -- Almost all pull requests must have associated issues opened and discussed first, meaning the relevant [issue workflow](steward_guidelines.md#issues) must have been followed first before a PR should be reviewed by any steward or maintainer. - - The only instances where this does not apply are very minor typo fixes, which do not require an open issue and can be merged by anyone with merge access to the repo, even if they are not stewards of a particular area. - - While this exception exists, we will apply it in practice only while contributors are still encouraged to open new issues first. In other words, if in doubt about whether this exception applies, just open an issue anyway. -- If a pull request does not fully solve the referenced issue, you can edit the original post and change "Resolves #OOOO" to "Addresses #OOOO" so that it does not automatically close the original issue when the PR is merged. - +* Pull request template can be found [here](https://github.com/processing/p5.js/blob/main/.github/PULL_REQUEST_TEMPLATE/). +* Almost all pull requests must have associated issues opened and discussed first, meaning the relevant [issue workflow](steward_guidelines.md#issues) must have been followed first before a PR should be reviewed by any steward or maintainer. + * The only instances where this does not apply are very minor typo fixes, which do not require an open issue and can be merged by anyone with merge access to the repo, even if they are not stewards of a particular area. + * While this exception exists, we will apply it in practice only while contributors are still encouraged to open new issues first. In other words, if in doubt about whether this exception applies, just open an issue anyway. +* If a pull request does not fully solve the referenced issue, you can edit the original post and change "Resolves #OOOO" to "Addresses #OOOO" so that it does not automatically close the original issue when the PR is merged. ### Simple fix Simple fixes, such as a small typo fix, can be merged directly by anyone with merge access.  Check on the PR "Files Changed" tab to ensure  that the automated CI test passes. -![The "files changed" tab when viewing a pull request on GitHub](images/contributor-docs/files-changed.png) - -![The "All checks have passed" indicator on a GitHub pull request, highlighted above the merge button](images/contributor-docs/all-checks-passed.png) +![The "files changed" tab when viewing a pull request on GitHub](/images/contributor-docs/files-changed.png) +![The "All checks have passed" indicator on a GitHub pull request, highlighted above the merge button](/images/contributor-docs/all-checks-passed.png) ### Bug fix 1. Bug fixes should be reviewed by the relevant area steward, ideally the same one that approved the referenced issue for fixing. + 2. The PR "Files Changed" tab can be used to initially review whether the fix is implemented as described in the issue discussion. + 3. The PR should be tested locally whenever possible and relevant. The GitHub CLI can help streamline some of the process. (See more below in [Tips & Tricks](steward_guidelines.md#tips-tricks)). - - [ ] The fix should address the original issue sufficiently. - - [ ] The fix should not change any existing behaviors unless agreed upon in the original issue. - - [ ] The fix should not have a significant performance impact on p5.js. - - [ ] The fix should not have any impact on p5.js' accessibility. - - [ ] The fix should use the modern standard of JavaScript coding. - - [ ] The fix should pass all automated tests and include new tests if relevant. + * [ ] The fix should address the original issue sufficiently. + * [ ] The fix should not change any existing behaviors unless agreed upon in the original issue. + * [ ] The fix should not have a significant performance impact on p5.js. + * [ ] The fix should not have any impact on p5.js' accessibility. + * [ ] The fix should use the modern standard of JavaScript coding. + * [ ] The fix should pass all automated tests and include new tests if relevant. + 4. If any additional changes are required, line comments should be added to the relevant lines as described [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#adding-line-comments-to-a-pull-request). - - A suggestion block can also be used to suggest specific changes:\ - ![The Suggest Change button while writing a comment on code in a GitHub pull request](images/contributor-docs/suggest-change.png)\ - ![A suggested change appearing within code fences with the "suggestion" tag](images/contributor-docs/suggested-value-change.png)\ - ![A suggested change previewed as a diff](images/contributor-docs/suggestion-preview.png) - - If multiple changes are required, don’t add single-line comments many times. Instead, follow the procedure documented [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/reviewing-proposed-changes-in-a-pull-request) to make multiple-line comments and a single request for changes. - - If line comments are just for clarification or discussion, choose “Comment” instead of "Request changes":\ - ![The "comment" option circled within the GitHub Finish Review menu](images/contributor-docs/comment-review.png) + * A suggestion block can also be used to suggest specific changes:\ + ![The Suggest Change button while writing a comment on code in a GitHub pull request](/images/contributor-docs/suggest-change.png)\ + ![A suggested change appearing within code fences with the "suggestion" tag](/images/contributor-docs/suggested-value-change.png)\ + ![A suggested change previewed as a diff](/images/contributor-docs/suggestion-preview.png) + * If multiple changes are required, don’t add single-line comments many times. Instead, follow the procedure documented [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/reviewing-proposed-changes-in-a-pull-request) to make multiple-line comments and a single request for changes. + * If line comments are just for clarification or discussion, choose “Comment” instead of "Request changes":\ + ![The "comment" option circled within the GitHub Finish Review menu](/images/contributor-docs/comment-review.png) + 5. Once the PR has been reviewed and no additional changes are required, a steward can mark the PR as "Approved" by choosing the "Approve" option in the previous step, with or without additional comments. The steward can then either request additional review by another steward or maintainer if desired, merge the PR if they have merge access, or request a merge from a maintainer. 6. @[all-contributors](https://allcontributors.org/docs/en/emoji-key) bot should be called to add any new contributors to the list of contributors in the README.md file. Each type of contribution can be indicated in place of `[contribution` `type]` below, the full list of available types of contributions can be found in the link above. `@all-contributors` `please` `add` `@[GitHub` `handle]` `for` `[contribution` `type]` - ### New feature/feature enhancement The process for new feature or feature enhancement PR is similar to bug fixes with just one notable difference: -- A new feature/feature enhancement PR must be reviewed and approved by at least two stewards or maintainers before it can be merged. - +* A new feature/feature enhancement PR must be reviewed and approved by at least two stewards or maintainers before it can be merged. ### Dependabot Dependabot PRs are usually only visible to repo admins so if this does not apply to you, please skip this section. -- Dependabot PRs can be merged directly if the version update is a [semver](https://semver.org/) patch version and the automated CI test has passed. -- Dependabot PRs with semver minor version changes can usually be merged directly as long as automated CI test passes. A quick check on the changelog of the updated dependency is recommended. -- Dependabot PRs with semver major version changes may likely affect either the build process or p5.js functionalities. The reviewer, in this case, is encouraged to review the changelog from the current version to the target version if possible and test the PR locally to ensure all processes are functioning and make any required changes due to potential breaking changes in the dependencies. - - Many dependencies bump major version numbers only because they drop official support for very old versions of Node.js. In many cases, major version changes don't necessarily mean breaking changes resulting from dependency API changes. - ---- +* Dependabot PRs can be merged directly if the version update is a [semver](https://semver.org/) patch version and the automated CI test has passed. +* Dependabot PRs with semver minor version changes can usually be merged directly as long as automated CI test passes. A quick check on the changelog of the updated dependency is recommended. +* Dependabot PRs with semver major version changes may likely affect either the build process or p5.js functionalities. The reviewer, in this case, is encouraged to review the changelog from the current version to the target version if possible and test the PR locally to ensure all processes are functioning and make any required changes due to potential breaking changes in the dependencies. + * Many dependencies bump major version numbers only because they drop official support for very old versions of Node.js. In many cases, major version changes don't necessarily mean breaking changes resulting from dependency API changes. +*** ## Build process @@ -179,7 +167,6 @@ This section will not cover the general build setup nor commands but rather deta The Gruntfile.js file contains the main build definitions for p5.js. Among the different tools used to build the library and documentation includes but not limited to Grunt, Browserify, YUIDoc, ESLint, Babel, Uglify, and Mocha. It may be helpful for us to start with the `default` task and work backward from there. It may be helpful at this point to open up the Gruntfile.js document while going through the explainer below. - ### Main build task ``` @@ -188,7 +175,6 @@ grunt.registerTask('default', ['lint', 'test']); When we run `grunt` or the npm script `npm test`, we run the default task consisting of `lint` then `test`. - #### `lint` Task ``` @@ -201,7 +187,6 @@ The `lint:samples` task will first run the `yui` task which itself consists of ` Next in `lint:samples` is `eslint-samples:source`, which is a custom written task whose definition is in [./tasks/build/eslint-samples.js](tasks/build/eslint-samples.js); it will run ESLint to check the documentation example code to make sure they follow the same coding convention as the rest of p5.js (`yui` is run first here because we need the JSON file to be built first before we can lint the examples). - #### `test` Task ```js @@ -227,9 +212,9 @@ grunt.registerTask('build', [ Tasks that start with `browserify` are defined in [./tasks/build/browserify.js](tasks/build/browserify.js). They all  similar steps with minor differences. These are the main steps to build the full p5.js library from its many source code files into one: -- `browserify` builds p5.js while `browserify:min` builds an intermediate file to be minified in the next step. The difference between `browserify` and `browserify:min` is that `browserify:min` does not contain data needed for FES to function. -- `uglify` takes the output file of `browserify:min` and minify it into the final p5.min.js (configuration of this step is in the main Gruntfile.js). -- `browserify:test` is building a version identical to the full p5.js except for added code that is used for test code coverage reporting (using [Istanbul](https://istanbul.js.org/)). +* `browserify` builds p5.js while `browserify:min` builds an intermediate file to be minified in the next step. The difference between `browserify` and `browserify:min` is that `browserify:min` does not contain data needed for FES to function. +* `uglify` takes the output file of `browserify:min` and minify it into the final p5.min.js (configuration of this step is in the main Gruntfile.js). +* `browserify:test` is building a version identical to the full p5.js except for added code that is used for test code coverage reporting (using [Istanbul](https://istanbul.js.org/)). First, use of the `fs.readFileSync()` node.js specific code is replaced with the file's actual content using `brfs-babel`. This is used mainly by WebGL code to inline shader code from source code written as separate files. @@ -265,7 +250,6 @@ Finally, after all builds and tests are complete, this step will gather the test And that covers the default task in the Gruntfile.js configuration! - ### Miscellaneous tasks All of the steps can be run directly with `npx grunt [step]`. There are also a few tasks that are not covered above but could be useful in certain cases. @@ -294,75 +278,62 @@ The `watch:quick` task will run the library build only on detecting changes in t Depending on what you are working on, choosing the most minimal watch task here can save you from having to manually run a rebuild whenever you want to make some changes. ---- - +*** ## Release process Please see [release\_process.md](release_process/). ---- - +*** ## Tips & tricks Sometimes, the number of issues and PR that require review can get a bit overwhelming.  While we try to put in place processes that make things easier, there are some tips and tricks that you can utilize to help with reviewing issues and PRs. - ### Reply templates A handy GitHub feature that you can use is the [Saved Replies](https://docs.github.com/en/get-started/writing-on-github/working-with-saved-replies/about-saved-replies) feature, which is available to use when authoring a reply to issues or pull requests. Some of the workflow described above may require responding to issues or PRs with identical or very similar replies (redirecting questions to the forum, accepting an issue for fixing, etc.), and using Saved Replies can just ever so slightly make this more efficient. Below are some of the Saved Replies that are being used by p5.js maintainers. You can use them yourself or create your own! - ##### Closing: Can’t Reproduce > We're not able to reproduce this, but please feel free to reopen if you can provide a code sample that demonstrates the issue. Thanks! - ##### Closing: Need Snippet > I'm closing this for organizational purposes. Please reopen if you can provide a code snippet that illustrates the issue. Thanks! - ##### Closing: Use the Forum > The GitHub issues here are a good place for bugs and issues with the p5.js library itself. For questions about writing your own code, tests, or following tutorials, the [forum](https://discourse.processing.org/) is the best place to post. Thanks! - ##### Closing: GSOC > Thanks! The best place to discuss GSOC proposals is on our [forum](https://discourse.processing.org/c/summer-of-code). - ##### Closing: Access > I'm not seeing a lot of interest in this feature, and we don't have a clear explanation of how it [expands access](access/), so I will close this for now. If an access statement can be added to the issue request, please feel welcome to reopen. > We do not see a further explanation of how this issue [expands access](access/), so I will close this issue for now. If a more detailed access statement can be added to the feature request, please feel welcome to reopen it. Thank you! - ##### Closing: Addon > I think this function is beyond the scope of the p5.js API (we try to keep it as minimal as possible), but it could be a great starting point for an addon library. See the docs here for how to create an addon: [https://github.com/processing/p5.js/blob/main/contributor\_docs/creating\_libraries.md](creating_libraries/) - ##### Closing PR: Need Issue First > Thank you. As a reminder, issues need to be opened before pull requests are opened and tagged with the issue. This is necessary for tracking development and keeping discussion clear. Thanks! - ##### Approve issue for fixing > You can go ahead with a fix. Thanks. - ##### Merged PR > Looks good. Thanks! - ### GitHub CLI Reviewing a complex PR can be difficult with complex git commands required to get the PR's version of code locally for you to test. Fortunately, the [GitHub CLI](https://cli.github.com/) tool can help greatly with this process and more. @@ -371,18 +342,14 @@ After installing the CLI and logging in, reviewing a PR locally can be done by r There are many other commands available in the GitHub CLI as well that you may or may not find useful, but it is a good tool to have around in any case. - ### Managing notifications Instead of manually monitoring the "Issues" or "Pull Requests" tabs of the repo for new issues or PRs, you can "watch" the repo by clicking on the "Watch" button with an eye icon on the top of the repo page opposite the repo name. -![Cropped screenshot of the top right corner of a GitHub repository page showing a series of buttons in the center from left to right: Sponsor, Watch, Fork, Starred.](images/contributor-docs/github-repo-metrics.png) +![Cropped screenshot of the top right corner of a GitHub repository page showing a series of buttons in the center from left to right: Sponsor, Watch, Fork, Starred.](/images/contributor-docs/github-repo-metrics.png) By watching a repo, events such as new issues, new pull requests, mentions of your user handle, and other activities you subscribed to on the repo will be sent as notifications to your [notification page](https://github.com/notifications), where they can be marked as read or dismissed much like an email inbox. In some cases, you may receive emails from GitHub about events in the repo you are watching as well, and you can customize these (including unsubscribing from them completely) from your [notifications settings page](https://github.com/settings/notifications). Setting these up to fit the way you work can be the difference between having to find relevant issues/PRs to review manually and being overwhelmed by endless notifications from GitHub. A good balance is required here. As a starting suggestion, stewards should watch this repo for "Issues" and "Pull Requests" and set it to only receive emails on "Participating, @mentions and custom." - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/supported_browsers.mdx b/src/content/contributor-docs/en/supported_browsers.mdx index f6a8b4480c..6f63306f4f 100644 --- a/src/content/contributor-docs/en/supported_browsers.mdx +++ b/src/content/contributor-docs/en/supported_browsers.mdx @@ -1,10 +1,7 @@ - ---- - ---- # Supported browsers ## Our stated goal + p5.js uses [browserslist](https://browsersl.ist/) and [Babel](https://babeljs.io/) to provide support for older browsers. The browserslist configuration in use is [`last 2 versions, not dead`](https://browserslist.dev/?q=bGFzdCAyIHZlcnNpb25zLCBub3QgZGVhZA%3D%3D). `last 2 versions` means the last two releases of any browsers, `not dead` means browsers that had official support or updates in the past 24 months. Both of these conditions must be true for a browser to be supported. In practice, you can still use most of the latest features available in Javascript because Babel will likely be able to transpile or polyfill them to something matching the required compatibility list. Some features such as [Web API](https://developer.mozilla.org/en-US/docs/Web/API), [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API), or similar features not part of the core Javascript language cannot be handled by Babel and will need to be assessed on a case by case basis. @@ -12,9 +9,9 @@ In practice, you can still use most of the latest features available in Javascri Good places to check if a feature is available are [caniuse.com](https://caniuse.com/) and [MDN](https://developer.mozilla.org/en-US/). ## Where does this apply + The supported browsers requirement will apply to the p5.js source code, all examples (both website examples page and documentation), and all official tutorials. Third party add-on libraries does not have to adhere to the same requirement but are encouraged to do so. In many cases browsers not officially supported will likely still work with p5.js but we provide no guarantee for this case. Stewards of each section will be responsible for ensuring PR involving code changes adhere to this requirement. - \ No newline at end of file diff --git a/src/content/contributor-docs/en/unit_testing.mdx b/src/content/contributor-docs/en/unit_testing.mdx index 69cd243aef..542cce4090 100644 --- a/src/content/contributor-docs/en/unit_testing.mdx +++ b/src/content/contributor-docs/en/unit_testing.mdx @@ -1,7 +1,3 @@ - ---- - ---- # Unit Testing Unit testing is an essential part of how a large codebase can stay relatively bug-free. Unit tests are small pieces of code that aim to test individual components of a larger code base for correctness. For example, making sure a function is doing what it should be doing or a class is creating its object instances correctly. @@ -10,13 +6,11 @@ p5.js uses unit tests to ensure the correctness of its various functions. Unit t This guide will walk you through the process of writing unit tests for p5.js. If you are implementing a new function, adding a new feature to an existing function, or changing the behavior of a function, you should implement the relevant unit tests. - ## Prerequisites -- p5.js foundation -- Contributor guidelines with local development setup -- Looking inside p5.js - +* p5.js foundation +* Contributor guidelines with local development setup +* Looking inside p5.js ## Files and folders @@ -24,31 +18,29 @@ All test-related files for p5.js are located in the `test` folder. We won’t go As you can see, the subfolders in the `unit` subfolder roughly correspond to the subfolders in the `src` folder containing the source code of p5.js. At the same time, the files in each subfolder also have a counterpart in the subfolders in the `src` folder. p5.js is composed of many different modules with many different functions in each module. The aim is to have relevant unit tests for every public function that p5.js provides. - ## Testing frameworks p5.js uses [Mocha](https://mochajs.org) as a test runner. It is responsible for running the test code as well as providing a solid framework for reporting test results (i.e., the very long output you see in the terminal when you run the tests!) However, Mocha by itself doesn’t do any testing; for that, we need an assertion library. An assertion library is a collection of handy functions that lets us test various properties of our code, such as whether two values are equal, two values are of the same type, whether a function throws an error, and many more. p5.js uses [Chai's `assert` (and `expect`)](https://www.chaijs.com/api/assert/) to write individual statements about how the code should behave. - ## Writing unit tests To start writing unit tests, first pick a unit. A unit can be a function or a variable in p5.js. Let’s use `p5.prototype.keyIsPressed` as an example. Before beginning to write tests, we need to understand the expected behavior of this variable. The *expected behavior* is that the `keyIsPressed` variable should be `true` if any key is pressed and `false` if no keys are pressed. Now, you can think of various tests against this expected behavior. Possible test cases could be: -- the variable is a boolean -- it should be `true` if a key is pressed -- it should be `true` if any key is pressed - alphabet keys, number keys, special keys, etc. -- it should be `true` if multiple keys are pressed -- it should be `false` if no keys are pressed +* the variable is a boolean +* it should be `true` if a key is pressed +* it should be `true` if any key is pressed - alphabet keys, number keys, special keys, etc. +* it should be `true` if multiple keys are pressed +* it should be `false` if no keys are pressed In the example below, `suite()` and `test()` are both built-in functions provided by Mocha as part of the test environment. If you look into the test file (eg. `test/unit/events/keyboard.js`) you may find additional built-in functions such as `setup()` and `teardown()` as well. Each `suite()` describes a unit of p5.js that you are writing a test for (a function, a variable, etc). Each `test()` in a `suite()` is an individual test case that checks a single feature/behavior of the unit being tested. The first argument passed to `suite()` and `test()` is a description of the suite/test, and its purpose is to give clear output in the terminal for the test case. -- `p5.prototype.keyIsPressed` is the unit being tested in this suite. -- There are three tests in this suite: - - The first test checks if `keyIsPressed` is a boolean value. - - The second test checks if `keyIsPressed` is `true` on key press. - - The third test checks if `keyIsPressed` is `false` when no keys are pressed +* `p5.prototype.keyIsPressed` is the unit being tested in this suite. +* There are three tests in this suite: + * The first test checks if `keyIsPressed` is a boolean value. + * The second test checks if `keyIsPressed` is `true` on key press. + * The third test checks if `keyIsPressed` is `false` when no keys are pressed ```js suite('p5.prototype.keyIsPressed', function() { @@ -96,7 +88,6 @@ Chai provides many different assertion functions that you can use to create the Now that you have written the tests, run them and see if the method behaves as expected. If not, consider whether the tested source code is correct or the test code is not testing the behavior of the code correctly. - ## Adding unit tests If you want to add more unit tests, look and see if there's already a test file for the component you want to add tests for. Generally, tests for a given file in `src` are at the same path under `test/unit`. For example, the tests for `src/color/p5.Color.js` are in `test/unit/color/p5.Color.js`. @@ -170,24 +161,23 @@ suite('module_name', function() { This is also how you will add tests for existing modules for which you didn’t need to create a new test file. - ## Conventions Here are the conventions and best practices that p5.js uses for unit tests which you should follow when writing your own tests: -- Use a single `suite` for each p5.js function/variable being tested. -- Each `suite` representing a function/variable can contain as many `test`s as needed. -- Each `test` should be self-contained and not rely on any other modules in p5.js. -- Test code should be as minimal as possible and only test one thing at a time. Do not test if a value is a function while also testing if it accepts the correct arguments in a single `test`; use two `test`s instead. -- Prefer Chai `assert` when possible instead of `expect`. - +* Use a single `suite` for each p5.js function/variable being tested. +* Each `suite` representing a function/variable can contain as many `test`s as needed. +* Each `test` should be self-contained and not rely on any other modules in p5.js. +* Test code should be as minimal as possible and only test one thing at a time. Do not test if a value is a function while also testing if it accepts the correct arguments in a single `test`; use two `test`s instead. +* Prefer Chai `assert` when possible instead of `expect`. ## Running tests The most straightforward way to run the tests is by using the `npm test` command in your terminal. However, `npm test` usually takes a long time to run simply because of the large number of test cases p5.js has. It can also sometimes be a bit repetitive to make some changes, run `npm test`, make some more changes, and run `npm test` again. Here are some tricks that can help streamline this process: -- Use the `npx grunt watch:main` command to automatically build and test p5.js whenever you save changes to p5.js source files. This will save you from having to manually run tests whenever you are making frequent changes to the codebase. -- You can mark certain test suites to be skipped or be the only suite that is run with the `.skip` and `.only` syntax. +* Use the `npx grunt watch:main` command to automatically build and test p5.js whenever you save changes to p5.js source files. This will save you from having to manually run tests whenever you are making frequent changes to the codebase. + +* You can mark certain test suites to be skipped or be the only suite that is run with the `.skip` and `.only` syntax. ```js // This test suite will not run @@ -201,8 +191,7 @@ The most straightforward way to run the tests is by using the `npm test` command }); ``` -- You can also run `grunt yui:dev` to launch a local server with the reference and a test runner. Once live, you can go to [`http://127.0.0.1:9001/test/test.html`](http://127.0.0.1:9001/test/test.html) to run tests live in your browser. This can be useful if you want to use a debugger in the middle of a test case or if you want to log complex objects. If you want to filter tests by the name of the test case, you can add a search term after a `?grep=` URL parameter, e.g.: [`http://127.0.0.1:9001/test/test.html?grep=framebuffer`](http://127.0.0.1:9001/test/test.html?grep=framebuffer) - +* You can also run `grunt yui:dev` to launch a local server with the reference and a test runner. Once live, you can go to [`http://127.0.0.1:9001/test/test.html`](http://127.0.0.1:9001/test/test.html) to run tests live in your browser. This can be useful if you want to use a debugger in the middle of a test case or if you want to log complex objects. If you want to filter tests by the name of the test case, you can add a search term after a `?grep=` URL parameter, e.g.: [`http://127.0.0.1:9001/test/test.html?grep=framebuffer`](http://127.0.0.1:9001/test/test.html?grep=framebuffer) ## Visual tests @@ -223,8 +212,7 @@ If you need to add a new test file, add it to that folder, then add the filename When you add a new test, running `npm test` will generate new screenshots for any visual tests that do not yet have them. Those screenshots will then be used as a reference the next time tests run to make sure the sketch looks the same. If a test intentionally needs to look different, you can delete the folder matching the test name in the `test/unit/visual/screenshots` folder, and then re-run `npm test` to generate a new one. -To manually inspect all visual tests, run `grunt yui:dev` to launch a local server, then go to http://127.0.0.1:9001/test/visual.html to see a list of all test cases. - +To manually inspect all visual tests, run `grunt yui:dev` to launch a local server, then go to [http://127.0.0.1:9001/test/visual.html](http://127.0.0.1:9001/test/visual.html) to see a list of all test cases. In a continuous integration (CI) environment, optimizing test speed is essential. It is advantageous to keep the code concise, avoid unnecessary frames, minimize canvas size, and load assets only when essential for the specific functionality under test. To address scenarios involving operations like asynchronous 3D model rendering, consider returning a promise that resolves upon completing all the necessary tests, ensuring efficiency in your visual testing approach. Here's an example of how you can asynchronous 3D model rendering in your visual tests: @@ -250,6 +238,3 @@ visualSuite('3D Model rendering', function() { }); }); ``` - - - \ No newline at end of file diff --git a/src/content/contributor-docs/en/web_accessibility.mdx b/src/content/contributor-docs/en/web_accessibility.mdx index 4757ea3278..c8050daf0f 100644 --- a/src/content/contributor-docs/en/web_accessibility.mdx +++ b/src/content/contributor-docs/en/web_accessibility.mdx @@ -1,7 +1,3 @@ - ---- - ---- # p5.js Web Accessibility This document describes the structure of p5.js’ web accessibility features for contributors.  @@ -12,14 +8,12 @@ If you want to use p5.js with a screen reader, visit the [Using p5.js with a Scr The canvas HTML element is a grid of pixels. It doesn’t provide any screen reader-accessible information about the shapes drawn on it. p5.js has several functions that make the canvas more accessible to screen readers by providing [fallback text](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_usage#accessible_content) descriptions. I’ll describe some of the details around the implementation of these functions. - ## Prerequisites -- p5.js foundation -- Contributor guidelines with local development setup -- Looking inside p5.js -- How to label your p5.js code - +* p5.js foundation +* Contributor guidelines with local development setup +* Looking inside p5.js +* How to label your p5.js code ## Library-generated accessible outputs for basic shapes @@ -42,7 +36,7 @@ function draw() { } ``` -![An orange circle and pink square on a light purple canvas](images/contributor-docs/sketch-with-shapes.png) +![An orange circle and pink square on a light purple canvas](/images/contributor-docs/sketch-with-shapes.png) `textOutput()` creates a screen reader-accessible output that describes the shapes present on the canvas. The general description of the canvas includes the canvas size, canvas color, and number of elements in the canvas: @@ -59,45 +53,44 @@ Each element can be selected to get more details. A table of elements is also pr > fuchsia square    location = bottom right    area = 2%
-This generates the following HTML: - -```html - -  
-    
-      Text Output -      
-        

-          Your output is a, 400 by 400 pixels, white canvas containing the following 2 shapes: -        

-        
    -          
  • -            orange circle, at top left, covering 1% of the canvas. -          
  • -          
  • -            fuchsia square, at bottom right, covering 2% of the canvas. -          
  • -        
-      
-      
-         -           -             -             -             -           -           -             -             -             -           -         -      
orange circlelocation = top left area = 1%
fuchsia squarelocation = bottom right area = 2%
-     -   - -``` - + This generates the following HTML: + + ```html + +   
+     
+       Text Output +       
+         

+           Your output is a, 400 by 400 pixels, white canvas containing the following 2 shapes: +         

+         
    +           
  • +             orange circle, at top left, covering 1% of the canvas. +           
  • +           
  • +             fuchsia square, at bottom right, covering 2% of the canvas. +           
  • +         
+       
+        +          +            +              +              +              +            +            +              +              +              +            +          +       
orange circlelocation = top left area = 1%
fuchsia squarelocation = bottom right area = 2%
+     
+   
+
+ ``` `gridOutput()` lays out the content of the canvas in the form of a grid using an HTML table element. Each shape’s location in the grid is based on its spatial location on the canvas. A brief description of the canvas is available before the table output. This description includes the color of the background, size of the canvas, number of objects, and object types: @@ -111,67 +104,64 @@ Each shape’s description is placed in a cell of the table depending on its loc These descriptions can be selected individually to get more details. A list of elements where shape, color, location, and area are described is also available: -- *orange circle, location = top left, area = 1 %* -- *fuchsia square, location = bottom right, area = 2 %* +* *orange circle, location = top left, area = 1 %* +* *fuchsia square, location = bottom right, area = 2 %*
- -The generated HTML is as follows: - - -```html - -  
-    
-      Grid Output -      

-     white canvas, 400 by 400 pixels, contains 2 shapes:  1 circle 1 square -   

-       -         -           -           -           -             -           -           -           -           -           -           -           -             -           -           -         -      
orange circle
fuchsia square
-      
    -        
  • orange circle, location = top left, area = 1 %
  • -        
  • fuchsia square, location = bottom right, area = 2 %
  • -      
-    
-  
-
-``` - + + The generated HTML is as follows: + + + ```html + +   
+     
+       Grid Output +       

+      white canvas, 400 by 400 pixels, contains 2 shapes:  1 circle 1 square +    

+        +          +            +            +            +              +            +            +            +            +            +            +            +              +            +            +          +       
orange circle
fuchsia square
+       
    +         
  • orange circle, location = top left, area = 1 %
  • +         
  • fuchsia square, location = bottom right, area = 2 %
  • +       
+     
+   
+
+ ```
If a user passes `LABEL` as an argument to either of these functions, an additional `
` element is created next to the `` element. The new \
contains a visible version of the same screen reader-accessible description embedded in the `` element. This is useful for non-screen reader users who might want to display the output as they code. However, using `LABEL` will create unnecessary redundancy for screen reader users. We recommend using `LABEL` only as part of the development process of a sketch and removing it before publishing or sharing your sketch with screen reader users. -![A p5.js canvas, with the text descriptions described earlier present below it](images/contributor-docs/sketch-text-output.png) - +![A p5.js canvas, with the text descriptions described earlier present below it](/images/contributor-docs/sketch-text-output.png) ### Outputs structure Although `textOutput()` and `gridOutput()` are located in [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/src/accessibility/outputs.js), the outputs are created and updated using functions distributed across the library. This section details the different functions that support the accessible outputs. - #### outputs.js [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/src/accessibility/outputs.js) includes two public methods: -- `textOutput()` -- `gridOutput()` +* `textOutput()` +* `gridOutput()` Both methods activate the accessible output by setting `this._accessibleOutputs.text` or `this._accessibleOutputs.grid `to `true` and calling `this._createOutput('textOutput', 'Fallback')` or `this._createOutput('gridOutput', 'Fallback')` respectively.  @@ -179,37 +169,36 @@ If `LABEL` is passed as a parameter to the method, it also activates the visible In the same file, there are the following private methods as well: -- `_createOutput()`: This method creates the HTML structure for all accessible outputs. Depending on the type and display of the outputs, the HTML structure created will vary. The function also initializes `this.ingredients` which stores all the data for the outputs including: `shapes`, `colors`, and `pShapes` (which stores a string of the previous shapes of the canvas). It also creates `this.dummyDOM` if it doesn't exist. `this.dummyDOM` stores the HTMLCollection of DOM elements inside of ``. -- `_updateAccsOutput()`: Is called at the end of `setup()` and `draw()` if using accessibleOutputs. If `this.ingredients` differs from the current outputs, this function calls the update methods of the accessible outputs (eg. `_updateTextOutput` and `_updateGridOutput`). Calling this function only at the end of `setup()` and `draw()` as well as only calling `_updateGridOutput` and `_updateTextOutput` only when the ingredients are different helps avoid overwhelming the screen reader. Otherwise, a screen reader user would not be able to access the descriptions of the canvas as the content of the divs will be constantly updating. -- `_addAccsOutput()`: This method initializes `this._accessibleOutputs` and returns true when `this._accessibleOutputs.grid` or `this._accessibleOutputs.text` is true. -- `_accsBackground()`: Is called at the end of `background()`. It resets `this.ingredients.shapes` and if the color of the background is different than before it calls `this._rgbColorName()` to get the name of the color and store it in `this.ingredients.colors.background` -- `_accsCanvasColors()`: Is called at the end of fill() and stroke(). This function updates the fill and stroke colors by saving them in `this.ingredients.colors.fill` and `this.ingredients.colors.stroke`. It also calls `this._rgbColorName()` to get the names of the colors. -- `_accsOutput()`: Builds `this.ingredients.shapes` which includes all the shapes that are used for creating the outputs. This function is called at the end of the basic shape functions (see accessible output beyond src/accessibility). Depending on the shape that calls it, `_accsOutput()` may call helper functions to gather all the information about that shape that will be needed to create the outputs. These functions include: - - `_getMiddle()`: Returns the middle point or centroid of rectangles, arcs, ellipses, triangles, and quadrilaterals. - - `_getPos()`: Returns the position of a shape on the canvas (e.g.: 'top left', 'mid right'). - - `_canvasLocator()`: Returns location of the shape on a 10\*10 grid mapped to the canvas. - - `_getArea()`: Returns the area of the shape as a percentage of the canvas' total area. +* `_createOutput()`: This method creates the HTML structure for all accessible outputs. Depending on the type and display of the outputs, the HTML structure created will vary. The function also initializes `this.ingredients` which stores all the data for the outputs including: `shapes`, `colors`, and `pShapes` (which stores a string of the previous shapes of the canvas). It also creates `this.dummyDOM` if it doesn't exist. `this.dummyDOM` stores the HTMLCollection of DOM elements inside of ``. +* `_updateAccsOutput()`: Is called at the end of `setup()` and `draw()` if using accessibleOutputs. If `this.ingredients` differs from the current outputs, this function calls the update methods of the accessible outputs (eg. `_updateTextOutput` and `_updateGridOutput`). Calling this function only at the end of `setup()` and `draw()` as well as only calling `_updateGridOutput` and `_updateTextOutput` only when the ingredients are different helps avoid overwhelming the screen reader. Otherwise, a screen reader user would not be able to access the descriptions of the canvas as the content of the divs will be constantly updating. +* `_addAccsOutput()`: This method initializes `this._accessibleOutputs` and returns true when `this._accessibleOutputs.grid` or `this._accessibleOutputs.text` is true. +* `_accsBackground()`: Is called at the end of `background()`. It resets `this.ingredients.shapes` and if the color of the background is different than before it calls `this._rgbColorName()` to get the name of the color and store it in `this.ingredients.colors.background` +* `_accsCanvasColors()`: Is called at the end of fill() and stroke(). This function updates the fill and stroke colors by saving them in `this.ingredients.colors.fill` and `this.ingredients.colors.stroke`. It also calls `this._rgbColorName()` to get the names of the colors. +* `_accsOutput()`: Builds `this.ingredients.shapes` which includes all the shapes that are used for creating the outputs. This function is called at the end of the basic shape functions (see accessible output beyond src/accessibility). Depending on the shape that calls it, `_accsOutput()` may call helper functions to gather all the information about that shape that will be needed to create the outputs. These functions include: + * `_getMiddle()`: Returns the middle point or centroid of rectangles, arcs, ellipses, triangles, and quadrilaterals. + * `_getPos()`: Returns the position of a shape on the canvas (e.g.: 'top left', 'mid right'). + * `_canvasLocator()`: Returns location of the shape on a 10\*10 grid mapped to the canvas. + * `_getArea()`: Returns the area of the shape as a percentage of the canvas' total area. When `this._accessibleOutputs.text` or `this._accessibleOutputs.text` are `true` several functions across the p5.js library call functions in output.js: -- `_accsOutput()` is called in: - - `p5.prototype.triangle()` - - `p5.prototype._renderRect()` - - `p5.prototype.quad()` - - `p5.prototype.point()` - - `p5.prototype.line()` - - `p5.prototype._renderEllipse()` - - `p5.prototype.arc()` -- `_updateAccsOutput()` is called in: - - `p5.prototype.redraw()` - - `p5.prototype.resizeCanvas()` - - `this._setup` -- `_accsCanvasColors()` is called in: - - `p5.Renderer2D.prototype.stroke()` - - `p5.Renderer2D.prototype.fill()` -- `_accsBackground()` is called in: - - `p5.Renderer2D.prototype.background()` - +* `_accsOutput()` is called in: + * `p5.prototype.triangle()` + * `p5.prototype._renderRect()` + * `p5.prototype.quad()` + * `p5.prototype.point()` + * `p5.prototype.line()` + * `p5.prototype._renderEllipse()` + * `p5.prototype.arc()` +* `_updateAccsOutput()` is called in: + * `p5.prototype.redraw()` + * `p5.prototype.resizeCanvas()` + * `this._setup` +* `_accsCanvasColors()` is called in: + * `p5.Renderer2D.prototype.stroke()` + * `p5.Renderer2D.prototype.fill()` +* `_accsBackground()` is called in: + * `p5.Renderer2D.prototype.background()` #### textOutput.js @@ -217,10 +206,9 @@ When `this._accessibleOutputs.text` or `this._accessibleOutputs.text` are `true` `_updateTextOutput()` uses `this.ingredients` to build the content of the text output and text output label which include a summary, a list of shapes, and a table of shapes details. If these are different from the current outputs it updates them. Building the output content is supported by several helper functions in the file that are not part of the `p5` prototype: -- `_textSummary()`: Builds the content of the text output summary. -- `_shapeDetails()`: Builds the text output table that contains shape details. -- `_shapeList()`: Builds the list of shapes of the text output. - +* `_textSummary()`: Builds the content of the text output summary. +* `_shapeDetails()`: Builds the text output table that contains shape details. +* `_shapeList()`: Builds the list of shapes of the text output. #### gridOutput.js @@ -228,10 +216,9 @@ When `this._accessibleOutputs.text` or `this._accessibleOutputs.text` are `true` `_updateGridOutput()` uses `this.ingredients` to build the content of the grid output and grid output label, which include a summary, a grid that maps the location of shapes, and a list of shapes. If these are different from the current outputs, it updates them. Building the output content is supported by several helper functions in the file that are not part of the `p5` prototype: -- `_gridSummary()`: Builds the content of the grid output summary. -- `_gridMap()`: Builds a grid that maps the location of shapes on the canvas. -- `_gridShapeDetails()`: Builds the list of shapes of the grid output, each line of the list includes details about the shape. - +* `_gridSummary()`: Builds the content of the grid output summary. +* `_gridMap()`: Builds a grid that maps the location of shapes on the canvas. +* `_gridShapeDetails()`: Builds the list of shapes of the grid output, each line of the list includes details about the shape. #### color\_namer.js @@ -239,7 +226,6 @@ When creating screen reader-accessible outputs, naming the colors used in the ca `_rgbColorName()` uses `p5.color_conversion._rgbaToHSBA()` to get the HSV values of the color and then uses `_calculateColor()` to get the color name. The function `_calculateColor()` in this file comes from [colorNamer.js](https://github.com/MathuraMG/color-namer), which was developed as part of a [2018 Processing Foundation fellowship](https://medium.com/processing-foundation/making-p5-js-accessible-e2ce366e05a0) and in consultation with blind screen reader expert users. This function returns color names by comparing HSV values to those stored in the `colorLookUp` array, returning the closest color name as a string. - ## User-generated accessible canvas descriptions ### describe() @@ -248,8 +234,8 @@ The `describe()` function creates a sketch author-defined screen reader accessib `describe()` is supported by several methods in [src/accessibility/describe.js](https://github.com/processing/p5.js/blob/main/src/accessibility/describe.js): -- `_descriptionText()`: Checks that text is not `LABEL` or `FALLBACK` and ensures text ends with a punctuation mark. If the text does not end with '.', ',', ';', '?', '!', this function adds a '.' at the end of the string to improve screen reader readability. This function then returns the text as a string. -- `_describeHTML()`: Creates fallback HTML structure for the canvas. If the second parameter of `describe()` is `LABEL`, this function creates a `
` tag adjacent to the `` element for the description text. +* `_descriptionText()`: Checks that text is not `LABEL` or `FALLBACK` and ensures text ends with a punctuation mark. If the text does not end with '.', ',', ';', '?', '!', this function adds a '.' at the end of the string to improve screen reader readability. This function then returns the text as a string. +* `_describeHTML()`: Creates fallback HTML structure for the canvas. If the second parameter of `describe()` is `LABEL`, this function creates a `
` tag adjacent to the `` element for the description text. With example code: @@ -269,8 +255,7 @@ function setup() { The page will output: -![A p5.js canvas, with a description below reading, "A pink square with a red heart in the bottom-right corner."](images/contributor-docs/sketch-text-output2.png) - +![A p5.js canvas, with a description below reading, "A pink square with a red heart in the bottom-right corner."](/images/contributor-docs/sketch-text-output2.png) ### describeElement() @@ -278,9 +263,9 @@ The `describeElement()` function creates a screen reader-accessible description `describeElement()` is supported by several functions in [src/accessibility/describe.js](https://github.com/processing/p5.js/blob/main/src/accessibility/describe.js): -- `_elementName()`: First checks that the element name is not `LABEL` or `FALLBACK` and ensures the name ends with a colon character ‘:’. It then returns the name as a string. -- `_descriptionText()`: Checks that text is not `LABEL` or `FALLBACK` and ensures the text ends with a punctuation mark. If the text does not end with '.', ',', ';', '?', '!', this function adds a '.' at the end of the string. It then returns the text as a string. -- `_describeElementHTML()`: Creates fallback HTML structure for the canvas. When the second parameter of `describeElement()` is `LABEL`, this function creates a div adjacent to the canvas element for the descriptions. +* `_elementName()`: First checks that the element name is not `LABEL` or `FALLBACK` and ensures the name ends with a colon character ‘:’. It then returns the name as a string. +* `_descriptionText()`: Checks that text is not `LABEL` or `FALLBACK` and ensures the text ends with a punctuation mark. If the text does not end with '.', ',', ';', '?', '!', this function adds a '.' at the end of the string. It then returns the text as a string. +* `_describeElementHTML()`: Creates fallback HTML structure for the canvas. When the second parameter of `describeElement()` is `LABEL`, this function creates a div adjacent to the canvas element for the descriptions. With example code: @@ -301,7 +286,4 @@ function setup() { The page will output: -![A p5.js canvas, followed by two lines of description: "A red heart and yellow circle over a pink background," and "Heart: A red heart in the bottom-right corner."](images/contributor-docs/sketch-text-output3.png) - - - \ No newline at end of file +![A p5.js canvas, followed by two lines of description: "A red heart and yellow circle over a pink background," and "Heart: A red heart in the bottom-right corner."](/images/contributor-docs/sketch-text-output3.png) diff --git a/src/content/contributor-docs/en/webgl_contribution_guide.mdx b/src/content/contributor-docs/en/webgl_contribution_guide.mdx index 58b6417cf4..4cad8f90b8 100644 --- a/src/content/contributor-docs/en/webgl_contribution_guide.mdx +++ b/src/content/contributor-docs/en/webgl_contribution_guide.mdx @@ -1,34 +1,27 @@ - ---- - ---- # WebGL Contribution Guide If you're reading this page, you're probably interested in helping work on WebGL mode. Thank you, we're grateful for your help! This page exists to help explain how we structure WebGL contributions and to offer some tips for making changes. - ## Resources -- Read our [p5.js WebGL architecture overview](webgl_mode_architecture/) to understand how WebGL mode differs from 2D mode. This will be a valuable reference for some implementation specifics for shaders, strokes, and more. -- Read our [contributor guidelines](https://p5js.org/contributor-docs/#/./contributor_guidelines) for information on how to create issues, set up the codebase, and test changes. -- It can be helpful to know a bit about the browser's WebGL API, which is what p5.js's WebGL mode is built on top of: - - [WebGL fundamentals](https://webglfundamentals.org/) goes over many core rendering concepts - - [The Book of Shaders](https://thebookofshaders.com/) explains many techniques used in WebGL shaders - +* Read our [p5.js WebGL architecture overview](webgl_mode_architecture/) to understand how WebGL mode differs from 2D mode. This will be a valuable reference for some implementation specifics for shaders, strokes, and more. +* Read our [contributor guidelines](https://p5js.org/contributor-docs/#/./contributor_guidelines) for information on how to create issues, set up the codebase, and test changes. +* It can be helpful to know a bit about the browser's WebGL API, which is what p5.js's WebGL mode is built on top of: + * [WebGL fundamentals](https://webglfundamentals.org/) goes over many core rendering concepts + * [The Book of Shaders](https://thebookofshaders.com/) explains many techniques used in WebGL shaders ## Planning We organize open issues [in a GitHub Project](https://github.com/orgs/processing/projects/5), where we divide them up into a few types: -- **System-level changes** are longer-term goals with far-reaching implications in the code. These require the most discussion and planning before jumping into implementation. -- **Bugs with no solution yet** are bug reports that need some debugging to narrow down the cause. These are not yet ready to be fixed: once the cause is found, then we can discuss the best way to fix it. -- **Bugs with solutions but no PR** are bugs where we have decided how to fix it and are free for someone to write code for. -- **Minor enhancements** are issues for new features that have an obvious spot within the current architecture without needing to discuss how to fit them in. Once agreed that these are worth doing, they are free to write code for. -- **2D features** are ones that already exist in p5.js but not within WebGL mode. The expected behavior of the feature, once implemented, is to match 2D mode. We may need to discuss the best implementation, but the user requirements for these are clear. -- **Features that don't work in all contexts** are ones that exist in WebGL mode but do not work in all the ways one can use WebGL mode. For example, some p5.js methods work with both 2D coordinates and 3D coordinates, but others break if you use 3D coordinates. These are generally free to begin working on. -- **Feature requests** are all other code change requests. These need a bit of discussion to make sure they are things that fit into WebGL mode's roadmap. -- **Documentation** issues are ones that don't need a code change but instead need better documentation of p5.js's behavior. - +* **System-level changes** are longer-term goals with far-reaching implications in the code. These require the most discussion and planning before jumping into implementation. +* **Bugs with no solution yet** are bug reports that need some debugging to narrow down the cause. These are not yet ready to be fixed: once the cause is found, then we can discuss the best way to fix it. +* **Bugs with solutions but no PR** are bugs where we have decided how to fix it and are free for someone to write code for. +* **Minor enhancements** are issues for new features that have an obvious spot within the current architecture without needing to discuss how to fit them in. Once agreed that these are worth doing, they are free to write code for. +* **2D features** are ones that already exist in p5.js but not within WebGL mode. The expected behavior of the feature, once implemented, is to match 2D mode. We may need to discuss the best implementation, but the user requirements for these are clear. +* **Features that don't work in all contexts** are ones that exist in WebGL mode but do not work in all the ways one can use WebGL mode. For example, some p5.js methods work with both 2D coordinates and 3D coordinates, but others break if you use 3D coordinates. These are generally free to begin working on. +* **Feature requests** are all other code change requests. These need a bit of discussion to make sure they are things that fit into WebGL mode's roadmap. +* **Documentation** issues are ones that don't need a code change but instead need better documentation of p5.js's behavior. ## Where to Put Code @@ -38,37 +31,30 @@ When implementing user-facing classes, we generally try to have one file per cla `p5.RendererGL` is a large class that handles a lot of behavior. For this reason, rather than having one large class file, its functionality is split into many files based on what subject area it is. Here is a description of the files we split `p5.RendererGL` across, and what to put in each one: - #### `p5.RendererGL.js` Initialization and core functionality. - #### `p5.RendererGL.Immediate.js` Functionality related to **immediate mode** drawing (shapes that will not get stored and reused, such as `beginShape()` and `endShape()`) - #### `p5.RendererGL.Retained.js` Functionality related to **retained mode** drawing (shapes that have been stored for reuse, such as `sphere()`) - #### `material.js` Management of blend modes - #### `3d_primitives.js` User-facing functions that draw shapes, such as `triangle()`. These define the geometry of the shapes. The rendering of those shapes then happens in `p5.RendererGL.Retained.js` or `p5.RendererGL.Immediate.js`, treating the geometry input as a generic shape. - #### `Text.js` Functionality and utility classes for text rendering. - ## Testing WebGL Changes ### Testing Consistency @@ -126,15 +112,14 @@ test('color interpolation', function() { }); ``` - ### Performance Testing While not the #1 concern of p5.js, we try to make sure changes don't cause a large hit to performance. Typically, this is done by creating two test sketches: one with your change and one without the change. We then compare the frame rates of both. Some advice on how to measure performance: -- Disable friendly errors with `p5.disableFriendlyErrors = true` at the top of your sketch (or just test `p5.min.js`, which does not include the friendly error system) -- Display the average frame rate to get a clear sense of the steady state frame rate: +* Disable friendly errors with `p5.disableFriendlyErrors = true` at the top of your sketch (or just test `p5.min.js`, which does not include the friendly error system) +* Display the average frame rate to get a clear sense of the steady state frame rate: ```js let frameRateP; @@ -161,7 +146,5 @@ function draw() { Here are cases we try to test since they stress different parts of the rendering pipeline: -- A few very complicated shapes (e.g., a large 3D model or a long curve) -- Many simple shapes (e.g., `line()` called many times in a for loop) - - \ No newline at end of file +* A few very complicated shapes (e.g., a large 3D model or a long curve) +* Many simple shapes (e.g., `line()` called many times in a for loop) diff --git a/src/content/contributor-docs/en/webgl_mode_architecture.mdx b/src/content/contributor-docs/en/webgl_mode_architecture.mdx index f9cff7e47f..61510eb819 100644 --- a/src/content/contributor-docs/en/webgl_mode_architecture.mdx +++ b/src/content/contributor-docs/en/webgl_mode_architecture.mdx @@ -1,19 +1,13 @@ - ---- - ---- # p5.js WebGL Mode Architecture This document is intended for contributors and library makers who want to extend the WebGL codebase. If you are looking for help using WebGL mode in your sketches, consider reading the WebGL tutorials [on the p5.js Learn page](https://p5js.org/learn/) instead. - ## What is WebGL mode? There are two renderers that p5.js can run in, 2D and WebGL mode. WebGL mode in p5.js allows the user to make use of the [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) built into the web browser for rendering high-performance 2D and 3D graphics. The key difference between 2D mode and WebGL mode is that the latter provides more direct access to the computer's GPU, allowing it to performantly render shapes in 3D or perform other graphics and image processing tasks.  We keep track of the progress of WebGL issues in [a GitHub Project.](https://github.com/orgs/processing/projects/20) - ## Goals of WebGL mode When evaluating a new feature, we consider whether it aligns with the goals of p5.js and WebGL mode: @@ -23,15 +17,13 @@ When evaluating a new feature, we consider whether it aligns with the goals of p 3. **Simplicity and Extensibility are paramount:** It should **have a small core and be extensible for libraries.** Keeping WebGL mode small makes it easier to optimize core features and reduce bug surface area. Extension provides an avenue to include more advanced features via libraries. 4. **Improve p5.js performance:** It should **run as fast as possible without interfering with the previous goals.** Good performance keeps sketches accessible to a wide variety of viewers and devices. When designing new APIs, we try to ensure the design has a performant implementation. However, we give preference to simplicity and parity with 2D mode. - ## Design Differences with 2D Mode The browser's 2D and WebGL canvas context APIs offer very different levels of abstraction, with WebGL being generally lower-level and 2D being higher-level. This motivates some fundamental design differences between p5.js's WebGL and 2D modes. -- **WebGL mode creates more deeply nested data structures.** 2D mode generally passes commands to the browser, leading to relatively shallow call stacks. In contrast, WebGL mode is responsible for breaking down shapes into triangles, rendering them, and often caching them for future reuse. The more complicated rendering logic necessitates splitting code into a number of classes like `p5.Texture`, `p5.RenderBuffer`, and `p5.DataArray` to keep implementations readable and maintainable. -- **WebGL mode offers more customization.** For example, while 2D mode does not control how curves get rendered, WebGL is responsible for converting them into triangles. While it picks a sensible default, the `curveDetail()` API lets users control how many line segments to use, as we cannot predict the best balance of quality and performance for every use case. -- **WebGL mode must balance high- and low-level APIs.** Since finer-grained control is available with the browser WebGL API, p5.js's WebGL mode is able to offer users some of that control where 2D mode cannot. We then are faced with the task of picking the right level of abstraction for users. Too high, and they are unable to take advantage of some of what the browser has to offer; too low, and we pass too much of the work of managing complexity and performance onto the user. - +* **WebGL mode creates more deeply nested data structures.** 2D mode generally passes commands to the browser, leading to relatively shallow call stacks. In contrast, WebGL mode is responsible for breaking down shapes into triangles, rendering them, and often caching them for future reuse. The more complicated rendering logic necessitates splitting code into a number of classes like `p5.Texture`, `p5.RenderBuffer`, and `p5.DataArray` to keep implementations readable and maintainable. +* **WebGL mode offers more customization.** For example, while 2D mode does not control how curves get rendered, WebGL is responsible for converting them into triangles. While it picks a sensible default, the `curveDetail()` API lets users control how many line segments to use, as we cannot predict the best balance of quality and performance for every use case. +* **WebGL mode must balance high- and low-level APIs.** Since finer-grained control is available with the browser WebGL API, p5.js's WebGL mode is able to offer users some of that control where 2D mode cannot. We then are faced with the task of picking the right level of abstraction for users. Too high, and they are unable to take advantage of some of what the browser has to offer; too low, and we pass too much of the work of managing complexity and performance onto the user. ## Drawing Shapes @@ -41,24 +33,23 @@ Everything drawn by p5.js, both in 2D and WebGL, consists of fills and strokes. All shapes in webGL are composed of triangles. When a user calls a function like `circle()`, `beginShape(),` or `vertex()`, the renderer must [break the shape down into a series of points](https://github.com/processing/p5.js/blob/main/src/webgl/3d_primitives.js). The points are connected into lines, and the lines into triangles. For example, `circle()` uses trigonometry to figure out where to place points along a circle. `curveVertex()` and `bezierVertex()` create look-up tables to turn any Bezier curve into points. - #### Fills To create fills, the outline of a shape needs to be filled in with triangles. Some drawing functions like `beginShape(TRIANGLE_STRIP)` already provide triangles for fills. If the shape being drawn is not already made using triangles, we use the library [libtess](https://github.com/brendankenny/libtess.js/) to break it down: in [p5.RendererGL.Immediate.js](https://github.com/processing/p5.js/blob/main/src/webgl/p5.RendererGL.Immediate.js), we run polygon outlines through `_processVertices()`. After libtess turns them into triangles, they are in a format where a shader can draw them to the screen. - #### Strokes Despite their name, strokes also need to be filled in to support strokes of varying widths and styles. The lines along the outline of a shape need to expand out from their centers to form shapes with area. Expansion of strokes creates three types of shapes: joins, caps, and segments, illustrated below. Illustration of the segment, join, and cap shapes created by a stroke. - + +{/* Generated via https://codepen.io/davepvm/pen/ZEVdppQ */} Where two line segments connect, we add a join.  -- A miter join extends the edges of the rectangles until they intersect at a point.  -- A bevel join connects the corners of the rectangles with a straight line.  -- A round join connects the corners with a circular arc.  +* A miter join extends the edges of the rectangles until they intersect at a point.  +* A bevel join connects the corners of the rectangles with a straight line.  +* A round join connects the corners with a circular arc.  We support switching join styles without having to recompute line triangles. To do this, we make each line join a quad, composed of two triangles. The quad extent bounds all possible join styles. We use a shader to only display pixels within the quad that are present in the selected join style. We illustrate how each style fits into the quad below. @@ -70,48 +61,44 @@ We use a similar strategy for stroke caps, present at the disconnected ends of l 3D shapes can also have strokes, but stroke shapes are calculated in 2D. This means they can change based on the camera's perspective. We want to avoid as much recalculation as possible, so we store all the information about the line that is not camera-dependent: -- We include the **center points of the line** in model space, shown below in red. -- We include the **direction of the line**, its tangent, at the start and end of each shape, shown in blue and pink, respectively. This helps us compute the shape of joins where two lines connect. -- We include **a flag that uniquely identifies each corner of the shape.** Combined with the tangent and the normal (a 90-degree rotation of the tangent), it helps determine in what direction to expand the line to give it thickness. +* We include the **center points of the line** in model space, shown below in red. +* We include the **direction of the line**, its tangent, at the start and end of each shape, shown in blue and pink, respectively. This helps us compute the shape of joins where two lines connect. +* We include **a flag that uniquely identifies each corner of the shape.** Combined with the tangent and the normal (a 90-degree rotation of the tangent), it helps determine in what direction to expand the line to give it thickness. To draw the line, we combine that information with camera intrinsics in a shader to produce the final line positions in screen space. The information stored about lines, and the final shapes that they turn into. - ### Rendering Shapes: Immediate and Retained Modes There are two routes that p5.js uses to draw shapes onto the screen: **immediate mode** and **retained mode.** **Immediate mode** is optimized for shapes that change every frame. If you were drawing a curve that changes each frame, its shape data would be different every time you drew it. Because of this, immediate mode fits it best. It indicates to p5.js that it does not need to spend time storing the shape for reuse, and it saves graphics memory from being filled up with all the shape variations over time. The following functions use this mode: -- `vertex()`, `curveVertex()`, `bezierVertex()`, and `quadraticVertex()`, called between `beginShape()` and `endShape()` -- `rect()` when using rounded corners -- `bezier()` -- `curve()` -- `line()` -- `image()` +* `vertex()`, `curveVertex()`, `bezierVertex()`, and `quadraticVertex()`, called between `beginShape()` and `endShape()` +* `rect()` when using rounded corners +* `bezier()` +* `curve()` +* `line()` +* `image()` Retained mode is optimized for shapes that you will need to keep redrawing and don’t change shape. Once a shape is made of triangles and has been sent to the GPU to draw, retained mode keeps it there. It can then be drawn again without having to spend time re-triangulating it or sending it to the GPU again. The saved shape data is kept in a p5.Geometry object. p5.Geometry stores triangle data and keeps track of its uploaded buffers on the GPU. Calling `freeGeometry()` clears the GPU data to make space. Drawing it again after that will re-upload the data. Many 3D shape drawing functions in p5.js, such as `sphere()` or `cone()`, use this internally. You can use buildGeometry() to make a p5.Geometry out of immediate mode commands. You call it with a function that runs a series of any p5.js shape drawing functions. It runs the function, collects the shapes into a new p5.Geometry, and returns it. The p5.Geometry can then be drawn and redrawn efficiently in the future. - ## Materials, Lights, and Shaders Every shape we draw uses a single shader for its fills, and a single shader for its strokes. There are a few default shaders that one can pick from in p5.js. You can also write and use your own shader instead of the default ones. The default shaders work with p5.js's lighting and materials system. The user can specify what lights are in the scene with a shape and how each object reacts to light, including color and shininess. This information is given to the shader for each object being drawn. Custom shaders can also access the same lighting and material information, allowing users and library makers to extend the default rendering behavior. - ### Shaders P5 has a few shaders built in: -- **Color Shader:** for drawing flat colors, activated by using `fill()` or `stroke()`. -- **Lighting Shader:** for drawing 2D and 3D shapes with complex lighting and textures. Activated by calling `lights()`, `ambientLight()`, `directionalLight()`, `pointLight()`, and `spotLight()`. Each adds a light to the lighting list. All added lights contribute to the shading of the shape. If you do not use lights, the shape will be drawn using the color shader, which only uses the fill color. -- **Normal/Debug Shader:** for drawing 2D and 3D shapes using the surface normal as a color. It is activated by calling `normalMaterial()`. - +* **Color Shader:** for drawing flat colors, activated by using `fill()` or `stroke()`. +* **Lighting Shader:** for drawing 2D and 3D shapes with complex lighting and textures. Activated by calling `lights()`, `ambientLight()`, `directionalLight()`, `pointLight()`, and `spotLight()`. Each adds a light to the lighting list. All added lights contribute to the shading of the shape. If you do not use lights, the shape will be drawn using the color shader, which only uses the fill color. +* **Normal/Debug Shader:** for drawing 2D and 3D shapes using the surface normal as a color. It is activated by calling `normalMaterial()`. ### Lights @@ -121,17 +108,15 @@ For all but `ambientLight()`, each light added contributes to the view-independe If you do not use lights, the shape will be drawn using the **color shader,** which only uses the fill color. - ### Materials Each 3D object has a few material properties that can be set by the user: -- **Fill color:** This is the color you see when there are no lights. Set it with `fill()`. If done before drawing the shape, it applies to the whole shape. If called before a `vertex()` between `beginShape()`/`endShape()`, it will apply only to that vertex. A texture, if present from a call to `texture()`, will override the fill. When there are lights, this color will be mixed with the diffuse component of the light. The diffuse component describes the bright and dark areas of the surface due to light being directly cast on it. -- **Specular material:** This is the color that gets mixed with the specular component of the light. The specular component describes the reflected highlights seen on the shape's surface. Set this parameter with `specularMaterial()`. If unspecified, the shape will have no reflections. -- **Shininess:** Set with `shininess()`, this is how sharp the specular reflections are. -- **Ambient material:** This is the color that gets mixed with the ambient light. Ambient light describes constant omnidirectional light on the shape. Set this parameter with `ambientMaterial()`. If unspecified, it will be the same as the fill color. -- **Emissive material**: Set with `emissiveMaterial()`, this adds a constant color to the lighting of the shape, as if it were producing its own light of that color. - +* **Fill color:** This is the color you see when there are no lights. Set it with `fill()`. If done before drawing the shape, it applies to the whole shape. If called before a `vertex()` between `beginShape()`/`endShape()`, it will apply only to that vertex. A texture, if present from a call to `texture()`, will override the fill. When there are lights, this color will be mixed with the diffuse component of the light. The diffuse component describes the bright and dark areas of the surface due to light being directly cast on it. +* **Specular material:** This is the color that gets mixed with the specular component of the light. The specular component describes the reflected highlights seen on the shape's surface. Set this parameter with `specularMaterial()`. If unspecified, the shape will have no reflections. +* **Shininess:** Set with `shininess()`, this is how sharp the specular reflections are. +* **Ambient material:** This is the color that gets mixed with the ambient light. Ambient light describes constant omnidirectional light on the shape. Set this parameter with `ambientMaterial()`. If unspecified, it will be the same as the fill color. +* **Emissive material**: Set with `emissiveMaterial()`, this adds a constant color to the lighting of the shape, as if it were producing its own light of that color. ### Shader Implementation @@ -139,87 +124,77 @@ The lighting and material parameters get turned into shader attributes and unifo While advanced shader writers can take advantage of these properties, it can be unclear for new users. In the Future Goals section, we describe some plans for improving the API. We may want to improve it before publicly documenting and supporting it. - #### Global For all objects in all contexts, the following global uniforms are available: -- `uniform mat4 uModelViewMatrix`: A matrix to convert object-space positions into camera-space -- `uniform mat4 uProjectionMatrix`: A matrix to convert camera-space positions into screen space -- `uniform mat3 uNormalMatrix`: A matrix to convert object-space normals into camera-space +* `uniform mat4 uModelViewMatrix`: A matrix to convert object-space positions into camera-space +* `uniform mat4 uProjectionMatrix`: A matrix to convert camera-space positions into screen space +* `uniform mat3 uNormalMatrix`: A matrix to convert object-space normals into camera-space Additionally, these per-vertex properties are available as attributes: -- `attribute vec3 aPosition`: The position of the vertex in object space -- `attribute vec3 aNormal`: For fills, a direction pointing outward from the surface -- `attribute vec2 aTexCoord`: For fills, a coordinate between 0 and 1 in x and y referring to a location on a texture image -- `attribute vec3 aVertexColor`: For fills, an optional per-vertex color - +* `attribute vec3 aPosition`: The position of the vertex in object space +* `attribute vec3 aNormal`: For fills, a direction pointing outward from the surface +* `attribute vec2 aTexCoord`: For fills, a coordinate between 0 and 1 in x and y referring to a location on a texture image +* `attribute vec3 aVertexColor`: For fills, an optional per-vertex color #### Lights -- `uniform bool uUseLighting`: Whether or not lights have been provided +* `uniform bool uUseLighting`: Whether or not lights have been provided If `uUseLighting` has been set, further lighting information will be passed in: - ##### Ambient lights -- `uniform int uAmbientLightCount`: How many ambient lights are present, up to a maximum of 5 -- `uniform vec3 uAmbientColor[5]`: Ambient light colors - +* `uniform int uAmbientLightCount`: How many ambient lights are present, up to a maximum of 5 +* `uniform vec3 uAmbientColor[5]`: Ambient light colors ##### Directional lights -- `uniform int uDirectionalLightCount`: How many directional lights are present, up to a maximum of 5 -- `uniform vec3 uLightingDirection[5]`: Light directions -- `uniform vec3 uDirectionalDiffuseColors[5]`: Light diffuse colors -- `uniform vec3 uDirectionalSpecularColors[5]`: Light specular colors - +* `uniform int uDirectionalLightCount`: How many directional lights are present, up to a maximum of 5 +* `uniform vec3 uLightingDirection[5]`: Light directions +* `uniform vec3 uDirectionalDiffuseColors[5]`: Light diffuse colors +* `uniform vec3 uDirectionalSpecularColors[5]`: Light specular colors ##### Point lights -- `uniform int uPointLightCount`: How many point lights are present, up to a maximum of 5 -- `uniform vec3 uPointLightLocation[5]`: Locations of point lights -- `uniform vec3 uPointLightDiffuseColors[5]`: Diffuse colors of point lights -- `uniform vec3 uPointLightSpecularColors[5]`: Specular colors of point lights - +* `uniform int uPointLightCount`: How many point lights are present, up to a maximum of 5 +* `uniform vec3 uPointLightLocation[5]`: Locations of point lights +* `uniform vec3 uPointLightDiffuseColors[5]`: Diffuse colors of point lights +* `uniform vec3 uPointLightSpecularColors[5]`: Specular colors of point lights ##### Spot lights -- `uniform int uSpotLightCount`: How many spot lights are present, up to a maximum of 5 -- `uniform float uSpotLightAngle[5]`: Spot light cone radii -- `uniform float uSpotLightConc[5]`: Concentration (focus) of each spot light -- `uniform vec3 uSpotLightDiffuseColors[5]`: Light diffuse colors -- `uniform vec3 uSpotLightSpecularColors[5]`: Light specular colors -- `uniform vec3 uSpotLightLocation[5]`: Spot light locations -- `uniform vec3 uSpotLightDirection[5]`: Spot light directions - +* `uniform int uSpotLightCount`: How many spot lights are present, up to a maximum of 5 +* `uniform float uSpotLightAngle[5]`: Spot light cone radii +* `uniform float uSpotLightConc[5]`: Concentration (focus) of each spot light +* `uniform vec3 uSpotLightDiffuseColors[5]`: Light diffuse colors +* `uniform vec3 uSpotLightSpecularColors[5]`: Light specular colors +* `uniform vec3 uSpotLightLocation[5]`: Spot light locations +* `uniform vec3 uSpotLightDirection[5]`: Spot light directions #### Materials ##### Fill color -- `uniform vec4 uMaterialColor`: shape fill color -- `uniform bool uUseVertexColor`: Whether there are per-vertex colors that override the shape fill color -- `attribute vec4 aVertexColor`: Per-vertex fill color -- `uniform bool isTexture`: Whether a texture is specified -- `uniform sampler2D uSampler`: A texture -- `uniform vec4 uTint`: A tint multiplier for the texture - +* `uniform vec4 uMaterialColor`: shape fill color +* `uniform bool uUseVertexColor`: Whether there are per-vertex colors that override the shape fill color +* `attribute vec4 aVertexColor`: Per-vertex fill color +* `uniform bool isTexture`: Whether a texture is specified +* `uniform sampler2D uSampler`: A texture +* `uniform vec4 uTint`: A tint multiplier for the texture ##### Specular reflections -- `uniform bool uSpecular`: Whether to show reflections -- `uniform float uShininess`: The shininess of the material -- `uniform vec4 uSpecularMatColor`: The material color to blend with specular light - +* `uniform bool uSpecular`: Whether to show reflections +* `uniform float uShininess`: The shininess of the material +* `uniform vec4 uSpecularMatColor`: The material color to blend with specular light ##### Ambient color -- `uniform bool uHasSetAmbient`: Whether an ambient color has been set or if it should default to the fill color -- `uniform vec4 uAmbientMatColor`: The material color to blend with ambient light - +* `uniform bool uHasSetAmbient`: Whether an ambient color has been set or if it should default to the fill color +* `uniform vec4 uAmbientMatColor`: The material color to blend with ambient light #### Other shader inputs @@ -227,22 +202,20 @@ If `uUseLighting` has been set, further lighting information will be passed in: The default line shader is automatically supplied with these global properties in uniforms: -- `uniform vec4 uViewport`: A vector containing `[minX, minY, maxX, maxY]` of the screen rectangle -- `uniform int uPerspective`: A boolean specifying whether to apply perspective projection to line thickness -- `uniform int uStrokeJoin`: An enum representing the join style. 0, 1, and 2 represent `ROUND`, `MITER`, `BEVEL`. -- `uniform int uStrokeCap`: An enum representing the cap style. 0, 1, and 2 represent `ROUND`, `PROJECT`, `SQUARE`. +* `uniform vec4 uViewport`: A vector containing `[minX, minY, maxX, maxY]` of the screen rectangle +* `uniform int uPerspective`: A boolean specifying whether to apply perspective projection to line thickness +* `uniform int uStrokeJoin`: An enum representing the join style. 0, 1, and 2 represent `ROUND`, `MITER`, `BEVEL`. +* `uniform int uStrokeCap`: An enum representing the cap style. 0, 1, and 2 represent `ROUND`, `PROJECT`, `SQUARE`. It also has the following per-vertex attributes: -- `attribute vec3 aTangentIn`: The 3D direction at the start of the line segment -- `attribute vec3 aTangentOut`: The 3D direction at the end of the line segment -- `attribute float aSide`: An enum representing what part of the stroke shape the point is on. See the Strokes section for details. - +* `attribute vec3 aTangentIn`: The 3D direction at the start of the line segment +* `attribute vec3 aTangentOut`: The 3D direction at the end of the line segment +* `attribute float aSide`: An enum representing what part of the stroke shape the point is on. See the Strokes section for details. ##### Points -- `uniform float uPointSize`: The radius of the point being drawn - +* `uniform float uPointSize`: The radius of the point being drawn ## Classes @@ -256,14 +229,10 @@ When setting a shader uniform, if the uniform type is an image, then the rendere Textures corresponding to **p5.Framebuffer** objects are unique. Framebuffers are like graphics: they represent surfaces that can be drawn to. Unlike p5.Graphics, framebuffers live entirely on the GPU. If one uses a p5.Graphics as a texture in a shader, the data needs to be transferred to and from the CPU. This can often be a performance bottleneck. In contrast, when drawing to a framebuffer, you draw directly to its GPU texture. Because of this, no extra data transfer is necessary. WebGL mode tries to use p5.Framebuffers over p5.Graphics where possible for this reason. - ## Future Goals Currently, WebGL mode is functional for a variety of tasks, but many users and library makers want to extend it in new directions. We aim to create a set of building blocks for users and library makers from which they can craft extensions. A block can be considered "done" when it has an extensible API we can confidently commit to supporting. A major milestone for WebGL mode will be when we have a sufficient set of such blocks for an ecosystem of libraries. The main areas currently lacking in extension support are geometry and materials. -- **Extend p5.Geometry to support richer content.** One can create geometry, but many tasks a user might want to accomplish are not yet supported with a stable API. One might want to efficiently update geometry, which is necessary to support animated gltf models. One might want to group multiple materials in one object, if they are present in an imported model. One might want to add custom vertex attributes for a shader to work with. These tasks are currently unsupported. -- **Enable less brittle custom shaders.** To create a shader that integrates p5.js's lighting and materials system, a user is currently forced to create shaders from scratch. These shaders often copy and paste parts of default shaders. This may break between versions if internal naming or structure changes. To be less brittle, libraries should be able to import and reuse default pieces. This lets libraries reuse positioning logic or augment positioning logic but reuse shading logic. There is currently [an issue open for this task.](https://github.com/processing/p5.js/issues/6144) -- **Improve performance.** WebGL mode tries to strike a balance between features and performance. One method is to introduce APIs to tune output quality, like how `curveDetail()` allows faster but lower-quality curves. Line rendering is one of the common performance bottlenecks in its present state, and it could benefit from having lower fidelity but higher performance options. Another method is to introduce new types of objects and rendering methods that are optimized for different usage patterns, like how `endShape(shouldClose, count)` now supports WebGL 2 instanced rendering for more efficient drawing of many shapes. - - - \ No newline at end of file +* **Extend p5.Geometry to support richer content.** One can create geometry, but many tasks a user might want to accomplish are not yet supported with a stable API. One might want to efficiently update geometry, which is necessary to support animated gltf models. One might want to group multiple materials in one object, if they are present in an imported model. One might want to add custom vertex attributes for a shader to work with. These tasks are currently unsupported. +* **Enable less brittle custom shaders.** To create a shader that integrates p5.js's lighting and materials system, a user is currently forced to create shaders from scratch. These shaders often copy and paste parts of default shaders. This may break between versions if internal naming or structure changes. To be less brittle, libraries should be able to import and reuse default pieces. This lets libraries reuse positioning logic or augment positioning logic but reuse shading logic. There is currently [an issue open for this task.](https://github.com/processing/p5.js/issues/6144) +* **Improve performance.** WebGL mode tries to strike a balance between features and performance. One method is to introduce APIs to tune output quality, like how `curveDetail()` allows faster but lower-quality curves. Line rendering is one of the common performance bottlenecks in its present state, and it could benefit from having lower fidelity but higher performance options. Another method is to introduce new types of objects and rendering methods that are optimized for different usage patterns, like how `endShape(shouldClose, count)` now supports WebGL 2 instanced rendering for more efficient drawing of many shapes. diff --git a/src/content/contributor-docs/es/README.mdx b/src/content/contributor-docs/es/README.mdx index 9033b26d3a..a8954d3b05 100644 --- a/src/content/contributor-docs/es/README.mdx +++ b/src/content/contributor-docs/es/README.mdx @@ -1,7 +1,3 @@ - ---- - ---- Help is needed translating these Developer Docs to Spanish (and other languages) [See this link for more info!](https://github.com/processing/p5.js/issues/4137) @@ -9,12 +5,10 @@ Help is needed translating these Developer Docs to Spanish (and other languages) # Estructura del directorio del proyecto -- `src /` contiene todo el código fuente de la biblioteca, que está organizado por temas en módulos separados. Esto es en lo que trabajará si está cambiando p5.js. -- `lib /` contiene la versión final de p5.js destinada a que los usuarios carguen en sus bocetos y proyectos, incluidos en formularios comprimidos y no comprimidos. Esta es la salida cuando [Grunt](https://gruntjs.com/) compila los módulos de código fuente en un solo archivo. -- `contributor_docs /` contiene varios documentos de Markdown que probablemente sean útiles para los desarrolladores de p5.js, en particular porque explican prácticas y principios. -- `docs /` en realidad no contiene documentos! Más bien, contiene el código utilizado para * generar * el [manual de referencia en línea](https://p5js.org/reference/). -- `tests /` contiene pruebas unitarias que aseguran que la biblioteca continúe funcionando correctamente a medida que se realizan los cambios. -- `task /` contiene scripts que realizan tareas automatizadas relacionadas con la compilación, implementación y lanzamiento de nuevas versiones de p5.js. -- `parches /` podría contener [parches Git](https://git-scm.com/docs/git-format-patch) de vez en cuando, pero en casi todos los casos puede ignorar por completo este directorio. - - \ No newline at end of file +* `src /` contiene todo el código fuente de la biblioteca, que está organizado por temas en módulos separados. Esto es en lo que trabajará si está cambiando p5.js. +* `lib /` contiene la versión final de p5.js destinada a que los usuarios carguen en sus bocetos y proyectos, incluidos en formularios comprimidos y no comprimidos. Esta es la salida cuando [Grunt](https://gruntjs.com/) compila los módulos de código fuente en un solo archivo. +* `contributor_docs /` contiene varios documentos de Markdown que probablemente sean útiles para los desarrolladores de p5.js, en particular porque explican prácticas y principios. +* `docs /` en realidad no contiene documentos! Más bien, contiene el código utilizado para \* generar \* el [manual de referencia en línea](https://p5js.org/reference/). +* `tests /` contiene pruebas unitarias que aseguran que la biblioteca continúe funcionando correctamente a medida que se realizan los cambios. +* `task /` contiene scripts que realizan tareas automatizadas relacionadas con la compilación, implementación y lanzamiento de nuevas versiones de p5.js. +* `parches /` podría contener [parches Git](https://git-scm.com/docs/git-format-patch) de vez en cuando, pero en casi todos los casos puede ignorar por completo este directorio. diff --git a/src/content/contributor-docs/hi/README.mdx b/src/content/contributor-docs/hi/README.mdx index 3c8e34db85..5eb08adc1c 100644 --- a/src/content/contributor-docs/hi/README.mdx +++ b/src/content/contributor-docs/hi/README.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 🌸 नमस्कार! 🌺 p5.js में योगदान देने में आपकी रुचि के लिए धन्यवाद! हमारा समुदाय सभी रूपों के योगदान को महत्व देता है और जहाँ तक हो सके "योगदानकर्ता" शब्द के अर्थ का विस्तार करना चाहता है। इसमें दस्तावेज़ीकरण, शिक्षण, कोड लिखना, आर्ट बनाना, लिखना, रचना, सक्रियतावाद, व्यवस्थित करना, संधारण करना, या ऐसी कोई भी चीज जिसकी आप कल्पना कर सकते हैं। आप [यहाँ](https://p5js.org/community/#contribute) योगदान करने के कुछ अलग तरीकों से शुरुआत कर सकते हैं। तकनीकी योगदान आरंभ करने के लिए, इस पृष्ठ को पढ़ें। @@ -16,32 +12,31 @@ p5.js में योगदान देने में आपकी रुच व्यापक p5.js परियोजना में इस के अलावा कुछ रिपॉजिटरी शामिल हैं- -- [p5.js](https://github.com/processing/p5.js): इस रिपॉजिटरी में p5.js लाइब्रेरी का स्रोत कोड है। [p5.js संदर्भ मैनुअल](https://p5js.org/reference/) भी इस स्रोत कोड में शामिल [JSDoc](http://usejsdoc.org/) टिप्पणियों से उत्पन्न होता है। इसका अनुरक्षण [Moira Turner](https://github.com/mcturner1995) के द्वारा किया जा रहा है। -- [p5.js-website](https://github.com/processing/p5.js-website) इस रिपॉजिटरी में [p5.js वेबसाइट](http://p5js.org) का अधिकांश कोड हैं, संदर्भ मैनुअल के अपवाद के साथ। इसका अनुरक्षण [Moira Turner](https://github.com/mcturner1995) के द्वारा किया जा रहा है। -- [p5.js-sound](https://github.com/processing/p5.js-sound) इस भंडार में p5.sound.js लाइब्रेरी है। इसका अनुरक्षण [Jason Sigal](https://github.com/therewasaguy) के द्वारा किया जा रहा है। -- [p5.js-web-editor](https://github.com/processing/p5.js-web-editor) इस रिपॉजिटरी में [p5.js वेब एडिटर](https://editor.p5js.org) के लिए स्रोत कोड है। इसका अनुरक्षण [Cassie Tarakajian](https://github.com/catarak) के द्वारा किया जा रहा है। ध्यान दें कि पुराना [p5.js संपादक](https://github.com/processing/p5.js-editor) अब पदावनत हो गया है। +* [p5.js](https://github.com/processing/p5.js): इस रिपॉजिटरी में p5.js लाइब्रेरी का स्रोत कोड है। [p5.js संदर्भ मैनुअल](https://p5js.org/reference/) भी इस स्रोत कोड में शामिल [JSDoc](http://usejsdoc.org/) टिप्पणियों से उत्पन्न होता है। इसका अनुरक्षण [Moira Turner](https://github.com/mcturner1995) के द्वारा किया जा रहा है। +* [p5.js-website](https://github.com/processing/p5.js-website) इस रिपॉजिटरी में [p5.js वेबसाइट](http://p5js.org) का अधिकांश कोड हैं, संदर्भ मैनुअल के अपवाद के साथ। इसका अनुरक्षण [Moira Turner](https://github.com/mcturner1995) के द्वारा किया जा रहा है। +* [p5.js-sound](https://github.com/processing/p5.js-sound) इस भंडार में p5.sound.js लाइब्रेरी है। इसका अनुरक्षण [Jason Sigal](https://github.com/therewasaguy) के द्वारा किया जा रहा है। +* [p5.js-web-editor](https://github.com/processing/p5.js-web-editor) इस रिपॉजिटरी में [p5.js वेब एडिटर](https://editor.p5js.org) के लिए स्रोत कोड है। इसका अनुरक्षण [Cassie Tarakajian](https://github.com/catarak) के द्वारा किया जा रहा है। ध्यान दें कि पुराना [p5.js संपादक](https://github.com/processing/p5.js-editor) अब पदावनत हो गया है। # रिपोजिटरी फ़ाइल संरचना यहाँ बहुत सारी फाइलें हैं! यह एक संक्षिप्त अवलोकन है। यह भ्रामक हो सकता है, लेकिन आरंभ करने के लिए आपको रिपॉजिटरी की प्रत्येक फ़ाइल को समझने की आवश्यकता नहीं है। हम एक क्षेत्र में शुरुआत करने की सलाह देते हैं (उदाहरण के लिए, कुछ इनलाइन प्रलेखन को ठीक करना), और अधिक खोज करने के लिए अपने तरीके से काम करना। Luisa Pereira का [लुकिंग इनसाइड p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) भी p5 .js वर्कफ़्लो में उपयोग किए जाने वाले टूल और फ़ाइलों का वीडियो टूर देता है। -- `contributor_docs/` में विभिन्न दस्तावेज हैं, जो विशेष रूप से p5.js के डेवलपर्स के लिए उपयोगी होने की संभावना है, क्योंकि वे प्रथाओं और सिद्धांतों की व्याख्या करते हैं। -- `docs/` वास्तव में डॉक्स शामिल नहीं है! इसके बजाय, इसमें * [ऑनलाइन संदर्भ पुस्तिका](https://p5js.org/reference/) * का उपयोग करने वाला कोड शामिल है। -- `lib/` में शामिल है एक खाली उदाहरण और p5.sound ऐड-ऑन, जो समय-समय पर [p5.js-sound रिपॉजिटरी](https://github.com/processing/p5.js-sound) से पुल अनुरोध के माध्यम से अद्यतन किया जाता है। यह वह जगह है जहाँ अंतर्निहित p5.js लाइब्रेरी को [ग्रंट](https://gruntjs.com/) का उपयोग करके एक फ़ाइल में संकलित किए जाने के बाद रखा जाता है। जब आप एक पुल अनुरोध करते हैं तो इसे GitHub रिपॉजिटरी में जांचने की आवश्यकता नहीं होती है। -- `src/` में लाइब्रेरी के लिए सभी स्रोत कोड शामिल हैं, जो अलग-अलग मॉड्यूल में शीर्ष रूप से व्यवस्थित है। यदि आप p5.js. बदल रहे हैं, तो आप इस पर काम करेंगे। अधिकांश फ़ोल्डरों के पास अपनी स्वयं की readme.md फाइलें होती हैं जो आपको अपना रास्ता खोजने में मदद करती हैं। -- `tasks/` में स्क्रिप्ट शामिल हैं जो p5.js के नए संस्करणों के निर्माण, परिनियोजन और रिलीज़ से संबंधित स्वचालित कार्य करते हैं। -- `tests/` में यूनिट परीक्षण शामिल हैं जो सुनिश्चित करते हैं कि लाइब्रेरी सही ढंग से कार्य कर रहे हैं क्योंकि परिवर्तन किए जाते हैं। -- `utils/` इसमें रिपॉजिटरी के लिए उपयोगी अतिरिक्त फाइलें हो सकती हैं, लेकिन आम तौर पर आप इस डायरेक्टरी को अनदेखा कर सकते हैं। +* `contributor_docs/` में विभिन्न दस्तावेज हैं, जो विशेष रूप से p5.js के डेवलपर्स के लिए उपयोगी होने की संभावना है, क्योंकि वे प्रथाओं और सिद्धांतों की व्याख्या करते हैं। +* `docs/` वास्तव में डॉक्स शामिल नहीं है! इसके बजाय, इसमें \* [ऑनलाइन संदर्भ पुस्तिका](https://p5js.org/reference/) \* का उपयोग करने वाला कोड शामिल है। +* `lib/` में शामिल है एक खाली उदाहरण और p5.sound ऐड-ऑन, जो समय-समय पर [p5.js-sound रिपॉजिटरी](https://github.com/processing/p5.js-sound) से पुल अनुरोध के माध्यम से अद्यतन किया जाता है। यह वह जगह है जहाँ अंतर्निहित p5.js लाइब्रेरी को [ग्रंट](https://gruntjs.com/) का उपयोग करके एक फ़ाइल में संकलित किए जाने के बाद रखा जाता है। जब आप एक पुल अनुरोध करते हैं तो इसे GitHub रिपॉजिटरी में जांचने की आवश्यकता नहीं होती है। +* `src/` में लाइब्रेरी के लिए सभी स्रोत कोड शामिल हैं, जो अलग-अलग मॉड्यूल में शीर्ष रूप से व्यवस्थित है। यदि आप p5.js. बदल रहे हैं, तो आप इस पर काम करेंगे। अधिकांश फ़ोल्डरों के पास अपनी स्वयं की readme.md फाइलें होती हैं जो आपको अपना रास्ता खोजने में मदद करती हैं। +* `tasks/` में स्क्रिप्ट शामिल हैं जो p5.js के नए संस्करणों के निर्माण, परिनियोजन और रिलीज़ से संबंधित स्वचालित कार्य करते हैं। +* `tests/` में यूनिट परीक्षण शामिल हैं जो सुनिश्चित करते हैं कि लाइब्रेरी सही ढंग से कार्य कर रहे हैं क्योंकि परिवर्तन किए जाते हैं। +* `utils/` इसमें रिपॉजिटरी के लिए उपयोगी अतिरिक्त फाइलें हो सकती हैं, लेकिन आम तौर पर आप इस डायरेक्टरी को अनदेखा कर सकते हैं। # प्रलेखन -हमें एहसास है कि प्रलेखन इस परियोजना का सबसे महत्वपूर्ण हिस्सा है। खराब प्रलेखन नए उपयोगकर्ताओं और योगदानकर्ताओं के लिए उपयोग करने के लिए मुख्य बाधाओं में से एक है, जिससे परियोजना कम समावेशी हो जाती है। [contributing_documentation.md](./contributing_documentation/) पृष्ठ प्रलेखन के साथ आरंभ करने का एक गहन अवलोकन देता है। p5.js के लिए प्रलेखन कुछ मुख्य स्थानों में पाया जा सकता है: - -- [p5js.org संदर्भ](https://p5js.org/reference/) स्रोत कोड में ही [इनलाइन प्रलेखन](./inline_documentation/) से उत्पन्न होता है। इसमें पाठ विवरण और पैरामीटर के साथ-साथ कोड स्निपेट उदाहरण भी शामिल हैं। हम कोड और प्रलेखन को निकटता से रखने के लिए यह सब इनलाइन रखते हैं, और इस विचार को सुदृढ़ करने के लिए कि कोड में योगदान देने की तुलना में प्रलेखन में योगदान करना अधिक महत्वपूर्ण है (यदि अधिक नहीं)। जब लाइब्रेरी निर्मित हो जाता है, तो यह इनलाइन प्रलेखन और उदाहरणों की जांच करता है ताकि यह सुनिश्चित हो सके कि वे कोड के व्यवहार के तरीके से मेल खाते हैं। योगदान करने के लिए, आप [inline_documentation.md](./inline_documentation/) पृष्ठ को देखकर शुरू कर सकते हैं। -- The [p5js.org उदाहरण](http://p5js.org/examples) पृष्ठ में लंबे उदाहरण हैं जो p5.js. सीखने के लिए उपयोगी हो सकते हैं। योगदान करने के लिए, आप [add_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) पृष्ठ को देखकर शुरू कर सकते हैं। -- The [p5js.org सीखिए](https://p5js.org/learn) पृष्ठ में p5.js और प्रोग्रामिंग की अवधारणाओं को सीखने में मदद करने के लिए ट्यूटोरियल हैं। योगदान करने के लिए, आप [p5.js ट्यूटोरियल में योगदान करने के लिए गाइड](https://p5js.org/learn/tutorial-guide.html) देखकर शुरू कर सकते हैं। -- आप देखेंगे कि वर्तमान में p5.js वेबसाइट कुछ अलग भाषाओं का समर्थन करती है। इसे अंतर्राष्ट्रीयकरण (या संक्षेप में i18n) कहा जाता है। आप इस दस्तावेज़ के बारे में [i18n_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contention/) पृष्ठ पर अधिक पढ़ सकते हैं। +हमें एहसास है कि प्रलेखन इस परियोजना का सबसे महत्वपूर्ण हिस्सा है। खराब प्रलेखन नए उपयोगकर्ताओं और योगदानकर्ताओं के लिए उपयोग करने के लिए मुख्य बाधाओं में से एक है, जिससे परियोजना कम समावेशी हो जाती है। [contributing\_documentation.md](./contributing_documentation/) पृष्ठ प्रलेखन के साथ आरंभ करने का एक गहन अवलोकन देता है। p5.js के लिए प्रलेखन कुछ मुख्य स्थानों में पाया जा सकता है: +* [p5js.org संदर्भ](https://p5js.org/reference/) स्रोत कोड में ही [इनलाइन प्रलेखन](./inline_documentation/) से उत्पन्न होता है। इसमें पाठ विवरण और पैरामीटर के साथ-साथ कोड स्निपेट उदाहरण भी शामिल हैं। हम कोड और प्रलेखन को निकटता से रखने के लिए यह सब इनलाइन रखते हैं, और इस विचार को सुदृढ़ करने के लिए कि कोड में योगदान देने की तुलना में प्रलेखन में योगदान करना अधिक महत्वपूर्ण है (यदि अधिक नहीं)। जब लाइब्रेरी निर्मित हो जाता है, तो यह इनलाइन प्रलेखन और उदाहरणों की जांच करता है ताकि यह सुनिश्चित हो सके कि वे कोड के व्यवहार के तरीके से मेल खाते हैं। योगदान करने के लिए, आप [inline\_documentation.md](./inline_documentation/) पृष्ठ को देखकर शुरू कर सकते हैं। +* The [p5js.org उदाहरण](http://p5js.org/examples) पृष्ठ में लंबे उदाहरण हैं जो p5.js. सीखने के लिए उपयोगी हो सकते हैं। योगदान करने के लिए, आप [add\_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) पृष्ठ को देखकर शुरू कर सकते हैं। +* The [p5js.org सीखिए](https://p5js.org/learn) पृष्ठ में p5.js और प्रोग्रामिंग की अवधारणाओं को सीखने में मदद करने के लिए ट्यूटोरियल हैं। योगदान करने के लिए, आप [p5.js ट्यूटोरियल में योगदान करने के लिए गाइड](https://p5js.org/learn/tutorial-guide.html) देखकर शुरू कर सकते हैं। +* आप देखेंगे कि वर्तमान में p5.js वेबसाइट कुछ अलग भाषाओं का समर्थन करती है। इसे अंतर्राष्ट्रीयकरण (या संक्षेप में i18n) कहा जाता है। आप इस दस्तावेज़ के बारे में [i18n\_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contention/) पृष्ठ पर अधिक पढ़ सकते हैं। # गिटहब मुद्दों का संचलान @@ -57,11 +52,12 @@ p5.js में योगदान देने में आपकी रुच * [Organization.md](https://github.com/processing/p5.js/blob/main/contributor_docs/organization/) फ़ाइल एक उच्च-स्तरीय अवलोकन देती है कि मुद्दों को कैसे व्यवस्थित किया जा सकता है और निर्णय प्रक्रिया का पालन कैसे करना है। यदि आप रुचि रखते हैं तो हम इसमें शामिल होने के लिए आपका स्वागत करते हैं। - # विकास की प्रक्रिया 1. स्थापित करें [node.js](http://nodejs.org/), जो स्वचालित रूप से [npm](https://www.npmjs.org) पैकेज मैनेजर भी स्थापित करता है। + 2. [फोर्क](https://help.github.com/articles/fork-a-repo) [p5.js रिपॉजिटरी](https://github.com/processing/p5.js) अपने खुद के गिटहब खाते में। + 3. [क्लोन](https://help.github.com/articles/cloning-a-repository/) आपके स्थानीय कंप्यूटर पर गिटहब से रिपॉजिटरी का नया फोर्क। ```shell @@ -100,12 +96,10 @@ p5.js में योगदान देने में आपकी रुच 9. एक बार सब कुछ तैयार हो जाने के बाद, अपने परिवर्तनों को एक [पुल अनुरोध](https://help.github.com/articles/creating-a-pull-request) के रूप में सबमिट करें। - # गोचास p5.js कोडबेस के साथ शामिल डेवलपर टूलिंग जानबूझकर कुछ चीजों के बारे में बहुत सख्त है। यह एक अच्छी बात है! यह सब कुछ सुसंगत बनाता है, और यह आपको अनुशासित होने के लिए प्रोत्साहित करेगा। इसका मतलब यह है कि आप अपनी परियोजना को खारिज करने के लिए केवल कुछ बदलने की कोशिश कर सकते हैं, लेकिन निराश न हों; यहां तक ​​कि अनुभवी p5.js डेवलपर्स को हर समय इसका सामना करना पड़ता है। आमतौर पर समस्या दो क्षेत्रों में से एक में होगी, कोड सिंटैक्स या यूनिट परीक्षण। - ## कोड सिंटैक्स p5.js को स्वच्छ और शैलीगत सुसंगत कोड सिंटैक्स की आवश्यकता होती है, जिसे वह [Prettier](https://prettier.io/) और [ESlint](https://eslint.org/) के साथ लागू करता है। आपके द्वारा किए जाने से पहले नियमों की जाँच की जाती है, लेकिन जैसे ही आप उन्हें लिखते हैं, त्रुटियों को उजागर करने के लिए आप अपने कोड संपादक के लिए [ESlint प्लगइन](https://eslint.org/docs/user-guide/integrations#editors) भी स्थापित कर सकते हैं। , जो शायद आपकी मदद करेंगे क्योंकि आप कोडिंग कर रहे हैं और आपको एक असफल Git प्रतिबद्ध की परेशानी से बचाता है। सामान्य तौर पर, हम लचीलेपन के पक्ष में गलती करते हैं, जब यह कोड शैली की बात आती है, ताकि भागीदारी और योगदान के लिए बाधाओं को कम किया जा सके। @@ -122,9 +116,10 @@ $ npm run lint $ npm run lint:fix ``` -स्थापित परियोजना शैली के साथ चिपके रहना आमतौर पर बेहतर होता है, लेकिन [कभी-कभी](https://github.com/processing/p5.js/search?utf8=%E2%9C%93&q=prettier-ignore&type=) एक वैकल्पिक वाक्यविन्यास का उपयोग कर सकते हैं। अपने कोड को समझना आसान बनाएं। इन मामलों के लिए, Prettier [एक एस्केप हैच प्रदान करता है](https://prettier.io/docs/en/ignore.html), `// prettier-ignore` टिप्पणी, जिसका उपयोग आप ग्रैनुलर अपवाद बनाने के लिए कर सकते हैं। यदि आप कर सकते हैं तो इसका उपयोग करने से बचने की कोशिश करें, क्योंकि लाइनिंग द्वारा लागू अधिकांश शैली वरीयताओं के लिए अच्छे कारण हैं। +स्थापित परियोजना शैली के साथ चिपके रहना आमतौर पर बेहतर होता है, लेकिन [कभी-कभी](https://github.com/processing/p5.js/search?utf8=%E2%9C%93\&q=prettier-ignore\&type=) एक वैकल्पिक वाक्यविन्यास का उपयोग कर सकते हैं। अपने कोड को समझना आसान बनाएं। इन मामलों के लिए, Prettier [एक एस्केप हैच प्रदान करता है](https://prettier.io/docs/en/ignore.html), `// prettier-ignore` टिप्पणी, जिसका उपयोग आप ग्रैनुलर अपवाद बनाने के लिए कर सकते हैं। यदि आप कर सकते हैं तो इसका उपयोग करने से बचने की कोशिश करें, क्योंकि लाइनिंग द्वारा लागू अधिकांश शैली वरीयताओं के लिए अच्छे कारण हैं। + +यहाँ कोड शैली नियमों का एक त्वरित सारांश है। कृपया ध्यान दें कि यह सूची अधूरी हो सकती है, और [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc) और [.esintintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) को संदर्भित करना सबसे अच्छा है। -यहाँ कोड शैली नियमों का एक त्वरित सारांश है। कृपया ध्यान दें कि यह सूची अधूरी हो सकती है, और [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc) और [.esintintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) को संदर्भित करना सबसे अच्छा है। * ES6 कोड सिंटैक्स का उपयोग किया जाता है * सिंगल कोट्स (डबल कोट्स के बजाय) का उपयोग करें * इंडेंटेशन दो स्थानों के साथ किया जाता है @@ -133,7 +128,6 @@ $ npm run lint:fix * जब भी आप लिख रहे हैं, तो कार्य में अस्पष्टता या जटिलता होने पर अपना कोड कमेंट करें। * देखें [मोज़िला JS प्रथाओं](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#JavaScript_practices) अधिक स्टाइलिंग टिप्स के लिए एक उपयोगी मार्गदर्शिका के रूप में। - ## इकाई परीक्षण इकाई परीक्षण कोड के छोटे टुकड़े होते हैं जो प्राथमिक तर्क के पूरक के रूप में बनाए जाते हैं और सत्यापन करते हैं। यदि आप p5.js के लिए एक प्रमुख नई सुविधा विकसित कर रहे हैं, तो आपको शायद परीक्षण शामिल करना चाहिए। पुल अनुरोध सबमिट न करें जिसमें परीक्षण पास नहीं होते हैं, क्योंकि इसका मतलब है कि कुछ टूट गया है। @@ -146,8 +140,8 @@ $ npm ci यह p5.js के लिए *सभी* निर्भरताएं स्थापित करेगा; संक्षेप में, यूनिट परीक्षण के लिए सबसे महत्वपूर्ण निर्भरताएं शामिल हैं: -- [मोचा](https://mochajs.org/), एक शक्तिशाली परीक्षण ढाँचा जो व्यक्तिगत परीक्षण फ़ाइलों को निष्पादित करता है जो p5.js के लिए विशिष्ट हैं -- [मोचा-क्रोम](https://github.com/shellscape/mocha-chrome), एक मोचा प्लगइन जो बिना सिर के गूगल क्रोम का उपयोग करके मोचा परीक्षण चलाता है +* [मोचा](https://mochajs.org/), एक शक्तिशाली परीक्षण ढाँचा जो व्यक्तिगत परीक्षण फ़ाइलों को निष्पादित करता है जो p5.js के लिए विशिष्ट हैं +* [मोचा-क्रोम](https://github.com/shellscape/mocha-chrome), एक मोचा प्लगइन जो बिना सिर के गूगल क्रोम का उपयोग करके मोचा परीक्षण चलाता है एक बार निर्भरताएं स्थापित हो जाने के बाद, यूनिट परीक्षणों को चलाने के लिए ग्रंट का उपयोग करें। @@ -165,14 +159,11 @@ $ npm run dev इकाई परीक्षण के लिए एक पूर्ण मार्गदर्शिका p5.js प्रलेखन के दायरे से परे है, लेकिन संक्षिप्त संस्करण यह है कि `src/` निर्देशिका में निहित स्रोत कोड में लागू किए गए किसी भी बड़े बदलाव या नई सुविधाओं को भी `test/` फ़ाइलों के साथ होना चाहिए लाइब्रेरी के सभी भविष्य के संस्करणों में लगातार व्यवहार को सत्यापित करने के लिए मोचा द्वारा निष्पादित किया जा सकता है। इकाई परीक्षण लिखते समय, अपने दावे संदेशों को फिर से प्रकाशित करने के लिए एक गाइड के रूप में [Chai.js संदर्भ](http://www.chaijs.com/api/assert/) का उपयोग करें ताकि भविष्य में आपके परीक्षणों द्वारा पकड़ी गई कोई भी त्रुटि लगातार और परिणामस्वरूप दूसरों को समझने के लिए आसान होगी। - # विविध -- [योगदानकर्ता डॉक्स](https://github.com/processing/p5.js/tree/main/contributor_docs) फ़ोल्डर में अन्य फाइलें हैं जिन्हें आप देख सकते हैं। वे इस परियोजना के विशिष्ट क्षेत्रों, दोनों तकनीकी और गैर-तकनीकी में योगदान करने से संबंधित हैं। -- [लुकिंग इनसाइड p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) p5.js डेवलपमेंट वर्कफ़्लो में इस्तेमाल होने वाले टूल्स और फाइल्स का वीडियो टूर है। -- [द कोडिंग ट्रेन का यह वीडियो](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: तकनीकी योगदान के साथ शुरू करने का अवलोकन देता है। -- p5.js [डॉकर छवि](https://github.com/toolness/p5.js-docker) [डॉकर](https://www.docker.com/) में आरोहित किया जा सकता है और इसका उपयोग p5 विकसित करने के लिए किया जाता है [नोड](https://nodejs.org/) जैसी आवश्यकताओं की मैन्युअल स्थापना की आवश्यकता के बिना .js या अन्यथा डॉकर की स्थापना से अलग किसी भी तरह से मेजबान ऑपरेटिंग सिस्टम को प्रभावित करना। -- p5.js लाइब्रेरी के लिए निर्माण प्रक्रिया एक [json डेटा फ़ाइल](https://p5js.org/reference/data.json) उत्पन्न करती है, जिसमें p5.js की सार्वजनिक API होती है और इसका उपयोग स्वचालित टूलिंग में किया जा सकता है, जैसे एक संपादक में स्वतः पूर्ण p5.js विधियों के रूप में। यह फ़ाइल p5.js वेबसाइट पर होस्ट की गई है, लेकिन यह रिपॉजिटरी के हिस्से के रूप में शामिल नहीं है। -- p5.js ने हाल ही में [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015) पर माइग्रेट किया है। यह देखने के लिए कि यह संक्रमण आपके योगदान को कैसे प्रभावित कर सकता है कृपया [es6-adoption.md](./es6-adoption/) फ़ाइल पर जाएँ। - - \ No newline at end of file +* [योगदानकर्ता डॉक्स](https://github.com/processing/p5.js/tree/main/contributor_docs) फ़ोल्डर में अन्य फाइलें हैं जिन्हें आप देख सकते हैं। वे इस परियोजना के विशिष्ट क्षेत्रों, दोनों तकनीकी और गैर-तकनीकी में योगदान करने से संबंधित हैं। +* [लुकिंग इनसाइड p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) p5.js डेवलपमेंट वर्कफ़्लो में इस्तेमाल होने वाले टूल्स और फाइल्स का वीडियो टूर है। +* [द कोडिंग ट्रेन का यह वीडियो](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: तकनीकी योगदान के साथ शुरू करने का अवलोकन देता है। +* p5.js [डॉकर छवि](https://github.com/toolness/p5.js-docker) [डॉकर](https://www.docker.com/) में आरोहित किया जा सकता है और इसका उपयोग p5 विकसित करने के लिए किया जाता है [नोड](https://nodejs.org/) जैसी आवश्यकताओं की मैन्युअल स्थापना की आवश्यकता के बिना .js या अन्यथा डॉकर की स्थापना से अलग किसी भी तरह से मेजबान ऑपरेटिंग सिस्टम को प्रभावित करना। +* p5.js लाइब्रेरी के लिए निर्माण प्रक्रिया एक [json डेटा फ़ाइल](https://p5js.org/reference/data.json) उत्पन्न करती है, जिसमें p5.js की सार्वजनिक API होती है और इसका उपयोग स्वचालित टूलिंग में किया जा सकता है, जैसे एक संपादक में स्वतः पूर्ण p5.js विधियों के रूप में। यह फ़ाइल p5.js वेबसाइट पर होस्ट की गई है, लेकिन यह रिपॉजिटरी के हिस्से के रूप में शामिल नहीं है। +* p5.js ने हाल ही में [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015) पर माइग्रेट किया है। यह देखने के लिए कि यह संक्रमण आपके योगदान को कैसे प्रभावित कर सकता है कृपया [es6-adoption.md](./es6-adoption/) फ़ाइल पर जाएँ। diff --git a/src/content/contributor-docs/hi/access.mdx b/src/content/contributor-docs/hi/access.mdx index ef9dce7ee5..9044904274 100644 --- a/src/content/contributor-docs/hi/access.mdx +++ b/src/content/contributor-docs/hi/access.mdx @@ -1,7 +1,3 @@ - ---- - ---- # पहुँच पर हमारा ध्यान [२०१९ के योगदानकर्ताओं के सम्मेलन](https://p5js.org/community/contributors-conference-2019.html) में, हमने पहुंच को बढ़ाने के लिए केवल p5.js में सुविधाओं को जोड़ने के लिए एक प्रतिबद्धता बनाई (जिसका अर्थ है समावेश / और / पहुंच क्षमता) । इसका अर्थ है विविधता के वैक्टर (जैसे लिंग, सामाजिक, आर्थिक, नस्ल, जातीयता, भाषा, विकलांगता, आदि) पर विचार करना जो पहुंच / भागीदारी को प्रभावित कर सकता है; और बाधाओं को स्वीकार, विघटित करने और रोकने के लिए कार्रवाई कर रहा है। हम p5.js. के साथ अधिक विशेषाधिकार प्राप्त समूहों के निरंतर आराम से अधिक ऐतिहासिक रूप से हाशिए वाले समूहों की आवश्यकताओं को प्राथमिकता देते हैं। @@ -18,28 +14,27 @@ यहां पहुंच का मतलब है कि p5.js को इसके लिए बेहतर बनाना: -- जो लोग अंग्रेजी के अलावा अन्य भाषाएं बोलते हैं -- काले लोग, स्वदेशी लोग और रंग के लोग -- जो लोग समलैंगिक, समलैंगिक, उभयलिंगी, ट्रांस या क्वीर हैं -- सीमांत लिंग वाले लोग -- विकलांग या बीमारी वाले लोग -- वे लोग जिनके पास कक्षा या आय के कारण रचनात्मक कोडिंग के साथ जुड़ने के अवसरों और / या संसाधनों का अभाव है -- ओपन सोर्स और क्रिएटिव कोडिंग में बहुत कम या पहले के अनुभव वाले लोग -- और अन्य लोग जिन्हें व्यवस्थित रूप से बाहर रखा गया है और ऐतिहासिक रूप से कम आंकलन किया गया है +* जो लोग अंग्रेजी के अलावा अन्य भाषाएं बोलते हैं +* काले लोग, स्वदेशी लोग और रंग के लोग +* जो लोग समलैंगिक, समलैंगिक, उभयलिंगी, ट्रांस या क्वीर हैं +* सीमांत लिंग वाले लोग +* विकलांग या बीमारी वाले लोग +* वे लोग जिनके पास कक्षा या आय के कारण रचनात्मक कोडिंग के साथ जुड़ने के अवसरों और / या संसाधनों का अभाव है +* ओपन सोर्स और क्रिएटिव कोडिंग में बहुत कम या पहले के अनुभव वाले लोग +* और अन्य लोग जिन्हें व्यवस्थित रूप से बाहर रखा गया है और ऐतिहासिक रूप से कम आंकलन किया गया है ### उदाहरण हमारे द्वारा पहुँच बढ़ाने के लिए किए गए प्रयासों के उदाहरण हैं: -- अधिक दस्तावेजों और अन्य सामग्रियों का अधिक भाषाओं में अनुवाद करना -- सहायक तकनीकों के लिए हमारे समर्थन में सुधार (जैसे कि स्क्रीन्रेडर्स) -- हमारे टूल में वेब कंटेंट अभिगम्यता दिशानिर्देशों का पालन करना और उपयोगकर्ताओं को उनकी परियोजनाओं में उनका पालन करना आसान बनाने की दिशा में काम करना -- टूल का उपयोग करने वाले लोगों के लिए p5.js त्रुटि संदेशों को अधिक सहायक और सहायक बनाना -- ऐतिहासिक रूप से रचनात्मक कोडिंग और डिजिटल आर्ट्स में हाशिए पर छोड़ दिए गए समुदायों के भीतर p5.js के शिक्षार्थियों का परामर्श और समर्थन करना +* अधिक दस्तावेजों और अन्य सामग्रियों का अधिक भाषाओं में अनुवाद करना +* सहायक तकनीकों के लिए हमारे समर्थन में सुधार (जैसे कि स्क्रीन्रेडर्स) +* हमारे टूल में वेब कंटेंट अभिगम्यता दिशानिर्देशों का पालन करना और उपयोगकर्ताओं को उनकी परियोजनाओं में उनका पालन करना आसान बनाने की दिशा में काम करना +* टूल का उपयोग करने वाले लोगों के लिए p5.js त्रुटि संदेशों को अधिक सहायक और सहायक बनाना +* ऐतिहासिक रूप से रचनात्मक कोडिंग और डिजिटल आर्ट्स में हाशिए पर छोड़ दिए गए समुदायों के भीतर p5.js के शिक्षार्थियों का परामर्श और समर्थन करना ऐसी अन्य चीजें हैं जिनके बारे में हमने अभी तक सोचा नहीं है और हम यह पता लगाने के लिए उत्साहित हैं कि वे एक साथ क्या कर रहे हैं। यदि आपके पास एक विचार है, तो कृपया [इसे एक मुद्दे के रूप में साझा करें](https://github.com/processing/p5.js/issues/new/choose)। ## रखरखाव हम p5.js. के मौजूदा फीचर सेट को बनाए रखने के अपने इरादे की भी पुष्टि करते हैं हम त्रुटियों को ठीक करना चाहते हैं चाहे कोडबेस के किस क्षेत्र में हो क्योंकि हम मानते हैं कि उपकरण की निरंतरता इसे शुरुआती लोगों के लिए अधिक सुलभ बनाती है। - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/benchmarking_p5.mdx b/src/content/contributor-docs/hi/benchmarking_p5.mdx index cc4472aeea..49450ff095 100644 --- a/src/content/contributor-docs/hi/benchmarking_p5.mdx +++ b/src/content/contributor-docs/hi/benchmarking_p5.mdx @@ -1,8 +1,3 @@ - ---- - ---- # बेंचमार्किंग p5.js -बेंचमार्किंग को https://github.com/limzykenneth/p5-benchmark पर उपलब्ध अपने रेपो में स्थानांतरित कर दिया गया है। P5.js के नवीनतम संस्करण के बेंचमार्क परिणाम का एक समग्र दृश्य https://limzykenneth.github.io/p5-benchmark/ पर देखा जा सकता है। अभी भी कार्य प्रगति पर है। - \ No newline at end of file +बेंचमार्किंग को [https://github.com/limzykenneth/p5-benchmark](https://github.com/limzykenneth/p5-benchmark) पर उपलब्ध अपने रेपो में स्थानांतरित कर दिया गया है। P5.js के नवीनतम संस्करण के बेंचमार्क परिणाम का एक समग्र दृश्य [https://limzykenneth.github.io/p5-benchmark/](https://limzykenneth.github.io/p5-benchmark/) पर देखा जा सकता है। अभी भी कार्य प्रगति पर है। diff --git a/src/content/contributor-docs/hi/contributing_documentation.mdx b/src/content/contributor-docs/hi/contributing_documentation.mdx index bdc6f7e1d1..1f0b1d1c43 100644 --- a/src/content/contributor-docs/hi/contributing_documentation.mdx +++ b/src/content/contributor-docs/hi/contributing_documentation.mdx @@ -1,35 +1,38 @@ - ---- - ---- नए शिक्षार्थियों और अनुभवी प्रोग्रामर के लिए समान रूप से प्रलेखन आवश्यक है। यह हमारे समुदाय को उन लोगों के लिए एक अनुकूल हाथ बढ़ाकर समावेशी बनाने में मदद करता है जो p5.js. से कम परिचित हैं। यह हमें कोड के साथ बग्स और मुद्दों को खोजने में भी मदद करता है, क्योंकि हम परीक्षण करते हैं और प्रलेखन करते समय चीजों को आज़माते हैं। प्रलेखन में योगदान देने के कई तरीके हैं: ## ☝️ मुद्दे बनाएँ + यदि आप अभी शुरुआत कर रहे हैं, तो एक बहुत ही उपयोगी तरीका जो आप योगदान कर सकते हैं, वह है प्रलेखन आवश्यकताओं के लिए मुद्दे खोलना। यदि आप एक लेखन त्रुटि, एक लापता या टूटा हुआ उदाहरण, या एक फ़ंक्शन विवरण जो भ्रामक है, देखते हैं, [इसके लिए एक मुद्दा बनाएँ](https://github.com/processing/p5.js/issues)! कृपया उस पृष्ठ का लिंक शामिल करें जिसे ठीक करने की आवश्यकता है ताकि हम इसे आसानी से पा सकें। ## 🗯 संदर्भ के लिए योगदान करें + [संदर्भ](http://p5js.org/reference/) के माध्यम से पढ़ें, और लेखन त्रुटि, टूटे उदाहरणों या भ्रमित करने वाले दस्तावेज़ देखें। यदि यह एक सीधा तय है, तो आगे बढ़ें और उस पर काम करें! यदि यह अधिक सम्मिलित प्रश्न है, जिस पर चर्चा की आवश्यकता है, तो एक [मुद्दा](https://github.com/processing/p5.js/issues/new) बनाएं। + * [यहाँ](./README/) पहली बार p5.js रेपो के साथ सेटअप होने के लिए निर्देश दिए गए हैं। * संदर्भ स्रोत कोड में (इन `src /` फ़ोल्डर में पाया गया) इनलाइन प्रलेखन से बनाया गया है। * यहाँ [कैसे अद्यतन या इनलाइन प्रलेखन और उदाहरणों को जोड़ने के लिए](./inline_documentation/) पर जानकारी है। -यदि आप [स्पेनिश प्रलेखन](http://p5js.org/es) के साथ त्रुटियां पाते हैं, तो इसे [यहाँ](https://github.com/processing/p5.js-website#internationalization-i18n) और संरचना अद्यतन करने के निर्देश हैं । + यदि आप [स्पेनिश प्रलेखन](http://p5js.org/es) के साथ त्रुटियां पाते हैं, तो इसे [यहाँ](https://github.com/processing/p5.js-website#internationalization-i18n) और संरचना अद्यतन करने के निर्देश हैं । * सामुदायिक-अनुरक्षित टाइपस्क्रिप्ट परिभाषाएँ [यहाँ](https://github.com/p5-types/p5.ts) हैं । ## ✨ उदाहरण बनाओ + जबकि संदर्भ में उदाहरण कोड के बहुत ही सरल स्निपेट होने के लिए होते हैं, लेकिन लंबे, अधिक जटिल उदाहरणों के लिए भी उपयोगी है। + * वर्तमान में हम [प्रोसेसिंग उदाहरण पृष्ठ](https://processing.org/examples/) से [p5.js उदाहरण पृष्ठ](http://p5js.org/examples) के उदाहरणों को पोर्ट करने पर काम कर रहे हैं। यदि आप इसके साथ मदद करना चाहते हैं, तो कृपया [यहाँ](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) के निर्देश देखें। * वैकल्पिक रूप से, आप अपने स्वयं के उदाहरण सेट कर सकते हैं और उन्हें स्वतंत्र रूप से प्रकाशित कर सकते हैं जैसे आप कहीं भी हैं। यदि आप उन्हें ऑनलाइन टैग [@ p5xjs](https://twitter.com/p5xjs) या ईमेल [hello@p5js.org](mailto:hello@p5js.org) पर साझा करते हैं, तो हमें बताएं, और हम दूर तक साझा करेंगे और विस्तृत! यह [एम्बेडिंग p5.js के लिए गाइड](https://github.com/processing/p5.js/wiki/Embedding-p5.js) आपके उदाहरणों को ऑनलाइन पोस्ट करने के लिए उपयोगी हो सकता है। -यदि आप रास्ते में p5.js में त्रुटि ढूंढते हैं, तो कृपया उन्हें [मुद्दों](https://github.com/processing/p5.js/issues) में साझा करें। + यदि आप रास्ते में p5.js में त्रुटि ढूंढते हैं, तो कृपया उन्हें [मुद्दों](https://github.com/processing/p5.js/issues) में साझा करें। ## 👯 शिक्षण सामग्री बनाएं + * यदि आप p5.js में नए हैं, तो यह शुरू करने के लिए एक शानदार जगह है। खुद कुछ बनाने की कोशिश करें, फिर दूसरों को भी करने के लिए एक शिक्षण बनाना। * वर्तमान में हम [प्रोसेसिंग शिक्षण पृष्ठ](https://processing.org/tutorials) से [p5.js शिक्षण पृष्ठ](http://p5js.org/learn) पर शिक्षण को पोर्ट करने पर काम कर रहे हैं। यदि आप इसकी सहायता करना चाहते हैं, तो कृपया शिक्षण बनाने के लिए [यहाँ शिक्षण देखें](https://p5js.org/learn/tutorial-guide.html)। * हम विभिन्न विषयों पर शिक्षण का भी स्वागत करते हैं। आप इन्हें कहीं भी, किसी भी प्रारूप में प्रकाशित कर सकते हैं। यदि आप उन्हें ऑनलाइन टैग [@ p5xjs](https://twitter.com/p5xjs) या ईमेल [hello@p5js.org](mailto:hello@p5js.org) पर साझा करते हैं, तो हमें बताएं, और हम दूर तक साझा करेंगे और विस्तृत! हम विशेष रूप से एक विशिष्ट दर्शकों के साथ बनाए गए शिक्षण को ध्यान में रखते हैं या मामले में उपयोग करते हैं (उदाहरण: पत्रकारों, कार्यकर्ताओं, कवियों, बच्चों, वरिष्ठ नागरिकों, सपने देखने वालों के लिए एक अलग भाषा में, आदि)। हम विचार करना पसंद करते हैं, जो पहले से ही स्वागत नहीं करता है या p5 समुदाय में शामिल है, और क्या हम सीखने को निमंत्रण के रूप में उपयोग कर सकते हैं? वह कौन सी भाषा है जिसका उपयोग आप अपने दर्शकों के साथ संवाद करने और उन्हें महसूस करने के लिए करते हैं? अपने प्रारूप के साथ प्रयोग करने के लिए स्वतंत्र महसूस करें। प्रेरणा के लिए [कोड स्लैंग पर शेरोन डी ला क्रूज़ की चर्चा](https://www.youtube.com/watch?v=CFT6w9NKfCs) देखें। -यदि आप रास्ते में p5.js में त्रुटि ढूंढते हैं, तो कृपया उन्हें [मुद्दों](https://github.com/processing/p5.js/issues) में साझा करें। + यदि आप रास्ते में p5.js में त्रुटि ढूंढते हैं, तो कृपया उन्हें [मुद्दों](https://github.com/processing/p5.js/issues) में साझा करें। ## 👉 आरंभ करना + * [P5.js समुदाय कथन](http://p5js.org/community/) पढ़ें * वैकल्पिक: रिपॉजिटरी का अवलोकन प्राप्त करने और कोड का निर्माण करने का तरीका जानने के लिए [योगदानकर्ता डॉक्स](./README/) देखें (यदि आपके लिए प्रासंगिक हो)। * सभी चर्चा गिटहब मुद्दों पर होती है, इसलिए आपको इसमें शामिल होने की जरूरत नहीं है। @@ -38,5 +41,3 @@ स्वागत हे! हमें बहुत खुशी है कि आप यहाँ हैं! ❤️ p5.js समुदाय - - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/design_principles.mdx b/src/content/contributor-docs/hi/design_principles.mdx index 7cdc2585c5..58eaac79b2 100644 --- a/src/content/contributor-docs/hi/design_principles.mdx +++ b/src/content/contributor-docs/hi/design_principles.mdx @@ -1,15 +1,9 @@ - ---- - ---- # P5.js के लिए डिजाइन सिद्धांत -- **शुरुआती मित्रवत** p5.js एपीआई का उद्देश्य शुरुआती कोडरों के अनुकूल होना है, जो अत्याधुनिक HTML5 / कैनवस / DOM एपीआई के साथ इंटरैक्टिव और विज़ुअल वेब कंटेंट बनाने के लिए एक कम अवरोध प्रदान करता है। - -- **शैक्षिक** p5.js एक एपीआई और पाठ्यक्रम पर केंद्रित है जो शैक्षिक उपयोग का समर्थन करता है, जिसमें समर्थन उदाहरणों के साथ एपीआई का पूरा संदर्भ शामिल है, साथ ही साथ ट्यूटोरियल और नमूना वर्ग पाठ्यक्रम जो एक स्पष्ट और स्पष्ट रचनात्मक रचनात्मक कोडिंग सिद्धांतों का परिचय देता है आकर्षक क्रम। +* **शुरुआती मित्रवत** p5.js एपीआई का उद्देश्य शुरुआती कोडरों के अनुकूल होना है, जो अत्याधुनिक HTML5 / कैनवस / DOM एपीआई के साथ इंटरैक्टिव और विज़ुअल वेब कंटेंट बनाने के लिए एक कम अवरोध प्रदान करता है। -- **जावास्क्रिप्ट और इसके समुदाय** p5.js का उद्देश्य वेब विकास प्रथाओं को उचित जावास्क्रिप्ट डिजाइन पैटर्न और उपयोग के माध्यम से शुरुआती लोगों के लिए अधिक सुलभ बनाना है, जबकि उन्हें आवश्यक रूप से अमूर्त करना है। एक ओपन सोर्स लाइब्रेरी के रूप में, p5.js में इसके निर्माण, प्रलेखन और प्रसार में व्यापक जावास्क्रिप्ट समुदाय भी शामिल है। +* **शैक्षिक** p5.js एक एपीआई और पाठ्यक्रम पर केंद्रित है जो शैक्षिक उपयोग का समर्थन करता है, जिसमें समर्थन उदाहरणों के साथ एपीआई का पूरा संदर्भ शामिल है, साथ ही साथ ट्यूटोरियल और नमूना वर्ग पाठ्यक्रम जो एक स्पष्ट और स्पष्ट रचनात्मक रचनात्मक कोडिंग सिद्धांतों का परिचय देता है आकर्षक क्रम। -- **प्रोसेसिंग और इसका समुदाय** p5.js प्रोसेसिंग भाषा और इसके समुदाय के लिए एक सीधी प्रतिक्रिया है, और इसका लक्ष्य प्रोसेसिंग से जावास्क्रिप्ट में परिवर्तन को आसान और स्पष्ट बनाना है। प्रोसेसिंग एपीआई और समुदाय का समर्थन करना p5.js के लिए प्राथमिकता है, जबकि वेब पर रचनात्मक कोडिंग की नई संभावनाओं को शामिल करने के लिए विस्तार करना, और उस एपीआई को शुरुआती लोगों को उजागर करने के लिए प्रोसेसिंग-शैली दृष्टिकोण लेना। +* **जावास्क्रिप्ट और इसके समुदाय** p5.js का उद्देश्य वेब विकास प्रथाओं को उचित जावास्क्रिप्ट डिजाइन पैटर्न और उपयोग के माध्यम से शुरुआती लोगों के लिए अधिक सुलभ बनाना है, जबकि उन्हें आवश्यक रूप से अमूर्त करना है। एक ओपन सोर्स लाइब्रेरी के रूप में, p5.js में इसके निर्माण, प्रलेखन और प्रसार में व्यापक जावास्क्रिप्ट समुदाय भी शामिल है। - \ No newline at end of file +* **प्रोसेसिंग और इसका समुदाय** p5.js प्रोसेसिंग भाषा और इसके समुदाय के लिए एक सीधी प्रतिक्रिया है, और इसका लक्ष्य प्रोसेसिंग से जावास्क्रिप्ट में परिवर्तन को आसान और स्पष्ट बनाना है। प्रोसेसिंग एपीआई और समुदाय का समर्थन करना p5.js के लिए प्राथमिकता है, जबकि वेब पर रचनात्मक कोडिंग की नई संभावनाओं को शामिल करने के लिए विस्तार करना, और उस एपीआई को शुरुआती लोगों को उजागर करने के लिए प्रोसेसिंग-शैली दृष्टिकोण लेना। diff --git a/src/content/contributor-docs/hi/discussions.mdx b/src/content/contributor-docs/hi/discussions.mdx index 9d6b9eeafd..fcf99b4c63 100644 --- a/src/content/contributor-docs/hi/discussions.mdx +++ b/src/content/contributor-docs/hi/discussions.mdx @@ -1,8 +1,3 @@ - ---- - ---- p5 कैसे विकसित होता है, इस बारे में चर्चा में शामिल होना योगदान देने का एक शानदार तरीका है। यह कई तरीकों से किया जा सकता है, लेकिन शुरू करने के लिए एक बढ़िया जगह मौजूदा गिटहब [जिन मुद्दों को 'चर्चा' करार दिया गया है](https://github.com/processing/p5.js/labels/discubion) की जाँच करके और अपनी आवाज जोड़ें। इस चर्चा के आधार पर इस उपधारा में दस्तावेज विकसित किए जाते हैं। यह वह जगह है जहां हम लाइब्रेरी के लिए वर्तमान और भविष्य के डिजाइन के बारे में विचारों को संकलित करते हैं। - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/es6-adoption.mdx b/src/content/contributor-docs/hi/es6-adoption.mdx index f28db2df86..a0d39ee362 100644 --- a/src/content/contributor-docs/hi/es6-adoption.mdx +++ b/src/content/contributor-docs/hi/es6-adoption.mdx @@ -1,8 +1,5 @@ - ---- - ---- ## ES6 को अपनाया + p5.js ने कोडबेस की जटिलता को कम करने, पठनीयता बढ़ाने और उन सुविधाओं का उपयोग करने के लिए हाल ही में ECMAScript 2015 (ES6) भाषा विनिर्देशों को अपनाया है, जो नए लोगों और सीज़न योगदानकर्ताओं के लिए सुरुचिपूर्ण और प्रभावी कोडिंग प्रथाओं की सुविधा प्रदान करते हैं। संक्रमण प्रक्रिया की शुरुआत में p5 को ES6 में माइग्रेट करने के उद्देश्य से [चर्चा की गई थी](https://github.com/processing/p5.js/issues/3758), जो बाद में कोडबेस में ES6 विनिर्देशों के साथ बड़े पैमाने पर वाक्यविन्यास परिवर्तनों की एक श्रृंखला की ओर ले गया। प्रारंभिक संक्रमण के बारे में अधिक जानकारी [यहां](https://github.com/processing/p5.js/pull/3874) पाई जा सकती है। इन परिवर्तनों में ईएस 6 मानकों के आधार पर लाइब्रेरी को प्रोसेसिंग, लाइनिंग और परीक्षण की सुविधा प्रदान करने के लिए निर्माण प्रणाली में मामूली संशोधन शामिल थे, साथ ही साथ ईएस 6 सुविधाओं के अनुरूप प्रमुख और सर्वव्यापी वाक्यविन्यास संशोधन भी थे। @@ -10,6 +7,7 @@ p5.js ने कोडबेस की जटिलता को कम कर यह ध्यान देने योग्य है कि इसे लिखने के रूप में, ये परिवर्तन किसी भी तरह से पूर्ण नहीं हैं, और ES6 की हर संभव विशेषता को प्रतिबिंबित या कार्यान्वित नहीं करते हैं। इनका उद्देश्य है कि सामुदायिक हितों और मानकों के साथ गठबंधन करने पर ES6 सुविधाओं को ठीक से और कुशलता से उपयोग करने के लिए एक सरल संक्रमण की सुविधा प्रदान करना। और योगदानकर्ताओं को धीरे-धीरे नई शैली और विशेषताओं के अनुरूप बनाने के लिए प्रेरित करें। हम सभी योगदानकर्ताओं को अपने कमिट्स और अनुरोधों में ES6 मानकों का पालन करने के लिए प्रोत्साहित करते हैं जब तक कि उपयोग की गई विशेषताएँ- + 1. जावास्क्रिप्ट के साथ जुड़े वाक्यविन्यास अस्पष्टता और विलक्षणता को कम करें 2. पठनीयता और कोड स्पष्टता बढ़ाएँ 3. कोड अस्पष्टता और मतिहीनता से बचाये (पठनीयता के साथ सहायता के लिए) @@ -18,76 +16,78 @@ p5.js ने कोडबेस की जटिलता को कम कर 6. कार्यक्षमता का त्याग न करे कई ES6 विशेषताएं हैं जो अभी तक p5 में उपयोग नहीं की गई हैं। हालाँकि लाइब्रेरी के कई क्षेत्र ऐसी विशेषताओं से लाभान्वित हो सकते हैं जिनमें शामिल हैं लेकिन यह सीमित नहीं हैं- -- जेनरेटर -- नंबर प्रकार की जाँच -- सेट/मैप डेटा संरचनाएं -- टाइप्ड एरे -- [आदि](http://es6-features.org/) + +* जेनरेटर +* नंबर प्रकार की जाँच +* सेट/मैप डेटा संरचनाएं +* टाइप्ड एरे +* [आदि](http://es6-features.org/) यह ध्यान देने योग्य है कि ES6 मानकों का पूर्ण अनुपालन p5 के सभी क्षेत्रों में समुदाय के प्रयासों की मांग करता है और इसकी प्रकृति के कारण एक क्रमिक प्रक्रिया है। ### प्रासंगिक संसाधन -- [आधिकारिक ES6 भाषा विशिष्टता](https://www.ecma-international.org/ecma-262/6.0/) -- [ES6 कार्यक्षमता तुलना](http://incaseofstairs.com/six-speed/) -- [ES6 विशेषताएं: अवलोकन और तुलना](http://es6-features.org/) -- [यू डॉन'ट नो जेएस : ES6 एंड बियॉन्ड (पुस्तक)](https://github.com/getify/You-Dont-Know-JS/tree/main/es6%20%26%20beyond) -- [एक्सप्लोरिंग ES6 (पुस्तक)](https://exploringjs.com/es6/) + +* [आधिकारिक ES6 भाषा विशिष्टता](https://www.ecma-international.org/ecma-262/6.0/) +* [ES6 कार्यक्षमता तुलना](http://incaseofstairs.com/six-speed/) +* [ES6 विशेषताएं: अवलोकन और तुलना](http://es6-features.org/) +* [यू डॉन'ट नो जेएस : ES6 एंड बियॉन्ड (पुस्तक)](https://github.com/getify/You-Dont-Know-JS/tree/main/es6%20%26%20beyond) +* [एक्सप्लोरिंग ES6 (पुस्तक)](https://exploringjs.com/es6/) ### कार्यक्षमता -यद्यपि हमारा लक्ष्य ES6 मानकों का अनुपालन और पालन करना है, यह ध्यान रखना महत्वपूर्ण है कि p5 प्रदर्शन कोड पर निर्भर करता है। इसे लिखते समय, ES6 की कई विशेषताएं कार्यक्षमता पतन, अड़चनों और ऊपरी चीज़ों से जुड़ी होती हैं। इस प्रकार, ES6 सुविधाओं का उपयोग करने से बचना महत्वपूर्ण है, जिसके परिणामस्वरूप खराब प्रदर्शन कोड होता है। हालांकि, यह एक अस्थायी चिंता का विषय है कि ब्राउज़र इंजन डेवलपर्स इन नई सुविधाओं के प्रदर्शन को बेहतर बनाने में सक्रिय रूप से लगे हुए हैं। हालांकि, कुछ समय के लिए, ES6 मानकों के पूर्ण अनुपालन पर प्रदर्शन को प्राथमिकता देना महत्वपूर्ण है, खासकर तब जब वाक्य-संबंधी परिवर्तन सामुदायिक लक्ष्यों के साथ गठबंधन किए गए बड़े सुधारों का परिणाम नहीं देते हैं। + +यद्यपि हमारा लक्ष्य ES6 मानकों का अनुपालन और पालन करना है, यह ध्यान रखना महत्वपूर्ण है कि p5 प्रदर्शन कोड पर निर्भर करता है। इसे लिखते समय, ES6 की कई विशेषताएं कार्यक्षमता पतन, अड़चनों और ऊपरी चीज़ों से जुड़ी होती हैं। इस प्रकार, ES6 सुविधाओं का उपयोग करने से बचना महत्वपूर्ण है, जिसके परिणामस्वरूप खराब प्रदर्शन कोड होता है। हालांकि, यह एक अस्थायी चिंता का विषय है कि ब्राउज़र इंजन डेवलपर्स इन नई सुविधाओं के प्रदर्शन को बेहतर बनाने में सक्रिय रूप से लगे हुए हैं। हालांकि, कुछ समय के लिए, ES6 मानकों के पूर्ण अनुपालन पर प्रदर्शन को प्राथमिकता देना महत्वपूर्ण है, खासकर तब जब वाक्य-संबंधी परिवर्तन सामुदायिक लक्ष्यों के साथ गठबंधन किए गए बड़े सुधारों का परिणाम नहीं देते हैं। ES6 सुविधाओं के प्रदर्शन की तुलना के लिए कृपया [इस लिंक को देखें](http://incaseofstairs.com/six-speed/)। प्रदर्शन प्राथमिकताकरण पर प्रकाश डालने वाली चर्चा के लिए, `forEach` के मामले पर [यहाँ](https://github.com/processing/p5.js/issues/3758#issuecomment-507922753) एक नज़र डालें। - ### ब्राउज़र संगतता और संकलन -p5 का निर्माण [ब्राउज़र लिस्ट के](https://github.com/browserslist/browserslist) `अंतिम 2 संस्करणों` और` मृत नहीं` के विरुद्ध किया गया है, ताकि किसी बड़े यूज़रबेस तक पहुँच बनाए रखने के दौरान नवीनतम सुविधाओं का समर्थन किया जा सके। समर्थित ब्राउज़रों की जांच करने के लिए कृपया [इस लिंक](https://browserl.ist/?q=last+2+versions) पर जाएं। इसके अलावा, अब तक, p5 पहले के ES5 मानकों में [संकलित](https://en.wikipedia.org/wiki/Source-to-source_compiler) होने के लिए [बैबल](https://babeljs.io/) का उपयोग कर रहा है। इसका मतलब यह है कि यद्यपि हम जावास्क्रिप्ट के ES6 या संभवतः अधिक अत्याधुनिक सुविधाओं का उपयोग करते हैं, इन सभी सुविधाओं को अंततः पहले के ES5 मानकों में बदल दिया जाता है जब लाइब्रेरी उत्पादन के लिए बनाया जाता है (`p5-min.js`)। यह पुराने ब्राउज़रों और मोबाइल उपकरणों के साथ संगतता सुनिश्चित करने के लिए है जो इंटरनेट एक्सप्लोरर जैसे इन नई सुविधाओं का समर्थन करने में विफल रहते हैं। इसलिए जब ब्राउज़र संगतता के बारे में पता होना महत्वपूर्ण है, तो यह ध्यान देने योग्य है कि ES6 सुविधाओं को अंततः व्यापक रूप से समर्थित ES5 मानकों में परिवर्तित किया जाता है, और अधिकांश भाग के लिए संगतता को अनदेखा किया जा सकता है। +p5 का निर्माण [ब्राउज़र लिस्ट के](https://github.com/browserslist/browserslist) `अंतिम 2 संस्करणों` और` मृत नहीं` के विरुद्ध किया गया है, ताकि किसी बड़े यूज़रबेस तक पहुँच बनाए रखने के दौरान नवीनतम सुविधाओं का समर्थन किया जा सके। समर्थित ब्राउज़रों की जांच करने के लिए कृपया [इस लिंक](https://browserl.ist/?q=last+2+versions) पर जाएं। इसके अलावा, अब तक, p5 पहले के ES5 मानकों में [संकलित](https://en.wikipedia.org/wiki/Source-to-source_compiler) होने के लिए [बैबल](https://babeljs.io/) का उपयोग कर रहा है। इसका मतलब यह है कि यद्यपि हम जावास्क्रिप्ट के ES6 या संभवतः अधिक अत्याधुनिक सुविधाओं का उपयोग करते हैं, इन सभी सुविधाओं को अंततः पहले के ES5 मानकों में बदल दिया जाता है जब लाइब्रेरी उत्पादन के लिए बनाया जाता है (`p5-min.js`)। यह पुराने ब्राउज़रों और मोबाइल उपकरणों के साथ संगतता सुनिश्चित करने के लिए है जो इंटरनेट एक्सप्लोरर जैसे इन नई सुविधाओं का समर्थन करने में विफल रहते हैं। इसलिए जब ब्राउज़र संगतता के बारे में पता होना महत्वपूर्ण है, तो यह ध्यान देने योग्य है कि ES6 सुविधाओं को अंततः व्यापक रूप से समर्थित ES5 मानकों में परिवर्तित किया जाता है, और अधिकांश भाग के लिए संगतता को अनदेखा किया जा सकता है। -इसे पढ़ते हुए आप आश्चर्यचकित हो सकते हैं: "* यदि ES6 को ES5 में बदल दिया जाए तो इन विशेषताओं का उपयोग करने का क्या मतलब है? *" इस बहुत ही उपयुक्त प्रश्न का उत्तर यह है कि ES5 निस्संदेह ES6 द्वारा आगामी वर्षों में प्रतिस्थापित किया जाएगा। और शायद समय आने पर लाइब्रेरी को ES5 में वापस स्थानांतरित करने की आवश्यकता नहीं होगी। ES6 मानकों का उपयोग मुख्य रूप से कोड को सरल बनाने, पठनीयता बढ़ाने और नए डेवलपर्स के लिए प्रवेश की बाधा को कम करने और यह सुनिश्चित करने के लिए करता है कि p5 नई सुविधाओं से लाभान्वित हो। सबसे महत्वपूर्ण बात यह है कि यह कोडबेस को भविष्य का प्रमाण बनाता है। +इसे पढ़ते हुए आप आश्चर्यचकित हो सकते हैं: "\* यदि ES6 को ES5 में बदल दिया जाए तो इन विशेषताओं का उपयोग करने का क्या मतलब है? \*" इस बहुत ही उपयुक्त प्रश्न का उत्तर यह है कि ES5 निस्संदेह ES6 द्वारा आगामी वर्षों में प्रतिस्थापित किया जाएगा। और शायद समय आने पर लाइब्रेरी को ES5 में वापस स्थानांतरित करने की आवश्यकता नहीं होगी। ES6 मानकों का उपयोग मुख्य रूप से कोड को सरल बनाने, पठनीयता बढ़ाने और नए डेवलपर्स के लिए प्रवेश की बाधा को कम करने और यह सुनिश्चित करने के लिए करता है कि p5 नई सुविधाओं से लाभान्वित हो। सबसे महत्वपूर्ण बात यह है कि यह कोडबेस को भविष्य का प्रमाण बनाता है। ### संगतता बनाम प्रदर्शन जबकि अधिकांश भाग के लिए ब्राउज़र संगतता को अनदेखा किया जा सकता है, वही प्रदर्शन के लिए सही नहीं है। ES6 का ES5 में रूपांतरण सुरक्षित रूप से पूरा किया जा सकता है, लेकिन ज्यादातर मामलों के लिए, उत्पन्न ES5 कोड से जुड़े कार्यक्षमता दंड हैं। कृपया फिर से देखें [यह लिंक](http://incaseofstairs.com/six-speed/) यह देखने के लिए कि कैसे बबेल द्वारा कोड किए गए कोड बनाम मूल ES5 कार्यान्वयन करता है। ### ES6 कोडिंग दिशानिर्देश -- ES6 `import` के पक्ष में `require` का परित्याग [[अधिक पढ़ें](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] -- ES6 `export` के पक्ष में `module.exports` का परित्याग [[अधिक पढ़ें](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] - - **अपवाद:** `app.js` अभी भी सिस्टम सीमाओं के कारण `module.exports = p5;` का उपयोग कर रहा है। -- `const` का इस्तेमाल हमेशा करें और `let` का इस्तेमाल तभी करें, जब पुनः असाइनमेंट जरूरी हो [[विचार-विमर्श](https://github.com/processing/p5.js/issues/3877)] -- प्रोटोटाइप सदस्यों को एरो फ़ंक्शन के बजाय फ़ंक्शन घोषणा का उपयोग करना चाहिए [[विचार-विमर्श](https://github.com/processing/p5.js/issues/3875)] - - **सही-** `p5.prototype.myMethod = function() { }` - - **गलत-** `p5.prototype.myMethod = () => { }` -- प्रोटोटाइप सदस्य जिन्हें `.bind(this)` की आवश्यकता है उन्हें एरो फ़ंक्शन में परिवर्तित किया जाना चाहिए [[विचार-विमर्श](https://github.com/processing/p5.js/issues/3875)] - - **सही-** `p5.prototype.myMethod = () => { }` - - **गलत-** `p5.prototype.myMethod = function() {...}.bind(this);` -- स्थिरांक आयात किये जाते हैं जो वाक्यविन्यास पुराने प्रारूप को दोहराती हैं- `constants.TWO_PI` +* ES6 `import` के पक्ष में `require` का परित्याग \[[अधिक पढ़ें](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] +* ES6 `export` के पक्ष में `module.exports` का परित्याग \[[अधिक पढ़ें](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] + * **अपवाद:** `app.js` अभी भी सिस्टम सीमाओं के कारण `module.exports = p5;` का उपयोग कर रहा है। +* `const` का इस्तेमाल हमेशा करें और `let` का इस्तेमाल तभी करें, जब पुनः असाइनमेंट जरूरी हो \[[विचार-विमर्श](https://github.com/processing/p5.js/issues/3877)] +* प्रोटोटाइप सदस्यों को एरो फ़ंक्शन के बजाय फ़ंक्शन घोषणा का उपयोग करना चाहिए \[[विचार-विमर्श](https://github.com/processing/p5.js/issues/3875)] + * **सही-** `p5.prototype.myMethod = function() { }` + * **गलत-** `p5.prototype.myMethod = () => { }` +* प्रोटोटाइप सदस्य जिन्हें `.bind(this)` की आवश्यकता है उन्हें एरो फ़ंक्शन में परिवर्तित किया जाना चाहिए \[[विचार-विमर्श](https://github.com/processing/p5.js/issues/3875)] + * **सही-** `p5.prototype.myMethod = () => { }` + * **गलत-** `p5.prototype.myMethod = function() {...}.bind(this);` +* स्थिरांक आयात किये जाते हैं जो वाक्यविन्यास पुराने प्रारूप को दोहराती हैं- `constants.TWO_PI` ### परिवर्तनों का सारांश -- [मॉड्यूल: निर्यात / आयात](http://es6-features.org/#ValueExportImport) -- [मॉड्यूल: डिफ़ॉल्ट और वाइल्डकार्ड](http://es6-features.org/#ValueExportImport) -- [स्थिरांक](http://es6-features.org/#Constants) -- [ब्लॉक-स्कोप चर](http://es6-features.org/#BlockScopedVariables) -- [रेस्ट पैरामीटर](http://es6-features.org/#RestParameter) -- [स्प्रेड ऑपरेटर ](http://es6-features.org/#SpreadOperator) -- [मेथड प्रॉपर्टीज](http://es6-features.org/#MethodProperties) -- [प्रॉपर्टी शॉर्टहैंड](http://es6-features.org/#PropertyShorthand) -- [एरो फंक्शन्स : स्टेटमेंट बॉडीज](http://es6-features.org/#StatementBodies) -- [एरो फंक्शन्स : एक्सप्रेशन बॉडीज](http://es6-features.org/#ExpressionBodies) -- [क्लास डेफिनिशन](http://es6-features.org/#ClassDefinition) -- [क्लास इनहेरिटेंस](http://es6-features.org/#ClassInheritance) -- [टेम्पलेट लिटेरल्स : स्ट्रिंग इन्टरपोलेशन](http://es6-features.org/#StringInterpolation) -- [टेम्पलेट लिटेरल्स : कस्टम इन्टरपोलेशन ](http://es6-features.org/#CustomInterpolation) -- [डिफ़ॉल्ट पैरामीटर वैल्यूज](http://es6-features.org/#DefaultParameterValues) -- [स्ट्रिंग सर्चिंग: इन्क्लुड्स](http://es6-features.org/#StringSearching) -- [स्ट्रिंग सर्चिंग: इन्क्लुड्स (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) -- [इटरेटर्स: फॉर-ऑफ़](http://es6-features.org/#IteratorForOfOperator) + +* [मॉड्यूल: निर्यात / आयात](http://es6-features.org/#ValueExportImport) +* [मॉड्यूल: डिफ़ॉल्ट और वाइल्डकार्ड](http://es6-features.org/#ValueExportImport) +* [स्थिरांक](http://es6-features.org/#Constants) +* [ब्लॉक-स्कोप चर](http://es6-features.org/#BlockScopedVariables) +* [रेस्ट पैरामीटर](http://es6-features.org/#RestParameter) +* [स्प्रेड ऑपरेटर ](http://es6-features.org/#SpreadOperator) +* [मेथड प्रॉपर्टीज](http://es6-features.org/#MethodProperties) +* [प्रॉपर्टी शॉर्टहैंड](http://es6-features.org/#PropertyShorthand) +* [एरो फंक्शन्स : स्टेटमेंट बॉडीज](http://es6-features.org/#StatementBodies) +* [एरो फंक्शन्स : एक्सप्रेशन बॉडीज](http://es6-features.org/#ExpressionBodies) +* [क्लास डेफिनिशन](http://es6-features.org/#ClassDefinition) +* [क्लास इनहेरिटेंस](http://es6-features.org/#ClassInheritance) +* [टेम्पलेट लिटेरल्स : स्ट्रिंग इन्टरपोलेशन](http://es6-features.org/#StringInterpolation) +* [टेम्पलेट लिटेरल्स : कस्टम इन्टरपोलेशन ](http://es6-features.org/#CustomInterpolation) +* [डिफ़ॉल्ट पैरामीटर वैल्यूज](http://es6-features.org/#DefaultParameterValues) +* [स्ट्रिंग सर्चिंग: इन्क्लुड्स](http://es6-features.org/#StringSearching) +* [स्ट्रिंग सर्चिंग: इन्क्लुड्स (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) +* [इटरेटर्स: फॉर-ऑफ़](http://es6-features.org/#IteratorForOfOperator) **ध्यान दें:** लाइब्रेरी में नई सुविधाओं को शामिल किए जाने पर कृपया ऊपर की सूची को अपडेट करें। - ### Current Issues -- [`#3883`](https://github.com/processing/p5.js/issues/3883)- कस्टम बंडल्स बनाने के लिए `combineModules` का उपयोग करते समय `new p5()` का निर्माण करने में विफलता। वैश्विक मोड अप्रभावित है और अपेक्षा के अनुसार व्यवहार करता है। +### Current Issues - \ No newline at end of file +* [`#3883`](https://github.com/processing/p5.js/issues/3883)- कस्टम बंडल्स बनाने के लिए `combineModules` का उपयोग करते समय `new p5()` का निर्माण करने में विफलता। वैश्विक मोड अप्रभावित है और अपेक्षा के अनुसार व्यवहार करता है। diff --git a/src/content/contributor-docs/hi/issue_labels.mdx b/src/content/contributor-docs/hi/issue_labels.mdx index 544bc4badb..4c511d456a 100644 --- a/src/content/contributor-docs/hi/issue_labels.mdx +++ b/src/content/contributor-docs/hi/issue_labels.mdx @@ -1,7 +1,3 @@ - ---- - ---- # p5.js लेबल जारी करें p5.js मुद्दों को सुलझाने और व्यवस्थित करने में मदद करने के लिए लेबल के एक सेट का उपयोग करता है। @@ -10,41 +6,43 @@ p5.js मुद्दों को सुलझाने और व्यवस ## स्थिति -लेबल | प्रयोग -------------------- | ------------- -help_wanted | निश्चित नहीं है कि कैसे तय किया जाए, योगदान की तलाश में, लोगों के लिए आसान पहुंच बिंदु (इंगित करता है कि नए डेवलपर द्वारा दावा किया जा सकता है -inconsistent_style | अस्पष्ट कोड, भ्रामक वाक्यविन्यास, शायद अपर्याप्त प्रलेखन -duplicate | मुद्दा पहले ही कहीं और नोट किया गया है -missing_test | स्वचालित परीक्षण की आवश्यकता है -wont_fix | वैध मुद्दा, लेकिन समुदाय द्वारा गुंजाइश पर सहमत होने के कारण संबोधित नहीं किया जाएगा -gsoc | समस्या को पहले से ही गूगल समर ऑफ़ कोड द्वारा संबोधित किया जा रहा है -invalid| अब प्रासंगिक नहीं है (उदाहरण के लिए, पुराने एपीआई में सुविधा अनुरोध), वास्तव में समस्या नहीं है -discussion | जानें कि समस्या क्या है, समाधान का निर्धारण करने के लिए सामुदायिक इनपुट की आवश्यकता है -question | निश्चित नहीं है कि क्या समस्या है / यदि कोई समस्या है, तो स्पष्टीकरण की आवश्यकता है -feature | एक अतिरिक्त या कोडबेस में सुधार -regression | कार्य / सुविधा एक बार काम करती है, लेकिन तब से टूट गई है। अस्थिर सुविधाओं या घटकों की पहचान करने के लिए उपयोगी है - +| लेबल | प्रयोग | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| help\_wanted | निश्चित नहीं है कि कैसे तय किया जाए, योगदान की तलाश में, लोगों के लिए आसान पहुंच बिंदु (इंगित करता है कि नए डेवलपर द्वारा दावा किया जा सकता है | +| inconsistent\_style | अस्पष्ट कोड, भ्रामक वाक्यविन्यास, शायद अपर्याप्त प्रलेखन | +| duplicate | मुद्दा पहले ही कहीं और नोट किया गया है | +| missing\_test | स्वचालित परीक्षण की आवश्यकता है | +| wont\_fix | वैध मुद्दा, लेकिन समुदाय द्वारा गुंजाइश पर सहमत होने के कारण संबोधित नहीं किया जाएगा | +| gsoc | समस्या को पहले से ही गूगल समर ऑफ़ कोड द्वारा संबोधित किया जा रहा है | +| invalid | अब प्रासंगिक नहीं है (उदाहरण के लिए, पुराने एपीआई में सुविधा अनुरोध), वास्तव में समस्या नहीं है | +| discussion | जानें कि समस्या क्या है, समाधान का निर्धारण करने के लिए सामुदायिक इनपुट की आवश्यकता है | +| question | निश्चित नहीं है कि क्या समस्या है / यदि कोई समस्या है, तो स्पष्टीकरण की आवश्यकता है | +| feature | एक अतिरिक्त या कोडबेस में सुधार | +| regression | कार्य / सुविधा एक बार काम करती है, लेकिन तब से टूट गई है। अस्थिर सुविधाओं या घटकों की पहचान करने के लिए उपयोगी है | ## तीव्रता + P5.js उपयोगकर्ताओं और डेवलपर्स पर त्रुटि के प्रभाव को वर्गीकृत करें। -लेबल | प्रयोग -------------------- | ------------- -severity:critical | अन्य डेवलपर्स के ब्लॉक काम करते हैं (उदाहरण के लिए एक टूटी हुई निर्माण); या लाइब्रेरी या IDE उपयोगकर्ता के लिए डेटा हानि का कारण बनता है -severity:major | एक महत्वपूर्ण घटक में कार्यक्षमता का नुकसान -severity:minor | कई उपयोगकर्ताओं द्वारा देखा जाने की संभावना नहीं है एक छोटी सी वस्तु; या ऐसा कुछ जो केवल उपयोगकर्ता द्वारा सामना किए जाने पर मामूली झुंझलाहट होगी; या किसी ज्ञात कार्य के साथ +| लेबल | प्रयोग | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| severity:critical | अन्य डेवलपर्स के ब्लॉक काम करते हैं (उदाहरण के लिए एक टूटी हुई निर्माण); या लाइब्रेरी या IDE उपयोगकर्ता के लिए डेटा हानि का कारण बनता है | +| severity:major | एक महत्वपूर्ण घटक में कार्यक्षमता का नुकसान | +| severity:minor | कई उपयोगकर्ताओं द्वारा देखा जाने की संभावना नहीं है एक छोटी सी वस्तु; या ऐसा कुछ जो केवल उपयोगकर्ता द्वारा सामना किए जाने पर मामूली झुंझलाहट होगी; या किसी ज्ञात कार्य के साथ | ## कठिनाई स्तर + टैग स्तर और सुविधा अनुरोध कठिनाई स्तर के अनुसार। उन बगों की पहचान करने में सहायता करें, जो शुरुआती या नए योगदानकर्ताओं, या आइटम से निपट सकते हैं जो अनुभवी योगदानकर्ताओं से भी पर्याप्त प्रयास करेंगे। -लेबल | प्रयोग -------------------- | ------------- -level:bite size| आसानी से स्क्वैश किया जा सकता है, एक नए / कनिष्ठ डेवलपर द्वारा सामना किया जा सकता है -level:moderate | कोड बेस के साथ काम या परिचित की एक बड़ी राशि की आवश्यकता है -level:advanced | बड़ी मात्रा में काम करने की आवश्यकता होती है और संभवतः एक आक्रामक फिक्स या पुनः वास्तुकला -level:unknown | समस्या दाखिल करने वाले व्यक्ति द्वारा ज्ञात नहीं होने से कठिनाई +| लेबल | प्रयोग | +| --------------- | ----------------------------------------------------------------------------------------- | +| level:bite size | आसानी से स्क्वैश किया जा सकता है, एक नए / कनिष्ठ डेवलपर द्वारा सामना किया जा सकता है | +| level:moderate | कोड बेस के साथ काम या परिचित की एक बड़ी राशि की आवश्यकता है | +| level:advanced | बड़ी मात्रा में काम करने की आवश्यकता होती है और संभवतः एक आक्रामक फिक्स या पुनः वास्तुकला | +| level:unknown | समस्या दाखिल करने वाले व्यक्ति द्वारा ज्ञात नहीं होने से कठिनाई | ## क्षेत्र + समस्या से प्रभावित कोड आधार के भाग को इंगित करें। * area:3d @@ -54,13 +52,14 @@ level:unknown | समस्या दाखिल करने वाले व * area:dom * area:events * area:examples -* area:image -* area:io -* area:math -* area:tutorial +* area:image +* area:io +* area:math +* area:tutorial * area:typography ## ओएस / ब्राउज़र + जब कोई समस्या केवल एक विशिष्ट ऑपरेटिंग सिस्टम और / या ब्राउज़र को प्रभावित करती है, तो समस्या को उचित रूप से टैग करें। * chrome @@ -70,8 +69,7 @@ level:unknown | समस्या दाखिल करने वाले व * firefox * android * ios -* windows_mobile +* windows\_mobile * windows * osx * linux - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/organization.mdx b/src/content/contributor-docs/hi/organization.mdx index 4eccc1be22..6d9843a12c 100644 --- a/src/content/contributor-docs/hi/organization.mdx +++ b/src/content/contributor-docs/hi/organization.mdx @@ -1,7 +1,3 @@ - ---- - ---- # योगदान का आयोजन रिपॉजिटरी को व्यवस्थित रखना यह सुनिश्चित करता है कि यह हमेशा स्पष्ट हो कि कौन से विचार-विमर्श और कार्य सबसे महत्वपूर्ण हैं। यह अनुरक्षक से नए योगदानकर्ताओं तक सभी को अभिभूत किए बिना भंडार को नेविगेट करने में मदद करता है। इसके साथ मदद करने के लिए, हमारे पास मुद्दों को व्यवस्थित करने, काम करने और अनुरोधों को खींचने के लिए दिशानिर्देशों का एक सेट है। @@ -11,21 +7,21 @@ # संगठन के लिए दिशा निर्देश ## मुद्दे -- **सभी त्रुटि विवरण में नमूना कोड शामिल होना चाहिए** - - यह मुद्दे के विवरण में पोस्ट किए गए कोड के रूप में हो सकता है, या यह [ऑनलाइन संपादक](https://editor.p5js.org) में अधिमानतः कोड के ऑनलाइन उदाहरण का लिंक हो सकता है -- **सभी मुद्दों में कम से कम 2 लेबल होने चाहिए** - - इससे मुद्दों को नेविगेट करने में काफी आसानी होती है। - - क्षेत्र (webgl, core, image, आदि) के लिए एक लेबल जोड़ने का प्रयास करें। -- **यह कार्य पहले आओ, पहले पाओ है** - - यदि त्रुटि को पुन: पेश किया गया है, या समुदाय द्वारा एक सुविधा अनुरोध / वृद्धि पर सहमति हुई है, तो यह असाइनमेंट के लिए उपलब्ध है। जब ऐसा होता है कि योगदानकर्ता कहता है "मैं इस मुद्दे पर काम करना चाहूंगा", तो असाइनमेंट का अनुरोध करने वाले पहले योगदानकर्ता को असाइन किया जाएगा। - - अगर यह अस्पष्ट है कि त्रुटि प्रतिलिपि प्रस्तुत करने योग्य है या सुविधा अनुरोध / वृद्धि पर सहमति व्यक्त की गई है, तो किसी मुद्दे को सौंपा जाने का अनुरोध न करें। -## पुल अनुरोध -- **सभी पुल अनुरोधों को एक मुद्दे के साथ जोड़ा जाना चाहिए** - - यदि आप त्रुटि को ठीक करना चाहते हैं या एक सुविधा जोड़ना चाहते हैं, तो एक मुद्दे को खोलकर शुरू करें ताकि समुदाय उस पर चर्चा कर सके। - - यदि किसी संबंधित मुद्दे के बिना एक पुल अनुरोध खोला जाता है, तो टिप्पणी करें और योगदानकर्ता को मुद्दा खोलने के लिए कहें। +* **सभी त्रुटि विवरण में नमूना कोड शामिल होना चाहिए** + * यह मुद्दे के विवरण में पोस्ट किए गए कोड के रूप में हो सकता है, या यह [ऑनलाइन संपादक](https://editor.p5js.org) में अधिमानतः कोड के ऑनलाइन उदाहरण का लिंक हो सकता है +* **सभी मुद्दों में कम से कम 2 लेबल होने चाहिए** + * इससे मुद्दों को नेविगेट करने में काफी आसानी होती है। + * क्षेत्र (webgl, core, image, आदि) के लिए एक लेबल जोड़ने का प्रयास करें। +* **यह कार्य पहले आओ, पहले पाओ है** + * यदि त्रुटि को पुन: पेश किया गया है, या समुदाय द्वारा एक सुविधा अनुरोध / वृद्धि पर सहमति हुई है, तो यह असाइनमेंट के लिए उपलब्ध है। जब ऐसा होता है कि योगदानकर्ता कहता है "मैं इस मुद्दे पर काम करना चाहूंगा", तो असाइनमेंट का अनुरोध करने वाले पहले योगदानकर्ता को असाइन किया जाएगा। + * अगर यह अस्पष्ट है कि त्रुटि प्रतिलिपि प्रस्तुत करने योग्य है या सुविधा अनुरोध / वृद्धि पर सहमति व्यक्त की गई है, तो किसी मुद्दे को सौंपा जाने का अनुरोध न करें। +## पुल अनुरोध +* **सभी पुल अनुरोधों को एक मुद्दे के साथ जोड़ा जाना चाहिए** + * यदि आप त्रुटि को ठीक करना चाहते हैं या एक सुविधा जोड़ना चाहते हैं, तो एक मुद्दे को खोलकर शुरू करें ताकि समुदाय उस पर चर्चा कर सके। + * यदि किसी संबंधित मुद्दे के बिना एक पुल अनुरोध खोला जाता है, तो टिप्पणी करें और योगदानकर्ता को मुद्दा खोलने के लिए कहें। # निर्णय लेने के लिए दिशानिर्देश @@ -39,8 +35,6 @@ p5 अपनी निर्णय लेने की प्रक्रिय > अगर आपको बॉट या गीथब एक्शन के साथ उपरोक्त में से किसी को भी स्वचालित करने का विचार है तो अपने प्रस्ताव के साथ समस्या को खोलने के लिए स्वतंत्र महसूस करें! - - # प्रबंधक प्रबंधक ऐसे योगदानकर्ता होते हैं जो विशेष रूप से परियोजना के कुछ क्षेत्रों से परिचित, परिचित या उत्तरदायी होते हैं। उनकी भूमिका p5.js. पर काम करने वाले अन्य लोगों को संदर्भ और मार्गदर्शन प्रदान करने में मदद करना है। यदि आपके पास किसी विशेष क्षेत्र में योगदान करने के बारे में कोई सवाल है, तो आप सूचीबद्ध प्रबंधक को किसी समस्या या टैग अनुरोध में टैग कर सकते हैं। वे समुदाय अनुरोधों पर भी वजन कर सकते हैं और समुदाय के इनपुट के साथ अपने क्षेत्र की समग्र दिशा का मार्गदर्शन कर सकते हैं। @@ -48,4 +42,3 @@ p5 अपनी निर्णय लेने की प्रक्रिय कोई भी इच्छुक स्वयंसेवक एक प्रबंधक हो सकता है! विशेषज्ञता के लिए कोई विशिष्ट आवश्यकताएं नहीं हैं, बस सक्रिय रूप से सीखने और भाग लेने में रुचि है। यदि आप इस परियोजना के एक या अधिक हिस्सों से परिचित हैं, तो एक समस्या को स्वयंसेवक के रूप में खोलें! एक बार जोड़े जाने के बाद, एक प्रबंधक का उपयोगकर्ता नाम [रीडमी के स्टीवर्ड सेक्शन](https://github.com/processing/p5.js#stewards) में रहेगा, जब तक कि उन्हें हटाने का अनुरोध नहीं किया जाता। यदि एक प्रबंधक एक विस्तारित अवधि के लिए अनुत्तरदायी है, तो हम उनसे उनकी स्थिति के बारे में पूछ सकते हैं। और आप हमेशा एक प्रबंधक के रूप में विराम ले सकते हैं और वापस आ सकते हैं! - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/preparing_a_pull_request.mdx b/src/content/contributor-docs/hi/preparing_a_pull_request.mdx index 222864af3b..574ba9acf8 100644 --- a/src/content/contributor-docs/hi/preparing_a_pull_request.mdx +++ b/src/content/contributor-docs/hi/preparing_a_pull_request.mdx @@ -1,7 +1,3 @@ - ---- - ---- # एक पुल अनुरोध तैयार करना जब आपका कोड अद्यतन हो तो पुल अनुरोध में आसानी होती है! आप अपने कोड को अन्य योगदानकर्ताओं से परिवर्तनों को शामिल करने के लिए अद्यतन करने के लिए git rebase का उपयोग कर सकते हैं। ऐसे - @@ -9,47 +5,52 @@ ## सहेजें और अपडेट करें ### आपके पास जो कुछ है उसे बचाओ! - git status - git add -u - git commit + +git status +git add -u +git commit ### परिवर्तनों के बारे में जानें + सुनिश्चित करें कि आप अपस्ट्रीम p5.js रिपॉजिटरी को ट्रैक कर रहे हैं। - $ git remote show upstream +$ git remote show upstream यदि आपको कोई त्रुटि दिखाई देती है, तो आपको "upstream" रिमोट रिपॉजिटरी के रूप में मुख्य p5.js रेपो को ट्रैक करना शुरू करना होगा। आपको केवल एक बार ऐसा करने की आवश्यकता होगी! लेकिन, अगर आप इसे दूसरी बार चलाते हैं तो कोई नुकसान नहीं होता है। - $ git remote add upstream https://github.com/processing/p5.js +$ git remote add upstream [https://github.com/processing/p5.js](https://github.com/processing/p5.js) फिर नवीनतम परिवर्तनों के बारे में पूछें। - $ git fetch upstream +$ git fetch upstream ### शायद ज़रुरत पड़े- एक नई शाखा में अपने परिवर्तनों की एक प्रति बनाएँ - $ git branch your-branch-name-backup + +$ git branch your-branch-name-backup ### मुख्य शाखा से परिवर्तन लागू करता है, *बाद में* अपने परिवर्तन जोड़ता है - $ git rebase upstream/main + +$ git rebase upstream/main ### विवादों का समाधान + आपकी शाखा में कुछ उलझनें हो सकती हैं! यदि यह केवल lib / p5.js और lib / p5.min.js है, तो इसे ठीक करना आसान है। बस परियोजना को फिर से ग्रंट के साथ बनाएं। - grunt - git add -u - git rebase --continue +grunt +git add -u +git rebase --continue यदि आपके पास अन्य फ़ाइलों में विरोध है और आप सुनिश्चित नहीं हैं कि उन्हें कैसे हल किया जाए ... मदद के लिए पूछें! ### और अंत में, महान गौरव के लिए - $ git push origin -यदि आप तकनीकी विवरणों के बारे में गहन जानकारी प्राप्त कर रहे हैं, तो रेबेसिंग पर एक अच्छा संदर्भ है। https://www.atlassian.com/git/tutorials/merging-vs-rebasing +$ git push origin + +यदि आप तकनीकी विवरणों के बारे में गहन जानकारी प्राप्त कर रहे हैं, तो रेबेसिंग पर एक अच्छा संदर्भ है। [https://www.atlassian.com/git/tutorials/merging-vs-rebasing](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) ## पुल अनुरोध बनाना यहाँ [गिटहब पर पुल अनुरोध बनाने के निर्देश](https://help.github.com/articles/creating-a-pull-request/) दिए गए हैं। आप जिस भी शाखा में काम कर रहे हैं, उसका नाम बता सकते हैं। आप p5.js. की "मुख्य" शाखा के खिलाफ अपना पुल अनुरोध प्रस्तुत करेंगे एक बार जब आप अपना पुल अनुरोध प्रस्तुत कर देते हैं, तो इसकी समीक्षा की जाएगी और जैसे ही कोई अन्य ऐसा करने के लिए उपलब्ध होगा, और इसे विलय कर दिया जाएगा। परिवर्तन p5.js लाइब्रेरी की अगली रिलीज़ के साथ दिखाई देंगे। - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/roadmap.mdx b/src/content/contributor-docs/hi/roadmap.mdx index 4a4c52d81d..d4cd570866 100644 --- a/src/content/contributor-docs/hi/roadmap.mdx +++ b/src/content/contributor-docs/hi/roadmap.mdx @@ -1,14 +1,11 @@ - ---- - ---- -# p5.js 1.0 रोडमैप [WIP] +# p5.js 1.0 रोडमैप \[WIP] यह दस्तावेज़ भविष्य के 1.0 संस्करण p5.js. के लिए संभावित सुविधाओं, सुधारों और रखरखाव मदों की एक सूची है। पहला मसौदा कार्य समूह द्वारा यूसीएलए डिजाइन मीडिया आर्ट्स में बनाया गया था और आपकी प्रतिक्रिया के लिए बाहर रखा गया है। यह एक कामकाजी मसौदा है जिसे अद्यतन किया जा सकता है और इसे अगस्त 2019 के लिए p5.js योगदानकर्ता सम्मेलन में संशोधित किया जाएगा। हमारा लक्ष्य 2019 के अंत तक p5.js 1.0 जारी करना है। ईएस 6 प्रवास के अपवाद के साथ, यहां कार्यों को प्राथमिकता से आदेश नहीं दिया गया है। गथुब पर [मील के पत्थर](https://github.com/processing/p5.js/milestones) है, जहां हम रिलीज और ट्रैक प्रगति के लिए कार्यों को प्राथमिकता देते हैं। ## ES6 प्रवास + * चरण 1: उपयोगकर्ता का सामना करना पड़ रहा है * p5js.org ट्यूटोरियल (प्रति ट्यूटोरियल इश्यू) * p5js.org उदाहरण (प्रति अनुभाग समस्या) @@ -23,15 +20,17 @@ * योगदान पुस्तकालयों ## रखरखाव + * लंबित क्रोम परिवर्तनों के लिए ऑडियो अपडेट (उपयोगकर्ता को पहले बातचीत करनी चाहिए) * अद्यतन संदर्भ प्रलेखन और उदाहरण, और उदाहरण पृष्ठ * इस बारे में चेतावनी देने के लिए FES अपडेट करें? * अधिक पूर्ण इकाई परीक्षण * ऐसा करने के लिए स्पष्ट ट्यूटोरियल * मित्रतापूर्ण त्रुटि प्रणाली प्रलेखन में सुधार - * इस प्रक्रिया में क्या हो रहा है, इसे बेहतर दस्तावेज़ के लिए टिप्पणियों को https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js पर जोड़ें। + * इस प्रक्रिया में क्या हो रहा है, इसे बेहतर दस्तावेज़ के लिए टिप्पणियों को [https://github.com/processing/p5.js/blob/main/src/core/friendly\_errors/fes\_core.js](https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js) पर जोड़ें। ## बग फिक्सिंग + * मोबाइल डिवाइस का समर्थन / उन्नयन * WebGL मजबूती * प्रकाश @@ -43,6 +42,7 @@ * आकृतियों के लिए एक रेंडरिंग विधि, रिटेन मोड से जियोम ऑब्जेक्ट का निर्माण करें ## नए विशेषताएँ + * आकृतियाँ * createShape () p5.Geometry ऑब्जेक्ट वापस करने के लिए सार्वजनिक API ?? 2D में समतुल्य क्या है? * 2 डी के लिए एसवीजी कुछ भी? @@ -57,8 +57,9 @@ * पुस्तकालय भर में वादों को लागू करें * कोडबेस में प्रोमिस के उपयोग की पुष्टि / कार्यान्वयन * लोड एक्सएक्सएक्स (लोड प्राथमिकता) के लिए एपीआई में प्रोमिस का खुला उपयोग? - + ## योगदानकर्ता प्रक्रिया और समर्थन + * विभिन्न क्षेत्रों में अपूर्णता के लिए खुले टिकट: * परिक्षण * फ़ीचर कार्यान्वयन @@ -67,5 +68,5 @@ * भविष्य के संस्करणों के लिए रोडमैप इनपुट को सुलझाने के लिए स्पष्ट प्रक्रिया। ## आदि + * 1.0 रिलीज के लिए, कलाकारों और कोडर से क्यूरेटेड उदाहरणों का एक नया सेट ड्रॉप करें। - \ No newline at end of file diff --git a/src/content/contributor-docs/hi/unit_testing.mdx b/src/content/contributor-docs/hi/unit_testing.mdx index 572e9957ac..c6bbf57272 100644 --- a/src/content/contributor-docs/hi/unit_testing.mdx +++ b/src/content/contributor-docs/hi/unit_testing.mdx @@ -1,7 +1,3 @@ - ---- - ---- ## इकाई परीक्षण हम यह सुनिश्चित करने के लिए इकाई परीक्षण का उपयोग करते हैं कि कोडबेस के अलग-अलग घटक काम करते हैं जैसा कि हम उनसे उम्मीद करते हैं। @@ -10,61 +6,67 @@ यहां एक समान तकनीक स्टैक के साथ [यूनिट परीक्षण](https://codeburst.io/javascript-unit-testing-using-mocha-and-chai-1d97d9f18e71) के लिए एक अच्छा, त्वरित परिचय है, और यहां गहराई से [व्याख्या](https://blog.logrocket.com/a-quick-and-complete-guide-to-mocha-testing-d0e0ea09f09d) दी गयी है। - ### सभी यूनिट टेस्ट को चलाना + रेपो रूट में, अपने टर्मिनल में निम्न कमांड का उपयोग करें + ```shell $ npm test ``` ### परीक्षण कवरेज + जब भी परीक्षण चलाए जाते हैं, एक कवरेज रिपोर्ट तैयार की जाती है। यह कवरेज रिपोर्ट बताती है कि परीक्षण सूट द्वारा किस स्रोत कोड फ़ाइलों का उपयोग किया गया था, प्रभावी रूप से हमें बता रहा था कि कोडबेस का कितना परीक्षण किया गया था। -परीक्षण चलाने के बाद एक सारांश मुद्रित किया जाता है, और आप किसी भी वेब ब्राउज़र में ```coverage/index.html``` पर विस्तृत रिपोर्ट देख सकते हैं। आप अपने डिफॉल्ट वेब ब्राउज़र में पेज खोलने के लिए Mac पर कमांड लाइन से `open coverage/index.html` चला सकते हैं। आप कमांड का उपयोग करके टर्मिनल में परीक्षण चलाने के बाद कवरेज रिपोर्ट भी देख सकते हैं ```npx nyc report --reporter=text```. +परीक्षण चलाने के बाद एक सारांश मुद्रित किया जाता है, और आप किसी भी वेब ब्राउज़र में `coverage/index.html` पर विस्तृत रिपोर्ट देख सकते हैं। आप अपने डिफॉल्ट वेब ब्राउज़र में पेज खोलने के लिए Mac पर कमांड लाइन से `open coverage/index.html` चला सकते हैं। आप कमांड का उपयोग करके टर्मिनल में परीक्षण चलाने के बाद कवरेज रिपोर्ट भी देख सकते हैं `npx nyc report --reporter=text`. ### एक सुइट चला कर देखें -एकल परीक्षण या परीक्षणों के समूह को चलाने के लिए,```.only``` सुइट में या तो `.js` फ़ाइल में परीक्षण करें और उपरोक्त आदेश का उपयोग करके परीक्षण चलाएं। सावधान रहो, हालांकि आप प्रतिबद्ध नहीं हैं। ```.only``` (हम हमेशा चाहते हैं कि हमारा CI सभी यूनिट टेस्ट चलाए।) +एकल परीक्षण या परीक्षणों के समूह को चलाने के लिए,`.only` सुइट में या तो `.js` फ़ाइल में परीक्षण करें और उपरोक्त आदेश का उपयोग करके परीक्षण चलाएं। सावधान रहो, हालांकि आप प्रतिबद्ध नहीं हैं। `.only` (हम हमेशा चाहते हैं कि हमारा CI सभी यूनिट टेस्ट चलाए।) ### एक उदाहरण -केवल "p5.ColorConversion" परीक्षणों का सूट चलाने के लिए, आप पढ़ने के लिए ```test/unit/color/color_conversion.js``` की पहली पंक्ति को बदल देंगे- +केवल "p5.ColorConversion" परीक्षणों का सूट चलाने के लिए, आप पढ़ने के लिए `test/unit/color/color_conversion.js` की पहली पंक्ति को बदल देंगे- + ```js suite.only('color/p5.ColorConversion', function() { ``` -अब जब आप ```npm test``` का उपयोग करते हैं, तो केवल उस ```function()``` बॉडी के भीतर परीक्षण चलाए जाएंगे। +अब जब आप `npm test` का उपयोग करते हैं, तो केवल उस `function()` बॉडी के भीतर परीक्षण चलाए जाएंगे। ### एक परीक्षण सूट लंघन -यह सुविधा .only () का विलोम है। .Skip () को जोड़कर, आप मोचा को इन सुइट्स और टेस्ट केस (मामलों) को अनदेखा करने के लिए कह सकते हैं। कुछ भी छोड़ दिया जाना लंबित के रूप में चिह्नित किया जाएगा, और इस तरह की रिपोर्ट की जाएगी। +यह सुविधा .only () का विलोम है। .Skip () को जोड़कर, आप मोचा को इन सुइट्स और टेस्ट केस (मामलों) को अनदेखा करने के लिए कह सकते हैं। कुछ भी छोड़ दिया जाना लंबित के रूप में चिह्नित किया जाएगा, और इस तरह की रिपोर्ट की जाएगी। ## आधारिक संरचना + ### ढांचा -हम अपने यूनिट परीक्षणों को संरचित करने और चलाने के लिए [Mocha](https://mochajs.org/) का उपयोग करते हैं हम कोड का व्यवहार कैसे करना चाहिए, इसके बारे में अलग-अलग कथन लिखने के लिए हम [chai assert (और except)](https://www.chaijs.com api/assert/) का उपयोग करते हैं। +हम अपने यूनिट परीक्षणों को संरचित करने और चलाने के लिए [Mocha](https://mochajs.org/) का उपयोग करते हैं हम कोड का व्यवहार कैसे करना चाहिए, इसके बारे में अलग-अलग कथन लिखने के लिए हम \[chai assert (और except)]\([https://www.chaijs.com](https://www.chaijs.com) api/assert/) का उपयोग करते हैं। ### वातावरण -हमारे पास ```test/unit``` फ़ोल्डर के तहत परीक्षण का एक संग्रह है जो ब्राउज़र में चलता है और ```test/node``` के तहत परीक्षणों का एक संग्रह है जो नोड्स .js. में चलता है। +हमारे पास `test/unit` फ़ोल्डर के तहत परीक्षण का एक संग्रह है जो ब्राउज़र में चलता है और `test/node` के तहत परीक्षणों का एक संग्रह है जो नोड्स .js. में चलता है। ब्राउज़र परीक्षण [हेडलेस क्रोम](https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai) में चलते हैं। यही कारण है कि जब आप परीक्षण चलाते हैं तो आपको ब्राउज़र विंडो पॉप-अप नहीं दिखाई देती है। ### सेटअप और सहायक -ये वर्तमान में केवल ब्राउज़र परीक्षणों के लिए उपलब्ध हैं (जहाँ हमारे अधिकांश परीक्षण चलते हैं)- -+ test/js/mocha_setup.js मोचा के लिए कुछ विकल्प कॉन्फ़िगर करता है। -+ test/js/chai_helpers.js chai.assert में चाई स्थापित करता है और कुछ उपयोगी कार्यों को जोड़ता है। -+ test/js/p5_helpers.js p5 स्केच के परीक्षण के लिए कुछ सहायकों को जोड़ता है। +ये वर्तमान में केवल ब्राउज़र परीक्षणों के लिए उपलब्ध हैं (जहाँ हमारे अधिकांश परीक्षण चलते हैं)- -Node.js परीक्षणों के लिए सेटअप सभी ```test/mocha.opts``` में किया जाता है। +* test/js/mocha\_setup.js मोचा के लिए कुछ विकल्प कॉन्फ़िगर करता है। +* test/js/chai\_helpers.js chai.assert में चाई स्थापित करता है और कुछ उपयोगी कार्यों को जोड़ता है। +* test/js/p5\_helpers.js p5 स्केच के परीक्षण के लिए कुछ सहायकों को जोड़ता है। +Node.js परीक्षणों के लिए सेटअप सभी `test/mocha.opts` में किया जाता है। ### निरंतर एकीकरण परीक्षण + जब आप p5.js रेपो में एक पुल अनुरोध भेजते हैं, तो यह स्वचालित रूप से [परीक्षण चलाएगा](https://github.com/processing/p5.js/actions)। इससे हमें यह जांचने में मदद मिलती है कि परीक्षण प्रत्येक पुल अनुरोध के लिए गुजरता है, व्यक्तिगत योगदानकर्ताओं से कोई अतिरिक्त काम नहीं है। यह स्वतः ही [कोडेकोव](https://codecov.io/github/processing/p5.js) रिपोर्ट को कवरेज रिपोर्ट भी अपलोड कर देता है। ### इकाई परीक्षण जोड़ना -यदि आप अधिक इकाई परीक्षण जोड़ना चाहते हैं, तो देखें और देखें कि क्या उस घटक के लिए पहले से ही एक परीक्षण फ़ाइल है जिसके लिए आप परीक्षण जोड़ना चाहते हैं। आम तौर पर, src में दिए गए फ़ाइल के लिए ```test/unit``` के तहत एक ही रास्ते पर होते हैं। (उदाहरण के लिए ```src/color/p5.Color.js``` के लिए परीक्षण ```test/unit/color/p5.Color.js``` + +यदि आप अधिक इकाई परीक्षण जोड़ना चाहते हैं, तो देखें और देखें कि क्या उस घटक के लिए पहले से ही एक परीक्षण फ़ाइल है जिसके लिए आप परीक्षण जोड़ना चाहते हैं। आम तौर पर, src में दिए गए फ़ाइल के लिए `test/unit` के तहत एक ही रास्ते पर होते हैं। (उदाहरण के लिए `src/color/p5.Color.js` के लिए परीक्षण `test/unit/color/p5.Color.js` में हैं।) यदि आपको एक नहीं मिल रहा है, तो शायद इसलिए कि उस फ़ाइल के लिए कोई परीक्षण नहीं हुआ है (अभी तक पलक), इसलिए ऊपर दिए गए सम्मेलनों के अनुसार एक नई फ़ाइल बनाएं। यदि आप जिस मॉड्यूल का परीक्षण कर रहे हैं, उसे काम करने के लिए ब्राउज़र की आवश्यकता होती है, तो आप इसे test/unit में रखना चाहते हैं, लेकिन यदि ऐसा नहीं है, तो आप इसे test/node के तहत जोड़ना चाह सकते हैं। जब संदेह हो, तो test/unit में एक ब्राउज़र टेस्ट जोड़ने के लिए डिफ़ॉल्ट! (यदि हमें ज़रूरत है तो बाद में स्थानांतरित करना बहुत आसान है।) @@ -73,16 +75,16 @@ Node.js परीक्षणों के लिए सेटअप सभी ` ### इकाई परीक्षण लिखना -एक इकाई चुनें, यह परीक्षण करने के लिए एक विधि या एक चर हो सकता है। एक उदाहरण के रूप में ```p5.prototype.isKeyPressed``` का उपयोग करें। परीक्षण लिखने की शुरुआत करने से पहले, हमें इस पद्धति के अपेक्षित व्यवहार को समझने की आवश्यकता है। **अपेक्षित व्यवहार**: बूलियन सिस्टम वैरिएबल सही होना चाहिए यदि कोई कुंजी दबाया जाता है और गलत है यदि कोई कुंजी दबाया नहीं जाता है। अब आप इस अपेक्षित व्यवहार के खिलाफ विभिन्न परीक्षणों के बारे में सोच सकते हैं। संभावित परीक्षण मामले हो सकते हैं- +एक इकाई चुनें, यह परीक्षण करने के लिए एक विधि या एक चर हो सकता है। एक उदाहरण के रूप में `p5.prototype.isKeyPressed` का उपयोग करें। परीक्षण लिखने की शुरुआत करने से पहले, हमें इस पद्धति के अपेक्षित व्यवहार को समझने की आवश्यकता है। **अपेक्षित व्यवहार**: बूलियन सिस्टम वैरिएबल सही होना चाहिए यदि कोई कुंजी दबाया जाता है और गलत है यदि कोई कुंजी दबाया नहीं जाता है। अब आप इस अपेक्षित व्यवहार के खिलाफ विभिन्न परीक्षणों के बारे में सोच सकते हैं। संभावित परीक्षण मामले हो सकते हैं- -+ वेरिएबल एक बूलियन है। -+ यह सच होना चाहिए अगर एक कुंजी को दबाया जाता है। -+ यह सच होना चाहिए अगर एक कुंजी को दबाया जाता है - वर्णमाला कुंजी, संख्या कुंजी, विशेष कुंजी आदि। -+ यदि कई कुंजियों को दबाया जाए तो यह सही होना चाहिए। -+ यह गलत होना चाहिए अगर कोई कुंजी दबाया नहीं जाता है। -+ यदि आप अधिक के बारे में सोच सकते हैं, तो आगे बढ़ें और उनके लिए परीक्षण जोड़ें। +* वेरिएबल एक बूलियन है। +* यह सच होना चाहिए अगर एक कुंजी को दबाया जाता है। +* यह सच होना चाहिए अगर एक कुंजी को दबाया जाता है - वर्णमाला कुंजी, संख्या कुंजी, विशेष कुंजी आदि। +* यदि कई कुंजियों को दबाया जाए तो यह सही होना चाहिए। +* यह गलत होना चाहिए अगर कोई कुंजी दबाया नहीं जाता है। +* यदि आप अधिक के बारे में सोच सकते हैं, तो आगे बढ़ें और उनके लिए परीक्षण जोड़ें। -हम ```p5.prototype.isKeyPressed``` के लिए एक परीक्षण सूट बना सकते हैं और इसके लिए परीक्षण बनाना शुरू कर सकते हैं। हम अपने यूनिट परीक्षणों की संरचना के लिए Mocha का उपयोग करेंगे। +हम `p5.prototype.isKeyPressed` के लिए एक परीक्षण सूट बना सकते हैं और इसके लिए परीक्षण बनाना शुरू कर सकते हैं। हम अपने यूनिट परीक्षणों की संरचना के लिए Mocha का उपयोग करेंगे। ```js suite('p5.prototype.keyIsPressed', function() { @@ -108,6 +110,4 @@ test('keyIsPressed is a boolean', function() { }); ``` -इसी प्रकार हम ```assert.strictEqual(myp5.keyIsPressed, true)``` का उपयोग कर सकते हैं यदि मान सत्य है। आप यहां चाय के दावे के बारे में अधिक पढ़ सकते हैं। अब जब आप परीक्षण लिख चुके हैं, तो उन्हें चलाएं और देखें कि क्या विधि अपेक्षित रूप से व्यवहार करती है। यदि नहीं, तो उसी के लिए एक मुद्दा बनाएं और यदि आप चाहें, तो आप इसे ठीक करने पर भी काम कर सकते हैं। - - \ No newline at end of file +इसी प्रकार हम `assert.strictEqual(myp5.keyIsPressed, true)` का उपयोग कर सकते हैं यदि मान सत्य है। आप यहां चाय के दावे के बारे में अधिक पढ़ सकते हैं। अब जब आप परीक्षण लिख चुके हैं, तो उन्हें चलाएं और देखें कि क्या विधि अपेक्षित रूप से व्यवहार करती है। यदि नहीं, तो उसी के लिए एक मुद्दा बनाएं और यदि आप चाहें, तो आप इसे ठीक करने पर भी काम कर सकते हैं। diff --git a/src/content/contributor-docs/ko/README.mdx b/src/content/contributor-docs/ko/README.mdx index da751e0f9d..ab4e32ce85 100644 --- a/src/content/contributor-docs/ko/README.mdx +++ b/src/content/contributor-docs/ko/README.mdx @@ -1,201 +1,176 @@ +# 🌸 환영합니다! 🌺 ---- - ---- - - -# 🌸 환영합니다! 🌺 - -p5.js에 기여하는데에 관심을 가져주셔서 감사합니다! 우리 커뮤니티는 모든 형태의 기여를 소중하게 생각하며 “컨트리뷰터”의 의미를 최대한 넓은 범위로 확장하고자 합니다. 이는 문서화, 강의, 코드 작성, 창작 활동, 글쓰기, 디자인, 운동, 조직화, 큐레이팅 및 그 외에도 여러분이 상상할 수 있는 모든 걸 포괄합니다. [우리의 커뮤니티 페이지](https://p5js.org/community/#contribute)에는 커뮤니티에 참여하고 기여할 수 있는 여러가지 방법들에 대한 개요가 제시되어 있습니다. 기술적인 기여를 하고자 하신다면, 시작하기에 앞서 이 글을 조금 더 읽어주시기 바랍니다. - -이 프로젝트는 [올-컨트리뷰터스(all-contributors)](https://github.com/kentcdodds/all-contributors) 사양을 따릅니다. [안내 사항](https://github.com/processing/p5.js/issues/2309)을 따라 [리드미(readme)](https://github.com/processing/p5.js/blob/main/README.md#contributors)에 본인을 추가하세요! 혹은 [깃허브 이슈](https://github.com/processing/p5.js/issues)에 여러분의 컨트리뷰션을 댓글로 달아주시면 저희가 추가해드리겠습니다. - - - -# 코드 보관 위치 - -p5.js 프로젝트의 핵심적인 저장소들은 아래와 같습니다: - -- [p5.js](https://github.com/processing/p5.js): 본 저장소에는 p5.js 라이브러리의 소스 코드가 보관되어 있습니다. [유저들이 보게 되는 p5.js의 레퍼런스 매뉴얼](https://p5js.org/reference/) 또한 이 소스 코드에 포함되어 있는 [JSDoc](http://usejsdoc.org/) 각주에서 생성됩니다. 본 저장소는 [로렌 리 맥카시(Lauren Lee McCarthy)](https://github.com/lmccart)가 관리합니다. -- [p5.js-website](https://github.com/processing/p5.js-website): 본 저장소에는 레퍼런스 매뉴얼을 제외한 [p5.js 웹사이트](http://p5js.org)의 코드가 전부 보관되어 있습니다. 본 저장소는 [로렌 리 맥카시(Lauren Lee McCarthy)](https://github.com/lmccart)가 관리합니다. -- [p5.js-sound](https://github.com/processing/p5.js-sound): 본 저장소에는 p5.sound.js 라이브러리가 보관되어 있습니다. 본 저장소는 [제이슨 시갈(Jason Sigal)](https://github.com/therewasaguy)이 관리합니다. -- [p5.js-web-editor](https://github.com/processing/p5.js-web-editor): 본 저장소에는 [p5.js 웹 에디터](https://editor.p5js.org)의 소스 코드가 보관되어 있습니다. 본 저장소는 [캐시 타라케지언(Cassie Tarakajian)](https://github.com/catarak)이 관리합니다. 예전의 [p5.js 에디터](https://github.com/processing/p5.js-editor)는 이제 더 이상 사용되지 않다는 점을 참고하십시오. -- [p5.accessibility](https://github.com/processing/p5.accessibility): 맹인 및 시각 장애인들이 조금 더 쉽게 p5 캔버스를 사용할 수 있도록 하는 라이브러리입니다. - - - -# 저장소 파일 구조 - -본 프로젝트엔 많은 파일들이 있습니다! 여기에 그 간략한 개요가 있습니다. 헷갈릴 수도 있지만, 기여하기 위해서 저장소의 모든 파일을 이해할 필요까지는 없습니다. 우리는 한 영역(인라인 도큐멘테이션을 고치는 것이 한 예가 될 수 있겠습니다)에서 시작해서 차근차근 다른 영역으로 나아가는 걸 권장합니다. 루이사 페레이라(Luisa Pereira)의 강의 [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation)에 p5.js 작업 흐름에 사용되는 도구와 파일들에 대한 소개를 동영상으로 확인하실 수 있습니다. - -- `contributor_docs/`에는 컨트리뷰터들을 위한 관례와 원칙을 설명하는 문서가 들어 있습니다. -- `docs/`에는 사실 문서들이 없습니다! 대신, [온라인 레퍼런스 매뉴얼](https://p5js.org/reference)을 생성하기 위한 코드가 담겨 있습니다. -- `lib/`에는 비어 있는 예시 파일과 [p5.js-sound 저장소](https://github.com/processing/p5.js-sound)에서 풀 리퀘스트를 통해 정기적으로 업데이트 되는 p5.sound 애드온이 담겨 있습니다. 또한 이곳은 빌드 된 p5.js 라이브러리가 [Grunt](https://gruntjs.com/)를 이용해 하나의 파일로 컴파일 된 후에 위치하게 되는 곳이기도 합니다. 풀 리퀘스트를 할 때 깃허브 저장소로 따로 파일을 이동시킬 필요가 없는 것입니다. -- `src/` 에는 라이브러리를 위한 모든 소스 코드가 담겨 있는데, 이들은 분리된 모듈의 형태로 주제별로 정리되어 있습니다. 만약 p5.js를 수정하고자 한다면 여기 있는 소스 코드에 작업을 하면 됩니다. 대부분의 폴더 안에는 각각의 리드미 파일(readme.md)이 있으니 이를 참고해 작업 해주시기 바랍니다. -- `tasks/`에는 새로운 버전의 p5.js를 빌드, 배포, 릴리스 하는데에 관련된 자동화 된 작업들을 수행하는 스크립트들이 담겨 있습니다. -- `tests/`는 내용 수정이 있어도 라이브러리가 제대로 작동하도록 보장해주는 유닛 테스트들을 담고 있습니다. -- `utils/`는 저장소에 유용할 수도 있는 추가적인 파일들을 담고 있는데, 일반적으로 본 디렉토리는 무시해도 괜찮습니다. - - - -# 문서화 - -문서화는 본 프로젝트의 가장 중요한 부분입니다. 낮은 품질의 문서화는 새로운 이용자와 컨트리뷰터들의 진입 장벽을 높여 프로젝트 참여도를 저하시킵니다. [contributing_documentation.md](./contributing_documentation/) 페이지는 문서화를 시작하는 데에 깊이 있는 개요를 제시합니다. p5.js를 위한 문서화는 아래와 같은 곳들에서 주로 찾아볼 수 있습니다: - -- [p5js.org/reference](https://p5js.org/reference/)는 소스 코드의 [인라인 도큐멘테이션](./inline_documentation/)으로부터 생성됩니다. 이는 텍스트 설명, 파라미터, 코드 스니펫 예시 등을 포함합니다. 우리는 코드와 인라인 도큐멘테이션을 긴밀히 연결시키고, 문서화에 기여하는 게 코드에 기여하는 것 만큼이나 중요하다는 생각을 강화하기 위해 인라인 도큐멘테이션을 활용하는 것입니다. 라이브러리가 빌드 되면 라이브러리와 코드가 작동하는 방식 사이에 문제가 없음을 확실히 하기 위해 인라인 도큐멘테이션과 예시를 확인합니다. 이에 기여하기 위해선 [inline_documentation.md](./inline_documentation/) 페이지를 살펴보는 걸로 시작하시기 바랍니다. -- [p5js.org/examples](http://p5js.org/examples)페이지는 p5.js를 학습하는 데에 유용할 수 있는 길이가 긴 예시들을 담고 있습니다. 컨트리뷰션을 위해서는 [adding_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) 페이지를 살펴보시기 바랍니다. -- [p5js.org/tutorials](https://p5js.org/tutorials)페이지는 p5.js와 프로그래밍의 개념을 배울 수 있도록 도와주는 튜토리얼들을 담고 있습니다. 기여하기 위해서는 [p5.js 웹사이트의 튜토리얼에 대한 튜토리얼](https://p5js.org/learn/tutorial-guide.html)을 살펴보시기 바랍니다! -- p5.js 웹사이트는 현재 몇 가지 다른 언어들을 지원하고 있음을 확인하실 수 있습니다. 이는 국제화(혹은 줄여서 i18n)라고 불립니다. 이에 대한 문서는 [i18n_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution/) 페이지에서 더 자세히 보실 수 있습니다. - - - -# 깃허브 이슈 흐름 - -* 알려진 버그와 추가되었으면 하는 새로운 기능들은 [깃허브 이슈](https://github.com/processing/p5.js/issues)들을 통해 추적됩니다. 이슈 [레이블](./issue_labels/)들은 이슈들을 카테고리별로 분류하는 데에 사용되는데, 예를 들면 [초보자에게 적합한 이슈들](https://github.com/processing/p5.js/labels/level%3Abeginner)을 레이블링 하는 식입니다. - -* 이미 제기된 이슈 중에 작업을 시작하고 싶은 게 있다면, 다른 컨트리뷰터들이 진행 사항을 파악하고 도움을 줄 수 있도록 해당 이슈에 댓글을 달아주시기 바랍니다. - -* 이슈를 해결했다면, p5.js 마스터 브랜치에 [풀 리퀘스트(PR)를 제출](./preparing_a_pull_request/)하십시오. PR의 설명 칸에 “resolves #XXXX”(#XXXX를 해결함)라고 써서 해결한 이슈를 태그해주시기 바랍니다. 만약 이 PR이 해당 이슈를 다루기는 하지만 완전히 해결하지는 못하는 거라면(즉, 여러분의 PR이 merge 되고 나서도 이슈가 열려 있어야 한다면), “addresses #XXXX”(#XXXX를 다룸)이라고 써주시기 바랍니다. - -* 만약 버그를 발견했거나 새롭게 더하고 싶은 기능에 대한 아이디어가 있다면, 이슈를 먼저 제출해주시기 바랍니다. 이슈를 제출하지 않고 수정 사항이나 새로운 기능을 풀 리퀘스트를 제출해버리는 경우, 이를 수락하기 어려울 가능성이 높습니다. 이슈에 대한 피드백을 받고 해당 이슈를 다뤄도 괜찮다는 걸 확인했다면, 위의 절차를 따라서 버그를 고치거나 새로운 기능을 추가하는 컨트리뷰션을 시작할 수 있습니다. - -* 버그 리포트를 재현하거나 버전 번호 혹은 재현 안내서와 같은 주요 정보들을 요청하는 등 이슈들을 선별하는 작업할 수도 있습니다. 이를 시작하기에 가장 용이한 방법 중 하나는 [코드 트리아지(CodeTriage)에서 p5.js를 구독](https://www.codetriage.com/processing/p5.js)하는 겁니다. [![Open Source Helpers](https://www.codetriage.com/processing/p5.js/badges/users.svg)](https://www.codetriage.com/processing/p5.js) - -* [organization.md](https://github.com/processing/p5.js/blob/main/contributor_docs/organization/) 파일은 이슈들이 어떻게 체계화 될 수 있는지, 그리고 그에 대한 의사결정 과정은 어떻게 이루어지는지에 대한 대략적인 개요를 담고 있습니다. 이에 관심이 있다면 얼마든지 기여해주시기 바랍니다. - - - -# 개발 과정 - -개발 프로세스라는 게 처음에는 약간 까다로울 수 있습니다. 그렇게 느끼는 건 여러분 뿐만이 아니라, 처음엔 모두가 혼란을 겪곤 합니다. 밑을 보시면 셋업 과정을 차례 차례 확인하실 수 있습니다. 만약 질문이 있다면 [포럼](https://discourse.processing.org/c/p5js)에 물어보거나 막힌 부분을 설명하는 [이슈](https://github.com/processing/p5.js/issues)를 제출하면 저희가 할 수 있는 최대한의 도움을 드리도록 하겠습니다. - -아래 절차는 [코딩 트레인(The Coding Train)의 비디오 강의](https://youtu.be/Rr3vLyP1Ods)에서도 다루고 있습니다.🚋🌈 - - - -1. [node.js](http://nodejs.org/)를 설치하세요. node.js를 설치하면 자동적으로 [npm](https://www.npmjs.org) 패키지 매니저도 설치됩니다. - -2. 본인의 깃허브 계정에 [p5.js 저장소](https://github.com/processing/p5.js)를 [포크](https://help.github.com/articles/fork-a-repo) 하십시오. - -3. 포크 된 깃허브 저장소를 로컬 컴퓨터에 [클론](https://help.github.com/articles/cloning-a-repository/) 하십시오. - - ```shell - $ git clone https://github.com/YOUR_USERNAME/p5.js.git - ``` - -4. 프로젝트 폴더로 들어가 npm에 필요한 모든 디펜던시를 설치하십시오. - - ```shell +p5.js에 기여하는데에 관심을 가져주셔서 감사합니다! 우리 커뮤니티는 모든 형태의 기여를 소중하게 생각하며 “컨트리뷰터”의 의미를 최대한 넓은 범위로 확장하고자 합니다. 이는 문서화, 강의, 코드 작성, 창작 활동, 글쓰기, 디자인, 운동, 조직화, 큐레이팅 및 그 외에도 여러분이 상상할 수 있는 모든 걸 포괄합니다. [우리의 커뮤니티 페이지](https://p5js.org/community/#contribute)에는 커뮤니티에 참여하고 기여할 수 있는 여러가지 방법들에 대한 개요가 제시되어 있습니다. 기술적인 기여를 하고자 하신다면, 시작하기에 앞서 이 글을 조금 더 읽어주시기 바랍니다. + +이 프로젝트는 [올-컨트리뷰터스(all-contributors)](https://github.com/kentcdodds/all-contributors) 사양을 따릅니다. [안내 사항](https://github.com/processing/p5.js/issues/2309)을 따라 [리드미(readme)](https://github.com/processing/p5.js/blob/main/README.md#contributors)에 본인을 추가하세요! 혹은 [깃허브 이슈](https://github.com/processing/p5.js/issues)에 여러분의 컨트리뷰션을 댓글로 달아주시면 저희가 추가해드리겠습니다. + +# 코드 보관 위치 + +p5.js 프로젝트의 핵심적인 저장소들은 아래와 같습니다: + +* [p5.js](https://github.com/processing/p5.js): 본 저장소에는 p5.js 라이브러리의 소스 코드가 보관되어 있습니다. [유저들이 보게 되는 p5.js의 레퍼런스 매뉴얼](https://p5js.org/reference/) 또한 이 소스 코드에 포함되어 있는 [JSDoc](http://usejsdoc.org/) 각주에서 생성됩니다. 본 저장소는 [로렌 리 맥카시(Lauren Lee McCarthy)](https://github.com/lmccart)가 관리합니다. +* [p5.js-website](https://github.com/processing/p5.js-website): 본 저장소에는 레퍼런스 매뉴얼을 제외한 [p5.js 웹사이트](http://p5js.org)의 코드가 전부 보관되어 있습니다. 본 저장소는 [로렌 리 맥카시(Lauren Lee McCarthy)](https://github.com/lmccart)가 관리합니다. +* [p5.js-sound](https://github.com/processing/p5.js-sound): 본 저장소에는 p5.sound.js 라이브러리가 보관되어 있습니다. 본 저장소는 [제이슨 시갈(Jason Sigal)](https://github.com/therewasaguy)이 관리합니다. +* [p5.js-web-editor](https://github.com/processing/p5.js-web-editor): 본 저장소에는 [p5.js 웹 에디터](https://editor.p5js.org)의 소스 코드가 보관되어 있습니다. 본 저장소는 [캐시 타라케지언(Cassie Tarakajian)](https://github.com/catarak)이 관리합니다. 예전의 [p5.js 에디터](https://github.com/processing/p5.js-editor)는 이제 더 이상 사용되지 않다는 점을 참고하십시오. +* [p5.accessibility](https://github.com/processing/p5.accessibility): 맹인 및 시각 장애인들이 조금 더 쉽게 p5 캔버스를 사용할 수 있도록 하는 라이브러리입니다. + +# 저장소 파일 구조 + +본 프로젝트엔 많은 파일들이 있습니다! 여기에 그 간략한 개요가 있습니다. 헷갈릴 수도 있지만, 기여하기 위해서 저장소의 모든 파일을 이해할 필요까지는 없습니다. 우리는 한 영역(인라인 도큐멘테이션을 고치는 것이 한 예가 될 수 있겠습니다)에서 시작해서 차근차근 다른 영역으로 나아가는 걸 권장합니다. 루이사 페레이라(Luisa Pereira)의 강의 [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation)에 p5.js 작업 흐름에 사용되는 도구와 파일들에 대한 소개를 동영상으로 확인하실 수 있습니다. + +* `contributor_docs/`에는 컨트리뷰터들을 위한 관례와 원칙을 설명하는 문서가 들어 있습니다. +* `docs/`에는 사실 문서들이 없습니다! 대신, [온라인 레퍼런스 매뉴얼](https://p5js.org/reference)을 생성하기 위한 코드가 담겨 있습니다. +* `lib/`에는 비어 있는 예시 파일과 [p5.js-sound 저장소](https://github.com/processing/p5.js-sound)에서 풀 리퀘스트를 통해 정기적으로 업데이트 되는 p5.sound 애드온이 담겨 있습니다. 또한 이곳은 빌드 된 p5.js 라이브러리가 [Grunt](https://gruntjs.com/)를 이용해 하나의 파일로 컴파일 된 후에 위치하게 되는 곳이기도 합니다. 풀 리퀘스트를 할 때 깃허브 저장소로 따로 파일을 이동시킬 필요가 없는 것입니다. +* `src/` 에는 라이브러리를 위한 모든 소스 코드가 담겨 있는데, 이들은 분리된 모듈의 형태로 주제별로 정리되어 있습니다. 만약 p5.js를 수정하고자 한다면 여기 있는 소스 코드에 작업을 하면 됩니다. 대부분의 폴더 안에는 각각의 리드미 파일(readme.md)이 있으니 이를 참고해 작업 해주시기 바랍니다. +* `tasks/`에는 새로운 버전의 p5.js를 빌드, 배포, 릴리스 하는데에 관련된 자동화 된 작업들을 수행하는 스크립트들이 담겨 있습니다. +* `tests/`는 내용 수정이 있어도 라이브러리가 제대로 작동하도록 보장해주는 유닛 테스트들을 담고 있습니다. +* `utils/`는 저장소에 유용할 수도 있는 추가적인 파일들을 담고 있는데, 일반적으로 본 디렉토리는 무시해도 괜찮습니다. + +# 문서화 + +문서화는 본 프로젝트의 가장 중요한 부분입니다. 낮은 품질의 문서화는 새로운 이용자와 컨트리뷰터들의 진입 장벽을 높여 프로젝트 참여도를 저하시킵니다. [contributing\_documentation.md](./contributing_documentation/) 페이지는 문서화를 시작하는 데에 깊이 있는 개요를 제시합니다. p5.js를 위한 문서화는 아래와 같은 곳들에서 주로 찾아볼 수 있습니다: + +* [p5js.org/reference](https://p5js.org/reference/)는 소스 코드의 [인라인 도큐멘테이션](./inline_documentation/)으로부터 생성됩니다. 이는 텍스트 설명, 파라미터, 코드 스니펫 예시 등을 포함합니다. 우리는 코드와 인라인 도큐멘테이션을 긴밀히 연결시키고, 문서화에 기여하는 게 코드에 기여하는 것 만큼이나 중요하다는 생각을 강화하기 위해 인라인 도큐멘테이션을 활용하는 것입니다. 라이브러리가 빌드 되면 라이브러리와 코드가 작동하는 방식 사이에 문제가 없음을 확실히 하기 위해 인라인 도큐멘테이션과 예시를 확인합니다. 이에 기여하기 위해선 [inline\_documentation.md](./inline_documentation/) 페이지를 살펴보는 걸로 시작하시기 바랍니다. +* [p5js.org/examples](http://p5js.org/examples)페이지는 p5.js를 학습하는 데에 유용할 수 있는 길이가 긴 예시들을 담고 있습니다. 컨트리뷰션을 위해서는 [adding\_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) 페이지를 살펴보시기 바랍니다. +* [p5js.org/tutorials](https://p5js.org/tutorials)페이지는 p5.js와 프로그래밍의 개념을 배울 수 있도록 도와주는 튜토리얼들을 담고 있습니다. 기여하기 위해서는 [p5.js 웹사이트의 튜토리얼에 대한 튜토리얼](https://p5js.org/learn/tutorial-guide.html)을 살펴보시기 바랍니다! +* p5.js 웹사이트는 현재 몇 가지 다른 언어들을 지원하고 있음을 확인하실 수 있습니다. 이는 국제화(혹은 줄여서 i18n)라고 불립니다. 이에 대한 문서는 [i18n\_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution/) 페이지에서 더 자세히 보실 수 있습니다. + +# 깃허브 이슈 흐름 + +* 알려진 버그와 추가되었으면 하는 새로운 기능들은 [깃허브 이슈](https://github.com/processing/p5.js/issues)들을 통해 추적됩니다. 이슈 [레이블](./issue_labels/)들은 이슈들을 카테고리별로 분류하는 데에 사용되는데, 예를 들면 [초보자에게 적합한 이슈들](https://github.com/processing/p5.js/labels/level%3Abeginner)을 레이블링 하는 식입니다. + +* 이미 제기된 이슈 중에 작업을 시작하고 싶은 게 있다면, 다른 컨트리뷰터들이 진행 사항을 파악하고 도움을 줄 수 있도록 해당 이슈에 댓글을 달아주시기 바랍니다. + +* 이슈를 해결했다면, p5.js 마스터 브랜치에 [풀 리퀘스트(PR)를 제출](./preparing_a_pull_request/)하십시오. PR의 설명 칸에 “resolves #XXXX”(#XXXX를 해결함)라고 써서 해결한 이슈를 태그해주시기 바랍니다. 만약 이 PR이 해당 이슈를 다루기는 하지만 완전히 해결하지는 못하는 거라면(즉, 여러분의 PR이 merge 되고 나서도 이슈가 열려 있어야 한다면), “addresses #XXXX”(#XXXX를 다룸)이라고 써주시기 바랍니다. + +* 만약 버그를 발견했거나 새롭게 더하고 싶은 기능에 대한 아이디어가 있다면, 이슈를 먼저 제출해주시기 바랍니다. 이슈를 제출하지 않고 수정 사항이나 새로운 기능을 풀 리퀘스트를 제출해버리는 경우, 이를 수락하기 어려울 가능성이 높습니다. 이슈에 대한 피드백을 받고 해당 이슈를 다뤄도 괜찮다는 걸 확인했다면, 위의 절차를 따라서 버그를 고치거나 새로운 기능을 추가하는 컨트리뷰션을 시작할 수 있습니다. + +* 버그 리포트를 재현하거나 버전 번호 혹은 재현 안내서와 같은 주요 정보들을 요청하는 등 이슈들을 선별하는 작업할 수도 있습니다. 이를 시작하기에 가장 용이한 방법 중 하나는 [코드 트리아지(CodeTriage)에서 p5.js를 구독](https://www.codetriage.com/processing/p5.js)하는 겁니다. [![Open Source Helpers](https://www.codetriage.com/processing/p5.js/badges/users.svg)](https://www.codetriage.com/processing/p5.js) + +* [organization.md](https://github.com/processing/p5.js/blob/main/contributor_docs/organization/) 파일은 이슈들이 어떻게 체계화 될 수 있는지, 그리고 그에 대한 의사결정 과정은 어떻게 이루어지는지에 대한 대략적인 개요를 담고 있습니다. 이에 관심이 있다면 얼마든지 기여해주시기 바랍니다. + +# 개발 과정 + +개발 프로세스라는 게 처음에는 약간 까다로울 수 있습니다. 그렇게 느끼는 건 여러분 뿐만이 아니라, 처음엔 모두가 혼란을 겪곤 합니다. 밑을 보시면 셋업 과정을 차례 차례 확인하실 수 있습니다. 만약 질문이 있다면 [포럼](https://discourse.processing.org/c/p5js)에 물어보거나 막힌 부분을 설명하는 [이슈](https://github.com/processing/p5.js/issues)를 제출하면 저희가 할 수 있는 최대한의 도움을 드리도록 하겠습니다. + +아래 절차는 [코딩 트레인(The Coding Train)의 비디오 강의](https://youtu.be/Rr3vLyP1Ods)에서도 다루고 있습니다.🚋🌈 + +1. [node.js](http://nodejs.org/)를 설치하세요. node.js를 설치하면 자동적으로 [npm](https://www.npmjs.org) 패키지 매니저도 설치됩니다. + +2. 본인의 깃허브 계정에 [p5.js 저장소](https://github.com/processing/p5.js)를 [포크](https://help.github.com/articles/fork-a-repo) 하십시오. + +3. 포크 된 깃허브 저장소를 로컬 컴퓨터에 [클론](https://help.github.com/articles/cloning-a-repository/) 하십시오. + + ```shell + $ git clone https://github.com/YOUR_USERNAME/p5.js.git + ``` + +4. 프로젝트 폴더로 들어가 npm에 필요한 모든 디펜던시를 설치하십시오. + + ```shell $ cd p5.js - $ npm ci - ``` - -5. 이제 [Grunt](https://gruntjs.com/)가 설치되었을텐데, 소스 코드로부터 라이브러리를 빌드하기 위해 이를 이용할 수 있습니다. - - ```shell - $ npm run grunt - ``` - -만약 라이브러리의 파일을 계속해서 변경해야 한다면, 사전에 수동으로 일일이 명령어를 입력하지 않아도 소스 파일 변경 사항을 자동적으로 다시 빌드해줄 수 있도록 `npm run dev`를 실행 하는 게 나을 것입니다. - -6. 로컬에서 코드 베이스를 변경하고, 깃(Git)으로 [커밋](https://help.github.com/articles/github-glossary/#commit) 하십시오. - - ```shell + $ npm ci + ``` + +5. 이제 [Grunt](https://gruntjs.com/)가 설치되었을텐데, 소스 코드로부터 라이브러리를 빌드하기 위해 이를 이용할 수 있습니다. + + ```shell + $ npm run grunt + ``` + +만약 라이브러리의 파일을 계속해서 변경해야 한다면, 사전에 수동으로 일일이 명령어를 입력하지 않아도 소스 파일 변경 사항을 자동적으로 다시 빌드해줄 수 있도록 `npm run dev`를 실행 하는 게 나을 것입니다. + +6. 로컬에서 코드 베이스를 변경하고, 깃(Git)으로 [커밋](https://help.github.com/articles/github-glossary/#commit) 하십시오. + + ```shell $ git add -u - $ git commit -m "YOUR COMMIT MESSAGE" - ``` - -7. 문법 오류가 없음을 확인하고, 고장 및 다른 문제들에 대한 테스트를 하기 위해 `npm run grunt`를 다시 한 번 실행하십시오. - -8. 변경 사항을 여러분의 깃허브 포크에 [푸시](https://help.github.com/articles/github-glossary/#push) 하십시오. - - ```shell - $ git push - ``` - -9. 모든 게 준비되었다면, 변경 사항을 [풀 리퀘스트](https://help.github.com/articles/creating-a-pull-request)로 제출하십시오. - - - -# 커밋이 거절 당하는 경우 - -p5.js 코드 베이스에 포함되어 있는 개발자 툴들은 어떤 것들에 대해 일부러 매우 엄격한 기준을 적용하도록 만들어져 있습니다. 이건 좋은 겁니다! 이는 모든 걸 일관성 있게 만들고, 규율이 지켜지도록 도울 겁니다. 여러분이 뭔가를 변경하고자 만들었던 커밋이 거절 당할 수도 있음을 의미하기는 하지만, 낙담하지는 말아주세요. 심지어 경험 많은 p5.js 개발자들의 커밋도 종종 거절 당하곤 합니다. 보통은 코드 문법 아니면 유닛 테스트가 문제인 경우가 많습니다. - -## 코드 문법 - -p5.js는 깔끔하고 일관성 있는 스타일의 코드 문법을 요구하기에, [Prettier](https://prettier.io/)와 [ESlint](https://eslint.org/)라는 툴의 사용이 필수입니다. 커밋을 하기 전에 특정 스타일 규칙을 점검하게 되는데, 사용하는 코드 에디터에 [ESlint 플러그인](https://eslint.org/docs/user-guide/integrations#editors)을 설치하면 타이핑 함과 동시에 오류를 하이라이트 해줍니다. 코드 스타일에 관해서 일반적으로 유연성과 관련된 오류를 내는데, 이는 참여와 기여의 장벽을 낮추기 위함입니다. - -에러를 포착하기 위해서는 터미널에서 다음 명령어를 실행하세요(`$` 프롬프트는 입력하지 마십시오): - -```shell -$ npm run lint -``` - -어떤 문법 오류는 자동적으로 고쳐질 수도 있습니다: - -```shell -$ npm run lint:fix -``` - -프로젝트의 기존 스타일을 고수하는 게 선호되는게 보통이지만, [가끔은](https://github.com/processing/p5.js/search?utf8=%E2%9C%93&q=prettier-ignore&type=) 다른 문법을 사용하는 게 코드를 이해하기 더 쉽게 만들기도 합니다. 이런 경우에는, Prettier의 `// prettier-ignore` 주석을 이용해 [예외적인 경우를 처리](https://prettier.io/docs/en/ignore.html)할 수 있습니다. 하지만 대부분의 경우 요구되는 스타일 선호 사항들은 그럴만한 이유가 있기 때문에 가능하다면 예외적인 경우를 만들지 말아주시길 바랍니다. - -여기 코드 스타일 규칙에 대한 간략한 요약본이 있습니다. 다만 이 목록이 전부가 아니기 때문에 [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc)와 [.eslintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) 파일의 전체 목록을 참고 하시기 바랍니다. -* ES6 코드 문법을 사용합니다. - -* (큰 따옴표 보다는) 작은 따옴표를 사용합니다. - -* 들여쓰기는 스페이스 두 개로 처리합니다. - -* 코드에 정의되어 있는 모든 변수들은 적어도 한 번은 사용되던가, 아니면 완전히 없애야 합니다. - -* x == true 혹은 x == false로 비교문을 작성하지 마십시오. 이것 대신 (x) 나 (!x)를 사용하십시오. x == true는 분명히 if (x) 와는 다릅니다! 헷갈릴 여지가 있다면 객체를 널(null)과 비교하고, 숫자를 0에, 문자열(string)을 “”과 비교하십시오. - -* 작성하는 함수가 모호하거나 복잡한 경우 주석을 답니다. - -* 더 많은 스타일링 팁을 참고하기 위해선 [모질라 자바스크립트 연습(Mozilla JS practice)](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#JavaScript_practices)을 보십시오. - - - -## 유닛 테스트 - -유닛 테스트란 주논리와 성능 검증을 보완하기 위해 만들어진 작은 규모의 코드들입니다. [unit_testing.md](./unit_testing/) 페이지에 유닛 테스트에 대한 더 많은 정보가 담겨 있습니다. 만약 여러분이 p5.js를 위한 주요 기능을 개발한다면, 아마도 테스트를 포함해야 할 것입니다. 테스트를 통과하지 못한다면, 그건 어딘가에 문제가 있다는 뜻이므로 풀 리퀘스트를 제출하지 마십시오. - -유닛 테스트를 돌리기 위해서는 프로젝트의 디펜던시들을 반드시 설치해야 합니다. - -```shell -$ npm ci -``` - -이것이 p5.js를 위한 *모든* 디펜던시들을 설치할 것입니다; 간단하게는, 유닛 테스팅에 가장 중요한 디펜던시들은 다음을 포함합니다: - -- [Mocha](https://mochajs.org/): p5.js를 위한, 개별적인 테스트 파일들을 실행하는 강력한 테스팅 프레임워크 -- [mocha-chrome](https://github.com/shellscape/mocha-chrome): 구글 크롬을 이용해 Mocha 테스트를 돌리는 모차 플러그인 - -디펜던시들이 설치되면, Grunt를 이용해 유닛 테스트를 돌리십시오. - -```shell -$ grunt -``` - -때론 커맨드 라인 대신 브라우저에서 테스트를 돌리는 것도 유용합니다. 이를 위해선, 먼저 서버 [연결](https://github.com/gruntjs/grunt-contrib-connect)을 시작하십시오: - -```shell -$ npm run dev -``` - -서버가 돌아가면, 브라우저에서 `test/test.html`을 열 수 있을 겁니다. - -유닛 테스팅에 대한 완전한 설명은 p5.js 문서의 범위를 벗어나는 것이지만, 간략하게만 말하자면 src/ 디렉토리에 있는 소스 코드에 가해진 중대한 수정 사항이나, 새로 구현된 기능은 Mocha가 실행할 수 있는 테스트 파일이 test/ 디렉토리에 동반되어야 하는데, 이는 향후 나올 모든 버전의 라이브러리에서도 일관성 있게 작동할 것임을 검증하기 위함입니다. 유닛 테스트를 작성할 때, [Chai.js 레퍼런스](http://www.chaijs.com/api/assert/)를 참고해 어서션(assertion) 메세지를 구성함으로써 미래에 테스트로 잡아낼 수 있는 오류들이 일관성 있고, 결과적으로 다른 개발자들이 이해하기 쉽게 만들어주시기를 바랍니다. - - - -# 기타 - -- [contributor_docs/](https://github.com/processing/p5.js/tree/main/contributor_docs) 폴더에는 살펴볼만한 다른 파일들도 있습니다. 이들은 본 프로젝트의 기술적인 혹은 비기술적인 각 영역과 관계된 것들입니다. -- p5.js 개발 작업 흐름에서 사용되는 도구와 파일들에 대한 영상 설명은 [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation)에서 보실 수 있습니다. -- [코딩 트레인의 이 동영상](https://youtu.be/Rr3vLyP1Ods)🚋🌈에서는 p5.js에 기술적 기여를 시작하는 것에 대한 개요를 제공합니다. -- p5.js [도커(Docker) 이미지](https://github.com/toolness/p5.js-docker)는 [도커](https://www.docker.com/)에 마운트 될 수 있는데, 이는 [Node](https://nodejs.org/) 같은 필수 요소들을 수동으로 설치할 필요 없이, 그리고 도커 설치를 제외하고는 어떤 방식으로든지 호스트 운영 체제에 영향을 주지 않고도 p5.js를 개발하는데에 사용될 수 있습니다. -- p5.js 라이브러리의 빌드 과정은 [json 데이터 파일](https://p5js.org/reference/data.json)을 생성하는데, 이는 p5.js의 공개 API를 담고 있으며, 이는 에디터에서 p5.js 메서드를 자동으로 완성하는 등의 자동화된 툴링에 사용될 수 있습니다. 이 파일은 p5.js 웹사이트에서 호스트 되지만, 저장소의 일부로 포함되어 있지는 않습니다. -- p5.js는 최근에 [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015)로 마이그레이션 됐습니다. 이 변화가 여러분의 기여에 어떤 영향을 미칠지를 보기 위해선 [ES6 채택](./es6-adoption/)을 방문해주십시오. - - \ No newline at end of file + $ git commit -m "YOUR COMMIT MESSAGE" + ``` + +7. 문법 오류가 없음을 확인하고, 고장 및 다른 문제들에 대한 테스트를 하기 위해 `npm run grunt`를 다시 한 번 실행하십시오. + +8. 변경 사항을 여러분의 깃허브 포크에 [푸시](https://help.github.com/articles/github-glossary/#push) 하십시오. + + ```shell + $ git push + ``` + +9. 모든 게 준비되었다면, 변경 사항을 [풀 리퀘스트](https://help.github.com/articles/creating-a-pull-request)로 제출하십시오. + +# 커밋이 거절 당하는 경우 + +p5.js 코드 베이스에 포함되어 있는 개발자 툴들은 어떤 것들에 대해 일부러 매우 엄격한 기준을 적용하도록 만들어져 있습니다. 이건 좋은 겁니다! 이는 모든 걸 일관성 있게 만들고, 규율이 지켜지도록 도울 겁니다. 여러분이 뭔가를 변경하고자 만들었던 커밋이 거절 당할 수도 있음을 의미하기는 하지만, 낙담하지는 말아주세요. 심지어 경험 많은 p5.js 개발자들의 커밋도 종종 거절 당하곤 합니다. 보통은 코드 문법 아니면 유닛 테스트가 문제인 경우가 많습니다. + +## 코드 문법 + +p5.js는 깔끔하고 일관성 있는 스타일의 코드 문법을 요구하기에, [Prettier](https://prettier.io/)와 [ESlint](https://eslint.org/)라는 툴의 사용이 필수입니다. 커밋을 하기 전에 특정 스타일 규칙을 점검하게 되는데, 사용하는 코드 에디터에 [ESlint 플러그인](https://eslint.org/docs/user-guide/integrations#editors)을 설치하면 타이핑 함과 동시에 오류를 하이라이트 해줍니다. 코드 스타일에 관해서 일반적으로 유연성과 관련된 오류를 내는데, 이는 참여와 기여의 장벽을 낮추기 위함입니다. + +에러를 포착하기 위해서는 터미널에서 다음 명령어를 실행하세요(`$` 프롬프트는 입력하지 마십시오): + +```shell +$ npm run lint +``` + +어떤 문법 오류는 자동적으로 고쳐질 수도 있습니다: + +```shell +$ npm run lint:fix +``` + +프로젝트의 기존 스타일을 고수하는 게 선호되는게 보통이지만, [가끔은](https://github.com/processing/p5.js/search?utf8=%E2%9C%93\&q=prettier-ignore\&type=) 다른 문법을 사용하는 게 코드를 이해하기 더 쉽게 만들기도 합니다. 이런 경우에는, Prettier의 `// prettier-ignore` 주석을 이용해 [예외적인 경우를 처리](https://prettier.io/docs/en/ignore.html)할 수 있습니다. 하지만 대부분의 경우 요구되는 스타일 선호 사항들은 그럴만한 이유가 있기 때문에 가능하다면 예외적인 경우를 만들지 말아주시길 바랍니다. + +여기 코드 스타일 규칙에 대한 간략한 요약본이 있습니다. 다만 이 목록이 전부가 아니기 때문에 [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc)와 [.eslintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) 파일의 전체 목록을 참고 하시기 바랍니다. + +* ES6 코드 문법을 사용합니다. + +* (큰 따옴표 보다는) 작은 따옴표를 사용합니다. + +* 들여쓰기는 스페이스 두 개로 처리합니다. + +* 코드에 정의되어 있는 모든 변수들은 적어도 한 번은 사용되던가, 아니면 완전히 없애야 합니다. + +* x == true 혹은 x == false로 비교문을 작성하지 마십시오. 이것 대신 (x) 나 (!x)를 사용하십시오. x == true는 분명히 if (x) 와는 다릅니다! 헷갈릴 여지가 있다면 객체를 널(null)과 비교하고, 숫자를 0에, 문자열(string)을 “”과 비교하십시오. + +* 작성하는 함수가 모호하거나 복잡한 경우 주석을 답니다. + +* 더 많은 스타일링 팁을 참고하기 위해선 [모질라 자바스크립트 연습(Mozilla JS practice)](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#JavaScript_practices)을 보십시오. + +## 유닛 테스트 + +유닛 테스트란 주논리와 성능 검증을 보완하기 위해 만들어진 작은 규모의 코드들입니다. [unit\_testing.md](./unit_testing/) 페이지에 유닛 테스트에 대한 더 많은 정보가 담겨 있습니다. 만약 여러분이 p5.js를 위한 주요 기능을 개발한다면, 아마도 테스트를 포함해야 할 것입니다. 테스트를 통과하지 못한다면, 그건 어딘가에 문제가 있다는 뜻이므로 풀 리퀘스트를 제출하지 마십시오. + +유닛 테스트를 돌리기 위해서는 프로젝트의 디펜던시들을 반드시 설치해야 합니다. + +```shell +$ npm ci +``` + +이것이 p5.js를 위한 *모든* 디펜던시들을 설치할 것입니다; 간단하게는, 유닛 테스팅에 가장 중요한 디펜던시들은 다음을 포함합니다: + +* [Mocha](https://mochajs.org/): p5.js를 위한, 개별적인 테스트 파일들을 실행하는 강력한 테스팅 프레임워크 +* [mocha-chrome](https://github.com/shellscape/mocha-chrome): 구글 크롬을 이용해 Mocha 테스트를 돌리는 모차 플러그인 + +디펜던시들이 설치되면, Grunt를 이용해 유닛 테스트를 돌리십시오. + +```shell +$ grunt +``` + +때론 커맨드 라인 대신 브라우저에서 테스트를 돌리는 것도 유용합니다. 이를 위해선, 먼저 서버 [연결](https://github.com/gruntjs/grunt-contrib-connect)을 시작하십시오: + +```shell +$ npm run dev +``` + +서버가 돌아가면, 브라우저에서 `test/test.html`을 열 수 있을 겁니다. + +유닛 테스팅에 대한 완전한 설명은 p5.js 문서의 범위를 벗어나는 것이지만, 간략하게만 말하자면 src/ 디렉토리에 있는 소스 코드에 가해진 중대한 수정 사항이나, 새로 구현된 기능은 Mocha가 실행할 수 있는 테스트 파일이 test/ 디렉토리에 동반되어야 하는데, 이는 향후 나올 모든 버전의 라이브러리에서도 일관성 있게 작동할 것임을 검증하기 위함입니다. 유닛 테스트를 작성할 때, [Chai.js 레퍼런스](http://www.chaijs.com/api/assert/)를 참고해 어서션(assertion) 메세지를 구성함으로써 미래에 테스트로 잡아낼 수 있는 오류들이 일관성 있고, 결과적으로 다른 개발자들이 이해하기 쉽게 만들어주시기를 바랍니다. + +# 기타 + +* [contributor\_docs/](https://github.com/processing/p5.js/tree/main/contributor_docs) 폴더에는 살펴볼만한 다른 파일들도 있습니다. 이들은 본 프로젝트의 기술적인 혹은 비기술적인 각 영역과 관계된 것들입니다. +* p5.js 개발 작업 흐름에서 사용되는 도구와 파일들에 대한 영상 설명은 [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation)에서 보실 수 있습니다. +* [코딩 트레인의 이 동영상](https://youtu.be/Rr3vLyP1Ods)🚋🌈에서는 p5.js에 기술적 기여를 시작하는 것에 대한 개요를 제공합니다. +* p5.js [도커(Docker) 이미지](https://github.com/toolness/p5.js-docker)는 [도커](https://www.docker.com/)에 마운트 될 수 있는데, 이는 [Node](https://nodejs.org/) 같은 필수 요소들을 수동으로 설치할 필요 없이, 그리고 도커 설치를 제외하고는 어떤 방식으로든지 호스트 운영 체제에 영향을 주지 않고도 p5.js를 개발하는데에 사용될 수 있습니다. +* p5.js 라이브러리의 빌드 과정은 [json 데이터 파일](https://p5js.org/reference/data.json)을 생성하는데, 이는 p5.js의 공개 API를 담고 있으며, 이는 에디터에서 p5.js 메서드를 자동으로 완성하는 등의 자동화된 툴링에 사용될 수 있습니다. 이 파일은 p5.js 웹사이트에서 호스트 되지만, 저장소의 일부로 포함되어 있지는 않습니다. +* p5.js는 최근에 [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015)로 마이그레이션 됐습니다. 이 변화가 여러분의 기여에 어떤 영향을 미칠지를 보기 위해선 [ES6 채택](./es6-adoption/)을 방문해주십시오. diff --git a/src/content/contributor-docs/ko/benchmarking_p5.mdx b/src/content/contributor-docs/ko/benchmarking_p5.mdx index 65e4be9dab..c35c53c3a0 100644 --- a/src/content/contributor-docs/ko/benchmarking_p5.mdx +++ b/src/content/contributor-docs/ko/benchmarking_p5.mdx @@ -1,8 +1,3 @@ - ---- - ---- # p5.js 벤치마킹 -벤치마킹은 https://github.com/limzykenneth/p5-benchmark의 자체 레파지토리로 이동했습니다. 최신 p5.js 버전의 벤치마크 결과는 https://limzykenneth.github.io/p5-benchmark/에서 확인 할 수 있습니다. 아직 진행중인 작업입니다. - \ No newline at end of file +벤치마킹은 [https://github.com/limzykenneth/p5-benchmark의](https://github.com/limzykenneth/p5-benchmark의) 자체 레파지토리로 이동했습니다. 최신 p5.js 버전의 벤치마크 결과는 [https://limzykenneth.github.io/p5-benchmark/에서](https://limzykenneth.github.io/p5-benchmark/에서) 확인 할 수 있습니다. 아직 진행중인 작업입니다. diff --git a/src/content/contributor-docs/ko/contributing_documentation.mdx b/src/content/contributor-docs/ko/contributing_documentation.mdx index f08b985a92..e538885b1b 100644 --- a/src/content/contributor-docs/ko/contributing_documentation.mdx +++ b/src/content/contributor-docs/ko/contributing_documentation.mdx @@ -1,16 +1,15 @@ - ---- - ---- 문서는 새로운 학습자와 숙련된 프로그래머 모두에게 필수적입니다. p5.js 익숙하지 않은 분들하게 다정하게 손을 내밀어 커뮤니티를 포용 할 수 있도록 도와줍니다. 또한 문서화를 하면서 테스트하고 시험해 보기 때문에, 코드에서 버그와 이슈를 찾는데 도움을 줍니다. 문서화에 기여하는 방법이 몇가지 있습니다: ## ☝️ 이슈 등록하기 + 이제 막 시작하는 단계라면, 여러분이 기여할 수 있는 유용한 방법 한가지는 문서화 요구사항에 따른 이슈를 등록하는 것입니다. 오타나, 누락 되거나 깨진 예제, 기능에 대한 설명이 헷갈릴 경우, [여기에 이슈를 등록](https://github.com/processing/p5.js/issues) 해 주세요! 저희가 쉽게 찾을 수 있도록 수정해야 할 페이지에 대한 링크도 첨부해주세요. ## 🗯 레퍼런스에 기여하기 + [레퍼런스](http://p5js.org/reference/)를 훑어보고, 오타나 깨진 예제, 헷갈리는 문서를 찾아보세요. 바로 해결 할 수 있는 문제라면, 계속 진행해서 해결해 보세요! 좀 더 논의가 필요한 질문이라면 [이슈](https://github.com/processing/p5.js/issues/new)를 등록해주세요. + * 다음은 [p5.js 처음으로 설정](./README/)할 경우에 대한 안내입니다. * 이 레퍼런스는 소스 코드의 인라인 설명서에서 작성됩니다('src/' 폴더에서 찾아 볼 수 있음). * 다음은 [인라인 설명서 및 예제를 업데이트하거나 추가하는 방법](./inline_documentation/)에 대한 정보입니다. @@ -18,18 +17,22 @@ * 커뮤니티에 의해 유지보수되고 있는 타입스크립트의 타입 정의는 [이곳](https://github.com/p5-types/p5.ts)에 있습니다. ## ✨ 예제 만들기 + 레퍼런스에 있는 예제는 매우 간단한 코드 스닛펫이지만, 더 길고 복잡한 예제도 유용합니다. + * 현재 [프로세싱 예제 페이지](https://processing.org/examples/)에서 [p5.js 예제 페이지](http://p5js.org/examples)로 예제들을 포팅하는 작업을 진행하고 있습니다. 여러분이 이 작업에 도움을 주고 싶다면, [여기](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/)의 안내를 참조하시기 바랍니다. * 또는 여러분이 만든 예제를 원하는 곳에 독립적으로 게시할 수 있습니다. 온라인 태그 [@p5xjs](https://twitter.com/p5xjs)로 공유하거나 또는 이메일 [hello@p5js.org](mailto:hello@p5js.org)로 알려주시면, 더욱 폭넓게 공유해 드리겠습니다! [p5.js를 임베딩 하기 위한 가이드](https://github.com/processing/p5.js/wiki/Embedding-p5.js)는 여러분의 예제를 온라인에 게시하는 데 유용할 수 있습니다. * 도중에 p5.js에서 버그를 발견하면 [이슈](https://github.com/processing/p5.js/issues)를 등록 해 주세요. ## 👯 튜토리얼 만들기 + * p5.js를 처음 접하신다면, 이곳이 시작하기에 좋은 장소입니다. 직접 무언가를 만든 다음, 다른분들도 가르칠 수 있도록 튜토리얼을 만들어 보세요. * 현재 [프로세싱 튜토리얼 페이지](https://processing.org/tutorials)에서 [p5.js 학습 페이지](http://p5js.org/learn)로 포팅을 진행하고 있습니다. 여러분이 도움을 주고 싶다면, [여기](https://p5js.org/learn/tutorial-guide.html)에서 튜토리얼을 만드는 방법에 대한 튜토리얼을 살펴 보시기 바랍니다. * 또한 다양한 주제에 대한 튜토리얼도 환영합니다. 원하는 형식으로 어디서나 게시할 수 있습니다. 온라인 태그 [@p5xjs](https://twitter.com/p5xjs)로 공유하시거나 또는 이메일 [hello@p5js.org](mailto:hello@p5js.org)로 알려주시면, 더욱 폭넓게 공유해 드리겠습니다! 특히 특정 청중 또는 사용 사례를 염두에 두고 만든 튜토리얼을 권장합니다. (예, 언론인, 활동가, 시인, 어린이, 노인, 꿈이 있는 분들, 다른 언어, 기타 등등을 위한 p5). 저희는 p5 커뮤니티에서 이미 환영을 받았거나 포함되지 않았던 분들을 고려하는 것을 좋아합니다. 그리고 저희가 학습을 초대장으로 사용할 수 있을까요? 여러분이 청중들과 의사소통하고 그분들이 알 수 있게 하기 위해 사용하는 언어는 무엇인가요? 여러분의 포맷에 따라 자유롭게 실험해 보세요. [Sharon De La Cruz의 코드 슬랭에 대한 이야기](https://www.youtube.com/watch?v=CFT6w9NKfCs)를 확인하고 영감을 받아 보세요. * 도중에 p5.js에서 버그를 발견하면 [이슈](https://github.com/processing/p5.js/issues)를 등록 해 주세요. ## 👉 시작하기 + * [p5.js 커뮤니티 성명서](http://p5js.org/community/)를 읽어보세요. * 선택 사항: 레파지토리 개요를 확인하기 위해 [컨트리뷰터 문서](./README/)를 확인하고, 코드 작성 방법을 배웁니다(해당되는 경우). * 모든 논의는 github 이슈에서 이루어지므로 슬랙/gitter/etc 채널에 가입할 필요가 없습니다. @@ -39,5 +42,3 @@ 환영합니다! 와주셔서 정말 기뻐요! ❤️ p5.js 커뮤니티 - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/creating_libraries.mdx b/src/content/contributor-docs/ko/creating_libraries.mdx index a20539993f..2ce9b95373 100644 --- a/src/content/contributor-docs/ko/creating_libraries.mdx +++ b/src/content/contributor-docs/ko/creating_libraries.mdx @@ -1,8 +1,3 @@ - ---- - ---- - p5.js 라이브러리는 p5.js의 핵심 기능을 확장하거나 추가하는 모든 자바스크립트 코드가 될 수 있습니다. 라이브러리에는 두 가지 범주가 있습니다. 코어 라이브러리(DOM 및 Sound)는 p5.js 배포의 일부이며 기여된 라이브러리는 p5.js 커뮤니티의 구성원이 개발, 소유 및 유지 관리합니다. 여러분이 라이브러리 하나를 만들고 있고, [p5js.org/libraries](https://p5js.org/libraries) 페이지에 포함하고 싶다면, [이 폼](https://docs.google.com/forms/d/e/1FAIpQLSdWWb95cfvosaIFI7msA7XC5zOEVsNruaA5klN1jH95ESJVcw/viewform)을 제출해 주세요. @@ -14,42 +9,47 @@ p5.js 라이브러리는 p5.js의 핵심 기능을 확장하거나 추가하는 ## 코드 ### p5.prototype에 메소드를 추가하여 p5 핵심 기능을 확장 할 수 있습니다. + 예를 들어, dom.js의 다음 코드는 DOM에 [HTMLImageElement](https://developer.Mozilla.org/en-US/docs/Web/API/HTMLImageElement)를 추가하는 `createImg()`메소드를 추가하기 위해 p5를 확장하는 것입니다. - ```js - p5.prototype.createImg = function (src) { - const elt = document.createElement('img'); - //const elt = new Image; // 위에 1행보다 더 짧게 대체 할 수 있습니다. +```js +p5.prototype.createImg = function (src) { + const elt = document.createElement('img'); + //const elt = new Image; // 위에 1행보다 더 짧게 대체 할 수 있습니다. - elt.src = src; - return addElement(elt, this); - }; - ``` - DOM 라이브러리가 프로젝트에 포함되면 `createImg()`는 `createCanvas()` 또는 `background()`와 함께 호출 될 수 있습니다. + elt.src = src; + return addElement(elt, this); +}; +``` + +DOM 라이브러리가 프로젝트에 포함되면 `createImg()`는 `createCanvas()` 또는 `background()`와 함께 호출 될 수 있습니다. ### 내부 helpers를 위한 private 함수 사용하기 + 사용자에 의해 호출되지 않을 목적의 함수를 의미합니다. 위의 예제의 `addElement()`는 [dom.js](https://GitHub.com/processing/p5.js/blob/main/src/dom/dom.js)에서 내부 함수 입니다. 하지만 `p5.prototype`에는 공개적으로 바운드 되지 않았습니다. ### 프로토타입에 메소드를 추가하여 p5.js 클래스를 확장 할 수 있습니다. + 아래 예제에서 `p5.Element.prototype`은 `html()` 메소드와 함께 확장되어 엘리먼트의 내부 html을 설정합니다. - ```js - p5.Element.prototype.html = function (html) { - this.elt.innerHTML = html; - //this.elt.textContent = html; //innerHTML보다 훨씬 더 안전한 대안 입니다. - }; - ``` +```js +p5.Element.prototype.html = function (html) { + this.elt.innerHTML = html; + //this.elt.textContent = html; //innerHTML보다 훨씬 더 안전한 대안 입니다. +}; +``` ### preload()에서 호출 될 수 있도록 p5에 메소드 이름을 등록하려면 registerPreloadMethod()를 이용하세요. 일반적으로 소리, 이미지 또는 기타 외부 파일 로딩과 같은 일부 비동기 기능에는 동기 및 비동기 옵션이 모두 제공됩니다. 예를 들어, `loadStrings(path, [callback])` 은 두번째 매개변수로 선택적으로 콜백 함수를 허용합니다.이 함수는 loadStrings 함수가 완료된 후 호출됩니다. 그러나 사용자는 콜백함수 없이 `preload()`에서 loadStrings를 호출 할 수 있으며 p5.js는 `preload()`의 모든 작업이 완료 될 때까지 기다렸다가 `setup()`으로 이동합니다. 메소드를 등록하고 싶다면, 등록하고자 하는 메소드명과 함께 `registerPreloadMethod()`를 호출하고, 프로토타입 객체를 ~~(기본값은 p5.prototype)~~ 포함하여 메소드에 전달합니다. 아래 예제는 "soundfile.js"(p5.sound 라이브러리)에 `loadSound()`를 등록하는 행 하나를 보여줍니다. - ```js - p5.prototype.registerPreloadMethod('loadSound', p5.prototype); - ``` +```js +p5.prototype.registerPreloadMethod('loadSound', p5.prototype); +``` + +### *callback* 및 **preload()** 에 대한 비동기 함수의 예제. -### _callback_ 및 **preload()** 에 대한 비동기 함수의 예제. ```js // preload() 또는 콜백과 함께 사용하기 위한 비동기 함수의 예제 p5.prototype.getData = function (callback) { @@ -82,24 +82,24 @@ p5.prototype.getData = function (callback) { }; ``` -### _**p5**_ 에 여러번 호출되는 함수를 등록하려면 **registerMethod()** 를 사용하세요. +### ***p5*** 에 여러번 호출되는 함수를 등록하려면 **registerMethod()** 를 사용하세요. - ```js - p5.prototype.doRemoveStuff = function () { - // 제거하는 기능을 위한 라이브러리 - }; - p5.prototype.registerMethod('remove', p5.prototype.doRemoveStuff); - ``` +```js +p5.prototype.doRemoveStuff = function () { + // 제거하는 기능을 위한 라이브러리 +}; +p5.prototype.registerMethod('remove', p5.prototype.doRemoveStuff); +``` 등록 할 수있는 메소드 이름은 다음과 같습니다. 함수를 등록하기 전에 먼저 함수를 정의해야 할 수 있습니다. - * **pre** — `draw()` 시작 시 호출됩니다. 드로잉에 영향을 줄 수 있습니다. - * **post** — `draw()` 끝에 호출됩니다. - * **remove** — `remove()`가 호출되면 호출됩니다. - * **init** — 스케치가 처음 초기화 될 때 스케치 초기화 함수(`p5` 생성자로 전달 된 것)가 실행되기 전에 호출됩니다. 전역 모드 설정 전에 호출되기 때문에 여러분의 라이브러리는 스케치에 무엇이든 추가 할 수 있으며 전역 모드가 활성화되어 있으면 자동으로 `window `에 복사됩니다. +* **pre** — `draw()` 시작 시 호출됩니다. 드로잉에 영향을 줄 수 있습니다. +* **post** — `draw()` 끝에 호출됩니다. +* **remove** — `remove()`가 호출되면 호출됩니다. +* **init** — 스케치가 처음 초기화 될 때 스케치 초기화 함수(`p5` 생성자로 전달 된 것)가 실행되기 전에 호출됩니다. 전역 모드 설정 전에 호출되기 때문에 여러분의 라이브러리는 스케치에 무엇이든 추가 할 수 있으며 전역 모드가 활성화되어 있으면 자동으로 `window `에 복사됩니다. 이 목록을 대략적으로 정리하면 다음과 같습니다. -https://GitHub.com/processing/processing/wiki/Library-Basics#library-methods +[https://GitHub.com/processing/processing/wiki/Library-Basics#library-methods](https://GitHub.com/processing/processing/wiki/Library-Basics#library-methods) ### 여러분만의 클래스를 생성 할 수 있습니다. @@ -108,7 +108,7 @@ https://GitHub.com/processing/processing/wiki/Library-Basics#library-methods ## 작명 * **p5 함수 또는 프로퍼티들을 덮어 쓰지 않아야 합니다..** p5.prototype을 확장 할 때는 기존 프로퍼티 또는 함수명을 사용하지 않도록 주의해야 합니다. [hasOwnProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) 를 사용하여 이름을 확인해 볼 수 있습니다. -예를 들면, 여러분의 라이브러리 파일 맨 위에서 다음 행을 추가하면 이미 `rect()` 메소드가 존재하기 때문에 true 를 출력할 것입니다. + 예를 들면, 여러분의 라이브러리 파일 맨 위에서 다음 행을 추가하면 이미 `rect()` 메소드가 존재하기 때문에 true 를 출력할 것입니다. ```js console.log(p5.prototype.hasOwnProperty('rect')); @@ -130,9 +130,7 @@ https://GitHub.com/processing/processing/wiki/Library-Basics#library-methods * **문서가 핵심입니다!** 라이브러리 문서는 사용자가 쉽게 찾아보고 다운로드 하여 사용할 수 있는 곳에 있어야 합니다. 기여된 라이브러리에 대한 문서는 기본 p5.js 레퍼런스에 포함되지 않지만 여러분이 유사한 형식을 따르고 싶을 수도 있습니다. [라이브러리 개요 페이지](http://p5js.org/reference/#/libraries/p5.sound), [클래스 개요 페이지](http://p5js.org/reference/#/p5.Vector) 및 [메소드 페이지](http://p5js.org/reference/#/p5/arc) 의 예제를 참조하세요. -* **예제가 좋습니다!** 사람들에게 라이브러리가 할 수 있는 일을 보여주세요. 모두 자바스크립트이므로 사람들은 라이브러리를 다운로드하기 전 온라인에서 실행 되는 것을 볼 수 있습니다. 예제들을 호스팅하기 쉬운 -[jsfiddle](http://jsfiddle.net/) 및 [codepen](http://codepen.io)이라는 두가지 좋은 옵션이 있습니다. +* **예제가 좋습니다!** 사람들에게 라이브러리가 할 수 있는 일을 보여주세요. 모두 자바스크립트이므로 사람들은 라이브러리를 다운로드하기 전 온라인에서 실행 되는 것을 볼 수 있습니다. 예제들을 호스팅하기 쉬운 + [jsfiddle](http://jsfiddle.net/) 및 [codepen](http://codepen.io)이라는 두가지 좋은 옵션이 있습니다. * **알려주세요!** 라이브러리를 배포 할 준비가 되면 [hello@p5js.org](mailto:hello@p5js.org)로 링크와 몇 가지 정보와 함께 보내주세요. [라이브러리 페이지](http://p5js.org/libraries/)에 추가 할 것입니다. - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/custom_p5_build.mdx b/src/content/contributor-docs/ko/custom_p5_build.mdx index 1cf8f98c41..f475bf67f6 100644 --- a/src/content/contributor-docs/ko/custom_p5_build.mdx +++ b/src/content/contributor-docs/ko/custom_p5_build.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 선택한 컴포넌트로 p5.js의 커스텀 빌드 생성하기 ## 개요 @@ -38,12 +34,11 @@ npm run grunt combineModules:min:module_x:module_y uglify ## 예제들 -- `npm run grunt combineModules:min:core/shape:color:math:image uglify` +* `npm run grunt combineModules:min:core/shape:color:math:image uglify` combineModules 및 uglify 태스크로 `lib/modules` 디렉토리안에 `p5Custom.min.js` 번들을 생성합니다. 모듈은 `combineModules:min` 다음에 나열 되어야하며 `uglify` 태스크는 모듈 목록 뒤에 공백이 있어야합니다. -- `npm run grunt combineModules:core/shape:color:math:image` +* `npm run grunt combineModules:core/shape:color:math:image` `lib/modules` 디렉토리에 압축되지 않은 `p5Custom.js` 번들을 생성합니다. -- `npm run grunt combineModules:min:core/shape:color:math:image` +* `npm run grunt combineModules:min:core/shape:color:math:image` `combineModules:min` 태스크를 사용하여 `lib/modules` 디렉토리에 `p5Custom.pre-min.js`를 생성합니다. 이 예제에서 `npm run grunt uglify`는 `combineModules:min` 작업을 실행 한 후에 별도로 실행 할 수 있습니다. - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/design_principles.mdx b/src/content/contributor-docs/ko/design_principles.mdx index d98edc31fa..02880e5eb7 100644 --- a/src/content/contributor-docs/ko/design_principles.mdx +++ b/src/content/contributor-docs/ko/design_principles.mdx @@ -1,15 +1,9 @@ - ---- - ---- # p5.js 디자인 원칙 -- **입문자 친화적인** p5.js API는 코딩 입문자에게 친화적이며, 최신 HTML5/canvas/DOM API로 인터랙티브하고 시각적인 웹 콘텐츠를 만드는 데 낮은 장벽을 제공하는 것을 목적으로 하고 있습니다. - -- **교육적인** p5.js는 지원하고 있는 예제들과 API에 대한 완벽한 레퍼런스를 비롯해 명확하고 매력적인 순서로 핵심 크리에이티브 코딩 원칙을 소개하는 튜토리얼과 샘플 클래스 커리큘럼을 제공하고 교육적인 용도로서 API와 커리큘럼에 초점을 맞추고 있습니다. +* **입문자 친화적인** p5.js API는 코딩 입문자에게 친화적이며, 최신 HTML5/canvas/DOM API로 인터랙티브하고 시각적인 웹 콘텐츠를 만드는 데 낮은 장벽을 제공하는 것을 목적으로 하고 있습니다. -- **자바스크립트와 커뮤니티** p5.js는 적절한 자바스크립트 디자인 패턴과 사용법을 모델링하고 필요할 경우 추상화하여 입문자가 웹 개발에 좀 더 접근하기 쉽도록 하는 것을 목표로 합니다. p5.js는 오픈소스 라이브러리로서, 창작, 문서화 및 배포에 더 광범위한 자바스크립트 커뮤니티를 포함합니다. +* **교육적인** p5.js는 지원하고 있는 예제들과 API에 대한 완벽한 레퍼런스를 비롯해 명확하고 매력적인 순서로 핵심 크리에이티브 코딩 원칙을 소개하는 튜토리얼과 샘플 클래스 커리큘럼을 제공하고 교육적인 용도로서 API와 커리큘럼에 초점을 맞추고 있습니다. -- **프로세싱과 커뮤니티** p5.js는 프로세싱 언어와 커뮤니티에 직접적인 연관이 있으며, 프로세싱에서 자바스크립트로의 전환을 쉽고 명확하게 하는 것을 목표로 합니다. p5.js를 위해 프로세싱 API와 커뮤니티를 지원하는 것을 우선으로 하고 있으며, 웹에서 크리에티브 코딩의 새로운 가능성을 포함하고 확장하며, 해당 API를 입문자에게 노출하는 프로세싱 스타일의 접근 방식을 취하고 있습니다. +* **자바스크립트와 커뮤니티** p5.js는 적절한 자바스크립트 디자인 패턴과 사용법을 모델링하고 필요할 경우 추상화하여 입문자가 웹 개발에 좀 더 접근하기 쉽도록 하는 것을 목표로 합니다. p5.js는 오픈소스 라이브러리로서, 창작, 문서화 및 배포에 더 광범위한 자바스크립트 커뮤니티를 포함합니다. - \ No newline at end of file +* **프로세싱과 커뮤니티** p5.js는 프로세싱 언어와 커뮤니티에 직접적인 연관이 있으며, 프로세싱에서 자바스크립트로의 전환을 쉽고 명확하게 하는 것을 목표로 합니다. p5.js를 위해 프로세싱 API와 커뮤니티를 지원하는 것을 우선으로 하고 있으며, 웹에서 크리에티브 코딩의 새로운 가능성을 포함하고 확장하며, 해당 API를 입문자에게 노출하는 프로세싱 스타일의 접근 방식을 취하고 있습니다. diff --git a/src/content/contributor-docs/ko/discussions.mdx b/src/content/contributor-docs/ko/discussions.mdx index 1448f7b35e..67839fa74c 100644 --- a/src/content/contributor-docs/ko/discussions.mdx +++ b/src/content/contributor-docs/ko/discussions.mdx @@ -1,9 +1,3 @@ - ---- - ---- p5 개발 방법에 대해 논의에 참여하는 것은 기여 할 수 있는 좋은 방법입니다. 여러가지 방법이 있지만, 한 가지 좋은 시작점은 기존의 Github의['discussion' 라벨을 가진 이슈](https://github.com/processing/p5.js/labels/discussion)를 확인하고 여러분의 의견을 추가하는 것입니다. 이 하위 섹션의 문서는 이러한 논의를 바탕으로 개발되었습니다. 이곳에서 라이브러리의 현재와 미래 디자인에 대해 아이디어를 수집합니다. - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/es6-adoption.mdx b/src/content/contributor-docs/ko/es6-adoption.mdx index 8f983e85fc..3071b4de9a 100644 --- a/src/content/contributor-docs/ko/es6-adoption.mdx +++ b/src/content/contributor-docs/ko/es6-adoption.mdx @@ -1,15 +1,13 @@ - ---- - ---- ## ES6 채택 -최근 p5.js는 코드베이스에서 복잡성을 줄이고, 가독성을 높이며, 새로오신 분들 및 숙련된 기여자 모두에게 우아하고 효과적인 코딩 방법을 지원하는 기능을 용이하게 하기 위해, ECMAScript 2015(ES6) 언어 명세를 채택했습니다. + +최근 p5.js는 코드베이스에서 복잡성을 줄이고, 가독성을 높이며, 새로오신 분들 및 숙련된 기여자 모두에게 우아하고 효과적인 코딩 방법을 지원하는 기능을 용이하게 하기 위해, ECMAScript 2015(ES6) 언어 명세를 채택했습니다. 전환 절차는 처음에 p5를 ES6로 마이그레이션하는 것으로 [논의되었고](https://github.com/processing/p5.js/issues/3758), 이후에 ES6 명세에 따라 코드베이스에서 문법이 광범위하게 변경되었습니다. 초기 전환에 대한 정보는 [여기](https://github.com/processing/p5.js/pull/3874)에서 확인 할 수 있습니다. 이러한 변경 사항은 ES6기능에 따라 주요한 혹은 흔하게 볼수 있는 문법을 수정하는 것 뿐만아니라 ES6 표준을 바탕으로 라이브러리를 처리, 린팅(linting) 및 테스트에 용이 하도록 빌드 시스템을 약간 수정하는 것들이 포함되어 있습니다. 이 글을 쓰는 시점에서 이러한 전환은 결코 완전한 것이 아니며 ES6의 가능한 모든 기능을 반영하거나 구현하지 않습니다. 커뮤니티의 관심사 및 표준에 부합할 때 ES6 기능을 적절하고 효율적으로 활용하기 위해 보다 원활한 전환을 촉진하기 위한 것이고 기여자들이 점차 새로운 스타일과 기능을 따르도록 동기를 부여하기 위함입니다. 따라서 우리는 모든 기여자들이 다음과 같은 기능을 사용하는 커밋 및 풀 리퀘스트에서 ES6 표준을 준수하도록 권장합니다: + 1. 자바스크립트와 관련된 문법적 모호성 및 특수성 감소 2. 가독성 및 코드 명확성 향상 3. 코드 난독화 및 과도한 추상화 (가독성을 돕기 위해) 자제 @@ -18,22 +16,25 @@ 6. 성능을 희생하지 않기 p5에서 아직 사용하지 않은 많은 ES6 기능이 있습니다. 하지만 영역에서 다음을 포함하지만, 이에 국한되지 않는 기능을 라이브러리에서 활용하므로서 이점을 얻을 수 있습니다: -- 제너레이터 -- 숫자 타입 검사 -- Set/Map 데이터 구조 -- 형식화 배열 -- [기타](http://es6-features.org/) + +* 제너레이터 +* 숫자 타입 검사 +* Set/Map 데이터 구조 +* 형식화 배열 +* [기타](http://es6-features.org/) ES6 표준을 완전히 준수하려면 p5의 모든 영역에서 커뮤니티의 노력이 필요하며, 그 특성때문에 점진적인 과정이 필요하다는 점에 주목할 필요가 있습니다. -### 관련 -- [공식 ES6 언어 명세](https://www.ecma-international.org/ecma-262/6.0/) -- [ES6 성능 비교](http://incaseofstairs.com/six-speed/) -- [ES6 기능: 개요 및 비교](http://es6-features.org/) -- [You Don't Know JS: ES6 & Beyond (도서)](https://github.com/getify/You-Dont-Know-JS/tree/master/es6%20%26%20beyond) -- [ES6 탐험하기 (도서)](https://exploringjs.com/es6/) +### 관련 + +* [공식 ES6 언어 명세](https://www.ecma-international.org/ecma-262/6.0/) +* [ES6 성능 비교](http://incaseofstairs.com/six-speed/) +* [ES6 기능: 개요 및 비교](http://es6-features.org/) +* [You Don't Know JS: ES6 & Beyond (도서)](https://github.com/getify/You-Dont-Know-JS/tree/master/es6%20%26%20beyond) +* [ES6 탐험하기 (도서)](https://exploringjs.com/es6/) ### 성능 + 우리의 목표는 ES6 표준을 준수하는 것이지만, p5는 성능 코드에 의존한다는 점에 유의해야합니다. 이 글을 작성하는 시점에서, ES6의 많은 기능들은 성능 저하, 병목 현상 및 오버 헤드와 연관이 있습니다. 따라서 코드 성능이 저하되는 ES6 기능을 사용하지 않는 것이 중요합니다. 하지만 브라우저 엔진 개발자가 새로운 기능의 성능 향상에 적극적으로 참여하고 있다는 점에서 일시적인 문제인 것 같습니다. 그러나 당분간은 특히 문법 변경으로 인해 커뮤니티의 목표와 상응하는 주요한 개선이 이루어지지 않는 경우 ES6 표준을 완전히 준수하는 것보다 성능을 우선시하는 것이 중요합니다. ES6 기능들의 성능을 비교하려면 [이 링크](http://incaseofstairs.com/six-speed/)를 참조해주세요. @@ -51,41 +52,42 @@ p5는 대규모 사용자층에게 접근성을 유지하면서 최신 기능을 대부분의 경우 브라우저 호환성은 무시할 수 있지만 성능에 대해서는 그렇지 않습니다. ES6에서 ES5로의 변환은 안전히 마무리 할 수 있지만 생성 된 ES5 코드와 관련된 성능 저하가 존재합니다. Babel이 트랜스파일링한 코드와 ES5로 구현한 코드의 성능을 확인하려면 [이 링크](http://incaseofstairs.com/six-speed/)를 다시 참조해 주세요. ### ES6 코딩 가이드라인 -- ES6 `import`를 선호하여 `require` 폐기 [[좀더 살펴보기](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] -- ES6 `export`를 선호하여 `module.exports` 폐기 [[좀더 살펴보기](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] - - **예외:** 빌드 시스템 한계로 인해 `app.js`는 여전히 `module.exports = p5;`를 사용합니다. -- 항상 `const`를 사용하고, 재 할당이 필요한 경우 `let`으로 변경 [[토론](https://github.com/processing/p5.js/issues/3877)] -- 프로토타입 멤버는 모두 화살표 함수 대신 함수 선언문을 사용해야함 [[토론](https://github.com/processing/p5.js/issues/3875)] - - **올바른 경우:** `p5.prototype.myMethod = function() { }` - - **올바르지 않은 경우:** `p5.prototype.myMethod = () => { }` -- `.bind (this)`가 필요한 프로토타입 멤버는 화살표 함수로 변환해야 함 [[토론](https://github.com/processing/p5.js/issues/3875)] - - **올바른 경우:** `p5.prototype.myMethod = () => { }` - - **올바르지 않은 경우:** `p5.prototype.myMethod = function() {...}.bind(this);` -- 구문이 이전 형식을 복제하도록 상수를 가져옵니다. `constants.TWO_PI` +* ES6 `import`를 선호하여 `require` 폐기 \[[좀더 살펴보기](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] +* ES6 `export`를 선호하여 `module.exports` 폐기 \[[좀더 살펴보기](https://exploringjs.com/es6/ch_modules.html#sec_importing-exporting-details)] + * **예외:** 빌드 시스템 한계로 인해 `app.js`는 여전히 `module.exports = p5;`를 사용합니다. +* 항상 `const`를 사용하고, 재 할당이 필요한 경우 `let`으로 변경 \[[토론](https://github.com/processing/p5.js/issues/3877)] +* 프로토타입 멤버는 모두 화살표 함수 대신 함수 선언문을 사용해야함 \[[토론](https://github.com/processing/p5.js/issues/3875)] + * **올바른 경우:** `p5.prototype.myMethod = function() { }` + * **올바르지 않은 경우:** `p5.prototype.myMethod = () => { }` +* `.bind (this)`가 필요한 프로토타입 멤버는 화살표 함수로 변환해야 함 \[[토론](https://github.com/processing/p5.js/issues/3875)] + * **올바른 경우:** `p5.prototype.myMethod = () => { }` + * **올바르지 않은 경우:** `p5.prototype.myMethod = function() {...}.bind(this);` +* 구문이 이전 형식을 복제하도록 상수를 가져옵니다. `constants.TWO_PI` ### 변환 요약 -- [Modules: Export/Import](http://es6-features.org/#ValueExportImport) -- [Modules: Default & Wildcard](http://es6-features.org/#ValueExportImport) -- [Constants](http://es6-features.org/#Constants) -- [Block-Scoped Variables](http://es6-features.org/#BlockScopedVariables) -- [Rest Parameter](http://es6-features.org/#RestParameter) -- [Spread Operator](http://es6-features.org/#SpreadOperator) -- [Method Properties](http://es6-features.org/#MethodProperties) -- [Property Shorthand](http://es6-features.org/#PropertyShorthand) -- [Arrow Functions: Statement Bodies](http://es6-features.org/#StatementBodies) -- [Arrow Functions: Expression Bodies](http://es6-features.org/#ExpressionBodies) -- [Class Definition](http://es6-features.org/#ClassDefinition) -- [Class Inheritance](http://es6-features.org/#ClassInheritance) -- [Template Literals: String Interpolation](http://es6-features.org/#StringInterpolation) -- [Template Literals: Custom Interpolation](http://es6-features.org/#CustomInterpolation) -- [Default Parameter Values](http://es6-features.org/#DefaultParameterValues) -- [String Searching: Includes](http://es6-features.org/#StringSearching) -- [Array Searching: Includes (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) -- [Iterators: For-Of](http://es6-features.org/#IteratorForOfOperator) + +* [Modules: Export/Import](http://es6-features.org/#ValueExportImport) +* [Modules: Default & Wildcard](http://es6-features.org/#ValueExportImport) +* [Constants](http://es6-features.org/#Constants) +* [Block-Scoped Variables](http://es6-features.org/#BlockScopedVariables) +* [Rest Parameter](http://es6-features.org/#RestParameter) +* [Spread Operator](http://es6-features.org/#SpreadOperator) +* [Method Properties](http://es6-features.org/#MethodProperties) +* [Property Shorthand](http://es6-features.org/#PropertyShorthand) +* [Arrow Functions: Statement Bodies](http://es6-features.org/#StatementBodies) +* [Arrow Functions: Expression Bodies](http://es6-features.org/#ExpressionBodies) +* [Class Definition](http://es6-features.org/#ClassDefinition) +* [Class Inheritance](http://es6-features.org/#ClassInheritance) +* [Template Literals: String Interpolation](http://es6-features.org/#StringInterpolation) +* [Template Literals: Custom Interpolation](http://es6-features.org/#CustomInterpolation) +* [Default Parameter Values](http://es6-features.org/#DefaultParameterValues) +* [String Searching: Includes](http://es6-features.org/#StringSearching) +* [Array Searching: Includes (ES7)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) +* [Iterators: For-Of](http://es6-features.org/#IteratorForOfOperator) **참고:** 새로운 기능이 라이브러리에 통합 되었으므로 위의 목록을 업데이트해 주세요. - ### 현재 이슈 -- [`#3883`](https://github.com/processing/p5.js/issues/3883): combineModules를 사용하여 사용자 지정 번들을 만들 때 "new p5()"를 생성하지 못합니다. 글로벌 모드에서는 영향을 받지 않으며 예상대로 작동합니다. - \ No newline at end of file +### 현재 이슈 + +* [`#3883`](https://github.com/processing/p5.js/issues/3883): combineModules를 사용하여 사용자 지정 번들을 만들 때 "new p5()"를 생성하지 못합니다. 글로벌 모드에서는 영향을 받지 않으며 예상대로 작동합니다. diff --git a/src/content/contributor-docs/ko/friendly_error_system.mdx b/src/content/contributor-docs/ko/friendly_error_system.mdx index 5d12c7cfd4..91293520b3 100644 --- a/src/content/contributor-docs/ko/friendly_error_system.mdx +++ b/src/content/contributor-docs/ko/friendly_error_system.mdx @@ -1,12 +1,8 @@ - ---- - ---- # p5.js 친절한 에러 시스템(Friendly Error System, FES) ## 개요 -FES는 학습을 시작할 때 일반적인 사용자 오류를 겪는 새로운 프로그래머를 돕도록 설계되었습니다. 이 시스템은 일반적인 시작 오류를 잡아내고, 사용자가 그 오류를 해결하도록 명확한 표현과 링크를 제공합니다. FES는 사용자가 막 시작할 때 마주칠 수 있는 함수에만 적용됩니다. 서버를 실행하지 않고 파일을 로드한다거나, URL로 loadImage() 함수를 호출하는 등의 특히 일반적인 문제는 예외입니다. +FES는 학습을 시작할 때 일반적인 사용자 오류를 겪는 새로운 프로그래머를 돕도록 설계되었습니다. 이 시스템은 일반적인 시작 오류를 잡아내고, 사용자가 그 오류를 해결하도록 명확한 표현과 링크를 제공합니다. FES는 사용자가 막 시작할 때 마주칠 수 있는 함수에만 적용됩니다. 서버를 실행하지 않고 파일을 로드한다거나, URL로 loadImage() 함수를 호출하는 등의 특히 일반적인 문제는 예외입니다. FES의 목표는 종종 암호화된 콘솔 오류를 보완하기 위해 이해하기 쉬운 오류 메시지를 생성하는 것입니다. 예를 들어, 자바스크립트는 기본적으로 파라미터의 타입 검사를 지원하지 않기 때문에 경험이 없는 자바스크립트 개발자는 파라미터 입력 시 발생하는 에러를 발견하기가 더욱 어렵습니다. @@ -24,13 +20,15 @@ FES는 네 종류의 오류를 감지하고 메시지를 출력할 수 있습니 4. `helpForMisusedAtTopLevelCode()`는 윈도우 로드 때 호출되며, setup()이나 draw() 외부에서 p5.js 함수를 사용할 수 있는지 확인합니다. -자세한 기술 정보는 [src/core/friendly_errors/fes_core.js](https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js)에서 인라인 메모를 참고하세요. +자세한 기술 정보는 [src/core/friendly\_errors/fes\_core.js](https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js)에서 인라인 메모를 참고하세요. + +### `core/friendly_errors/file_errors/friendlyFileLoadError()`: -### `core/friendly_errors/file_errors/friendlyFileLoadError()`: * 이 함수는 파일이 올바로 로드되지 않으면 친절한 오류 메시지를 생성하고, 표시합니다. 그리고 로드하기에는 파일이 너무 큰지 확인해서 경고를 생성하기도 합니다. * 이것은 다음과 같이 호출할 수 있습니다.: `p5._friendlyFileLoadError(ERROR_TYPE, FILE_PATH)`. * 파일 로딩 오류 예시: -````javascript + +```javascript /// 폰트 파일 누락 let myFont; function preload() { @@ -46,44 +44,53 @@ function draw() {}; /// 콘솔에 다음의 메시지가 생성됩니다.: /// > p5.js: 폰트를 로드하는 데 문제가 있는 것 같습니다. 파일 경로 [assets / OpenSans-Regular.ttf]가 올바른지, 폰트를 온라인 호스팅하는지, 또는 로컬 서버가 실행 중인지 확인하십시오. -```` +``` + * 현재 버전에는 `image`, `XML`, `table`, `text`, `json`, `font`에 대한 오류 메시지를 생성하는 템플릿이 포함되어 있습니다. * `image/loading_displaying/loadImage()`, `io/files/loadFont()`, `io/files/loadTable()`, `io/files/loadJSON()`, `io/files/loadStrings()`, `io/files/loadXML()`, `io/files/loadBytes()`에 구현되었습니다. -* 파일 크기가 커서 로드하는 중 생기는 오류는 모두 loadX 메소드에 구현되었습니다. +* 파일 크기가 커서 로드하는 중 생기는 오류는 모두 loadX 메소드에 구현되었습니다. ### `core/friendly_errors/validate_params/validateParameters()`: + * 이 함수는 `docs/reference/data.json`에 있는 입력 파라미터 정보와 일치하는지 파라미터 검증을 실행합니다. 이것은 함수 호출이 올바른 개수와 파라미터형을 가지고 있는지 확인합니다. * 파라미터 누락 예시: -````javascript + +```javascript arc(1, 1, 10.5, 10); /// 콘솔에 다음의 메시지가 생성됩니다.: /// > pt.js: arc() 함수의 입력 파라미터 중 4번째 자리(인덱스는 0부터 시작)에 빈 값이 들어온 것 같습니다. 의도한 것이 아니라면, 이것은 종종 범위의 문제입니다.: [https://p5js.org/examples/data-variable-scope.html]. [http://p5js.org/reference/#p5/arc] /// > pt.js: arc() 함수의 입력 파라미터 중 5번째 자리(인덱스는 0부터 시작)에 빈 값이 들어온 것 같습니다. 의도한 것이 아니라면, 이것은 종종 범위의 문제입니다.: [https://p5js.org/examples/data-variable-scope.html]. [http://p5js.org/reference/#p5/arc] -```` +``` + * 자료형 오류 예시: -````javascript + +```javascript arc('1', 1, 10.5, 10, 0, Math.PI, 'pie'); /// 콘솔에 다음의 메시지가 생성됩니다.: /// > p5.js:arc() 함수의 입력 파라미터 중 0번째 자리에는(인덱스는 0부터 시작)에는 숫자가 들어와야 하는데 문자열이 들어왔습니다. [http://p5js.org/reference/#p5/arc] -```` +``` + * 이것은 다음과 같이 호출할 수 있습니다.: `p5._validateParameters(FUNCT_NAME, ARGUMENTS)` 또는 `p5.prototype._validateParameters(FUNCT_NAME, ARGUMENTS)` 는 파라미터 검증이 필요한 함수 내부에서 씁니다. 일반적인 목적으로는 `p5._validateParameters` 를 사용하는 것이 좋습니다. `p5.prototype._validateParameters(FUNCT_NAME, ARGUMENTS)` 은 주로 디버깅이나 단위 테스트 목적으로 사용합니다. -* `color/creating_reading`, `core/2d_primitives`, `core/curves`, 그리고 `utilities/string_functions` 의 함수로 구현되어 있습니다. +* `color/creating_reading`, `core/2d_primitives`, `core/curves`, 그리고 `utilities/string_functions` 의 함수로 구현되어 있습니다. ## 추가 기능 -* FES는 p5와 친절한 디버거로 개발자들을 환영합니다. + +* FES는 p5와 친절한 디버거로 개발자들을 환영합니다. * FES는 IDE와 웹 에디터에서 동작합니다. ## 개발자 유의사항 -* p5.js 객체를 생성할 때: 파라미터로 사용될 모든 p5.js 객체는 클래스 선언부에서 `name` 파라미터(오브젝트의 이름) 값을 지정해야 합니다. 예를 들면 다음과 같습니다.: -````javascript +* p5.js 객체를 생성할 때: 파라미터로 사용될 모든 p5.js 객체는 클래스 선언부에서 `name` 파라미터(오브젝트의 이름) 값을 지정해야 합니다. 예를 들면 다음과 같습니다.: + +```javascript p5.newObject = function(parameter) { this.parameter = '파라미터'; this.name = 'p5.newObject'; }; -```` +``` + * 인라인 문서: 허용되는 파라미터 타입은 `Boolean`, `Number`, `String`, 그리고 객체의 이름(위의 주요 항목 참고)입니다. 유형에 관계없이 배열 파라미터에는 `Array` 를 쓰세요. 필요한 경우, 어떤 특정 타입의 배열 파라미터가 허용되는지(예시 `Number[]`, `String[]`) 설명 섹션에 적습니다. * 현재 지원되는 클래스 타입은 이렇습니다( `name` 파라미터를 가집니다): `p5.Color`, `p5.Element`, `p5.Graphics`, `p5.Renderer`, `p5.Renderer2D`, `p5.Image`, `p5.Table`, `p5.TableRow`, `p5.XML`, `p5.Vector`, `p5.Font`, `p5.Geometry`, `p5.Matrix`, `p5.RendererGL`. @@ -107,18 +114,23 @@ function draw() { 이렇게 하면 FES에서 성능 저하를 일으키는 부분(인자 확인 같은)이 비활성화됩니다. 성능에 영향을 주지 않는 부분(파일 로드 실패 시 오류나 전역에서 p5.js 함수를 오버라이드 할 경우 경고 등)은 그대로 유지됩니다. ## 알려진 제한사항 + * FES는 프로그램 속도를 늦춥니다. 옵션에서 `p5.disableFriendlyErrors = true;`를 설정하여 비활성화 할 수 있습니다. 그리고 축소 버전(`p5.min.js`)에서는 FES 기본 설정이 비활성입니다. * FES에서는 오류가 정상으로 처리되는 상황이 발생할 수 있습니다. 이런 경우는 보통, 함수가 설계된 형태와 실제 사용하는 방식이 일치하지 않을 때 생깁니다(예시: 그리기 함수는 원래 2D와 3D 설정에서 서로 바꿔 사용할 수 있도록 설계되었습니다). 예를 들어, 아래 코드로 3D 라인을 그리면 FES에 잡히지 않습니다. 왜냐하면, `line()` 의 2D 그리기 설정 인라인 문서에는 (`Number`, `Number`, `Number`, `Number`) 파라미터 패턴이 허용되기 때문입니다. 이것은 또한 현재 버전의 FES가 `_renderer.isP3D` 와 같은 환경 변수를 확인하지 않는다는 의미이기도 합니다. -```javascript + +```javascript const x3; // undefined line(0, 0, 100, 100, x3, Math.PI); ``` - * FES는 `const` 또는 `var` 를 사용해 선언할 때 덮어 쓴 전역 변수만 감지할 수 있습니다. `let`을 사용했다면 감지되지 않습니다. `let`이 변수를 인스턴스화하는 방식 때문에 현재는 해결이 어렵습니다. + +* FES는 `const` 또는 `var` 를 사용해 선언할 때 덮어 쓴 전역 변수만 감지할 수 있습니다. `let`을 사용했다면 감지되지 않습니다. `let`이 변수를 인스턴스화하는 방식 때문에 현재는 해결이 어렵습니다. ## 진행 중 + * 보다 일반적인 오류 유형을 식별하고 일반화합니다. (예시: `bezierVertex()`, `quadraticVertex()` - 필수 객체를 초기화하지 않음; `nf()` `nfc()` `nfp()` `nfs()` 에서 숫자형 파라미터의 양수 체크) ## 향후 + * 웹 에디터에서 색상 코드를 재도입합니다. * 더 많은 단위 테스트를 합니다. * 더 직관적인 메시지를 출력합니다. @@ -144,5 +156,3 @@ original_functions[func].apply(original, arguments) }; }); ``` - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/inline_documentation.mdx b/src/content/contributor-docs/ko/inline_documentation.mdx index 957e4a358f..d8513a3093 100644 --- a/src/content/contributor-docs/ko/inline_documentation.mdx +++ b/src/content/contributor-docs/ko/inline_documentation.mdx @@ -1,19 +1,16 @@ - ---- - ---- # p5.js에 인라인 문서 추가 p5.js 소스 코드에 인라인 문서를 추가하면 참조가 자동으로 생성 됩니다. 이 문서는 문서에 포함 할 태그와 정보를 설명하여 참조에 적절하게 표시되도록합니다. 참조는 주기적으로 소스 코드에서 자동 생성되므로 문서에 참조가 표시되는 데 시간이 걸릴 수 있습니다. 시간이 더 걸리거나 다른 문제가 있는 경우 [hello@p5js.org](mailto:hello@p5js.org)로 이메일 주세요. -yuidoc에 대한 기본 사항과 스타일에 대한 자세한 내용은 [여기](http://yui.github.io/yuidoc/syntax/index.html)를 참조하세요. __행 길이를 80열로 제한하며, 넘어갈 경우 새 행에서 시작하세요.__ +yuidoc에 대한 기본 사항과 스타일에 대한 자세한 내용은 [여기](http://yui.github.io/yuidoc/syntax/index.html)를 참조하세요. **행 길이를 80열로 제한하며, 넘어갈 경우 새 행에서 시작하세요.** -__[필요한 예제 목록](https://github.com/processing/p5.js/issues/1954) (grunt로 라이브러리를 작성하고 로그 메시지를 확인하여 최신 목록을 볼 수도 있습니다.)__ +**[필요한 예제 목록](https://github.com/processing/p5.js/issues/1954) (grunt로 라이브러리를 작성하고 로그 메시지를 확인하여 최신 목록을 볼 수도 있습니다.)** ## 요소 타입 및 설명 지정 요소에는 `@class`, `@method`, `@property`, `@event` 4 가지 종류가 있습니다. 요소가 문서에 나타나려면 다음 중 하나를 지정하고, 그 뒤에 요소 이름이 있어야 하며 상단에 설명이 표시되어야합니다. 몇 가지 서식 지정 팁 : + * 마크 다운 문법을 사용해 설명 텍스트의 형식을 지정할 수 있습니다. * 모든 함수, 변수 또는 상수 이름은 양쪽에 작은 따옴표를 사용하여 '고정 폭'을 가져야 합니다. * 두개의 줄 바꿈은 새 단락으로 인식됩니다. `

` 태그를 삽입 할 필요가 없습니다. @@ -118,6 +115,7 @@ __[필요한 예제 목록](https://github.com/processing/p5.js/issues/1954) (gr ``` 참고: + * 이전에 매개 변수가 정의 된 경우 'a'와 같이 정의할 내용을 다시 채울 필요가 없습니다. * 두 표기의 유일한 차이점이 선택적인 매개 변수의 유뮤일 경우 별도의 표기를 할 필요가 없습니다. * [배경](https://github.com/processing/p5.js/blob/f38f91308fdacc2f1982e0430b620778fff30a5a/src/color/setting.js#L106) 및 [색상](https://github.com/processing/p5.js/blob/f38f91308fdacc2f1982e0430b620778fff30a5a/src/color/creating_reading.js#L241)의 소스 코드에서 해당 인라인의 두 가지 예제를 살펴 볼 수 있습니다. @@ -136,7 +134,6 @@ __[필요한 예제 목록](https://github.com/processing/p5.js/issues/1954) (gr PI: PI ``` - 프로퍼티 또는 변수가 private 변수 인 경우 `@private`를 사용합니다 (기본값은 `@public`이므로 지정할 필요가 없음). ```js @@ -151,7 +148,7 @@ __[필요한 예제 목록](https://github.com/processing/p5.js/issues/1954) (gr ## 파일에 대한 모듈 지정 -각 *파일* 상단에는 `@module` 태그가 있어야합니다. 모듈은 JavaScript 파일 (또는 require.js 모듈)과 일치해야 하며, 항목리스트에서 그룹으로 작업할 수 있습니다. 여기를 참조해주세요: http://p5js.org/api/#methods(모듈은 COLOR, IMAGE, PVECTOR 등이 있습니다.) +각 *파일* 상단에는 `@module` 태그가 있어야합니다. 모듈은 JavaScript 파일 (또는 require.js 모듈)과 일치해야 하며, 항목리스트에서 그룹으로 작업할 수 있습니다. 여기를 참조해주세요: [http://p5js.org/api/#methods(모듈은](http://p5js.org/api/#methods\(모듈은) COLOR, IMAGE, PVECTOR 등이 있습니다.) ```js /** @@ -162,7 +159,6 @@ define(function (require) { }; ``` - ## 생성자 생성자는 `@class`로 정의됩니다. 각 생성자는 `@class` 태그와 클래스명, `@constructor` 태그 및 필요한 모든 `@param` 태그를 가지고 있어야 합니다. @@ -195,7 +191,7 @@ arc(50, 55, 70, 70, PI, PI+QUARTER_PI); arc(50, 55, 80, 80, PI+QUARTER_PI, TWO_PI);
-``` +``` 하나의 함수에 대해 여러 예제를 가질 수 있습니다. 단, `
`으로 감싸져서 줄바꿈으로 구분된 예제에는 하나의 @example를 가질 수 있습니다. @@ -211,6 +207,7 @@ arc(50, 55, 80, 80, PI+QUARTER_PI, TWO_PI); ``` 예제에서 코드를 실행하지 않으려면 (예: 코드만 표시하려는 경우) div에 "norender" 클래스를 포함해 주세요: + ``` @example
@@ -219,6 +216,7 @@ arc(50, 55, 80, 80, PI+QUARTER_PI, TWO_PI); ``` 예제가 빌드 테스트의 일부로 실행되는 것을 원하지 않는 경우 (예: 예제에 사용자 인터렉션이 필요하거나 headless-Chrome 테스트 프레임 워크에서 지원하지 않는 기능을 사용하는 경우) div에 "notest" 클래스를 포함합니다.: + ``` @example
@@ -232,6 +230,7 @@ function setup() { 외부 에셋 파일에 연결해야 하는 경우, [/docs/yuidoc-p5-theme/assets](https://github.com/processing/p5.js/tree/main/docs/yuidoc-p5-theme/assets)에 파일을 넣고 "assets/filename.ext"로 연결합니다. [tint 예제](http://p5js.org/reference/#/p5/tint)를 참조해주세요. ### alt-text 추가 + 마지막으로, 추가하는 모든 예제에 [alt-text](https://moz.com/learn/seo/alt-text)을 추가해 시각 장애인이 화면에 보여지는 예시를 이해할 수 있도록 합니다. 주어진 함수(각각 아래의 개별 `@alt` 태그가 아님)에 모든 예제 끝에 `@alt` 태그를 추가할 수 있으며, 여러 예제에 대한 설명을 구분하기 위해 줄 바꿈을 추가합니다. ``` @@ -268,22 +267,19 @@ horizontal wave pattern effected by mouse x-position & updating noise values. ``` ## 메소드를 위한 템플릿 + 여기 잘 문서화된 메소드에 대한 예제가 있습니다. 새로운 메소드를 생성하기 위해, [이 템플릿](https://github.com/processing/p5.js/tree/main/contributor_docs/method.example.js)을 사용할 수 있습니다. 텍스트를 메소드의 변수로 바꾸고, 남겨진 변수는 제거 할 수 있습니다. ![메서드에 대한 인라인 문서 예제를 보여주는 이미지](https://raw.githubusercontent.com/processing/p5.js/main/contributor_docs/images/method-template-example.png) - ## 문서 생성 * 먼저 `npm run docs`를 한 번 실행하여 필요한 모든 로컬 파일과 소스 코드의 참조 사본을 생성합니다. yuidoc 레퍼런스 페이지 뒤에서 코어 JS 파일을 변경할 때마다 다시 실행해주세요. 이는 src의 인라인 문서 변경이 아니라 yuidoc-p5-theme-src 폴더에있는 파일에 대한 변경 사항입니다. * 소스 코드만 변경했다면 `npm run grunt yui`만 실행할 수 있지만 `npm run grunt yui:build`도 사용할 수 있습니다. * `npm run docs:dev`를 실행하여 변경할 때마다 업데이트되는 사이트의 실시간 미리보기를 할 수 있습니다.(변경 한 후 페이지를 새로고침해야 표시됩니다.) -빌드 레퍼런스는 docs/reference에서 찾을 수 있으며. 로컬에서 미리 보려면 `npm run grunt yui:dev`를 실행해 http://localhost:9001/docs/reference/ 에서 살펴보세요. - +빌드 레퍼런스는 docs/reference에서 찾을 수 있으며. 로컬에서 미리 보려면 `npm run grunt yui:dev`를 실행해 [http://localhost:9001/docs/reference/](http://localhost:9001/docs/reference/) 에서 살펴보세요. ## 스페인어 버전 [스페인어 버전](http://p5js.org/es/reference)은 약간 다르게 생성되었습니다. 해당 자료를 업데이트하기위한 [안내](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution/)는 다음과 같습니다. - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/internationalization.mdx b/src/content/contributor-docs/ko/internationalization.mdx index 9737aef046..2285a3f941 100644 --- a/src/content/contributor-docs/ko/internationalization.mdx +++ b/src/content/contributor-docs/ko/internationalization.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 🌐 국제화 [국제화](https://developer.mozilla.org/docs/Glossary/Internationalization_and_localization)(때로는 약어로 "i18n"이라 칭하기도 함)는 소프트웨어 프로젝트에서 다국어를 지원하는 것을 가리킵니다. 종종 프로젝트에서 사용되는 텍스트 문자열의 번역을 유지보수하고, 또는 사용자가 수신 할 번역을 선택 (또는 브라우저 설정에서 감지) 하는 것을 의미합니다. @@ -55,13 +51,14 @@ translator에게 사용자가 선호하는 언어로 "sketch.loading" 메시지 ```js console.log('I couldnt find ' + file.name + '. Are you sure it's there?') ``` + 다음과 같은 모습을 가지게 될 것입니다. ```js console.log(translator('fileLoading.notFound', { fileName: file.name })) ``` -이와 같은 번역에서는 특정 이름을 사용하는 변수가 필요하므로 반드시 해당 이름을 사용해야 합니다. 변수명을 확인하기 위해 번역파일 (translations/{YOUR_LANGUAGE})을 확인해 보세요. 번역은 번역키 안에 오브젝트 경로 아래에서 찾아볼 수 있습니다. +이와 같은 번역에서는 특정 이름을 사용하는 변수가 필요하므로 반드시 해당 이름을 사용해야 합니다. 변수명을 확인하기 위해 번역파일 (`translations/{YOUR_LANGUAGE}`)을 확인해 보세요. 번역은 번역키 안에 오브젝트 경로 아래에서 찾아볼 수 있습니다. "`fileLoading.notFound`"는 다음에서 찾아볼 수 있습니다. @@ -90,4 +87,3 @@ console.log(translator('fileLoading.notFound', { fileName: file.name })) ### 좀더 살펴보기 [i18next 번역 기능 문서](https://www.i18next.com/translation-function/essentials)를 살펴보세요. 위에서 설명된 모든 내용들은 단 일부 기능들 일 뿐입니다. - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/issue_labels.mdx b/src/content/contributor-docs/ko/issue_labels.mdx index 96e6734635..6d3e64e5f3 100644 --- a/src/content/contributor-docs/ko/issue_labels.mdx +++ b/src/content/contributor-docs/ko/issue_labels.mdx @@ -1,7 +1,3 @@ - ---- - ---- # p5.js 이슈 라벨 p5.js는 이슈를 정렬하고 구성하기 편하도록 여러가지 라벨을 사용하고 있습니다. @@ -10,41 +6,43 @@ p5.js는 이슈를 정렬하고 구성하기 편하도록 여러가지 라벨을 ## 상태 -라벨 | 사용법 -------------------- | ------------- -help_wanted | 해결 방법을 모르고, 기여자를 찾으며, 사람들이 쉽게 접근 할 수 있는 지점을 찾을 때(새로운 개발자가 문제를 제기한 이슈를 가리킬 수도 있음) -inconsistent_style | 깔끔하지 못한 코드, 혼란스러운 문법, 불충분한 문서 -duplicate | 이슈가 이미 존재 할 경우 -missing_test | 자동화된 테스트가 필요한 기능이나 API -wont_fix | 타당한 이슈지만 커뮤니티 동의 하에 처리 되지 않은 이슈 -gsoc | Google Summer of Code에서 이미 보고 된 문제 -invalid | 더 이상 관련 없으며(예를 들면 오래된 API에서 기능 요청) 사실상 문제가 아닐 경우 -discussion | 문제가 무엇인지 알고, 해결책을 결정하기 위해 커뮤니티의 의견이 필요할 경우 -question | 불확실한 문제 혹은 좀 더 명확함이 요구되는 문제일 경우 -feature | 코드베이스에 추가 혹은 개선 -regression | 기능은 일단 동작했지만 이후로 고장난 경우, 불안정한 기능이나 컴포넌트를 식별하는데 유용. - +| 라벨 | 사용법 | +| ------------------- | -------------------------------------------------------------------------------- | +| help\_wanted | 해결 방법을 모르고, 기여자를 찾으며, 사람들이 쉽게 접근 할 수 있는 지점을 찾을 때(새로운 개발자가 문제를 제기한 이슈를 가리킬 수도 있음) | +| inconsistent\_style | 깔끔하지 못한 코드, 혼란스러운 문법, 불충분한 문서 | +| duplicate | 이슈가 이미 존재 할 경우 | +| missing\_test | 자동화된 테스트가 필요한 기능이나 API | +| wont\_fix | 타당한 이슈지만 커뮤니티 동의 하에 처리 되지 않은 이슈 | +| gsoc | Google Summer of Code에서 이미 보고 된 문제 | +| invalid | 더 이상 관련 없으며(예를 들면 오래된 API에서 기능 요청) 사실상 문제가 아닐 경우 | +| discussion | 문제가 무엇인지 알고, 해결책을 결정하기 위해 커뮤니티의 의견이 필요할 경우 | +| question | 불확실한 문제 혹은 좀 더 명확함이 요구되는 문제일 경우 | +| feature | 코드베이스에 추가 혹은 개선 | +| regression | 기능은 일단 동작했지만 이후로 고장난 경우, 불안정한 기능이나 컴포넌트를 식별하는데 유용. | ## 심각성 + 버그가 p5.js 사용자와 개발자에게 미치는 영향도 분류 -라벨 | 사용법 -------------------- | ------------- -severity:critical | 다른 개발자들의 작업을 중단 시킴(예를 들면 빌드가 깨진 경우) 혹은 라이브러리 또는 IDE 사용자의 데이터 손실 -severity:major | 중요한 컴포넌트안에서 기능 손실 -severity:minor | 다수의 사용자들에게서 잘 발견되지 않은 작은 이슈 혹은 사용자가 마주했을때 사소한 성가심을 일으킬 수 있는 무언가; 또는 알려진 해결 방법이 있는 무언가 +| 라벨 | 사용법 | +| ----------------- | ------------------------------------------------------------------------------------- | +| severity:critical | 다른 개발자들의 작업을 중단 시킴(예를 들면 빌드가 깨진 경우) 혹은 라이브러리 또는 IDE 사용자의 데이터 손실 | +| severity:major | 중요한 컴포넌트안에서 기능 손실 | +| severity:minor | 다수의 사용자들에게서 잘 발견되지 않은 작은 이슈 혹은 사용자가 마주했을때 사소한 성가심을 일으킬 수 있는 무언가; 또는 알려진 해결 방법이 있는 무언가 | ## 난이도 + 난이도에 따라 버그 및 기능 요청에 태그를 지정합니다. 초보자나 새 기여자가 해결할 수 있는 버그 또는 숙련된 기여자가 상당한 노력을 기울여야 하는 항목을 식별 하도록 도와줍니다. -라벨 | 사용법 -------------------- | ------------- -level:bite size | 새 개발자/주니어 개발자가 쉽게 해결 할 수 있을 경우 -level:moderate | 상당한 양의 작업이나 코드베이스에 익숙해야 할 경우 -level:advanced | 많은 양의 작업과 큰 수정이나 재구성이 필요할 경우 -level:unknown | 문제를 제기 한 사람이 알 수 없는 어려운 이슈일 경우 +| 라벨 | 사용법 | +| --------------- | ------------------------------ | +| level:bite size | 새 개발자/주니어 개발자가 쉽게 해결 할 수 있을 경우 | +| level:moderate | 상당한 양의 작업이나 코드베이스에 익숙해야 할 경우 | +| level:advanced | 많은 양의 작업과 큰 수정이나 재구성이 필요할 경우 | +| level:unknown | 문제를 제기 한 사람이 알 수 없는 어려운 이슈일 경우 | ## 영역 + 이슈에 영향을 받는 코드베이스 부분을 나타냅니다. * area:3d @@ -54,13 +52,14 @@ level:unknown | 문제를 제기 한 사람이 알 수 없는 어려운 * area:dom * area:events * area:examples -* area:image -* area:io -* area:math -* area:tutorial +* area:image +* area:io +* area:math +* area:tutorial * area:typography ## 운영체제/브라우저 + 이슈가 특정 운영체제 혹은 브라우저에만 영향을 주는 경우 이슈에 적절하게 태그를 지정해주세요. * chrome @@ -70,8 +69,7 @@ level:unknown | 문제를 제기 한 사람이 알 수 없는 어려운 * firefox * android * ios -* windows_mobile +* windows\_mobile * windows * osx * linux - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/organization.mdx b/src/content/contributor-docs/ko/organization.mdx index 1a8b33c60f..3ec2f8e1f6 100644 --- a/src/content/contributor-docs/ko/organization.mdx +++ b/src/content/contributor-docs/ko/organization.mdx @@ -1,32 +1,27 @@ - ---- - ---- # 체계적인 기여 + 저장소를 체계적으로 유지하면 어떤 토론과 작업이 가장 중요한지 항상 명확히 확인할 수 있습니다. 이를 통해 관리자에서 새로운 기여자까지 모든 사람이 혼란스럽지 않게 저장소를 탐색할 수 있습니다. 이것을 돕기 위해, 우리는 이슈를 정리하고, 작업하고, 풀 리퀘스트하는 방법에 대한 가이드라인이 있습니다. 조직을 돕는 것은 기여하는 좋은 방법이 될 수 있습니다. 만약 버그 리포트에 예제 코드 같은 정보가 누락되었다면 편히 누락된 정보를 요청하십시오. 담당자가 할당된 이슈에 60일 동안 아무 활동이 없다면 그 이슈에 코멘트를 남겨 담당자가 이슈를 계속 처리할 의사가 있는지 확인할 수 있습니다. 태스크를 정리하고 관리하는 일을 도울 때는 언제나 친절하고 항상 커뮤니티 가이드라인을 염두에 두십시오. - - # 조직 가이드라인 ## 이슈 -- **모든 버그 리포트는 샘플 코드를 포함해야 합니다** - - 이슈 본문에 코드를 포함하거나 [온라인 에디터](editor.p5js.org)에서 보기 적합한 코드 예시 링크여도 됩니다. -- **모든 이슈에는 최소 2개의 라벨이 있어야 합니다** -- 이렇게 하면 이슈를 훨씬 쉽게 탐색할 수 있습니다. - - 이 영역(webgl, core, image 등)의 라벨을 추가해 보십시오. -- **이슈는 희망자에게 먼저 할당됩니다** - - 버그가 재현되거나 커뮤니티에서 기능 요청/개선에 합의한 경우 그 이슈는 담당자를 할당할 수 있습니다. 이때 "제가 처리할게요!"라고 요청한 첫 번째 컨트리뷰터에게 이슈가 할당될 것입니다. - - 버그를 재현할 수 없거나 기능 요청/개선 합의가 명확하지 않은 경우라면 이슈를 할당해 달라고 요청하지 마십시오. -## 풀 리퀘스트 -- **모든 풀 리퀘스트는 이슈와 관련있어야 합니다** - - 버그를 수정하거나 기능을 추가하고 싶다면 먼저 이슈를 등록해서 커뮤니티가 그 점을 논의할 수 있게 합니다. - - 만약 관련된 이슈가 없는 풀 리퀘스트가 있다면 댓글을 달아서 컨트리뷰터에게 풀 리퀘스트를 열도록 요청하십시오. +* **모든 버그 리포트는 샘플 코드를 포함해야 합니다** + * 이슈 본문에 코드를 포함하거나 [온라인 에디터](editor.p5js.org)에서 보기 적합한 코드 예시 링크여도 됩니다. +* **모든 이슈에는 최소 2개의 라벨이 있어야 합니다** +* 이렇게 하면 이슈를 훨씬 쉽게 탐색할 수 있습니다. + * 이 영역(webgl, core, image 등)의 라벨을 추가해 보십시오. +* **이슈는 희망자에게 먼저 할당됩니다** + * 버그가 재현되거나 커뮤니티에서 기능 요청/개선에 합의한 경우 그 이슈는 담당자를 할당할 수 있습니다. 이때 "제가 처리할게요!"라고 요청한 첫 번째 컨트리뷰터에게 이슈가 할당될 것입니다. + * 버그를 재현할 수 없거나 기능 요청/개선 합의가 명확하지 않은 경우라면 이슈를 할당해 달라고 요청하지 마십시오. +## 풀 리퀘스트 +* **모든 풀 리퀘스트는 이슈와 관련있어야 합니다** + * 버그를 수정하거나 기능을 추가하고 싶다면 먼저 이슈를 등록해서 커뮤니티가 그 점을 논의할 수 있게 합니다. + * 만약 관련된 이슈가 없는 풀 리퀘스트가 있다면 댓글을 달아서 컨트리뷰터에게 풀 리퀘스트를 열도록 요청하십시오. # 의사결정 가이드라인 @@ -38,9 +33,7 @@ p5는 의사결정 프로세스가 가능한 투명하고 수평적이기를 희 > 향후에는 위의 조직화와 의사결정 프로세스를 자동화하는 것이 좋을 것입니다. -> 위의 항목 중 어느 것이든 봇이나 깃헙 액션으로 자동화하는 방법에 대한 아이디어가 있다면 이를 제안하는 이슈를 자유롭게 여십시오! - - +> 위의 항목 중 어느 것이든 봇이나 깃헙 액션으로 자동화하는 방법에 대한 아이디어가 있다면 이를 제안하는 이슈를 자유롭게 여십시오! # 스튜어드 @@ -49,5 +42,3 @@ p5는 의사결정 프로세스가 가능한 투명하고 수평적이기를 희 관심있는 사람은 누구나 스튜어드로 자원봉사할 수 있습니다! 전문 지식에 대한 구체적인 요구사항은 없습니다. 적극적으로 배우고 참여하는 데 관심이 있으면 됩니다. 이 프로젝트에서 하나 이상의 부분을 잘 안다면 이슈를 열어서 스튜어드로 자원하십시오! 스튜어드가 되면 [README 문서 스튜어드 섹션](https://github.com/processing/p5.js#stewards)에 이름이 올라가며, 삭제 요청이 있기 전까지 남아 있을 것입니다. 장기간 스튜어드의 활동이 없으면 우리는 활동 지속 여부를 물을 수도 있습니다. 잠시 쉬었다 다시 활동해도 됩니다! - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/preparing_a_pull_request.mdx b/src/content/contributor-docs/ko/preparing_a_pull_request.mdx index 46b14292d7..bc80cc3f51 100644 --- a/src/content/contributor-docs/ko/preparing_a_pull_request.mdx +++ b/src/content/contributor-docs/ko/preparing_a_pull_request.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 풀 리퀘스트 준비하기 풀 리퀘스트는 코드가 최신 일 때 더 쉽습니다! git rebase를 사용하면 다른 기여자의 변경 사항을 통합하고 코드를 업데이트할 수 있습니다. 방법은 다음과 같습니다. @@ -9,48 +5,52 @@ ## 저장하고 업데이트하기 ### 작업한 내용 모두 저장해주세요! - git status - git add -u - git commit + +git status +git add -u +git commit ### 변경사항을 확인해주세요 + upstream p5.js 저장소를 트래킹하고 있는지 확인해주세요. - $ git remote show upstream +$ git remote show upstream 에러를 보게 되면, 메인 p5.js 저장소를 "upstream" 원격 저장소로 트래킹해야 합니다. 이 작업은 한 번만 하면 됩니다! 하지만, 두 번 실행해도 아무 문제 없습니다. - $ git remote add upstream https://github.com/processing/p5.js +$ git remote add upstream [https://github.com/processing/p5.js](https://github.com/processing/p5.js) 그런 다음 git에서 최신 변경 사항을 확인해 봅니다. - $ git fetch upstream +$ git fetch upstream ### 만일의 경우를 대비해, 변경사항을 새 브랜치로 복사하세요. - $ git branch your-branch-name-backup + +$ git branch your-branch-name-backup ### main 브랜치로부터의 변경사항을 *적용한 후* 여러분이 작업한 변경 사항을 추가하세요 - $ git rebase upstream/main + +$ git rebase upstream/main ### 충돌 해결하기 + 충돌이 있을 수 있습니다! lib/p5.js와 lib/p5.min.js라면 쉽게 고칠 수 있습니다. grunt로 프로젝트를 재빌드합니다. - grunt - git add -u - git rebase --continue +grunt +git add -u +git rebase --continue 다른 파일과 충돌이 있고, 어떻게 해결해야 하는지 모른다면... 도움을 요청해 주세요! ### 마침내 - $ git push origin -기술적으로 세부사항에 대해 궁금한 점이 있을 경우, 여기 리베이싱에 대한 좋은 레퍼런스가 있습니다. https://www.atlassian.com/git/tutorials/merging-vs-rebasing +$ git push origin + +기술적으로 세부사항에 대해 궁금한 점이 있을 경우, 여기 리베이싱에 대한 좋은 레퍼런스가 있습니다. [https://www.atlassian.com/git/tutorials/merging-vs-rebasing](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) ## 풀리퀘스트 생성하기 여기 [github에서 풀 리퀘스트를 생성하는 것에 대한 안내서](https://help.github.com/articles/creating-a-pull-request/)가 있습니다. 원하는 이름으로 브랜치명을 지정할 수 있습니다. p5.js의 "main" 브랜치를 대상으로 풀 리퀘스트를 요청합니다. 풀 리퀘스트를 제출하면, 다른 분들이 가능할 때 즉시 검토되고, 머지 될 것입니다. 변경사항은 p5.js 라이브러리의 다음 릴리와 함께 나갈 것입니다. - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/release_process.mdx b/src/content/contributor-docs/ko/release_process.mdx index ca4782022c..bd8b9d7517 100644 --- a/src/content/contributor-docs/ko/release_process.mdx +++ b/src/content/contributor-docs/ko/release_process.mdx @@ -1,19 +1,17 @@ - ---- - ---- # 배포 프로세스 ## 접근법 -* 우리는 `주:부:수` 버전 패턴을 따르는 유의적 버전 관리 패턴을 따릅니다. +* 우리는 `주:부:수` 버전 패턴을 따르는 유의적 버전 관리 패턴을 따릅니다. ## 요구사항 + * Git, node.js, NPM이 여러분의 시스템에 설치되어 있어야 합니다. * NPM CLI에 로그인 되어 있어야 합니다: `npm whoami`에 로그인되어 있는지 확인합니다. * 높은 대역폭: 다운로드/풀/푸쉬 할것이 많습니다. (총 \~190MB 예상) ## 사용법 + ```shell $ npm run release ``` @@ -21,32 +19,34 @@ $ npm run release * 빌드 단계가 실행되며 프로세스를 마치려면 `np`에서 제공하는 프롬프트를 따라야합니다. * 그 다음 빌드 단계에서는 grunt 태스크를 실행해 라이브러리의 zip 버전을 생성하고, bower에서 릴리즈 하고, 웹사이트에 해당 레퍼런스를 릴리즈 합니다. - ## 실제로 일어나는 일 + * `npm run release`는 [`np`](https://www.npmjs.com/package/np)를 실행하여 먼저 하위 프로세스를 만들어내는 `grunt release-p5`의 별칭입니다. -* `np`는 로컬 저장소를 체크하고, 릴리즈를 생성하기 위해 설정을 준비하므로써 시작합니다. -계속 진행하기 위해 로컬 저장소에 커밋이 안된 변경사항이 있으면 안됩니다. +* `np`는 로컬 저장소를 체크하고, 릴리즈를 생성하기 위해 설정을 준비하므로써 시작합니다. + 계속 진행하기 위해 로컬 저장소에 커밋이 안된 변경사항이 있으면 안됩니다. * `np`는 `node_modules`를 재설치하고, `npm test`로 테스트를 실행합니다. * `np`는 처음에 선택한 항목에 따라 버전을 범프합니다. * 만약 이전 단계가 실패하면, 해당 저장소는 `npm run release`를 실행하기 전 초기 단계로 돌아갑니다. * 업데이트된 버전 넘버로 문서와 라이브러리를 빌드하기 위해 `package.json`안에 `prepublishOnly`에 언급된 태스크가 실행(`grunt prerelease`) 됩니다. * NPM 패키지가 게시됩니다. - * NPM에 출시: `package.json`에 `files`에 언급된 파일들만 게시됩니다. + * NPM에 출시: `package.json`에 `files`에 언급된 파일들만 게시됩니다. * 태그들과 로컬 커밋들을 git remote에 푸쉬됩니다. * 초안 릴리즈는 수정할 수 있는 변경로그들과 함께 github.com에 생성됩니다. * `lib` 폴더 안에(현재 빈 예제가 포함되어 있음) Zip 파일 `p5.zip`을 생성하며 위에서 생성한 GitHub Release 초안에 업로드 되어야 합니다. - * 이 프로세스가 완료되면 `release/` 를 가리키는 창이 열리고 해당 창에는 Github Release의 일부로 업로드해야 하는 모든 파일을 포함하고 있습니다. + * 이 프로세스가 완료되면 `release/` 를 가리키는 창이 열리고 해당 창에는 Github Release의 일부로 업로드해야 하는 모든 파일을 포함하고 있습니다. * 새로 빌드 된 라이브러리를 Bower용 [p5.js-release](https://github.com/processing/p5.js-release) 저장소에 푸시합니다. * 새로 빌드 된 참조를 [p5.js-website](https://github.com/processing/p5.js-website)에 푸시합니다. ## 테스팅 + 저장소에 대한 푸시 액세스 권한이 있는 경우: + * `npm run release---preview`를 실행하여 릴리스 프로세스를 간단하게 실행 할 수 있습니다. 이 단계를 실행하더라도 git 추적 파일이 변경되지 않으며 리모트에 푸시되지 않습니다. 저장소에 대한 푸시 액세스 권한이 없는 경우: + * `package.json`의 `name` 필드를 네임스페이스 버전으로 편집해야합니다. 예를 들면, 평소처럼 `npm run release---preview`를 실행하기 전에 `@username/p5`을 입력하고 이러한 번경사항을 git에 커밋합니다. NPM에 패키지된 네임스페이스에 패키지를 게시하지 않도록 선택하라는 메시지가 표시되면, 온라인에는 아무 것도 게시되지 않습니다. * `package.json`의 `name` 필드를 편집 한 경우 `npm run release`로 릴리스의 전체 테스트를 실행할 수 잇습니다. Bower 릴리스와 웹 사이트에 복제하고 푸시할 위치를 선택하려며, 다음과 같이 추가 인수를 지정 할 수 있습니다: -`npm run release -- --bowerReleaser=username`. + `npm run release -- --bowerReleaser=username`. -__참고:__ `np` (`6.2.0`)에는 현재 네임스페이스 패키지 이름으로 릴리스를 막는 [bug](https://github.com/sindresorhus/np/issues/508)가 존재하며, 이것을 테스트해야하는 경우 `5.2.1`로 되돌릴 수 있습니다. 그렇지 않으면 릴리즈 단계에서 실패합니다. - \ No newline at end of file +**참고:** `np` (`6.2.0`)에는 현재 네임스페이스 패키지 이름으로 릴리스를 막는 [bug](https://github.com/sindresorhus/np/issues/508)가 존재하며, 이것을 테스트해야하는 경우 `5.2.1`로 되돌릴 수 있습니다. 그렇지 않으면 릴리즈 단계에서 실패합니다. diff --git a/src/content/contributor-docs/ko/roadmap.mdx b/src/content/contributor-docs/ko/roadmap.mdx index 7ae210b94e..e3b756d11b 100644 --- a/src/content/contributor-docs/ko/roadmap.mdx +++ b/src/content/contributor-docs/ko/roadmap.mdx @@ -1,14 +1,11 @@ +# p5.js 1.0 로드맵 \[진행 중] ---- - ---- -# p5.js 1.0 로드맵 [진행 중] - -이 문서는 향후 p5.js 1.0 버전의 기능, 개선사항 및 유지보수 목록입니다. 첫 번째 초안은 UCLA 디자인 미디어 아트 실무그룹에서 작성했고, 여러분의 피드백을 위해 내놓습니다. 이것은 업데이트될 수 있는 초안이며, 2019년 8월 p5.js 기여자 컨퍼런스에서 대폭 수정될 것입니다. 우리의 목표는 2019년 말까지 p5.js 1.0 버전을 출시하는 것입니다. +이 문서는 향후 p5.js 1.0 버전의 기능, 개선사항 및 유지보수 목록입니다. 첫 번째 초안은 UCLA 디자인 미디어 아트 실무그룹에서 작성했고, 여러분의 피드백을 위해 내놓습니다. 이것은 업데이트될 수 있는 초안이며, 2019년 8월 p5.js 기여자 컨퍼런스에서 대폭 수정될 것입니다. 우리의 목표는 2019년 말까지 p5.js 1.0 버전을 출시하는 것입니다. ES6 마이그레이션을 제외하고, 여기에 있는 태스크들은 우선순위대로 기재된 것은 아닙니다. 깃헙 [마일스톤](https://github.com/processing/p5.js/milestones)은 릴리즈 작업 우선순위를 정하고 진행상황을 추적하는 곳입니다. ## ES6 마이그레이션 + * 1단계: 사용자측 * p5js.org 튜토리얼(튜토리얼별 이슈) * p5js.org 예제(섹션별 이슈) @@ -23,15 +20,17 @@ ES6 마이그레이션을 제외하고, 여기에 있는 태스크들은 우선 * 기여 라이브러리 ## 유지보수 + * 보류 중인 크롬 변경사항에 대한 오디오 업데이트(사용자가 먼저 반응해야 함) * 참조 문서와 예제, 예제 페이지 업데이트 * FES를 업데이트하여 이에 대해 경고하시겠습니까? * 더 완전한 단위 테스트 * 이를 위한 더 명확한 튜토리얼 * 친절한 에러 시스템 문서 개선 - * 이 과정에서 일어나는 상황을 더 상세히 남기려면 https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js 에 코멘트하세요. + * 이 과정에서 일어나는 상황을 더 상세히 남기려면 [https://github.com/processing/p5.js/blob/main/src/core/friendly\_errors/fes\_core.js](https://github.com/processing/p5.js/blob/main/src/core/friendly_errors/fes_core.js) 에 코멘트하세요. ## 버그 수정 + * 모바일 디바이스 지원/업그레이드 * WebGL 신뢰성 * 조명 효과 @@ -43,6 +42,7 @@ ES6 마이그레이션을 제외하고, 여기에 있는 태스크들은 우선 * 쉐이프 단일 렌더링 방법, 고정 모드에서 기하 오브젝트 생성 ## 새로운 기능 + * 쉐이프 * p5.Geometry 오브젝트를 반환하기 위한 createShape() 공개 API?? 2D에 해당하는 것은? * 2D용 SVG는 없나? @@ -57,8 +57,9 @@ ES6 마이그레이션을 제외하고, 여기에 있는 태스크들은 우선 * 라이브러리 전체에서 Promises 구현 * 코드베이스에서 Promises 사용 확인/구현 * loadX() 함수 API에서 Promises 공개 사용(우선순위 낮음?) - + ## 기여자 프로세스와 지원 + * 다양한 영역에서 미완성에 대한 티켓 오픈: * 테스팅 * 기능 구현 @@ -67,6 +68,5 @@ ES6 마이그레이션을 제외하고, 여기에 있는 태스크들은 우선 * 향후 버전 로드맵 입력을 요청하는 프로세스를 명확히 합니다. ## 기타 -* 1.0 버전 릴리즈의 경우, 아티스트와 코더가 큐레이션한 새로운 예시 세트를 삭제하십시오. - \ No newline at end of file +* 1.0 버전 릴리즈의 경우, 아티스트와 코더가 큐레이션한 새로운 예시 세트를 삭제하십시오. diff --git a/src/content/contributor-docs/ko/sidebar.mdx b/src/content/contributor-docs/ko/sidebar.mdx index 75aec5c3cb..6ccb304afc 100644 --- a/src/content/contributor-docs/ko/sidebar.mdx +++ b/src/content/contributor-docs/ko/sidebar.mdx @@ -1,29 +1,23 @@ +{/* docs/_sidebar.md */} ---- - ---- - - -- [__기여방법 소개__](README/) -- __CONTRIBUTING DOCS__ - - [문서 기여](contributing_documentation/) - - [이슈라벨](issue_labels/) -- __CONTRIBUTING THOUGHTS__ - - [토론](discussions/) - - [디자인 원칙](design_principles/) - - [로드맵](roadmap/) - - [단체에 기여하는 법](organization/) -- __CONTRIBUTING CODE__ - - [라이브러리 생성](creating_libraries/) - - [풀리퀘스트 생성](preparing_a_pull_request/) - - [인라인 문서](inline_documentation/) - - [벤치마킹](benchmarking_p5/) - - [단위 테스팅](unit_testing/) - - [친절한 에러 시스템](friendly_error_system/) - - [배포 절차](release_process/) -- __RELATED INFO__ - - [WebGL 아키텍처](webgl_mode_architecture/) - - [지원 브라우저](supported_browsers/) - - [사용자 지정 빌드](custom_p5_build/) - - \ No newline at end of file +* [**기여방법 소개**](README/) +* **CONTRIBUTING DOCS** + * [문서 기여](contributing_documentation/) + * [이슈라벨](issue_labels/) +* **CONTRIBUTING THOUGHTS** + * [토론](discussions/) + * [디자인 원칙](design_principles/) + * [로드맵](roadmap/) + * [단체에 기여하는 법](organization/) +* **CONTRIBUTING CODE** + * [라이브러리 생성](creating_libraries/) + * [풀리퀘스트 생성](preparing_a_pull_request/) + * [인라인 문서](inline_documentation/) + * [벤치마킹](benchmarking_p5/) + * [단위 테스팅](unit_testing/) + * [친절한 에러 시스템](friendly_error_system/) + * [배포 절차](release_process/) +* **RELATED INFO** + * [WebGL 아키텍처](webgl_mode_architecture/) + * [지원 브라우저](supported_browsers/) + * [사용자 지정 빌드](custom_p5_build/) diff --git a/src/content/contributor-docs/ko/supported_browsers.mdx b/src/content/contributor-docs/ko/supported_browsers.mdx index 336447250c..e57ce77d88 100644 --- a/src/content/contributor-docs/ko/supported_browsers.mdx +++ b/src/content/contributor-docs/ko/supported_browsers.mdx @@ -1,7 +1,3 @@ - ---- - ---- #### 이 페이지는 최신이 아닙니다. 업데이트를 도와주세요! 아래 명시된 목표를 확인하세요. # 지원되는 브라우저 @@ -19,18 +15,16 @@ 2018년 9월을 기준으로 다음을 지원합니다: -|Browser | Current Version | Previous Version| Notes -|-------------------|------------------:|----------------:|-------------- -|Internet Explorer | v. 11 | Not supported | No support for WebAudio -|Microsoft Edge | v. 42 | v. 41 | -|Chrome | v. 68 | v. 67 | -|Chrome for Android | v. 68 | v. 67 | -|Firefox | v. 61 | v. 60 | -|Safari | v. 11 | Not supported | -|iOS Safari | v. 11.4 | v. 11.2 | -|Opera | v. 54 | v. 53 | - +| Browser | Current Version | Previous Version | Notes | +| ------------------ | --------------: | ---------------: | ----------------------- | +| Internet Explorer | v. 11 | Not supported | No support for WebAudio | +| Microsoft Edge | v. 42 | v. 41 | | +| Chrome | v. 68 | v. 67 | | +| Chrome for Android | v. 68 | v. 67 | | +| Firefox | v. 61 | v. 60 | | +| Safari | v. 11 | Not supported | | +| iOS Safari | v. 11.4 | v. 11.2 | | +| Opera | v. 54 | v. 53 | | 여러 브라우저에서 알려진 모든 이슈를 나열했지만 브라우저에서 지원되는 기능 전체 목록을 보려면 [caniuse.com](http://caniuse.com)를 방문해 특정 기능 (예 : [WebGL](http://caniuse.com/#search=webgl) )을 검색하세요. - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/unit_testing.mdx b/src/content/contributor-docs/ko/unit_testing.mdx index b454fcfa92..6b17f7b8ea 100644 --- a/src/content/contributor-docs/ko/unit_testing.mdx +++ b/src/content/contributor-docs/ko/unit_testing.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 단위 테스팅 단위 테스트를 사용하여 코드베이스의 개별 컴포넌트가 예상대로 작동하는지 확인합니다. @@ -28,7 +24,7 @@ npm test 단일 테스트나 그룹 테스트를 실행하기 위해, `.js` 파일에 `suite` 혹은 `test`에 `.only`를 붙이고 위에 명령어를 사용해 테스트를 실행합니다. -**`.only`를 커밋하지 않도록 주의해주세요**(저희는 항상 CI가 _모든_ 단위 테스트를 실행하기를 원합니다.) +**`.only`를 커밋하지 않도록 주의해주세요**(저희는 항상 CI가 *모든* 단위 테스트를 실행하기를 원합니다.) #### 예제 @@ -62,9 +58,9 @@ suite.only('color/p5.ColorConversion', function() { 이러한 테스트는 현재 브라우저 테스트에서만 사용할 수 있습니다(대부분의 테스트가 실행되는 위치): -- `test/js/mocha_setup.js` mocha의 몇가지 옵션을 설정 -- `test/js/chai_helpers.js` chai 설정 및 `chai.assert` 에 도움되는 몇가지 함수 추가 -- `test/js/p5_helpers.js` p5 스케치의 테스트를 도와주는 몇가지 헬퍼 함수 추가 +* `test/js/mocha_setup.js` mocha의 몇가지 옵션을 설정 +* `test/js/chai_helpers.js` chai 설정 및 `chai.assert` 에 도움되는 몇가지 함수 추가 +* `test/js/p5_helpers.js` p5 스케치의 테스트를 도와주는 몇가지 헬퍼 함수 추가 Node.js를 위한 설정은 `test/mocha.opts`에서 모두 수행됩니다. @@ -88,12 +84,12 @@ p5.js 레파지토리에서 풀리퀘스트를 오픈하면, 자동으로 [테 **예상되는 동작:** boolean 시스템 변수는 키를 누르는 경우 참이고 키를 누르지 않으면 거짓입니다. 이제 예상되는 동작에 대한 다양한 테스트를 생각할 수 잇습니다. 가능한 테스트 케이스는 다음과 같습니다: -- 변수가 boolean이다. -- 키를 누르면 참이어야 한다 -- 어떠한 키(알파벳 키, 숫자 키, 특수문자 키 등)를 누르더라도 참이어야 한다. -- 여러 키를 누르면 참이어야 한다. -- 키를 누르지 않으면 거짓이어야 한다. -- 더 생각나는 것이 있다면, 계속해서 테스트를 추가하세요! +* 변수가 boolean이다. +* 키를 누르면 참이어야 한다 +* 어떠한 키(알파벳 키, 숫자 키, 특수문자 키 등)를 누르더라도 참이어야 한다. +* 여러 키를 누르면 참이어야 한다. +* 키를 누르지 않으면 거짓이어야 한다. +* 더 생각나는 것이 있다면, 계속해서 테스트를 추가하세요! `p5.prototype.isKeyPressed`를 위한 테스트 스위트를 생성하고, 테스트를 작성할 수 잇습니다. 단위테스트를 구성하기 위해 mocha를 사용할 것입니다. @@ -124,5 +120,3 @@ test('keyIsPressed is a boolean', function() { ``` 유사하게, 해당 값이 참인지 확인하기 위해 `assert.strictEqual(myp5.keyIsPressed, true)` 사용 할 수 잇습니다. chai의 assert에 대해 [여기](https://www.chaijs.com/api/assert/)에서 좀더 살펴 볼수 잇습니다. 테스트를 작성 했으므로 테스트를 실행하고 메소드가 예상대로 작동하는지 확인해보세요. 그렇지 않다면, 동일한 이슈를 생성하고, 원한다면 문제를 해결 볼 수 있습니다! - - \ No newline at end of file diff --git a/src/content/contributor-docs/ko/webgl_mode_architecture.mdx b/src/content/contributor-docs/ko/webgl_mode_architecture.mdx index 677ec07e67..db0801dfd9 100644 --- a/src/content/contributor-docs/ko/webgl_mode_architecture.mdx +++ b/src/content/contributor-docs/ko/webgl_mode_architecture.mdx @@ -1,7 +1,3 @@ - ---- - ---- # p5.js WEBGL 모드 아키텍쳐 이 문서는 p5.js 기여자, 메인테이너 및 기타 이해 관계자를 위한 p5.js의 WEBGL 모드의 구조를 설명합니다. 스케치에서 3D 그래픽을 사용하는 데 관심이 있다면 대신에 [튜토리얼 보기](https://github.com/processing/p5.js/wiki/Getting-started-with-WebGL-in-p5)를 참조해주세요. @@ -26,7 +22,8 @@ p5.Renderer에서 파생되었으며 2D 모드에서 사용할 수 없는 추가 렌더러는 현재 그리기 조건에 적합한 p5.Shader를 선택하는 것을 관리합니다. -### p5.Shader +### p5.Shader + p5.Shader클래스는 GL 프로그램의 정형과 속성에 대한 액세스를 제공합니다. * vertex 및 프래그먼트 쉐이더 컴포넌트를 컴파일하고 연결합니다. @@ -52,34 +49,32 @@ p5.Texture 객체는 `p5.Image`,`p5.MediaElement`,`p5.Element` 또는 `ImageData * 꼭지점 세트에 대한 면, 법선, 선 꼭지점 및 선 법선을 계산하는 방법을 제공합니다. ## 즉시 모드 + 즉시 모드로 그려진 모든 속성은 렌더러의 객체에 저장되고, GL 드로잉 컨텍스트에 그리는데 사용 된 후 폐기됩니다. ## 지오메트리 : 고정 및 즉시 모드 -고정된 지오메트리는 3D 원형에 사용되는 반면 즉시 모드는 begin/endShape로 만든 모양에 사용됩니다. - -|고정된 지오메트리 함수| 즉시 모드 함수 | -|--------------------------------|----------------------------------------| -|plane() | bezier() | -|box() | curve() | -|sphere() | line() | -|cylinder() | beginShape() | -|cone() | vertex() | -|ellipsoid() | endShape() | -|torus() | point() | -|triangle() | curveVertex() | -|arc() | bezierVertex() | -|point() | quadraticVertex() | -|ellipse() | -|rect() | -|quad() | -|text() | - - - +고정된 지오메트리는 3D 원형에 사용되는 반면 즉시 모드는 begin/endShape로 만든 모양에 사용됩니다. +| 고정된 지오메트리 함수 | 즉시 모드 함수 | +| ------------ | ----------------- | +| plane() | bezier() | +| box() | curve() | +| sphere() | line() | +| cylinder() | beginShape() | +| cone() | vertex() | +| ellipsoid() | endShape() | +| torus() | point() | +| triangle() | curveVertex() | +| arc() | bezierVertex() | +| point() | quadraticVertex() | +| ellipse() | | +| rect() | | +| quad() | | +| text() | | ## 텍스쳐 관리 + p5.Renderer.GL 인스턴스는 필요에 따라 p5.Textures 객체의 배열을 관리합니다. 텍스처는 `texture()` 메서드와 함께 사용되는 이미지 및 비디오용으로 생성되거나 커스텀 쉐이더에 제공되는 정형으로 생성됩니다. @@ -90,13 +85,16 @@ p5.Renderer.GL 인스턴스는 필요에 따라 p5.Textures 객체의 배열을 ### 쉐이더 유형 #### 색상 쉐이더 + 현재 채우기 색상에 따라 객체의 평평한 음영을 제공합니다. #### 조명 쉐이더(조명 & 텍스처용) + 다음을 설명합니다: + * `ambientLight()`, `directionalLight()`, `pointLight()`, `spotLight()` 및 `specularColor()`에 의해 설정된 조명 매개 변수 * `ambientMaterial()`, `emissiveMaterial()` 및 `specularMaterial()`에 의해 설정된 재질 매개 변수 -* `texture()`로 설정 된 텍스처 매개 변수 +* `texture()`로 설정 된 텍스처 매개 변수 #### 일반 쉐이더 @@ -105,86 +103,86 @@ p5.Renderer.GL 인스턴스는 필요에 따라 p5.Textures 객체의 배열을 ### 쉐이더 매개변수 #### 표준 모델 뷰 및 카메라 정형 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|---------------------------------|-----------|---------------|------------|-------------|------------| -|`uniform mat4 uModelViewMatrix;` |x |x |x |x |x | -|`uniform mat4 uProjectionMatrix;`|x |x |x |x |x | -|`uniform vec4 uViewPort;` |x | | | | | -|`uniform vec4 uPerspective;` |x | | | | | +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| --------------------------------- | ----------- | --------------- | ------------ | ------------- | ------------ | +| `uniform mat4 uModelViewMatrix;` | x | x | x | x | x | +| `uniform mat4 uProjectionMatrix;` | x | x | x | x | x | +| `uniform vec4 uViewPort;` | x | | | | | +| `uniform vec4 uPerspective;` | x | | | | | #### 지오메트리 속성 및 정형 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|---------------------------------|-----------|---------------|------------|-------------|------------| -|`attribute vec3 aPosition;` |x |x |x |x |x | -|`attribute vec3 aNormal;` | |x | |x | | -|`attribute vec2 aTexCoord;` | |x | |x | | -|`uniform mat3 uNormalMatrix;` | |x | |x | | -|`attribute vec4 aDirection;` |x | | | | | -|`uniform float uStrokeWeight;` |x | | | | | + +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| ------------------------------ | ----------- | --------------- | ------------ | ------------- | ------------ | +| `attribute vec3 aPosition;` | x | x | x | x | x | +| `attribute vec3 aNormal;` | | x | | x | | +| `attribute vec2 aTexCoord;` | | x | | x | | +| `uniform mat3 uNormalMatrix;` | | x | | x | | +| `attribute vec4 aDirection;` | x | | | | | +| `uniform float uStrokeWeight;` | x | | | | | #### 재질 색상 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|---------------------------------|-----------|---------------|------------|-------------|------------| -|`uniform vec4 uMaterialColor;` |x |x | | |x | -|`attribute vec4 aVertexColor;` | | |x | | | + +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| ------------------------------ | ----------- | --------------- | ------------ | ------------- | ------------ | +| `uniform vec4 uMaterialColor;` | x | x | | | x | +| `attribute vec4 aVertexColor;` | | | x | | | #### 조명 매개변수 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|-----------------------------------------------|-----------|---------------|------------|-------------|------------| -|`uniform int uAmbientLightCount;` | |x | | | | -|`uniform int uDirectionalLightCount;` | |x | | | | -|`uniform int uPointLightCount;` | |x | | | | -|`uniform int uSpotLightCount;` | |x | | | | -|`uniform vec3 uAmbientColor[8];` | |x | | | | -|`uniform vec3 uLightingDirection[8];` | |x | | | | -|`uniform vec3 uDirectionalDiffuseColors[8];` | |x | | | | -|`uniform vec3 uDirectionalSpecularColors[8];` | |x | | | | -|`uniform vec3 uPointLightLocation[8];` | |x | | | | -|`uniform vec3 uPointLightDiffuseColors[8];` | |x | | | | -|`uniform vec3 uPointLightSpecularColors[8];` | |x | | | | -|`uniform float uSpotLightAngle[8];` | |x | | | | -|`uniform float uSpotLightConc[8];` | |x | | | | -|`uniform vec3 uSpotLightDiffuseColors[8];` | |x | | | | -|`uniform vec3 uSpotLightSpecularColors[8];` | |x | | | | -|`uniform vec3 uSpotLightLocation[8];` | |x | | | | -|`uniform vec3 uSpotLightDirection[8];` | |x | | | | -|`uniform bool uSpecular;` | |x | | | | -|`uniform bool uEmissive;` | |x | | | | -|`uniform int uShininess;` | |x | | | | -|`uniform bool uUseLighting;` | |x | | | | -|`uniform float uConstantAttenuation;` | |x | | | | -|`uniform float uLinearAttenuation;` | |x | | | | -|`uniform float uQuadraticAttenuation;` | |x | | | | +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| --------------------------------------------- | ----------- | --------------- | ------------ | ------------- | ------------ | +| `uniform int uAmbientLightCount;` | | x | | | | +| `uniform int uDirectionalLightCount;` | | x | | | | +| `uniform int uPointLightCount;` | | x | | | | +| `uniform int uSpotLightCount;` | | x | | | | +| `uniform vec3 uAmbientColor[8];` | | x | | | | +| `uniform vec3 uLightingDirection[8];` | | x | | | | +| `uniform vec3 uDirectionalDiffuseColors[8];` | | x | | | | +| `uniform vec3 uDirectionalSpecularColors[8];` | | x | | | | +| `uniform vec3 uPointLightLocation[8];` | | x | | | | +| `uniform vec3 uPointLightDiffuseColors[8];` | | x | | | | +| `uniform vec3 uPointLightSpecularColors[8];` | | x | | | | +| `uniform float uSpotLightAngle[8];` | | x | | | | +| `uniform float uSpotLightConc[8];` | | x | | | | +| `uniform vec3 uSpotLightDiffuseColors[8];` | | x | | | | +| `uniform vec3 uSpotLightSpecularColors[8];` | | x | | | | +| `uniform vec3 uSpotLightLocation[8];` | | x | | | | +| `uniform vec3 uSpotLightDirection[8];` | | x | | | | +| `uniform bool uSpecular;` | | x | | | | +| `uniform bool uEmissive;` | | x | | | | +| `uniform int uShininess;` | | x | | | | +| `uniform bool uUseLighting;` | | x | | | | +| `uniform float uConstantAttenuation;` | | x | | | | +| `uniform float uLinearAttenuation;` | | x | | | | +| `uniform float uQuadraticAttenuation;` | | x | | | | #### 텍스쳐 매개변수 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|--------------------------------------|-----------|---------------|------------|-------------|------------| -|`uniform sampler2D uSampler;` | |x | | | | -|`uniform bool isTexture;` | |x | | | | +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| ----------------------------- | ----------- | --------------- | ------------ | ------------- | ------------ | +| `uniform sampler2D uSampler;` | | x | | | | +| `uniform bool isTexture;` | | x | | | | #### 일반 매개변수 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|--------------------------------------|-----------|---------------|------------|-------------|------------| -|`uniform float uResolution;` | | |x | | | -|`uniform float uPointSize;` | | |x | |x | +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| ---------------------------- | ----------- | --------------- | ------------ | ------------- | ------------ | +| `uniform float uResolution;` | | | x | | | +| `uniform float uPointSize;` | | | x | | x | #### 다양한 매개변수 -|Parameter |Line Shader|TexLight Shader|Color Shader|Normal Shader|Point Shader| -|--------------------------------------|-----------|---------------|------------|-------------|------------| -|`varying vec3 vVertexNormal;` | |x | | | | -|`varying vec2 vVertTexCoord;` | |x | | | | -|`varying vec3 vLightWeighting;` | |x | | | | -|`varying highp vec2 vVertTexCoord;` | | | |x | | -|`varying vec4 vColor;` | | |x | | | -|`varying float vStrokeWeight` | | | | |x | +| Parameter | Line Shader | TexLight Shader | Color Shader | Normal Shader | Point Shader | +| ----------------------------------- | ----------- | --------------- | ------------ | ------------- | ------------ | +| `varying vec3 vVertexNormal;` | | x | | | | +| `varying vec2 vVertTexCoord;` | | x | | | | +| `varying vec3 vLightWeighting;` | | x | | | | +| `varying highp vec2 vVertTexCoord;` | | | | x | | +| `varying vec4 vColor;` | | | x | | | +| `varying float vStrokeWeight` | | | | | x | ## 다음 단계 커밍 쑨! - - \ No newline at end of file diff --git a/src/content/contributor-docs/pt-br/README.mdx b/src/content/contributor-docs/pt-br/README.mdx index ed6f74c85b..613120714e 100644 --- a/src/content/contributor-docs/pt-br/README.mdx +++ b/src/content/contributor-docs/pt-br/README.mdx @@ -1,7 +1,3 @@ - ---- - ---- Olá! Obrigado pelo seu interesse em contribuir para o p5.js! Você pode começar com algumas maneiras diferentes de contribuir [aqui](https://p5js.org/community/#contribute). Esta pasta contém vários documentos destinados aos desenvolvedores do p5.js. # Estrutura de Diretório do Projeto @@ -16,7 +12,7 @@ Olá! Obrigado pelo seu interesse em contribuir para o p5.js! Você pode começa # Como Contribuir -Bugs conhecidos e novas funcionalidades pretendidos são rastreados usando as [issues do GitHub](https://github.com/processing/p5.js/issues). Os [rótulos das issues](./ issue_labels/) são usados para classificar as issues em categorias, como aqueles que são [adequados para iniciantes](https://github.com/processing/p5.js/labels/level%3Abeginner). Se você deseja começar a trabalhar em uma issue existente, comente na issue que planeja trabalhar para que outros colaboradores saibam que ele está sendo tratado e possam oferecer ajuda. Depois de concluir seu trabalho sobre essa issue, [envie uma solicitação de pull request (PR)](./preparing_a_pull_request/) na branch main do p5.js. No campo de descrição da PR, inclua "resolves #XXXX" identificando a issue que você está corrigindo. Se o PR resolver a issue, mas não a resolver completamente (por exemplo, a issue deve permanecer aberta após o merge do PR), escreva "addresses #XXXX". +Bugs conhecidos e novas funcionalidades pretendidos são rastreados usando as [issues do GitHub](https://github.com/processing/p5.js/issues). Os \[rótulos das issues]\(./ issue\_labels/) são usados para classificar as issues em categorias, como aqueles que são [adequados para iniciantes](https://github.com/processing/p5.js/labels/level%3Abeginner). Se você deseja começar a trabalhar em uma issue existente, comente na issue que planeja trabalhar para que outros colaboradores saibam que ele está sendo tratado e possam oferecer ajuda. Depois de concluir seu trabalho sobre essa issue, [envie uma solicitação de pull request (PR)](./preparing_a_pull_request/) na branch main do p5.js. No campo de descrição da PR, inclua "resolves #XXXX" identificando a issue que você está corrigindo. Se o PR resolver a issue, mas não a resolver completamente (por exemplo, a issue deve permanecer aberta após o merge do PR), escreva "addresses #XXXX". Se você descobrir um bug ou tiver uma idéia para uma nova funcionalidade que gostaria de adicionar, comece submetendo uma issue. Por favor, não basta enviar simplesmente uma solicitação de pull request contendo a correção ou a nova funcionalidade sem antes fazer uma issue, provavelmente não seremos capazes de aceitá-lo. Depois de receber algum feedback sobre a issue e avançar para resolvê-la, você pode seguir o processo acima para contribuir com a correção ou a funcionalidade. @@ -28,8 +24,8 @@ Reconhecemos todos os tipos de contribuições. Este projeto segue a especifica Além do código em si, também pode ser necessário fornecer alguma combinação do seguinte. -- [documentação embutida](./inline_documentation/) na forma de comentários de código, que explicam o código para outros desenvolvedores e usuários. Muitos desses comentários devem estar em conformidade com a sintaxe [JSDoc](https://usejsdoc.org) e serão publicados no site p5.js como parte do [manual de referência on-line](https://p5js.org/reference/ ) -- [testes de unidade](./unit_testing/), pequenos pedaços de código que são separados da biblioteca e são usados para verificar seu comportamento +* [documentação embutida](./inline_documentation/) na forma de comentários de código, que explicam o código para outros desenvolvedores e usuários. Muitos desses comentários devem estar em conformidade com a sintaxe [JSDoc](https://usejsdoc.org) e serão publicados no site p5.js como parte do [manual de referência on-line](https://p5js.org/reference/) +* [testes de unidade](./unit_testing/), pequenos pedaços de código que são separados da biblioteca e são usados para verificar seu comportamento ## Exemplos @@ -42,4 +38,3 @@ O p5.js foi recentemente migrado para o [ES6](https://en.wikipedia.org/wiki/ECMA ## Outras Ideas Se você deseja contribuir de outras maneiras que não são abordadas aqui, escreva para [hello@p5js.org](mailto:hello@p5js.org) e nos informe o que você está pensando! Além de trabalhar nessa base de código, sempre podemos usar ajuda em documentação, tutoriais, workshops, materiais educacionais, branding e design. Entre em contato e podemos conversar sobre como você pode participar. - \ No newline at end of file diff --git a/src/content/contributor-docs/sk/README.mdx b/src/content/contributor-docs/sk/README.mdx index 142a626914..f85e6e428b 100644 --- a/src/content/contributor-docs/sk/README.mdx +++ b/src/content/contributor-docs/sk/README.mdx @@ -1,18 +1,14 @@ - ---- - ---- Ahoj! Ďakujeme za tvoj záujem prispieť do projektu p5.js! Rôzne spôsoby akými môžeš prispieť nájdeš [tu](https://p5js.org/community/#contribute). Tento priečinok obsahuje niekoľko rôznych dokumentov určených pre vývojárov p5.js. # Štruktúra Priečinkov Projektu -- `src/` obsahuje všetky zdrojové kódy knižnice, ktoré sú organizované do modulov na základe tém. Práve tu budeš pracovať ak budeš vyvýjať p5.js. -- `lib/` obsahuje finálnu verziu p5.js určenú pre koncových používateľov. Táto verzia bude načítavaná do ich skečov a projektov (vrátane kompresnej formy). Toto je výstupom kompilácie zdrojových kódov do jedného súboru [Grunt](https://gruntjs.com/). -- `contributor_docs/` obsahuje rôzne Markdown dokumenty ktoré sú určené pre vývojárov p5.js a to hlavne preto, lebo obsahujú popis praktík a princípov. -- `docs/` neobsahuje samotnú dokumentáciu! Obsahuje však zdrojový kód, ktorý *generuje* [online verziu referenčnej príručky](https://p5js.org/reference/). -- `tests/` obsahuje unit testy, ktoré zaručujú, že knižnica bude fungovať správne aj po vykonaní zmien. -- `tasks/` obsahuje skripty, ktoré vykonávajú automatizované úlohy spojené s budovaním, nasadením a vydaním novej verzie p5.js. -- `patches/` môže z času na čas obsahovať [Git patches](https://git-scm.com/docs/git-format-patch). Vo väčšine prípadov však môžeš ignorovať tento priečinok. +* `src/` obsahuje všetky zdrojové kódy knižnice, ktoré sú organizované do modulov na základe tém. Práve tu budeš pracovať ak budeš vyvýjať p5.js. +* `lib/` obsahuje finálnu verziu p5.js určenú pre koncových používateľov. Táto verzia bude načítavaná do ich skečov a projektov (vrátane kompresnej formy). Toto je výstupom kompilácie zdrojových kódov do jedného súboru [Grunt](https://gruntjs.com/). +* `contributor_docs/` obsahuje rôzne Markdown dokumenty ktoré sú určené pre vývojárov p5.js a to hlavne preto, lebo obsahujú popis praktík a princípov. +* `docs/` neobsahuje samotnú dokumentáciu! Obsahuje však zdrojový kód, ktorý *generuje* [online verziu referenčnej príručky](https://p5js.org/reference/). +* `tests/` obsahuje unit testy, ktoré zaručujú, že knižnica bude fungovať správne aj po vykonaní zmien. +* `tasks/` obsahuje skripty, ktoré vykonávajú automatizované úlohy spojené s budovaním, nasadením a vydaním novej verzie p5.js. +* `patches/` môže z času na čas obsahovať [Git patches](https://git-scm.com/docs/git-format-patch). Vo väčšine prípadov však môžeš ignorovať tento priečinok. # Ako Prispieť @@ -28,14 +24,15 @@ Rozpoznávame všetky druhy príspevkov. Tento projekt sa riadi podľa [all-cont Mimo samotného kódu je potrebné aby si dodal aj kombináciu z nasledovných. -- [inline dokumentácia](./inline_documentation/) vo forme komentárov kódu, ktoré vysvetľujú kód vývojárom a používateľom. Mnohé z týchto komentárom musia podliehať syntaxi [JSDoc](https://jsdoc.app) a budú publikované na stránke p5.js ako súčasť [online referenčnej príručky](https://p5js.org/reference/) -- [unit testy](./unit_testing/), malé časti kódu, ktoré sú oddelené od knižnice a použite na overenie správnosti správanie +* [inline dokumentácia](./inline_documentation/) vo forme komentárov kódu, ktoré vysvetľujú kód vývojárom a používateľom. Mnohé z týchto komentárom musia podliehať syntaxi [JSDoc](https://jsdoc.app) a budú publikované na stránke p5.js ako súčasť [online referenčnej príručky](https://p5js.org/reference/) +* [unit testy](./unit_testing/), malé časti kódu, ktoré sú oddelené od knižnice a použite na overenie správnosti správanie ## Príklady Stránka p5.js obsahujé [integrované príklady](http://p5js.org/examples/). Môžeš [pridať ďalšie](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/) a zároveň si pozrieť problém, ktorý obsahuje list [požadovaných príkladov](https://github.com/processing/p5.js/issues/1954). ## ES6 + p5.js nedávno migrovalo na [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015). Ak chceš vidieť ako táto zmena ovplyňuje tvoj príspevok, navštív prosím stránku [adaptácia ES6](./es6-adoption/). ## Iné Nápady @@ -59,9 +56,11 @@ Niektoré syntaktické chyby je však možné opraviť automaticky pomocou prík ```shell $ npm run lint:fix ``` -Lepšie je držať sa zavedeného štýlu projektu, ale [príležitostne](https://github.com/processing/p5.js/search?utf8=%E2%9C%93&q=prettier-ignore&type=) by sa mohla použiť alternatívna syntax. Uľahčite tým pochopenie kódu. V týchto prípadoch Prettier [ponúka výnimky](https://prettier.io/docs/en/ignore.html), komentár `// prettier-ignore`, ktorý môžete použiť na získanie podrobných výnimiek. Pokúste sa vyhnúť použitiu tohto, ak je to možné, pretože existujú dobré dôvody pre väčšinu preferencií štýlov vynútených štylistickým procesorom. + +Lepšie je držať sa zavedeného štýlu projektu, ale [príležitostne](https://github.com/processing/p5.js/search?utf8=%E2%9C%93\&q=prettier-ignore\&type=) by sa mohla použiť alternatívna syntax. Uľahčite tým pochopenie kódu. V týchto prípadoch Prettier [ponúka výnimky](https://prettier.io/docs/en/ignore.html), komentár `// prettier-ignore`, ktorý môžete použiť na získanie podrobných výnimiek. Pokúste sa vyhnúť použitiu tohto, ak je to možné, pretože existujú dobré dôvody pre väčšinu preferencií štýlov vynútených štylistickým procesorom. Toto je krátky sumár k pravidlám štýlu kódu. Prosím ber na vedomie, že tento zoznam môže byť nekompletný a preto je najlepšie sa okazovať na [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc) a [.eslintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) súbory pre kompletný zoznam pravidiel. + * Používa sa ES6 syntax kódu. * Používaj apostrof (radšej než úvodzovky). * Na odsadenie použi dve medzery. @@ -82,8 +81,8 @@ $ npm ci Tento príkaz nainštaluje *všetky* závislosti p5.js; stručne, najdôležitejšie závislosti špecifické pre unit testy zahrňuje: -- [Mocha](https://mochajs.org/), mocný testovací rámec, ktorý vykonáva jednotlivé testy špecifické pre p5.js. -- [mocha-chrome](https://github.com/shellscape/mocha-chrome), doplnok pre mocha, ktorý spúšťa testy v "bezhlavom" móde prehliadača Google Chrome. +* [Mocha](https://mochajs.org/), mocný testovací rámec, ktorý vykonáva jednotlivé testy špecifické pre p5.js. +* [mocha-chrome](https://github.com/shellscape/mocha-chrome), doplnok pre mocha, ktorý spúšťa testy v "bezhlavom" móde prehliadača Google Chrome. Ak sú závislosti nainštalované, použi Grunt pre spustenie unit testov. @@ -104,7 +103,9 @@ Kompletný návod k unit testovaniu je nad rámec rozsahu p5.js dokumentácie, a # Vývojový Proces 1. Nainštaluj [node.js](http://nodejs.org/), ktorý automaticky nainštaluje balíčkového manažéra [npm](https://www.npmjs.org). + 2. [Rozvetvi](https://help.github.com/articles/fork-a-repo) [repozitár p5.js](https://github.com/processing/p5.js) do svojho GitHub účtu. + 3. [Vyklonuj](https://help.github.com/articles/cloning-a-repository/) svoj novo-rozvetvený repozitár z GitHub-u do svoj lokálneho počítača. ```shell @@ -157,16 +158,13 @@ $ npm run docs:dev Zastršujúci projekt p5.js zahŕňa aj iné repozitáre ako tento. -- [p5.js](https://github.com/processing/p5.js): Tento repozitár obsahuje zdrojový kód knižnice p5.js. [Používateľská referečná príručka p5.js](https://p5js.org/reference/) je generovaná z [JSDoc](http://usejsdoc.org/) komentárov zahrnutých v tomto zdrojovom kóde. Spravuje ho [Lauren McCarthy](https://github.com/lmccart). -- [website](https://github.com/processing/p5.js-website) Tento repozitár obsahuje väčšinu kódu [stránky p5.js](http://p5js.org) s výnimkou referenčnej príručky. Spravuje ho [Lauren McCarthy](https://github.com/lmccart). -- [sound](https://github.com/processing/p5.js-sound) Tento repozitár obsahuje knižnicu p5.sound.js. Spravuje ho [Jason Sigal](https://github.com/therewasaguy). -- [web editor](https://github.com/processing/p5.js-web-editor): Tento repozitár obsahuje zdrojový kód pre [p5.js web editor](https://editor.p5js.org). Spravuje ho [Cassie Tarakajian](https://github.com/catarak). Všimni si však, že [p5.js editor](https://github.com/processing/p5.js-editor) je už zastaraný. +* [p5.js](https://github.com/processing/p5.js): Tento repozitár obsahuje zdrojový kód knižnice p5.js. [Používateľská referečná príručka p5.js](https://p5js.org/reference/) je generovaná z [JSDoc](http://usejsdoc.org/) komentárov zahrnutých v tomto zdrojovom kóde. Spravuje ho [Lauren McCarthy](https://github.com/lmccart). +* [website](https://github.com/processing/p5.js-website) Tento repozitár obsahuje väčšinu kódu [stránky p5.js](http://p5js.org) s výnimkou referenčnej príručky. Spravuje ho [Lauren McCarthy](https://github.com/lmccart). +* [sound](https://github.com/processing/p5.js-sound) Tento repozitár obsahuje knižnicu p5.sound.js. Spravuje ho [Jason Sigal](https://github.com/therewasaguy). +* [web editor](https://github.com/processing/p5.js-web-editor): Tento repozitár obsahuje zdrojový kód pre [p5.js web editor](https://editor.p5js.org). Spravuje ho [Cassie Tarakajian](https://github.com/catarak). Všimni si však, že [p5.js editor](https://github.com/processing/p5.js-editor) je už zastaraný. # Iné -- [Náhľad Dovnútra p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) je videoprehliadka nástrojov a súborov použitých pri vývoji p5.js. -- p5.js [Docker image](https://github.com/toolness/p5.js-docker) môže byť namontovaný do [Docker](https://www.docker.com/) a použitý na vývoj p5.js bez potreby manuálnej inštalácie požiadaviek ako [Node](https://nodejs.org/) alebo iných, takých, ktoré ovlyvňujú hosťovský operačný systém (s výnimkou inštalácie Docker-a). -- Budovací proces knižnice p5.js generuje [json dátové súbory](https://p5js.org/reference/data.json), ktoré obsahujú verejné API p5.js a môžu byť použité v automatizovanom náradí, ako napríklad automatické dopĺňanie p5.js metód v editor-e. Tento súbor je dostupný na stránke p5.js, no nie je súčasťou tohto repozitára. - - - \ No newline at end of file +* [Náhľad Dovnútra p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) je videoprehliadka nástrojov a súborov použitých pri vývoji p5.js. +* p5.js [Docker image](https://github.com/toolness/p5.js-docker) môže byť namontovaný do [Docker](https://www.docker.com/) a použitý na vývoj p5.js bez potreby manuálnej inštalácie požiadaviek ako [Node](https://nodejs.org/) alebo iných, takých, ktoré ovlyvňujú hosťovský operačný systém (s výnimkou inštalácie Docker-a). +* Budovací proces knižnice p5.js generuje [json dátové súbory](https://p5js.org/reference/data.json), ktoré obsahujú verejné API p5.js a môžu byť použité v automatizovanom náradí, ako napríklad automatické dopĺňanie p5.js metód v editor-e. Tento súbor je dostupný na stránke p5.js, no nie je súčasťou tohto repozitára. diff --git a/src/content/contributor-docs/zh/README.mdx b/src/content/contributor-docs/zh/README.mdx index 2b000f9949..fe62a3fe28 100644 --- a/src/content/contributor-docs/zh/README.mdx +++ b/src/content/contributor-docs/zh/README.mdx @@ -1,9 +1,3 @@ - ---- - ---- - - # 🌸欢迎!🌺 感谢你有兴趣为 p5.js 做出贡献!我们的团队重视每一种形式的帮助,并且正在尽可能的扩大你能帮助的范围,这包括了参考文献、教学、编写程序、创作艺术、写作、设计、活动、组织、展策或者任何你能想象到的东西。[我们的社群网页](https://p5js.org/community/#contribute)提供了一些贡献与参与项目的方法。如果你要提供技术性的帮助,请接着往下读。 @@ -14,33 +8,32 @@ p5.js 项目除了这个代码库外还包括了以下几个其他的代码库: -- [p5.js](https://github.com/processing/p5.js):包括了 p5.js 源代码。[面向用户的 p5.js 参考文献](https://p5js.org/reference/)也是由包含在此源代码中的 [JSDoc](http://usejsdoc.org/) 注解生成的。[Lauren Lee McCarthy](https://github.com/lmccart) 为维持者。 -- [p5.js-website](https://github.com/processing/p5.js-website):此源代码包含了 [p5.js website](http://p5js.org )的大多数代码(除参考文献外)。[Lauren Lee McCarthy](https://github.com/lmccart) 为维持者。 -- [p5.js-sound](https://github.com/processing/p5.js-sound):包括了 p5.sound.js 程式库。[Jason Sigal](https://github.com/therewasaguy) 为维持者。 -- [p5.js-web-editor](https://github.com/processing/p5.js-web-editor):包含了 [p5.js web editor](https://editor.p5js.org) 的源代码。[Cassie Tarakajian](https://github.com/catarak) 为维持者。请注意,旧版 [p5.js editor](https://github.com/processing/p5.js-editor) 已不再受支持。 -- [p5.accessibility](https://github.com/processing/p5.accessibility):使 p5.js 更适合盲人和视障人士使用的程式库。 +* [p5.js](https://github.com/processing/p5.js):包括了 p5.js 源代码。[面向用户的 p5.js 参考文献](https://p5js.org/reference/)也是由包含在此源代码中的 [JSDoc](http://usejsdoc.org/) 注解生成的。[Lauren Lee McCarthy](https://github.com/lmccart) 为维持者。 +* [p5.js-website](https://github.com/processing/p5.js-website):此源代码包含了 [p5.js website](http://p5js.org)的大多数代码(除参考文献外)。[Lauren Lee McCarthy](https://github.com/lmccart) 为维持者。 +* [p5.js-sound](https://github.com/processing/p5.js-sound):包括了 p5.sound.js 程式库。[Jason Sigal](https://github.com/therewasaguy) 为维持者。 +* [p5.js-web-editor](https://github.com/processing/p5.js-web-editor):包含了 [p5.js web editor](https://editor.p5js.org) 的源代码。[Cassie Tarakajian](https://github.com/catarak) 为维持者。请注意,旧版 [p5.js editor](https://github.com/processing/p5.js-editor) 已不再受支持。 +* [p5.accessibility](https://github.com/processing/p5.accessibility):使 p5.js 更适合盲人和视障人士使用的程式库。 # 文件结构 这个代码库有很多文件,所以这里提供了文件总览。有些文件可能很难懂——不过你并不需要每一个都看懂才能开始。我们建议你先从一个特定区域入手(例如说,修复某些内联参考文献),并逐渐地探索更多领域。Luisa Pereira 的 [Looking Inside p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) 也给出了 p5.js 工具与文件的视频总览。 -- `contributor_docs/` 包含了贡献者所需遵循的原则; -- `docs/` 并不包含参考文献!它包含了 _*生成*_ [线上参考文献](https://p5js.org/reference/)的代码; -- `lib/` 包含一个空白示例和 p5.sound 扩展程式库,并且会周期性地通过 [p5.js-sound 代码库](https://github.com/processing/p5.js-sound) 更新。这里也是当用 [Grunt](https://gruntjs.com/) 把 p5.js 编译到单个文件后 p5.js 程式库的位置。发出 Pull request 时,无需将其检入 GitHub 代码库。 -- `src/` 包含所有的源代码,这些源代码通常组织成多个单独的模块。 如果要更改 p5.js,这就是你需要参考的地方。大多数文件夹内部都有独自的 README.md 文件,以帮助您浏览该文件夹。 -- `tasks/` 包含创建 p5.js 与新版本 p5.js 的构建、部署和发行有关的自动化任务的脚本。 -- `tests/` 包含单元测试,这些单元测试可确保库随着更改仍继续正常运行。 -- `utils/` 可能包含对存储库有用的其他文件,但是通常您可以忽略此目录。 - +* `contributor_docs/` 包含了贡献者所需遵循的原则; +* `docs/` 并不包含参考文献!它包含了 **生成** [线上参考文献](https://p5js.org/reference/)的代码; +* `lib/` 包含一个空白示例和 p5.sound 扩展程式库,并且会周期性地通过 [p5.js-sound 代码库](https://github.com/processing/p5.js-sound) 更新。这里也是当用 [Grunt](https://gruntjs.com/) 把 p5.js 编译到单个文件后 p5.js 程式库的位置。发出 Pull request 时,无需将其检入 GitHub 代码库。 +* `src/` 包含所有的源代码,这些源代码通常组织成多个单独的模块。 如果要更改 p5.js,这就是你需要参考的地方。大多数文件夹内部都有独自的 README.md 文件,以帮助您浏览该文件夹。 +* `tasks/` 包含创建 p5.js 与新版本 p5.js 的构建、部署和发行有关的自动化任务的脚本。 +* `tests/` 包含单元测试,这些单元测试可确保库随着更改仍继续正常运行。 +* `utils/` 可能包含对存储库有用的其他文件,但是通常您可以忽略此目录。 # 参考文献 -我们意识到参考文献是这个项目中最重要的部分。不好的参考文献是新用户与新贡献者的最大屏障,让项目不具有包容性。[contributing_documentation.md](./contributing_documentation/) 页面为开始修改参考文献给出了一个深入的导览。p5.js 的参考文献可以在以下几个地方找到: +我们意识到参考文献是这个项目中最重要的部分。不好的参考文献是新用户与新贡献者的最大屏障,让项目不具有包容性。[contributing\_documentation.md](./contributing_documentation/) 页面为开始修改参考文献给出了一个深入的导览。p5.js 的参考文献可以在以下几个地方找到: -- [p5js.org/reference](https://p5js.org/reference/):由 [inline documentation](./inline_documentation/) 的源代码生成。它包括了文本描述和参数以及随附的代码片段示例。我们将所有这些内联文献和代码放在一起,以使代码和参考文献保持紧密的联系,并强化这样的思想,贡献参考文献与贡献代码至少同等重要。构建库后,它将检查内联参考文献和示例,以确保它们与代码的行为方式匹配。 要做出贡献,您可以先查看 [inline_documentation.md](./inline_documentation/) 页面。 -- [p5js.org/examples](http://p5js.org/examples) 页面包含更长的示例,这些示例对于学习 p5.js 可能有用。要做出贡献,您可以先查看 [adding_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/)。 -- [p5js.org/learn](https://p5js.org/learn) 页面包含可帮助您学习 p5.js 和编程概念的教程。 要做出贡献,您可以先查看 [p5.js guide to contributing to tutorials](https://p5js.org/learn/tutorial-guide.html)。 -- 您可能会注意到 p5.js 网站目前支持几种不同的语言。这称为国际化(i18n)。您可以在 [i18n_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution/)页面了解更多。 +* [p5js.org/reference](https://p5js.org/reference/):由 [inline documentation](./inline_documentation/) 的源代码生成。它包括了文本描述和参数以及随附的代码片段示例。我们将所有这些内联文献和代码放在一起,以使代码和参考文献保持紧密的联系,并强化这样的思想,贡献参考文献与贡献代码至少同等重要。构建库后,它将检查内联参考文献和示例,以确保它们与代码的行为方式匹配。 要做出贡献,您可以先查看 [inline\_documentation.md](./inline_documentation/) 页面。 +* [p5js.org/examples](http://p5js.org/examples) 页面包含更长的示例,这些示例对于学习 p5.js 可能有用。要做出贡献,您可以先查看 [adding\_examples.md](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/)。 +* [p5js.org/learn](https://p5js.org/learn) 页面包含可帮助您学习 p5.js 和编程概念的教程。 要做出贡献,您可以先查看 [p5.js guide to contributing to tutorials](https://p5js.org/learn/tutorial-guide.html)。 +* 您可能会注意到 p5.js 网站目前支持几种不同的语言。这称为国际化(i18n)。您可以在 [i18n\_contribution](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution/)页面了解更多。 # GitHub Issue 流程 @@ -56,7 +49,6 @@ p5.js 项目除了这个代码库外还包括了以下几个其他的代码库 * [organization.md](https://github.com/processing/p5.js/blob/main/contributor_docs/organization/) 文件提供了有关如何组织问题以及决策过程的高级概述。如果您有兴趣,欢迎您参与。 - # 开发过程 我们知道开发过程可能会有点难——不只是你一个人,所有人一开始都会这么觉得。你可以遵循下面的步骤来设置;如果遇到了问题,你可以在[论坛](https://discourse.processing.org/c/p5js)上讨论或发布一个关于你的问题的 [issue](https://github.com/processing/p5.js/issues),我们会尽力帮助你的。 @@ -123,10 +115,11 @@ $ npm run lint $ npm run lint:fix ``` -坚持使用已建立的项目样式通常是更可取的,但是[偶尔](https://github.com/processing/p5.js/search?utf8=%E2%9C%93&q=prettier-ignore&type=)可能使用不同的语法会使您的代码更易于理解。 这些情况下,Prettier [提供了一个解决方式](https://prettier.io/docs/en/ignore.html),`// prettier-ignore`注释,您可以使用它来指定个别例外代码。不过如果可以的话,尽量避免使用它,因为 linter 实施的大多数代码格式都有好的理由。 +坚持使用已建立的项目样式通常是更可取的,但是[偶尔](https://github.com/processing/p5.js/search?utf8=%E2%9C%93\&q=prettier-ignore\&type=)可能使用不同的语法会使您的代码更易于理解。 这些情况下,Prettier [提供了一个解决方式](https://prettier.io/docs/en/ignore.html),`// prettier-ignore`注释,您可以使用它来指定个别例外代码。不过如果可以的话,尽量避免使用它,因为 linter 实施的大多数代码格式都有好的理由。 - 这是代码样式规则的快速摘要。请注意,此列表可能不完整,最好参考 [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc) 和 [.eslintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) 文件以获取完整列表。 - * 使用 ES6 语法 +这是代码样式规则的快速摘要。请注意,此列表可能不完整,最好参考 [.prettierrc](https://github.com/processing/p5.js/blob/main/.prettierrc) 和 [.eslintrc](https://github.com/processing/p5.js/blob/main/.eslintrc) 文件以获取完整列表。 + +* 使用 ES6 语法 * 优先使用单引号 @@ -142,7 +135,7 @@ $ npm run lint:fix ## 单元测试 -单元测试是一小段代码,它们是对主逻辑的补充,并执行验证。[unit_testing.md](../unit_testing/)页面提供了有关使用单元测试的更多信息。如果您正在开发 p5.js 的主要新功能,尽可能应该包含测试。不要提交没有通过测试的 pull request,因为这意味着某些代码中有错误。 +单元测试是一小段代码,它们是对主逻辑的补充,并执行验证。[unit\_testing.md](../unit_testing/)页面提供了有关使用单元测试的更多信息。如果您正在开发 p5.js 的主要新功能,尽可能应该包含测试。不要提交没有通过测试的 pull request,因为这意味着某些代码中有错误。 以运行单元测试,您需要确保已安装项目的依赖项。 @@ -173,11 +166,9 @@ $ npm run dev # 其他 -- 您可以浏览 [contributor_docs /](https://github.com/processing/p5.js/tree/main/contributor_docs) 文件夹中的其他文件。它们涉及贡献于此项目的技术和非技术方面的特定领域。 -- [深入p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) 是 p5.js 开发工作流程中使用的工具和文件的视频教程。 -- [来自 The Coding Train 的视频](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: 概述了对 p5.js 的技术贡献入门。 -- p5.js [Docker 映像](https://github.com/toolness/p5.js-docker)可以安装在 [Docker](https://www.docker.com/) 中,并用于开发p5 .js,无需手动安装诸如 [Node](https://nodejs.org/) 之类的要求,也无需以其他方式影响主机操作系统(除了安装 Docker 外)。 -- p5.js 库的构建过程会生成一个 [json 数据文件](https://p5js.org/reference/data.json),其中包含了 p5.js 的公共 API,可用于自动化工具中,例如在编辑器中自动完成 p5.js 语法。该文件托管在 p5.js 网站上,但不包含在代码库中。 -- p5.js 的语言最近已改版到 [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-__ECMAScript_2015)。要查看此举措如何影响您的贡献,请参考 [ES6 adoption](../es6-adoption/) 。 - - \ No newline at end of file +* 您可以浏览 [contributor\_docs /](https://github.com/processing/p5.js/tree/main/contributor_docs) 文件夹中的其他文件。它们涉及贡献于此项目的技术和非技术方面的特定领域。 +* [深入p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) 是 p5.js 开发工作流程中使用的工具和文件的视频教程。 +* [来自 The Coding Train 的视频](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: 概述了对 p5.js 的技术贡献入门。 +* p5.js [Docker 映像](https://github.com/toolness/p5.js-docker)可以安装在 [Docker](https://www.docker.com/) 中,并用于开发p5 .js,无需手动安装诸如 [Node](https://nodejs.org/) 之类的要求,也无需以其他方式影响主机操作系统(除了安装 Docker 外)。 +* p5.js 库的构建过程会生成一个 [json 数据文件](https://p5js.org/reference/data.json),其中包含了 p5.js 的公共 API,可用于自动化工具中,例如在编辑器中自动完成 p5.js 语法。该文件托管在 p5.js 网站上,但不包含在代码库中。 +* p5.js 的语言最近已改版到 [ES6](https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-__ECMAScript_2015)。要查看此举措如何影响您的贡献,请参考 [ES6 adoption](../es6-adoption/) 。 diff --git a/src/content/contributor-docs/zh/access.mdx b/src/content/contributor-docs/zh/access.mdx index 8e5920224d..b21c4491c9 100644 --- a/src/content/contributor-docs/zh/access.mdx +++ b/src/content/contributor-docs/zh/access.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 我们关注的重点是可及性 在[2019年贡献者大会](https://p5js.org/community/contributors-conference-2019.html)上,我们承诺只向p5.js添加增加可及性(包括包容性和/或无障碍性)的功能。这意味着要考虑多样性的方向(如性别、社会、经济、种族、族裔、语言、残疾等),这些方向可能影响到可及性/参与度,并采取行动来承认、消除和预防障碍。我们将优先考虑历史上受边缘化群体的需求,而不是为了使相对特权的群体在使用p5.js时更加舒适。 @@ -18,29 +14,27 @@ 这里的可及性意味着为以下人群改进 p5.js: -- 非英语为母语的人 -- 黑人、土著人和有色人种 -- 同性恋、双性恋、变性人或酷儿 -- 性别边缘化的人群 -- 残疾或患病的人 -- 由于阶级或收入原因而缺乏参与创意编程的机会和资源的人 -- 在开源和创意编程领域没有或几乎没有经验的人 -- 其他被系统性排除和历史上代表性不足的人群 +* 非英语为母语的人 +* 黑人、土著人和有色人种 +* 同性恋、双性恋、变性人或酷儿 +* 性别边缘化的人群 +* 残疾或患病的人 +* 由于阶级或收入原因而缺乏参与创意编程的机会和资源的人 +* 在开源和创意编程领域没有或几乎没有经验的人 +* 其他被系统性排除和历史上代表性不足的人群 ### 示例 以下是我们认为可以增加可及性的努力的示例: -- 将更多的文档和其他资料翻译成更多的语言 -- 改进对辅助技术(如屏幕阅读器)的支持 -- 遵循 Web 内容可访问性准则在我们的工具中,并努力使用户在项目中遵循这些准则更加容易 -- 使 p5.js 的错误信息对使用该工具的人更有帮助和支持 -- 在被历史上排除和边缘化的创意编程和数字艺术社区中进行 p5.js 的学习指导和支持 +* 将更多的文档和其他资料翻译成更多的语言 +* 改进对辅助技术(如屏幕阅读器)的支持 +* 遵循 Web 内容可访问性准则在我们的工具中,并努力使用户在项目中遵循这些准则更加容易 +* 使 p5.js 的错误信息对使用该工具的人更有帮助和支持 +* 在被历史上排除和边缘化的创意编程和数字艺术社区中进行 p5.js 的学习指导和支持 还有其他我们还没有想到的事情,我们很兴奋能够一起找出它们。如果您有想法,请[通过问题形式分享](https://github.com/processing/p5.js/issues/new/choose)。 ## 维护 我们也确认我们的意图是维护 p5.js 现有的功能集。我们希望修复错误,无论它们出现在代码库的哪个部分,因为我们相信工具的一致性使其对初学者更加可访问。 - - \ No newline at end of file diff --git a/src/content/contributor-docs/zh/contributing_documentation.mdx b/src/content/contributor-docs/zh/contributing_documentation.mdx index 4f41272d34..b69f2920b6 100644 --- a/src/content/contributor-docs/zh/contributing_documentation.mdx +++ b/src/content/contributor-docs/zh/contributing_documentation.mdx @@ -1,7 +1,3 @@ - ---- - ---- # 贡献文档 参考文献对于新手和有经验的程序员来说都是必不可少的。它向那些不太熟悉p5.js的人伸出友好之手以便帮助我们的社区变得更包容、更丰富。它还能帮助我们在测试和编写参考文献时找到代码本身的问题。 @@ -9,10 +5,13 @@ 有几种方法可以为参考文献做出贡献: ## ☝️ Open issues + 如果您想要开始解决一个关于参考文献的问题,您可以打开开放的问题列表(open issues),并找到标记为“参考文献”(docmentaion)需求的问题。如果您注意到有错别字、缺失或损坏的文档、或者一个令人困惑的函数描述,可以[为它创建一个 issue](https://github.com/processing/p5.js/issues)!请附上需要修复的页面的链接,以便我们可以很容易地找到。 ## 🗯 为参考资料作出贡献 + 仔细阅读[参考资料](http://p5js.org/reference/),看看是否有错别字、损坏或混乱的文档。如果是简单的修复,您可以直接修改。如果是需要讨论的问题,请创建一个 [issue](https://github.com/processing/p5.js/issues/new)。 + * 这里是[为初次使用p5.js代码库进行设置](./README/)的说明。 * 参考文献是根据源代码中的内联文档(在`src/`文件夹中找到)建立的。 * 这里是关于[如何更新或添加内联文档和例子](./inline_documentation/)的信息。 @@ -20,18 +19,22 @@ * 社区维护的Typescript定义在[此处](https://github.com/p5-types/p5.ts)。 ## ✨ 制作示例 + 虽然参考资料中通常列出函数非常简单的代码片段,但更长、更复杂的示例也是有用的。 + * 目前我们正在努力将[processing示例页](https://processing.org/examples/)中的示例转移到[p5.js示例页](http://p5js.org/examples)。如果您愿意帮忙,请看说明[这里](https://github.com/processing/p5.js-website/blob/main/contributor_docs/Adding_examples/)。 * 或者,您可以创建你自己的示例,并在您喜欢的地方独立发布。如果您想要在网上分享它们,请标记[@p5xjs](https://twitter.com/p5xjs)或发送电子邮件到[hello@p5js.org](mailto:hello@p5js.org)让我们知道,我们将广泛分享! 这个[嵌入p5.js指南](https://github.com/processing/p5.js/wiki/Embedding-p5.js)可能对您在网上发布你的示例很有用。 * 如果您发现p5.js中的bug,请在[issues](https://github.com/processing/p5.js/issues)中记录下来。 ## 👯 制作教程 + * 如果您是p5.js的新手,您可以从这里开始。试着自己做一些东西,然后做一个教程来教别人做。 * 目前,我们正在努力将教程从[processing教程页](https://processing.org/tutorials)转移到[p5.js学习页](http://p5js.org/learn)。如果您愿意帮忙,请看[这个](https://p5js.org/learn/tutorial-guide.html)教程制作教程。 * 我们也欢迎不同主题的教程。你可以在任何地方,以任何格式发布这些教程。如果您想要在网上分享这些教程,请给[@p5xjs](https://twitter.com/p5xjs)打上标签,或者给[hello@p5js.org](mailto:hello@p5js.org)发邮件,让我们了解,以便我们会广泛地分享这些教程。我们非常鼓励针对特定受众或使用案例创建的教程(例如:记者、维权人士、诗人、孩子、老人、梦想家、不同语言的p5等等)。我们喜欢思考:还有谁没有在p5社区中感受到欢迎的氛围又或者没能融入p5社区?我们能否将学习作为对他们的一种邀请?我们应该用什么语言和听众们沟通,让他们感到被力解?请自由尝试您的形式。可以参考[Sharon De La Cruz关于代码俚语的演讲](https://www.youtube.com/watch?v=CFT6w9NKfCs)获得灵感。 * 如果您发现p5.js中的bug,请在[issues](https://github.com/processing/p5.js/issues)中记录下来。 ## 👉 开始 + * 阅读[p5.js社区声明](http://p5js.org/community/) * 可选:查看[贡献者文档](./README/)以了解版本库的概况,并学习如何构建代码(如果与您相关的话)。 * 所有的讨论都发生在github issue上,所以您不需要加入slack/gitter/等等频道。 @@ -40,5 +43,3 @@ 欢迎!我们很高兴你在这里! ❤️ p5.js社区 - - \ No newline at end of file diff --git a/src/content/contributor-docs/zh/contributor_guidelines.mdx b/src/content/contributor-docs/zh/contributor_guidelines.mdx index a97ae1f58f..5766d7daa5 100644 --- a/src/content/contributor-docs/zh/contributor_guidelines.mdx +++ b/src/content/contributor-docs/zh/contributor_guidelines.mdx @@ -1,8 +1,5 @@ - ---- - ---- # 贡献者指南 + 欢迎来到贡献者指南!本文档适用于希望向 p5.js 贡献代码的新贡献者,希望在一些技术步骤上进行刷新的贡献者,或者与 p5.js 的代码贡献相关的其他任何事情。 如果您希望在 p5.js 存储库之外做出贡献(编写教程,计划课程,组织活动),请查看其他相关页面。管理员或维护人员可能会发现[管理员指南](./steward_guidelines/)在审查问题和拉取请求方面更有帮助。 @@ -10,37 +7,41 @@ 本文档内容较长而全面,但我们将尽量清晰地说明所有步骤和要点。请利用目录,浏览器的搜索功能(`Ctrl + F`或`Cmd + F`)来查找与您相关的部分。如果某些部分与您计划的贡献无关,可以跳过它们。 # 目录 -- [关于Issue](#关于issue) - - [Issue是什么?](#issue是什么) - - [问题模板](#问题模板) - - ["发现了一个错误"](#发现了一个错误) - - ["现有功能增强"](#现有功能增强) - - ["新功能请求"](#新功能请求) - - ["讨论"](#讨论) -- [在p5.js代码库上工作](#在p5js代码库上工作) - - [使用Github的编辑功能](#使用github的编辑功能) - - [Fork p5.js并从您的Fork上工作](#fork-p5js并从您的fork上工作) - - [代码库拆分](#代码库拆分) - - [构建设置](#构建设置) - - [Git工作流程](#git工作流程) - - [源代码](#源代码) - - [单元测试](#单元测试) - - [内联文档](#内联文档) - - [国际化](#国际化) - - [可访问性](#可访问性) - - [代码规范](#代码规范) - - [设计原则](#设计原则) -- [拉取请求](#拉取请求) - - [创建拉取请求](#创建拉取请求) - - [拉取请求信息](#拉取请求信息) - - [变基和解决冲突](#变基和解决冲突) - - [讨论和修改](#讨论和修改) - ---- + +* [关于Issue](#关于issue) + * [Issue是什么?](#issue是什么) + * [问题模板](#问题模板) + * ["发现了一个错误"](#发现了一个错误) + * ["现有功能增强"](#现有功能增强) + * ["新功能请求"](#新功能请求) + * ["讨论"](#讨论) +* [在p5.js代码库上工作](#在p5js代码库上工作) + * [使用Github的编辑功能](#使用github的编辑功能) + * [Fork p5.js并从您的Fork上工作](#fork-p5js并从您的fork上工作) + * [代码库拆分](#代码库拆分) + * [构建设置](#构建设置) + * [Git工作流程](#git工作流程) + * [源代码](#源代码) + * [单元测试](#单元测试) + * [内联文档](#内联文档) + * [国际化](#国际化) + * [可访问性](#可访问性) + * [代码规范](#代码规范) + * [设计原则](#设计原则) +* [拉取请求](#拉取请求) + * [创建拉取请求](#创建拉取请求) + * [拉取请求信息](#拉取请求信息) + * [变基和解决冲突](#变基和解决冲突) + * [讨论和修改](#讨论和修改) + +*** + # 关于Issue + p5.js 的 Github 存储库(repo)上的大部分活动都发生在问题上,Issue 很可能也是您开始贡献过程的地方。 ## Issue是什么? + Issue 是Github 上描述 Issue 的帖子的通用名称。这个"Issue"可以是一个错误报告,一个添加新功能的请求,一个讨论,一个问题,一个公告,或者任何可以作为帖子的内容。任何具有Github账号的人,包括机器人,都可以在每个问题下方添加评论!这是贡献者讨论与项目开发相关主题的地方。 尽管问题可以因各种原因而被提出,但对于p5.js的仓库,我们通常只使用问题来讨论与p5.js源代码开发相关的主题。像调试你自己的代码、邀请合作者加入你的项目或其他不相关的主题应该在[论坛](https://discourse.processing.com)或其他平台上进行讨论。 @@ -48,14 +49,17 @@ Issue 是Github 上描述 Issue 的帖子的通用名称。这个"Issue"可以 我们创建了易于使用的问题模板,以帮助您决定一个主题是否应该是Github的问题,还是应该在其他地方发布! ## 问题模板 + p5.js 的问题模板不仅使管理员和维护者更容易理解和审查问题,还使您更容易提交相关问题并更快地获得答复。尽管它们被称为模板,但从您的角度来看,就像填写一个简单的表格,其中表格的不同字段是问题审查者需要正确诊断您的问题所需的重要信息。 要提交新的问题,请转到p5.js存储库的“Issues”选项卡,然后点击“New issue”按钮(通常为绿色且位于右侧)。点击后,将显示几个不同的选项,每个选项对应一个相关的问题模板,或者将您重定向到适当的地方提交您的问题。请从所呈现的所有选项中选择最相关的选项,以确保您的问题能够迅速得到正确的关注。以下将介绍适用于p5.js的问题模板,对于其他存储库,请查阅它们各自的贡献者文档。 ### "发现了一个错误" + 当你在使用p5.js时遇到可能的错误行为或某些行为与文档描述不符时,请使用以下模板。请注意,如果你尝试调试自己的代码或弄清楚为什么你的草图的行为与你预期的不同,并且你认为可能是你的代码的问题,你应该在[论坛](https://discourse.processing.org)上提问。如果后来确定你的问题确实源自p5.js,你可以随时打开一个问题并使用这个模板。 这个模板有几个需要填写的字段: + 1. "p5.js 中最相关的子领域是什么?" - 这有助于相关的管理者识别和回应你的问题。这将自动使用相关的[标签](./issue_labels/)给问题打上标签。 2. "p5.js 版本" - 你可以在` -
\
+
+
Working example: https://editor.p5js.org/jywarren/sketches/rkztwSt8M diff --git a/src/pages/[slug].astro b/src/pages/[...slug].astro similarity index 100% rename from src/pages/[slug].astro rename to src/pages/[...slug].astro diff --git a/src/pages/examples/[slug].astro b/src/pages/examples/[...slug].astro similarity index 100% rename from src/pages/examples/[slug].astro rename to src/pages/examples/[...slug].astro diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000000..8b013d6a6b --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1 @@ +# Index diff --git a/src/scripts/build-contribute.ts b/src/scripts/build-contribute.ts index e7e43e0246..3a0a4008c5 100644 --- a/src/scripts/build-contribute.ts +++ b/src/scripts/build-contribute.ts @@ -1,7 +1,6 @@ import { readdir } from "fs/promises"; import path from "path"; import { fileURLToPath } from "url"; -import YAML from "yaml"; import { cloneLibraryRepo, copyDirectory, @@ -13,6 +12,12 @@ import { writeFile, } from "./utils"; import type { Dirent } from "fs"; +import { remark } from "remark"; +import remarkMDX from "remark-mdx"; +import remarkGfm from "remark-gfm"; +import matter from "gray-matter"; +import { compile } from "@mdx-js/mdx"; +import isAbsoluteUrl from "is-absolute-url"; /* Absolute path to the folder this file is in */ const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -27,7 +32,7 @@ const outputDirectory = path.join(__dirname, "../content/contributor-docs/"); /* Name of the folder within `sourceDirectory` folder where static assets are found */ const assetsSubFolder = "images"; /* Base URL to refer to assets from final mdx docs*/ -const assetsOutputBaseUrl = path.join("images/contributor-docs"); +const assetsOutputBaseUrl = path.join("/images/contributor-docs"); /* Where the image assets will be output for the website */ const assetsOutputDirectory = path.join( repoRootPath, @@ -70,22 +75,36 @@ const convertMdtoMdx = async ( // this means the read file failed for some reason if (contents === undefined) return; - const contentWithRewrittenLinks = rewriteRelativeImageLinks( + const contentWithRewrittenLinksAndComments = rewriteRelativeImageLinks( rewriteRelativeMdLinks(contents), assetsOutputBaseUrl, ); - const newFilePath = path.join(destinationFolder, `${name}.mdx`); - // Build new file contents with frontmatter and .md file contents - const newFileContents = ` ---- -${frontmatterObject ? YAML.stringify(frontmatterObject) : ""} ---- -${contentWithRewrittenLinks} - `; + try { + // Convert the markdown content to MDX + const newContent = remark() + .use(remarkGfm) + .use(remarkMDX) + .processSync(contentWithRewrittenLinksAndComments) + .toString(); + + // All MDX content with frontmatter as a string + const fullFileContent = matter.stringify( + newContent, + frontmatterObject ?? {}, + ); + + // Check that generated content can be compiled by MDX + // (sometimes this catches different problems) + await compile(fullFileContent); - await writeFile(newFilePath, newFileContents); + await writeFile(newFilePath, fullFileContent); + } catch (e) { + console.error( + `${sourceFile} could not be converted to .mdx (${e}). Skipping.`, + ); + } return undefined; }; @@ -119,10 +138,13 @@ export const rewriteRelativeImageLinks = ( * 1. Alt Text for the image * 2. Image url */ - const regexPattern: RegExp = /!\[([^\]]+)\]\((.?\/?images[^)]+)\)/g; + const regexPattern: RegExp = /!\[([^\]]+)\]\((.?\/?[^)]+)\)/g; return markdownText.replace(regexPattern, (match, linkText, url) => { - const { base } = path.parse(url); - return `![${linkText}](${assetsFolderUrl}/${base})`; + if (!isAbsoluteUrl(url)) { + const { base } = path.parse(url); + return `![${linkText}](${assetsFolderUrl}/${base})`; + } + return match; }); }; diff --git a/test/scripts/build-contributor-docs.test.ts b/test/scripts/build-contributor-docs.test.ts index 1afeb2a078..c271c09607 100644 --- a/test/scripts/build-contributor-docs.test.ts +++ b/test/scripts/build-contributor-docs.test.ts @@ -15,7 +15,8 @@ test("rewriteRelativeImageLinks", () => { ![alt-text](images/image.gif) ![alt-text](https://mypage.com/cool-image.jpg) - ![alt-text](mypage.com/cool-image.jpg) + ![alt-text](http://www.mypage.com/cool-image.jpg) + ![Screenshot of the main page of repository. A button, labeled with a fork icon and "Fork 59.3k," is outlined in dark orange.](fork.png) `, "/public/docs", ), @@ -30,6 +31,7 @@ test("rewriteRelativeImageLinks", () => { ![alt-text](/public/docs/image.gif) ![alt-text](https://mypage.com/cool-image.jpg) - ![alt-text](mypage.com/cool-image.jpg) + ![alt-text](http://www.mypage.com/cool-image.jpg) + ![Screenshot of the main page of repository. A button, labeled with a fork icon and "Fork 59.3k," is outlined in dark orange.](/public/docs/fork.png) `); });