├── .dev ├── localhost.cert └── localhost.key ├── .docs └── images │ ├── custom_link_plugin.png │ └── custom_link_settings.png ├── .editorconfig ├── .eslintignore ├── .eslintrc.cjs ├── .github ├── ISSUE_TEMPLATE │ ├── ---bug-report.md │ └── --anything-else.md ├── dependabot.yml └── workflows │ ├── changelog.yml │ ├── main.yml │ └── pull_requests.yml ├── .gitignore ├── .prettierrc ├── .vscode └── settings.json ├── CHANGELOG.md ├── LICENSE.txt ├── Readme.md ├── common ├── api-helpers.js ├── plugin-element-cache.js └── plugin-helpers.js ├── esbuild.config.js ├── package.json ├── plugin-manifest.json ├── plugins ├── i18n.js ├── index.js ├── managePlugin │ └── managePlugin.js ├── panelPlugin │ └── panelPlugin.js └── styles │ ├── button.css │ ├── index.css │ └── panel.css └── yarn.lock /.dev/localhost.cert: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIFCzCCAvOgAwIBAgIUfLvXiw1GaycV+Ya/jmJ54EqjEb0wDQYJKoZIhvcNAQEL 3 | BQAwFDESMBAGA1UEAwwJMTI3LjAuMC4xMCAXDTI0MDIxNTEyMDMxM1oYDzIwNTEw 4 | NzAyMTIwMzEzWjAUMRIwEAYDVQQDDAkxMjcuMC4wLjEwggIiMA0GCSqGSIb3DQEB 5 | AQUAA4ICDwAwggIKAoICAQDDdhdcQr1JGffkrBK7zDukb79YkD5Hg1FWWgByztdv 6 | dc0jvEnGLqkgaL8NYlmZqh5NRZ7ncp/A3C01wxGMAL1jhjcX56wt0hQRdszGdi0J 7 | XN8Ixqa2JLcNn20D4152HPgB7F/JlTPviW4Bws67sUs3JT0wrdjtx77rg4tPCL/S 8 | qP6N21EHXokVnwQHkFh/MUx1+agHDZL6U9iB0MKVErL/q2HLibQfjkJs5Y6kzdQQ 9 | WwVwbZul8XzEi9lU90hnBqT4wvDxYYzKZD+o4965B0ThhDbuYN8J4VCLE1mOLlhC 10 | bpKfMdwA3Un881MgWQXImGseAu1vYN7a8P3xy1LsLdjb6Du86/fQ8SL3YfH+wlw6 11 | 5eQ2J3KYheQgpwlpmIvjLNFqc72ymCIjcWWfW7gT81XmdfhlKObo8HQdrp1uMrSN 12 | 78xRLu9kRmL1iqHgqTF8kn3jUAGPr5EoUyzf8z8cX2Px0B7y8x/o845+CySHenZv 13 | AMkxA7N46c4M7o8kwHHm79dQO0Ep6dyiCTTII+DWe5BpbNlq1ddWynk5Rc2KQrvT 14 | oBV0cLpjvXQAlWB9YzqG6J4tvnfO3RjgUNgxfSDF2XW2Wi1mtnsk8m4NDGgOjLz0 15 | lVrPaeEXMDWiofpuMMW02MIYGTTYSFvO/TPO06tjVxq2jDshoUNS9faRhSxuOCEP 16 | CQIDAQABo1MwUTAdBgNVHQ4EFgQU7UYziQNqS7MqiGXjxN5KDKz784UwHwYDVR0j 17 | BBgwFoAU7UYziQNqS7MqiGXjxN5KDKz784UwDwYDVR0TAQH/BAUwAwEB/zANBgkq 18 | hkiG9w0BAQsFAAOCAgEAgZGo35kJFFEYS1iBHeLuo/7grrA2wcjR4e2eONKq21QU 19 | FJfbp+CpWkvMjq0SBq174KgfNpGrKD5KnfpBJoVD/9s43XGSCDzitZeW2mQtQ3uD 20 | nMYWGNE2rceZWmdDOKhhKMeDRdfososIdtFxBYW6nS9Znx2IwAvlDeOobmwgmUzb 21 | C2Y0S3lUnwQ2E7WStIN7zm43aFVRgigIm71sSWKpQoCfoy63ETG4m2q7uu/Ldw3y 22 | vGF2KA//ThrjWljqNu3xIRaSFWYhKJ6/Y78NNsg5vIoiI+Wk4PigY8Z3UQWdGjmW 23 | 9tZG7SAN2b4s6Zan2fbF3R4q6H3x3N3ZsjKVlBroyaOLN4WFABIHbU81ggFxIsFO 24 | 6RXHfNGDuPuYTrtlogvJ47nI4C5WeUFDWFcZQQ7BrS9ewZcLI5fOvejjlFqvSl87 25 | Y1StpTgVUEFL08bdjyFtAw7miJeofyT8bO1m/0Hg+snBtvBCCAJxflSVuySLp5Bi 26 | EtFxi53J+kezvRm64Y9ub61NGatXUAuPr7Z0P58ES6MgpoYgzUGeybV97MpDsRQb 27 | ze3fzqL5rE3Upb2asgINWjAXDM2Qhr8aY0OVKJQ1P4c+yyddlb3vzNfw0G5W0bsJ 28 | na+/Pfz1M60k1OxsWUGXWOPIEi29VeERDzSwhC4zShPAKYIlqrUpMunHoAGlGvM= 29 | -----END CERTIFICATE----- 30 | -------------------------------------------------------------------------------- /.dev/localhost.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDDdhdcQr1JGffk 3 | rBK7zDukb79YkD5Hg1FWWgByztdvdc0jvEnGLqkgaL8NYlmZqh5NRZ7ncp/A3C01 4 | wxGMAL1jhjcX56wt0hQRdszGdi0JXN8Ixqa2JLcNn20D4152HPgB7F/JlTPviW4B 5 | ws67sUs3JT0wrdjtx77rg4tPCL/SqP6N21EHXokVnwQHkFh/MUx1+agHDZL6U9iB 6 | 0MKVErL/q2HLibQfjkJs5Y6kzdQQWwVwbZul8XzEi9lU90hnBqT4wvDxYYzKZD+o 7 | 4965B0ThhDbuYN8J4VCLE1mOLlhCbpKfMdwA3Un881MgWQXImGseAu1vYN7a8P3x 8 | y1LsLdjb6Du86/fQ8SL3YfH+wlw65eQ2J3KYheQgpwlpmIvjLNFqc72ymCIjcWWf 9 | W7gT81XmdfhlKObo8HQdrp1uMrSN78xRLu9kRmL1iqHgqTF8kn3jUAGPr5EoUyzf 10 | 8z8cX2Px0B7y8x/o845+CySHenZvAMkxA7N46c4M7o8kwHHm79dQO0Ep6dyiCTTI 11 | I+DWe5BpbNlq1ddWynk5Rc2KQrvToBV0cLpjvXQAlWB9YzqG6J4tvnfO3RjgUNgx 12 | fSDF2XW2Wi1mtnsk8m4NDGgOjLz0lVrPaeEXMDWiofpuMMW02MIYGTTYSFvO/TPO 13 | 06tjVxq2jDshoUNS9faRhSxuOCEPCQIDAQABAoICACiwjb5kGll8cXGGLMQxiPz7 14 | Ul8ScBSdDrKmO8+qpYiLgm/9A3KhRg38IEGeBr8JfhNh+el+oCka7MJzYFS/1q1A 15 | RHnSfbJwOENGcuyhr1Byp++AwzXJwN2yIZScoY5/C1YDKhGh4NTtzBvLvROvndPW 16 | Cb33guBFI8aNdNO4I46sJYnMbTrWgD0jBEi60OFxltQ8a7FELyOzjq+/kLJN2TuG 17 | Ju6jNP8Ys1VOGHrQamQZPrGf77YE5o9X+Z9JdyYTaQZsNpJZV2DOq73x6eykyb8U 18 | sga/3c6FvCmnlo4VscPqltVTINSBPKTO1rA2OBEBQdNWkq0MAnibkJHkXNfT13/a 19 | 3woM0cCzY6UfTakD42qJQ+coXeS6u41wDBl7jcIJrHM9Ych0mFrmn/IWY8ay95vp 20 | ZOd36qD9Rs/+Ys8WaRc8giPO1l84ndfWx0jNhIkG7KQoQVIZk7Bf0Oc8gx6XzAbf 21 | mcSwNjN+3/gxlrJeb5eqlT4hE7zxgDMrW0qZc+iYRtsrIeaOnWWQ8rXOBOwvj35W 22 | xfGMvVb56rPHBEHcbNRHiDqYJcisd6xO+zMQK/bX0uSEZroy1MTiKENuhJxx8C8E 23 | t7Fwk+P/AdMLkKK7LEGw22QcAOBdzPsnrkiZajcvda+BJ0tO+Nsx25Vyxag+BDQl 24 | nX2ppIvK0odsbOkY8XmxAoIBAQDgUeCslVa0LMkmpltGntgO2KjMjnQs7mqEM06z 25 | a0MhEi/mCTd09CxRKDL8kCJvPIj3IIVYlRFck8e4R+VbBc73ZOwtUz4Nz6Ly/pzs 26 | mSKfX1bUYq7b5cwzn9kPM9v160CcRHNGcrlFSz/jH46kGlS1xGjWHoi0DhhLZU/b 27 | OPDtN2hueSQj2DYwLGhEqgUsaJFa7maCMRmwBrs6rwQiJS2YVpaQ3HQaind1Q7Mz 28 | F7uFT3ioyIa9X5Qq0O9HUzfJeTxAoweF5N2Ub9g41DYLMyVvnQv1kuldcEAMUTVo 29 | bXZYdyIrH2jJLax3IVMfhruTFbsZKIasuvq1De2CJH7YAUuNAoIBAQDfENqUilKp 30 | aYiGo0e8IWQtojiEW+5Le1jPecZ2btLB5pQxeoCvPTYZVmwyT+jVP5vi6owXW/Bi 31 | vJDvNRniuzsVkz2VR+WdtpwK4poEqX3bEeGjBDeOkJWR23EINvOS/CkOdpLtTXAi 32 | YrWGEVHVXbIcZC8+am/gifVb1P/ext+taG4dQnvKaLGbSxX7zBBxEY3VdFiVfroD 33 | BEvCue5suHxni8nFXWLJncUe/u9j9k3lnGwa7yADrASLtXRVXRBxz5zQvabFJ+DS 34 | naneySY2UBfRrRUvDAc7PlvV+fpI4gmEYsXqWnqoEHcspWuA5Wtx5iF86XM/ZdkU 35 | 5pJuPk3MuHRtAoIBAFf/JqDtMIcbrokP52yLsXwZeBZOp7pciMJ1kiEGKd5WUR3v 36 | babehmgL2fyD2k5CtAQl6Ml4KMhlXIqpAYs0ex1HpPKe3g/y7Rxfz1VtOUzFzL0i 37 | PTAcNH/n6/FvyZDuCXmDzKjNJmrNezFw1rb/cU2gz/N3JO9lPBiPlMUN0E1uV/RG 38 | Z2v8TD2XnguZms/x8Vt3fBUEh+wqp9X8hCWU6g8BoK0RHiavPO9ucGTRoYlJRK8J 39 | gvnU/b3SGpujRJYvjfhZPAFFZ7rsKSkZ7l10YfIn7GIYkJ1MBIQQc2AU2MEZcvjx 40 | qFyLI0XUd9Q9OWYYtz3GTRaDfwf5f7t2759y2p0CggEAVWJgKMehyJNK3S6XAN5P 41 | OGCF/bQqzN3UKubUHvVg2zPlueLIa0uk76HzHHcWCrqkcwGQykg5BbJkUAwlcnJ0 42 | tVd9FS1GKU6DAG+owOwX7skzc3Djy0Bw4Dn9VEWkirjXBmBA8XDY4XCjR0RN7LxG 43 | tzNqGhwn4u0r7BDmOGIrsHbu32hZdisJAQaGzbFZAc7UWcaFOgQeM5VrYohFSXx8 44 | si4B9/g9Hiu0Dp9LBxp6ys9LWiv6Ny2bN9cnRp2u88GipwxRT9pp5nTPVyXr6JJT 45 | 68CzASU7h2PhR1C+izNqrTAZzhEALmDPHVncgqROsnSCkQvTP4s+ww9XMbfLk/dv 46 | KQKCAQEAotNHi3WXU0xcXW1rdIIRJoSTORLFoSGoN2hkT1sbIxcbE90znBQv2ycg 47 | KdtHJPGjw46JUpaKT2G48Z/5U7GNn0jyCzqnzzqk1mPUBvFR9WLZZufmWF6TyYrm 48 | B76+XoydOOQP2aYczdJD16SKLmKLRwK+mIqwu6BWz7FYb2uKLSFyHpJmt4dDd0yg 49 | VgN+UtPJYbgws9F/+KFJEq4BVpAOu26FQz1lDga+xxPqqnIMs65NX/VN9xs3uNtS 50 | nAg3bHFZF3PpNFTDX+G5Mmdgq+5P0FGnbo9xnjQX0Dg9GF7t77UBAuSiwBqX7U+/ 51 | 0C66dFZAOvWn1oIUWWms2ytx0rg7sA== 52 | -----END PRIVATE KEY----- 53 | -------------------------------------------------------------------------------- /.docs/images/custom_link_plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flotiq/flotiq-ui-plugin-custom-links/7e3c5d7556343df4be14aab0c0fdeca88ad395b4/.docs/images/custom_link_plugin.png -------------------------------------------------------------------------------- /.docs/images/custom_link_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flotiq/flotiq-ui-plugin-custom-links/7e3c5d7556343df4be14aab0c0fdeca88ad395b4/.docs/images/custom_link_settings.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | 6 | [*.{js,jsx,mdx,ts,json,mjs,css}] 7 | charset = utf-8 8 | indent_style = space 9 | indent_size = 2 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .eslintrc.cjs 4 | esbuild.config.js 5 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | es6: true, 6 | }, 7 | extends: ['eslint:recommended', 'prettier'], 8 | parserOptions: { 9 | sourceType: 'module', 10 | ecmaVersion: 2020, 11 | }, 12 | rules: { 13 | 'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], 14 | 'linebreak-style': 0, 15 | 16 | /* This rule will warn when it encounters a reference to an identifier that has not yet been declared. */ 17 | 'no-use-before-define': [ 18 | 'error', 19 | { 20 | variables: false, 21 | }, 22 | ], 23 | 24 | /* Enforce require() on the top-level module scope */ 25 | 'global-require': 0, 26 | 27 | 'max-len': [ 28 | 'error', 29 | { 30 | code: 120, 31 | }, 32 | ], 33 | 34 | 'guard-for-in': 0, 35 | 'no-underscore-dangle': 0, 36 | 'import/prefer-default-export': 0, 37 | 'import/no-anonymous-default-export': 0, 38 | 'import/no-extraneous-dependencies': 0, 39 | }, 40 | }; 41 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Bug report" 3 | about: Report reproducible software issues, so we can improve 4 | 5 | --- 6 | 7 | Welcome to the Plugin for Custom links GitHub repo! 8 | 9 | For questions related to the plugin creation process, please check out docs at https://flotiq.com/docs/panel/PluginsDevelopment/plugins/ 10 | 11 | For support, help, questions, requests and ideas use https://discord.gg/FwXcHnX 12 | 13 | ### Issue Summary 14 | 15 | A summary of the issue and the browser/OS environment in which it occurs. 16 | 17 | ### To Reproduce 18 | 19 | 1. This is the first step 20 | 2. This is the second step, etc. 21 | 22 | Any other info e.g. Why do you consider this to be a bug? What did you expect to happen instead? 23 | 24 | ### Technical details: 25 | 26 | * Next.js Version: 27 | * Node Version: 28 | * OS: 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--anything-else.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Anything else" 3 | about: "For help, support, features & ideas - please use https://discord.gg/FwXcHnX" 4 | 5 | --- 6 | 7 | Click "Preview" for a nicer view! 8 | 9 | For support, help, questions, requests and ideas use https://discord.gg/FwXcHnX 10 | 11 | Alternatively, check out these resources below. Thanks! 12 | 13 | - [Discord](https://discord.gg/FwXcHnX) 14 | - [Plugin Docs](https://flotiq.com/docs/panel/PluginsDevelopment/plugins/) 15 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: '/' 5 | schedule: 6 | interval: 'monthly' 7 | -------------------------------------------------------------------------------- /.github/workflows/changelog.yml: -------------------------------------------------------------------------------- 1 | name: Check Changelog and Version 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | - main 8 | 9 | jobs: 10 | check-changelog: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | with: 15 | fetch-depth: 100 16 | - uses: flotiq/check-changelog-and-version@v1.1.1 17 | with: 18 | changelog_file: CHANGELOG.md 19 | version_file: package.json 20 | check-changelog-plugin-manifest: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - uses: actions/checkout@v4 24 | with: 25 | fetch-depth: 100 26 | - uses: flotiq/check-changelog-and-version@v1.1.1 27 | with: 28 | changelog_file: CHANGELOG.md 29 | version_file: plugin-manifest.json 30 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build & Release 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | push: 8 | branches: [ main ] 9 | workflow_dispatch: 10 | 11 | jobs: 12 | build-release: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Use Node.js 18.x 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 18.x 20 | - run: yarn 21 | - run: yarn build 22 | - name: Create tar from built plugin 23 | run: | 24 | BUILDFOLDER="dist" 25 | MANIFEST=$(find ./$BUILDFOLDER -name plugin-manifest.json) 26 | [ -z $MANIFEST ] && cp plugin-manifest $BUILDFOLDER 27 | MANIFEST="$BUILDFOLDER/plugin-manifest.json" 28 | VERSION=$(jq '.version' $MANIFEST -r) 29 | echo "version=$VERSION" 30 | mkdir -p output 31 | tar -C $BUILDFOLDER -czf output/$VERSION.tar.gz . 32 | ls -la output 33 | echo "version=$VERSION" >> $GITHUB_ENV 34 | - name: Create artifact 35 | uses: actions/upload-artifact@v4 36 | with: 37 | name: plugin-package 38 | path: output 39 | - name: Release built plugin 40 | uses: svenstaro/upload-release-action@v2 41 | with: 42 | repo_token: ${{ secrets.GITHUB_TOKEN }} 43 | file: output/* 44 | tag: ${{ env.version }} 45 | overwrite: true 46 | file_glob: true 47 | if: github.ref == 'refs/heads/main' 48 | -------------------------------------------------------------------------------- /.github/workflows/pull_requests.yml: -------------------------------------------------------------------------------- 1 | name: Build & Deploy to Minio 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | pull_request: 8 | 9 | jobs: 10 | build-minio: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: Use Node.js 18.x 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version: 18.x 18 | - run: yarn 19 | - run: yarn build 20 | - name: Create tar from built plugin 21 | run: | 22 | BUILDFOLDER="dist" 23 | MANIFEST=$(find ./$BUILDFOLDER -name plugin-manifest.json) 24 | [ -z $MANIFEST ] && cp plugin-manifest $BUILDFOLDER 25 | MANIFEST="$BUILDFOLDER/plugin-manifest.json" 26 | VERSION=$(jq '.version' $MANIFEST -r) 27 | URL=$(jq '.url' $MANIFEST -r) 28 | echo "version=$VERSION" 29 | mkdir -p output 30 | tar -C $BUILDFOLDER -czf output/$VERSION.tar.gz . 31 | ls -la output 32 | echo "version=$VERSION" >> $GITHUB_ENV 33 | REPO_NAME="$(basename $GITHUB_REPOSITORY)" 34 | echo "REPO_NAME=$REPO_NAME" >> $GITHUB_ENV 35 | ENTRYPOINT_NAME=$(basename $URL) 36 | ENTRYPOINT_PATH=$(find ./$BUILDFOLDER -name $ENTRYPOINT_NAME | sed "s|^./$BUILDFOLDER/||") 37 | UPLOAD_URL="$MINIO_URL/flotiq-plugins-dev/$REPO_NAME/$GITHUB_HEAD_REF/$ENTRYPOINT_PATH" 38 | echo $UPLOAD_URL 39 | tmp=$(mktemp) 40 | jq --arg upload_url "$UPLOAD_URL" '.url = $upload_url' $MANIFEST > "$tmp" && mv "$tmp" $MANIFEST 41 | env: 42 | MINIO_URL: ${{ secrets.MINIO_ENDPOINT }} 43 | - name: Minio Deploy 44 | uses: lovellfelix/minio-deploy-action@v1 45 | with: 46 | endpoint: ${{ secrets.MINIO_ENDPOINT }} 47 | access_key: ${{ secrets.MINIO_ACCESS_KEY }} 48 | secret_key: ${{ secrets.MINIO_SECRET_KEY }} 49 | bucket: 'flotiq-plugins-dev' 50 | # Optional inputs with their defaults: 51 | source_dir: 'dist' 52 | target_dir: '/${{ env.REPO_NAME }}/${{ github.head_ref }}/' 53 | - name: Create artifact 54 | uses: actions/upload-artifact@v4 55 | with: 56 | name: plugin-package 57 | path: output/${{ env.version }}.tar.gz 58 | dependabot: 59 | runs-on: ubuntu-latest 60 | if: github.actor == 'dependabot[bot]' 61 | steps: 62 | - name: Dependabot metadata 63 | id: metadata 64 | uses: dependabot/fetch-metadata@v1 65 | with: 66 | github-token: "${{ secrets.GITHUB_TOKEN }}" 67 | - name: Approve a PR 68 | run: gh pr review --approve "$PR_URL" 69 | env: 70 | PR_URL: ${{github.event.pull_request.html_url}} 71 | GH_TOKEN: ${{secrets.GITHUB_TOKEN}} 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "semi": true, 4 | "singleQuote": true, 5 | "tabWidth": 2, 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[css][scss][javascript][typescript][javascriptreact][typescriptreact][json][mdx][html]": { 3 | "editor.formatOnSave": true, 4 | "editor.defaultFormatter": "esbenp.prettier-vscode" 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [1.1.0] 9 | ### Added 10 | * Changelog 11 | * Issue templates 12 | * Dependabot 13 | * Collaboration section in readme 14 | * License 15 | * GitHub check actions 16 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2025 Flotiq team 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | Flotiq logo 3 | 4 | 5 | # About plugin 6 | 7 | This plugin will display a button with a link in the content edit object. The link will be supplemented with data from the currently edited object. Thanks to this link, you will be able to easily access the preview of where the content will be used. 8 | 9 | ## Plugin outcome 10 | 11 | In the sidebar of the Content Object form, you will see a panel with the configured link button. The button will not be visible when adding a new object. 12 | 13 | plugin-item 14 | 15 | ## Configuring plugin 16 | 17 | To manage a plugin, you must first add it to your plugins. Click the "+" icon to add the plugin to your library and click the "Manage" button. It will open the plugin settings. 18 | 19 | plugin-settings 20 | 21 | Field descriptions: 22 | 23 | * `URL Template` - It's a place to enter the link template, e.g. https://my-blog/post/{slug}, where `slug` is the name of the content field of the type selected below. Instead of `{slug}`, you can use any field of a given content type, it is also possible to use nesting, e.g. `{internal.createdAt}`. You can also use list fields: `{addresses[0].city}`. 24 | * `Displayed Name Template` - Any name that will be displayed on the link button. You can also use content object fields (e.g. `{slug}`), in the same way as with Url Template. 25 | * `Content Type Definition` - Select the content type to display the button only for the specified content type. If the content type is not selected, the button will be shown when editing each content object. 26 | 27 | # Development 28 | 29 | ## Quick start 30 | 31 | 1. `yarn` - to install dependencies 32 | 2. `yarn start` - to start development mode - rebuild on file modifications 33 | 3. update your `plugin-manifest.json` file to contain the production URL and other plugin information 34 | 4. `yarn build` - to build plugins 35 | 36 | ## Dev environment 37 | 38 | Dev environment is configured to use: 39 | 40 | * `prettier` - best used with automatic format on save in IDE 41 | * `eslint` - it is built into both `start` and `build` commands 42 | 43 | ## Output 44 | 45 | The plugins are built into a single `dist/index.js` file. The manifest is copied to `dist/plugin-manifest.json` file. 46 | 47 | ## Deployment 48 | 49 | 50 | 51 | ## Loading the plugin 52 | 53 | **Warning:** While developing, you can use `https://localhost:3053/plugin-manifest.json` address to load the plugin manifest. Make sure your browser trusts the local certificate on the latter, to be able to use it e.g. with `https://editor.flotiq.com` 54 | 55 | ### URL 56 | 57 | **Hint**: You can use localhost url from development mode `https://localhost:3053/index.js` 58 | 59 | 1. Open Flotiq editor 60 | 2. Open Chrome Dev console 61 | 3. Execute the following script 62 | ```javascript 63 | FlotiqPlugins.loadPlugin('plugin-id', '') 64 | ``` 65 | 4. Navigate to the view that is modified by the plugin 66 | 67 | ### Directly 68 | 69 | 1. Open Flotiq editor 70 | 2. Open Chrome Dev console 71 | 3. Paste the content of `dist/index.js` 72 | 4. Navigate to the view that is modified by the plugin 73 | 74 | ### Deployment 75 | 76 | **Hint**: You can use localhost url from development mode `https://localhost:3053/plugin-manifest.json` 77 | 78 | 1. Open Flotiq editor 79 | 2. Add a new plugin and paste the URL to the hosted `plugin-manifest.json` file 80 | 3. Navigate to the view that is modified by the plugin 81 | 82 | ## Collaborating 83 | 84 | If you wish to talk with us about this project, feel free to hop on our [![Discord Chat](https://img.shields.io/discord/682699728454025410.svg)](https://discord.gg/FwXcHnX). 85 | 86 | If you found a bug, please report it in [issues](https://github.com/flotiq/flotiq-ui-plugin-custom-links/issues). 87 | -------------------------------------------------------------------------------- /common/api-helpers.js: -------------------------------------------------------------------------------- 1 | let cachedCtds = null; 2 | 3 | export const getContentTypes = async (client, toast, t) => { 4 | if (cachedCtds) return cachedCtds; 5 | 6 | cachedCtds = client 7 | .getContentTypes({ 8 | limit: 1000, 9 | page: 1, 10 | order_by: 'label', 11 | order_direction: 'asc', 12 | }) 13 | .then(({ body, status }) => { 14 | if (status < 200 || status >= 300) { 15 | throw new Error(); 16 | } 17 | 18 | return body.data || []; 19 | }) 20 | .catch(() => { 21 | toast.error(t('ContentTypesErrors')); 22 | return []; 23 | }); 24 | 25 | return cachedCtds; 26 | }; 27 | -------------------------------------------------------------------------------- /common/plugin-element-cache.js: -------------------------------------------------------------------------------- 1 | const appRoots = {}; 2 | 3 | export const addElementToCache = (element, key, data = {}) => { 4 | appRoots[key] = { 5 | element, 6 | data, 7 | }; 8 | 9 | element.addEventListener('flotiq.detached', () => { 10 | setTimeout(() => { 11 | return delete appRoots[key]; 12 | }, 50); 13 | }); 14 | }; 15 | 16 | export const getCachedElement = (key) => { 17 | return appRoots[key]; 18 | }; 19 | 20 | export const registerFn = (pluginInfo, callback) => { 21 | if (window.FlotiqPlugins?.add) { 22 | window.FlotiqPlugins.add(pluginInfo, callback); 23 | return; 24 | } 25 | if (!window.initFlotiqPlugins) window.initFlotiqPlugins = []; 26 | window.initFlotiqPlugins.push({ pluginInfo, callback }); 27 | }; 28 | -------------------------------------------------------------------------------- /common/plugin-helpers.js: -------------------------------------------------------------------------------- 1 | const appRoots = {}; 2 | 3 | export const onElementRemoved = (element, callback) => { 4 | new MutationObserver(function () { 5 | if (!document.contains(element)) { 6 | callback(); 7 | this.disconnect(); 8 | } 9 | }).observe(element.parentElement, { childList: true }); 10 | }; 11 | 12 | export const addElementToCache = (element, root, key) => { 13 | appRoots[key] = { 14 | element, 15 | root, 16 | }; 17 | 18 | element.addEventListener( 19 | 'flotiq.attached', 20 | () => onElementRemoved(element, () => delete appRoots[key]), 21 | true, 22 | ); 23 | }; 24 | 25 | export const removeRoot = (key) => { 26 | delete appRoots[key]; 27 | }; 28 | 29 | export const getCachedElement = (key) => { 30 | return appRoots[key]; 31 | }; 32 | 33 | export const registerFn = (pluginInfo, callback) => { 34 | if (window.FlotiqPlugins?.add) { 35 | window.FlotiqPlugins.add(pluginInfo, callback); 36 | return; 37 | } 38 | if (!window.initFlotiqPlugins) window.initFlotiqPlugins = []; 39 | window.initFlotiqPlugins.push({ pluginInfo, callback }); 40 | }; 41 | 42 | /** 43 | * Read key value deep inside object 44 | * @param {string} key 45 | * @param {object} object 46 | * @returns {*} example: read 'object[0].key' from 'object: [{key: value}] 47 | */ 48 | export const deepReadKeyValue = (key, object) => { 49 | return key 50 | .split(/[[.\]]/) 51 | .filter((kp) => !!kp) 52 | .reduce((nestedOptions, keyPart) => { 53 | return nestedOptions?.[keyPart]; 54 | }, object); 55 | }; -------------------------------------------------------------------------------- /esbuild.config.js: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import * as esbuild from 'esbuild'; 3 | import eslint from 'esbuild-plugin-eslint'; 4 | import inlineImportPlugin from 'esbuild-plugin-inline-import'; 5 | import url from 'postcss-url'; 6 | import postcss from 'postcss'; 7 | import { copy } from 'esbuild-plugin-copy'; 8 | 9 | import http from 'node:http'; 10 | import https from 'node:https'; 11 | import fs from 'fs'; 12 | 13 | const watch = process.argv.includes('--watch'); 14 | 15 | function formatDuration(seconds) { 16 | const time = { 17 | y: 31536000, 18 | d: 86400, 19 | h: 3600, 20 | m: 60, 21 | s: 1, 22 | ms: 0.001, 23 | }, 24 | res = []; 25 | 26 | if (seconds === 0) return 'now'; 27 | 28 | for (let key in time) { 29 | if (seconds >= time[key]) { 30 | let val = Math.floor(seconds / time[key]); 31 | res.push((val += key)); 32 | seconds = seconds % time[key]; 33 | } 34 | } 35 | 36 | return res.length > 1 37 | ? res.join(', ').replace(/,([^,]*)$/, ' and' + '$1') 38 | : res[0]; 39 | } 40 | 41 | function postCssTransformer(code, path) { 42 | return new Promise((resolve, reject) => { 43 | postcss([ 44 | url({ 45 | url: 'inline', 46 | }), 47 | ]) 48 | .process(code, { from: path }) 49 | .then((result) => { 50 | resolve(result.css); 51 | }) 52 | .catch(reject); 53 | }); 54 | } 55 | 56 | const context = await esbuild.context({ 57 | entryPoints: ['plugins/index.js'], 58 | bundle: true, 59 | minify: true, 60 | sourcemap: true, 61 | outfile: 'dist/index.js', 62 | 63 | plugins: [ 64 | copy({ 65 | // this is equal to process.cwd(), which means we use cwd path as base path to resolve `to` path 66 | // if not specified, this plugin uses ESBuild.build outdir/outfile options as base path. 67 | resolveFrom: 'cwd', 68 | assets: { 69 | from: ['./plugin-manifest.json'], 70 | to: ['dist/plugin-manifest.json'], 71 | }, 72 | watch: true, 73 | }), 74 | 75 | inlineImportPlugin({ 76 | transform: (code, { path }) => { 77 | if (path.endsWith('.css')) { 78 | return postCssTransformer(code, path); 79 | } 80 | return code; 81 | }, 82 | }), 83 | 84 | eslint({ 85 | throwOnError: !watch, 86 | }), 87 | { 88 | name: 'result-message-plugin', 89 | setup(build) { 90 | let startedAt = null; 91 | build.onStart(() => { 92 | startedAt = Date.now(); 93 | console.log('Build started'); 94 | }); 95 | build.onEnd((result) => { 96 | const duration = Date.now() - startedAt; 97 | const durationText = formatDuration(duration / 1000); 98 | console.log( 99 | 'Build ended after', 100 | duration > 1000 101 | ? chalk.red(durationText) 102 | : chalk.green(durationText), 103 | ); 104 | const errors = result?.errors?.length || 0; 105 | const warnings = result?.warnings?.length || 0; 106 | if (result?.errors?.length) { 107 | console.log(chalk.red('Failed. See errors above for details.')); 108 | } else { 109 | console.log(chalk.green('Success')); 110 | } 111 | if (errors || warnings) { 112 | console.log( 113 | `Errors/Warnings: ${errors ? chalk.red(errors) : errors}/${ 114 | warnings ? chalk.yellow(warnings) : warnings 115 | }`, 116 | ); 117 | } 118 | }); 119 | }, 120 | }, 121 | ], 122 | }); 123 | 124 | if (watch) { 125 | console.log('Watching for changes...'); 126 | context.watch(); 127 | 128 | const { host, port } = await context.serve({ 129 | servedir: 'dist', 130 | port: 3050, 131 | }); 132 | 133 | const headers = { 134 | 'access-control-allow-origin': '*' /* @dev First, read about security */, 135 | 'access-control-allow-methods': 'OPTIONS, POST, GET', 136 | 'access-control-max-age': 2592000, // 30 days 137 | 'access-control-allow-headers': '*', 138 | /** add other headers as per requirement */ 139 | }; 140 | 141 | const options = { 142 | key: fs.readFileSync('./.dev/localhost.key'), 143 | cert: fs.readFileSync('./.dev/localhost.cert'), 144 | }; 145 | 146 | // Then start a proxy server on port 3000 147 | https 148 | .createServer(options, (req, res) => { 149 | const options = { 150 | hostname: host, 151 | port: port, 152 | path: req.url, 153 | method: req.method, 154 | headers: req.headers, 155 | }; 156 | 157 | if (req.method === 'OPTIONS') { 158 | res.writeHead(204, headers); 159 | res.end(); 160 | return; 161 | } 162 | 163 | // Forward each incoming request to esbuild 164 | const proxyReq = http.request(options, (proxyRes) => { 165 | // Forward the response from esbuild to the client 166 | // Include CORS headers 167 | res.writeHead(proxyRes.statusCode, { 168 | ...proxyRes.headers, 169 | ...headers, 170 | }); 171 | proxyRes.pipe(res, { end: true }); 172 | }); 173 | 174 | // Forward the body of the request to esbuild 175 | req.pipe(proxyReq, { end: true }); 176 | }) 177 | .listen(3053); 178 | 179 | console.log( 180 | `Serving at http://${host.replace( 181 | '0.0.0.0', 182 | 'localhost', 183 | )}:${port}/index.js and https://${host.replace( 184 | '0.0.0.0', 185 | 'localhost', 186 | )}:${3053}/index.js`, 187 | ); 188 | 189 | console.log( 190 | `Manifest file is avaiable at http://${host.replace( 191 | '0.0.0.0', 192 | 'localhost', 193 | )}:${port}/plugin-manifest.json and https://${host.replace( 194 | '0.0.0.0', 195 | 'localhost', 196 | )}:${3053}/plugin-manifest.json`, 197 | ); 198 | } else { 199 | await context.rebuild(); 200 | context.dispose(); 201 | } 202 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "license": "MIT", 4 | "version": "1.1.0", 5 | "scripts": { 6 | "build": "node esbuild.config.js", 7 | "start": "node esbuild.config.js --watch" 8 | }, 9 | "devDependencies": { 10 | "@babel/eslint-parser": "^7.26.8", 11 | "esbuild": "^0.25.1", 12 | "esbuild-plugin-eslint": "^0.3.12", 13 | "esbuild-plugin-inline-import": "^1.1.0", 14 | "eslint": "^8.57.1", 15 | "eslint-config-prettier": "^10.1.1", 16 | "postcss": "^8.5.3", 17 | "postcss-url": "^10.1.3", 18 | "prettier": "^3.5.3" 19 | }, 20 | "dependencies": { 21 | "chalk": "^5.4.1", 22 | "i18next": "^23.10.1", 23 | "esbuild-plugin-copy": "^2.1.1" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /plugin-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "flotiq.custom-links", 3 | "name": "Custom Links", 4 | "version": "1.1.0", 5 | "description": "This plugin will display a button with a link in the edit content object. The link will be supplemented with data from the currently edited object. Thanks to this link, you will be able to get easy access to the preview of where the content is used.", 6 | "repository": "https://github.com/flotiq/flotiq-ui-plugins-custom-links", 7 | "url": "https://localhost:3053/index.js", 8 | "permissions": [ 9 | { 10 | "ctdName": "_plugin_settings", 11 | "canRead": true, 12 | "canUpdate": true, 13 | "type": "CO" 14 | }, 15 | { 16 | "ctdName": "*", 17 | "canRead": true, 18 | "type": "CTD" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /plugins/i18n.js: -------------------------------------------------------------------------------- 1 | import i18n from 'i18next'; 2 | 3 | i18n.init({ 4 | fallbackLng: 'en', 5 | supportedLngs: ['en', 'pl'], 6 | resources: { 7 | en: { 8 | translation: { 9 | ContentTypes: 'Content types', 10 | LinkTemplate: 'Link name template', 11 | Settings: 'Settings', 12 | UrlTemplate: 'URL template', 13 | }, 14 | }, 15 | pl: { 16 | translation: { 17 | ContentTypes: 'Definicje typu', 18 | LinkTemplate: 'Szablon nazwy przycisku', 19 | Settings: 'Ustawienia', 20 | UrlTemplate: 'Szablon adresu URL', 21 | }, 22 | }, 23 | }, 24 | }); 25 | 26 | export default i18n; 27 | -------------------------------------------------------------------------------- /plugins/index.js: -------------------------------------------------------------------------------- 1 | import { registerFn } from '../common/plugin-helpers'; 2 | import { handlePanelPlugin, loadPanelPlugin } from './panelPlugin/panelPlugin'; 3 | import { handleManagePlugin } from './managePlugin/managePlugin'; 4 | import cssString from 'inline:./styles/index.css'; 5 | import cssPanelString from 'inline:./styles/panel.css'; 6 | import cssButtonString from 'inline:./styles/button.css'; 7 | import pluginInfo from '../plugin-manifest.json'; 8 | 9 | const loadStyles = () => { 10 | if (!document.getElementById(`${pluginInfo.id}-styles`)) { 11 | const style = document.createElement('style'); 12 | style.id = `${pluginInfo.id}-styles`; 13 | style.textContent = cssString + cssButtonString + cssPanelString; 14 | document.head.appendChild(style); 15 | } 16 | }; 17 | 18 | registerFn(pluginInfo, (handler, _client, { getLanguage }) => { 19 | loadStyles(); 20 | 21 | handler.on('flotiq.plugins.manage::form-schema', (data) => 22 | handleManagePlugin(data, pluginInfo, getLanguage), 23 | ); 24 | handler.on('flotiq.form.sidebar-panel::add', (data) => 25 | handlePanelPlugin(data, pluginInfo), 26 | ); 27 | }); 28 | 29 | const pluginManagePreviewRoot = document.getElementById('manage-preview-root'); 30 | const pluginPanelPreviewRoot = document.getElementById('panel-preview-root'); 31 | 32 | if (pluginManagePreviewRoot && pluginPanelPreviewRoot) { 33 | loadStyles(); 34 | loadPanelPlugin(pluginPanelPreviewRoot); 35 | } 36 | -------------------------------------------------------------------------------- /plugins/managePlugin/managePlugin.js: -------------------------------------------------------------------------------- 1 | import i18n from '../i18n'; 2 | 3 | let configCache = null; 4 | 5 | export const handleManagePlugin = ( 6 | { plugin, contentTypes, modalInstance }, 7 | pluginInfo, 8 | getLanguage, 9 | ) => { 10 | if (plugin?.id !== pluginInfo.id) return null; 11 | 12 | if (configCache) return configCache; 13 | 14 | const ctds = (contentTypes || []) 15 | .filter((ctd) => !ctd.internal || ctd.name === '_media') 16 | .map(({ name, label }) => ({ value: name, label })); 17 | 18 | const language = getLanguage(); 19 | if (language !== i18n.language) { 20 | i18n.changeLanguage(language); 21 | } 22 | 23 | configCache = {}; 24 | 25 | configCache.schema = { 26 | id: pluginInfo.id, 27 | name: 'custom_links', 28 | label: 'Custom links', 29 | workflowId: 'generic', 30 | internal: false, 31 | schemaDefinition: { 32 | type: 'object', 33 | allOf: [ 34 | { 35 | $ref: '#/components/schemas/AbstractContentTypeSchemaDefinition', 36 | }, 37 | { 38 | type: 'object', 39 | properties: { 40 | settings: { 41 | type: 'array', 42 | items: { 43 | type: 'object', 44 | required: ['url_template', 'link_template'], 45 | properties: { 46 | url_template: { 47 | type: 'string', 48 | minLength: 1, 49 | }, 50 | content_types: { 51 | type: 'array', 52 | }, 53 | link_template: { 54 | type: 'string', 55 | minLength: 1, 56 | }, 57 | }, 58 | }, 59 | minItems: 1, 60 | }, 61 | }, 62 | }, 63 | ], 64 | required: [], 65 | additionalProperties: false, 66 | }, 67 | metaDefinition: { 68 | order: ['settings'], 69 | propertiesConfig: { 70 | settings: { 71 | items: { 72 | order: ['url_template', 'link_template', 'content_types'], 73 | propertiesConfig: { 74 | url_template: { 75 | label: i18n.t('UrlTemplate'), 76 | unique: false, 77 | helpText: '', 78 | inputType: 'text', 79 | }, 80 | content_types: { 81 | label: i18n.t('ContentTypes'), 82 | unique: false, 83 | helpText: '', 84 | inputType: 'select', 85 | isMultiple: true, 86 | useOptionsWithLabels: true, 87 | optionsWithLabels: ctds, 88 | }, 89 | link_template: { 90 | label: i18n.t('LinkTemplate'), 91 | unique: false, 92 | helpText: '', 93 | inputType: 'text', 94 | }, 95 | }, 96 | }, 97 | label: i18n.t('Settings'), 98 | unique: false, 99 | helpText: '', 100 | inputType: 'object', 101 | }, 102 | }, 103 | }, 104 | }; 105 | 106 | modalInstance.promise.then(() => (configCache = null)); 107 | 108 | return configCache; 109 | }; 110 | -------------------------------------------------------------------------------- /plugins/panelPlugin/panelPlugin.js: -------------------------------------------------------------------------------- 1 | import { 2 | addElementToCache, 3 | getCachedElement, 4 | deepReadKeyValue 5 | } from '../../common/plugin-helpers'; 6 | 7 | const onClick = (e) => { 8 | e.preventDefault(); 9 | const url = e.target.href; 10 | window.open(url, '_blank'); 11 | }; 12 | 13 | export const handlePanelPlugin = ( 14 | { contentType, contentObject, duplicate, create, userPlugins }, 15 | pluginInfo, 16 | ) => { 17 | const customLinksSettings = userPlugins?.find( 18 | ({ id }) => id === pluginInfo.id, 19 | )?.settings; 20 | 21 | if ( 22 | !contentObject || 23 | !contentType?.name || 24 | create || 25 | duplicate || 26 | !customLinksSettings 27 | ) 28 | return null; 29 | 30 | const settingsForCtd = JSON.parse(customLinksSettings)?.settings?.filter( 31 | (plugin) => 32 | plugin.content_types.length === 0 || 33 | plugin.content_types.find((ctd) => ctd === contentType.name), 34 | ); 35 | 36 | if (!settingsForCtd.length) return null; 37 | 38 | const cacheKey = `${pluginInfo.id}-${contentType.name}-${contentObject.id}`; 39 | 40 | let element = getCachedElement(cacheKey)?.element; 41 | 42 | if (!element) { 43 | element = document.createElement('div'); 44 | element.setAttribute('class', 'plugin-custom-links panel'); 45 | } 46 | 47 | const links = settingsForCtd.map((settings) => { 48 | const url = settings.url_template.replace( 49 | /{(?[^{}]+)}/g, 50 | (...params) => { 51 | const { key } = params[4]; 52 | return deepReadKeyValue(key, contentObject); 53 | }, 54 | ); 55 | 56 | const displayName = settings.link_template.replace( 57 | /{(?[^{}]+)}/g, 58 | (...params) => { 59 | const { key } = params[4]; 60 | return deepReadKeyValue(key, contentObject); 61 | }, 62 | ); 63 | 64 | const link = document.createElement('a'); 65 | link.setAttribute('class', 'link-button'); 66 | link.setAttribute('href', url); 67 | 68 | const span = document.createElement('span'); 69 | span.textContent = displayName; 70 | 71 | link.appendChild(span); 72 | link.addEventListener('click', onClick); 73 | 74 | return link; 75 | }); 76 | 77 | if (element.children.length) { 78 | element.innerHTML = ''; 79 | } 80 | 81 | element.append(...links); 82 | 83 | addElementToCache(element, cacheKey); 84 | 85 | return element; 86 | }; 87 | 88 | export const loadPanelPlugin = (pluginPanelPreviewRoot) => { 89 | if (pluginPanelPreviewRoot) { 90 | const element = handlePanelPlugin( 91 | { 92 | contentType: { name: 'ctd' }, 93 | contentObject: { id: 'id', name: 'co name' }, 94 | duplicate: false, 95 | create: false, 96 | userPlugins: [ 97 | { 98 | id: 'plugin-id', 99 | settings: 100 | // eslint-disable-next-line max-len 101 | '{"settings":[{"url_template":"example.com","link_template":"Link","content_types":[]}, {"url_template":"example.com","link_template":"Link to {name}","content_types":[]}]}', 102 | }, 103 | ], 104 | }, 105 | { id: 'plugin-id' }, 106 | ); 107 | 108 | element.style.border = '1px solid #DAE3F2'; 109 | element.style.maxWidth = '400px'; 110 | 111 | pluginPanelPreviewRoot.appendChild(element); 112 | } 113 | }; 114 | -------------------------------------------------------------------------------- /plugins/styles/button.css: -------------------------------------------------------------------------------- 1 | .plugin-custom-links .link-button { 2 | all: unset; 3 | position: relative; 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | transition-property: color, background-color, border-color, 8 | text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, 9 | backdrop-filter; 10 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 11 | transition-duration: 200ms; 12 | line-height: 1; 13 | border-radius: 0.5rem; 14 | font-weight: 500; 15 | cursor: pointer; 16 | font-size: 0.875rem; 17 | line-height: 1.25rem; 18 | color: #141046; 19 | background-color: transparent; 20 | height: 2.5rem; 21 | border: 2px solid #0083fc; 22 | padding-left: 1.25rem; 23 | padding-right: 1.25rem; 24 | max-width: 100%; 25 | } 26 | 27 | .mode-dark .plugin-custom-links .link-button, 28 | .mode-dark .plugin-custom-links .link-button:active, 29 | .mode-dark .plugin-custom-links .link-button:focus { 30 | color: white; 31 | } 32 | 33 | .plugin-custom-links .link-button:hover { 34 | background-color: #0083fc; 35 | color: white; 36 | } 37 | 38 | .plugin-custom-links .link-button:focus { 39 | outline: 2px solid transparent; 40 | outline-offset: 2px; 41 | text-decoration: none; 42 | } 43 | 44 | .plugin-custom-links .link-button:hover, 45 | .plugin-custom-links .link-button:active { 46 | text-decoration: none; 47 | } 48 | 49 | .plugin-custom-links .link-button > span { 50 | min-width: 0; 51 | overflow: hidden; 52 | text-overflow: ellipsis; 53 | white-space: nowrap; 54 | line-height: 1.5; 55 | pointer-events: none; 56 | } 57 | -------------------------------------------------------------------------------- /plugins/styles/index.css: -------------------------------------------------------------------------------- 1 | .plugin-custom-links * { 2 | box-sizing: border-box !important; 3 | } 4 | -------------------------------------------------------------------------------- /plugins/styles/panel.css: -------------------------------------------------------------------------------- 1 | .plugin-custom-links.panel { 2 | position: relative; 3 | display: flex; 4 | flex-direction: row; 5 | flex-wrap: wrap; 6 | justify-content: center; 7 | align-items: center; 8 | gap: 0.5rem; 9 | padding-top: 1rem; 10 | padding-bottom: 1rem; 11 | padding-left: 0.5rem; 12 | padding-right: 0.5rem; 13 | gap: 1.25rem; 14 | border-radius: 1rem; 15 | background-color: white; 16 | } 17 | 18 | .mode-dark .plugin-custom-links.panel { 19 | background-color: #020617; 20 | } 21 | 22 | @media (min-width: 1536px) { 23 | .plugin-custom-links.panel { 24 | padding-left: 1rem; 25 | padding-right: 1rem; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/eslint-parser@^7.26.8": 6 | version "7.27.0" 7 | resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.27.0.tgz#d55e52a5ef3b164139a799dc522c338faba3507c" 8 | integrity sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng== 9 | dependencies: 10 | "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" 11 | eslint-visitor-keys "^2.1.0" 12 | semver "^6.3.1" 13 | 14 | "@babel/runtime@^7.23.2": 15 | version "7.24.7" 16 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" 17 | integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== 18 | dependencies: 19 | regenerator-runtime "^0.14.0" 20 | 21 | "@esbuild/aix-ppc64@0.25.2": 22 | version "0.25.2" 23 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" 24 | integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== 25 | 26 | "@esbuild/android-arm64@0.25.2": 27 | version "0.25.2" 28 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" 29 | integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== 30 | 31 | "@esbuild/android-arm@0.25.2": 32 | version "0.25.2" 33 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" 34 | integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== 35 | 36 | "@esbuild/android-x64@0.25.2": 37 | version "0.25.2" 38 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" 39 | integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== 40 | 41 | "@esbuild/darwin-arm64@0.25.2": 42 | version "0.25.2" 43 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" 44 | integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== 45 | 46 | "@esbuild/darwin-x64@0.25.2": 47 | version "0.25.2" 48 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" 49 | integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== 50 | 51 | "@esbuild/freebsd-arm64@0.25.2": 52 | version "0.25.2" 53 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" 54 | integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== 55 | 56 | "@esbuild/freebsd-x64@0.25.2": 57 | version "0.25.2" 58 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" 59 | integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== 60 | 61 | "@esbuild/linux-arm64@0.25.2": 62 | version "0.25.2" 63 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" 64 | integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== 65 | 66 | "@esbuild/linux-arm@0.25.2": 67 | version "0.25.2" 68 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" 69 | integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== 70 | 71 | "@esbuild/linux-ia32@0.25.2": 72 | version "0.25.2" 73 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" 74 | integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== 75 | 76 | "@esbuild/linux-loong64@0.25.2": 77 | version "0.25.2" 78 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" 79 | integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== 80 | 81 | "@esbuild/linux-mips64el@0.25.2": 82 | version "0.25.2" 83 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" 84 | integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== 85 | 86 | "@esbuild/linux-ppc64@0.25.2": 87 | version "0.25.2" 88 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" 89 | integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== 90 | 91 | "@esbuild/linux-riscv64@0.25.2": 92 | version "0.25.2" 93 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" 94 | integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== 95 | 96 | "@esbuild/linux-s390x@0.25.2": 97 | version "0.25.2" 98 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" 99 | integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== 100 | 101 | "@esbuild/linux-x64@0.25.2": 102 | version "0.25.2" 103 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" 104 | integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== 105 | 106 | "@esbuild/netbsd-arm64@0.25.2": 107 | version "0.25.2" 108 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" 109 | integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== 110 | 111 | "@esbuild/netbsd-x64@0.25.2": 112 | version "0.25.2" 113 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" 114 | integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== 115 | 116 | "@esbuild/openbsd-arm64@0.25.2": 117 | version "0.25.2" 118 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" 119 | integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== 120 | 121 | "@esbuild/openbsd-x64@0.25.2": 122 | version "0.25.2" 123 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" 124 | integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== 125 | 126 | "@esbuild/sunos-x64@0.25.2": 127 | version "0.25.2" 128 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" 129 | integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== 130 | 131 | "@esbuild/win32-arm64@0.25.2": 132 | version "0.25.2" 133 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" 134 | integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== 135 | 136 | "@esbuild/win32-ia32@0.25.2": 137 | version "0.25.2" 138 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" 139 | integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== 140 | 141 | "@esbuild/win32-x64@0.25.2": 142 | version "0.25.2" 143 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" 144 | integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== 145 | 146 | "@eslint-community/eslint-utils@^4.2.0": 147 | version "4.4.0" 148 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 149 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 150 | dependencies: 151 | eslint-visitor-keys "^3.3.0" 152 | 153 | "@eslint-community/regexpp@^4.6.1": 154 | version "4.12.1" 155 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 156 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 157 | 158 | "@eslint/eslintrc@^2.1.4": 159 | version "2.1.4" 160 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 161 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 162 | dependencies: 163 | ajv "^6.12.4" 164 | debug "^4.3.2" 165 | espree "^9.6.0" 166 | globals "^13.19.0" 167 | ignore "^5.2.0" 168 | import-fresh "^3.2.1" 169 | js-yaml "^4.1.0" 170 | minimatch "^3.1.2" 171 | strip-json-comments "^3.1.1" 172 | 173 | "@eslint/js@8.57.1": 174 | version "8.57.1" 175 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" 176 | integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== 177 | 178 | "@humanwhocodes/config-array@^0.13.0": 179 | version "0.13.0" 180 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 181 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 182 | dependencies: 183 | "@humanwhocodes/object-schema" "^2.0.3" 184 | debug "^4.3.1" 185 | minimatch "^3.0.5" 186 | 187 | "@humanwhocodes/module-importer@^1.0.1": 188 | version "1.0.1" 189 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 190 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 191 | 192 | "@humanwhocodes/object-schema@^2.0.3": 193 | version "2.0.3" 194 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 195 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 196 | 197 | "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": 198 | version "5.1.1-v1" 199 | resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" 200 | integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== 201 | dependencies: 202 | eslint-scope "5.1.1" 203 | 204 | "@nodelib/fs.scandir@2.1.5": 205 | version "2.1.5" 206 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 207 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 208 | dependencies: 209 | "@nodelib/fs.stat" "2.0.5" 210 | run-parallel "^1.1.9" 211 | 212 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 213 | version "2.0.5" 214 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 215 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 216 | 217 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 218 | version "1.2.8" 219 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 220 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 221 | dependencies: 222 | "@nodelib/fs.scandir" "2.1.5" 223 | fastq "^1.6.0" 224 | 225 | "@ungap/structured-clone@^1.2.0": 226 | version "1.3.0" 227 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" 228 | integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== 229 | 230 | acorn-jsx@^5.3.2: 231 | version "5.3.2" 232 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 233 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 234 | 235 | acorn@^8.9.0: 236 | version "8.14.1" 237 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" 238 | integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== 239 | 240 | ajv@^6.12.4: 241 | version "6.12.6" 242 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 243 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 244 | dependencies: 245 | fast-deep-equal "^3.1.1" 246 | fast-json-stable-stringify "^2.0.0" 247 | json-schema-traverse "^0.4.1" 248 | uri-js "^4.2.2" 249 | 250 | ansi-regex@^5.0.1: 251 | version "5.0.1" 252 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 253 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 254 | 255 | ansi-styles@^4.1.0: 256 | version "4.3.0" 257 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 258 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 259 | dependencies: 260 | color-convert "^2.0.1" 261 | 262 | anymatch@~3.1.2: 263 | version "3.1.3" 264 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 265 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 266 | dependencies: 267 | normalize-path "^3.0.0" 268 | picomatch "^2.0.4" 269 | 270 | argparse@^2.0.1: 271 | version "2.0.1" 272 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 273 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 274 | 275 | array-union@^2.1.0: 276 | version "2.1.0" 277 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 278 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 279 | 280 | balanced-match@^1.0.0: 281 | version "1.0.2" 282 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 283 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 284 | 285 | binary-extensions@^2.0.0: 286 | version "2.3.0" 287 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 288 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 289 | 290 | brace-expansion@^1.1.7: 291 | version "1.1.11" 292 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 293 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 294 | dependencies: 295 | balanced-match "^1.0.0" 296 | concat-map "0.0.1" 297 | 298 | braces@^3.0.3, braces@~3.0.2: 299 | version "3.0.3" 300 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 301 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 302 | dependencies: 303 | fill-range "^7.1.1" 304 | 305 | callsites@^3.0.0: 306 | version "3.1.0" 307 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 308 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 309 | 310 | chalk@^4.0.0, chalk@^4.1.2: 311 | version "4.1.2" 312 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 313 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 314 | dependencies: 315 | ansi-styles "^4.1.0" 316 | supports-color "^7.1.0" 317 | 318 | chalk@^5.4.1: 319 | version "5.4.1" 320 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" 321 | integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== 322 | 323 | chokidar@^3.5.3: 324 | version "3.6.0" 325 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 326 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 327 | dependencies: 328 | anymatch "~3.1.2" 329 | braces "~3.0.2" 330 | glob-parent "~5.1.2" 331 | is-binary-path "~2.1.0" 332 | is-glob "~4.0.1" 333 | normalize-path "~3.0.0" 334 | readdirp "~3.6.0" 335 | optionalDependencies: 336 | fsevents "~2.3.2" 337 | 338 | color-convert@^2.0.1: 339 | version "2.0.1" 340 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 341 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 342 | dependencies: 343 | color-name "~1.1.4" 344 | 345 | color-name@~1.1.4: 346 | version "1.1.4" 347 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 348 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 349 | 350 | concat-map@0.0.1: 351 | version "0.0.1" 352 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 353 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 354 | 355 | cross-spawn@^7.0.2: 356 | version "7.0.6" 357 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 358 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 359 | dependencies: 360 | path-key "^3.1.0" 361 | shebang-command "^2.0.0" 362 | which "^2.0.1" 363 | 364 | cuint@^0.2.2: 365 | version "0.2.2" 366 | resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" 367 | integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== 368 | 369 | debug@^4.3.1, debug@^4.3.2: 370 | version "4.3.5" 371 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" 372 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 373 | dependencies: 374 | ms "2.1.2" 375 | 376 | deep-is@^0.1.3: 377 | version "0.1.4" 378 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 379 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 380 | 381 | dir-glob@^3.0.1: 382 | version "3.0.1" 383 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 384 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 385 | dependencies: 386 | path-type "^4.0.0" 387 | 388 | doctrine@^3.0.0: 389 | version "3.0.0" 390 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 391 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 392 | dependencies: 393 | esutils "^2.0.2" 394 | 395 | esbuild-plugin-copy@^2.1.1: 396 | version "2.1.1" 397 | resolved "https://registry.yarnpkg.com/esbuild-plugin-copy/-/esbuild-plugin-copy-2.1.1.tgz#638308ecfd679e4c7c76b71c62f7dd9a4cc7f901" 398 | integrity sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw== 399 | dependencies: 400 | chalk "^4.1.2" 401 | chokidar "^3.5.3" 402 | fs-extra "^10.0.1" 403 | globby "^11.0.3" 404 | 405 | esbuild-plugin-eslint@^0.3.12: 406 | version "0.3.12" 407 | resolved "https://registry.yarnpkg.com/esbuild-plugin-eslint/-/esbuild-plugin-eslint-0.3.12.tgz#729cc6661acc5f3640078163e32e76efdf687129" 408 | integrity sha512-n37Nn6vmh2tdGMnm6GZebiYJDrqERAReyvLFwdCWCw15ZvAu251i6cIeJWoVB8AiS+j3N97gylvf58ysIwii4g== 409 | 410 | esbuild-plugin-inline-import@^1.1.0: 411 | version "1.1.0" 412 | resolved "https://registry.yarnpkg.com/esbuild-plugin-inline-import/-/esbuild-plugin-inline-import-1.1.0.tgz#9a581a50918021c48962da2309aecf24d3fb9fcd" 413 | integrity sha512-b0xX4tPKBdRjX1CkzpnULpEdeTo9vxD+wf83PKvgUYnOEaJfVxLey4q+sfTUPAdDnRRYasJsQUgQW7/e2Gm5Dw== 414 | 415 | esbuild@^0.25.1: 416 | version "0.25.2" 417 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" 418 | integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== 419 | optionalDependencies: 420 | "@esbuild/aix-ppc64" "0.25.2" 421 | "@esbuild/android-arm" "0.25.2" 422 | "@esbuild/android-arm64" "0.25.2" 423 | "@esbuild/android-x64" "0.25.2" 424 | "@esbuild/darwin-arm64" "0.25.2" 425 | "@esbuild/darwin-x64" "0.25.2" 426 | "@esbuild/freebsd-arm64" "0.25.2" 427 | "@esbuild/freebsd-x64" "0.25.2" 428 | "@esbuild/linux-arm" "0.25.2" 429 | "@esbuild/linux-arm64" "0.25.2" 430 | "@esbuild/linux-ia32" "0.25.2" 431 | "@esbuild/linux-loong64" "0.25.2" 432 | "@esbuild/linux-mips64el" "0.25.2" 433 | "@esbuild/linux-ppc64" "0.25.2" 434 | "@esbuild/linux-riscv64" "0.25.2" 435 | "@esbuild/linux-s390x" "0.25.2" 436 | "@esbuild/linux-x64" "0.25.2" 437 | "@esbuild/netbsd-arm64" "0.25.2" 438 | "@esbuild/netbsd-x64" "0.25.2" 439 | "@esbuild/openbsd-arm64" "0.25.2" 440 | "@esbuild/openbsd-x64" "0.25.2" 441 | "@esbuild/sunos-x64" "0.25.2" 442 | "@esbuild/win32-arm64" "0.25.2" 443 | "@esbuild/win32-ia32" "0.25.2" 444 | "@esbuild/win32-x64" "0.25.2" 445 | 446 | escape-string-regexp@^4.0.0: 447 | version "4.0.0" 448 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 449 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 450 | 451 | eslint-config-prettier@^10.1.1: 452 | version "10.1.1" 453 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz#cf0ff6e5c4e7e15f129f1f1ce2a5ecba92dec132" 454 | integrity sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw== 455 | 456 | eslint-scope@5.1.1: 457 | version "5.1.1" 458 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 459 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 460 | dependencies: 461 | esrecurse "^4.3.0" 462 | estraverse "^4.1.1" 463 | 464 | eslint-scope@^7.2.2: 465 | version "7.2.2" 466 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 467 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 468 | dependencies: 469 | esrecurse "^4.3.0" 470 | estraverse "^5.2.0" 471 | 472 | eslint-visitor-keys@^2.1.0: 473 | version "2.1.0" 474 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 475 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 476 | 477 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 478 | version "3.4.3" 479 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 480 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 481 | 482 | eslint@^8.57.1: 483 | version "8.57.1" 484 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" 485 | integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 486 | dependencies: 487 | "@eslint-community/eslint-utils" "^4.2.0" 488 | "@eslint-community/regexpp" "^4.6.1" 489 | "@eslint/eslintrc" "^2.1.4" 490 | "@eslint/js" "8.57.1" 491 | "@humanwhocodes/config-array" "^0.13.0" 492 | "@humanwhocodes/module-importer" "^1.0.1" 493 | "@nodelib/fs.walk" "^1.2.8" 494 | "@ungap/structured-clone" "^1.2.0" 495 | ajv "^6.12.4" 496 | chalk "^4.0.0" 497 | cross-spawn "^7.0.2" 498 | debug "^4.3.2" 499 | doctrine "^3.0.0" 500 | escape-string-regexp "^4.0.0" 501 | eslint-scope "^7.2.2" 502 | eslint-visitor-keys "^3.4.3" 503 | espree "^9.6.1" 504 | esquery "^1.4.2" 505 | esutils "^2.0.2" 506 | fast-deep-equal "^3.1.3" 507 | file-entry-cache "^6.0.1" 508 | find-up "^5.0.0" 509 | glob-parent "^6.0.2" 510 | globals "^13.19.0" 511 | graphemer "^1.4.0" 512 | ignore "^5.2.0" 513 | imurmurhash "^0.1.4" 514 | is-glob "^4.0.0" 515 | is-path-inside "^3.0.3" 516 | js-yaml "^4.1.0" 517 | json-stable-stringify-without-jsonify "^1.0.1" 518 | levn "^0.4.1" 519 | lodash.merge "^4.6.2" 520 | minimatch "^3.1.2" 521 | natural-compare "^1.4.0" 522 | optionator "^0.9.3" 523 | strip-ansi "^6.0.1" 524 | text-table "^0.2.0" 525 | 526 | espree@^9.6.0, espree@^9.6.1: 527 | version "9.6.1" 528 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 529 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 530 | dependencies: 531 | acorn "^8.9.0" 532 | acorn-jsx "^5.3.2" 533 | eslint-visitor-keys "^3.4.1" 534 | 535 | esquery@^1.4.2: 536 | version "1.6.0" 537 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 538 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 539 | dependencies: 540 | estraverse "^5.1.0" 541 | 542 | esrecurse@^4.3.0: 543 | version "4.3.0" 544 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 545 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 546 | dependencies: 547 | estraverse "^5.2.0" 548 | 549 | estraverse@^4.1.1: 550 | version "4.3.0" 551 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 552 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 553 | 554 | estraverse@^5.1.0, estraverse@^5.2.0: 555 | version "5.3.0" 556 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 557 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 558 | 559 | esutils@^2.0.2: 560 | version "2.0.3" 561 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 562 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 563 | 564 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 565 | version "3.1.3" 566 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 567 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 568 | 569 | fast-glob@^3.2.9: 570 | version "3.3.2" 571 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 572 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 573 | dependencies: 574 | "@nodelib/fs.stat" "^2.0.2" 575 | "@nodelib/fs.walk" "^1.2.3" 576 | glob-parent "^5.1.2" 577 | merge2 "^1.3.0" 578 | micromatch "^4.0.4" 579 | 580 | fast-json-stable-stringify@^2.0.0: 581 | version "2.1.0" 582 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 583 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 584 | 585 | fast-levenshtein@^2.0.6: 586 | version "2.0.6" 587 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 588 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 589 | 590 | fastq@^1.6.0: 591 | version "1.17.1" 592 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 593 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 594 | dependencies: 595 | reusify "^1.0.4" 596 | 597 | file-entry-cache@^6.0.1: 598 | version "6.0.1" 599 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 600 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 601 | dependencies: 602 | flat-cache "^3.0.4" 603 | 604 | fill-range@^7.1.1: 605 | version "7.1.1" 606 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 607 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 608 | dependencies: 609 | to-regex-range "^5.0.1" 610 | 611 | find-up@^5.0.0: 612 | version "5.0.0" 613 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 614 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 615 | dependencies: 616 | locate-path "^6.0.0" 617 | path-exists "^4.0.0" 618 | 619 | flat-cache@^3.0.4: 620 | version "3.2.0" 621 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 622 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 623 | dependencies: 624 | flatted "^3.2.9" 625 | keyv "^4.5.3" 626 | rimraf "^3.0.2" 627 | 628 | flatted@^3.2.9: 629 | version "3.3.1" 630 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 631 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 632 | 633 | fs-extra@^10.0.1: 634 | version "10.1.0" 635 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 636 | integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 637 | dependencies: 638 | graceful-fs "^4.2.0" 639 | jsonfile "^6.0.1" 640 | universalify "^2.0.0" 641 | 642 | fs.realpath@^1.0.0: 643 | version "1.0.0" 644 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 645 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 646 | 647 | fsevents@~2.3.2: 648 | version "2.3.3" 649 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 650 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 651 | 652 | glob-parent@^5.1.2, glob-parent@~5.1.2: 653 | version "5.1.2" 654 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 655 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 656 | dependencies: 657 | is-glob "^4.0.1" 658 | 659 | glob-parent@^6.0.2: 660 | version "6.0.2" 661 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 662 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 663 | dependencies: 664 | is-glob "^4.0.3" 665 | 666 | glob@^7.1.3: 667 | version "7.2.3" 668 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 669 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 670 | dependencies: 671 | fs.realpath "^1.0.0" 672 | inflight "^1.0.4" 673 | inherits "2" 674 | minimatch "^3.1.1" 675 | once "^1.3.0" 676 | path-is-absolute "^1.0.0" 677 | 678 | globals@^13.19.0: 679 | version "13.24.0" 680 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 681 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 682 | dependencies: 683 | type-fest "^0.20.2" 684 | 685 | globby@^11.0.3: 686 | version "11.1.0" 687 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 688 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 689 | dependencies: 690 | array-union "^2.1.0" 691 | dir-glob "^3.0.1" 692 | fast-glob "^3.2.9" 693 | ignore "^5.2.0" 694 | merge2 "^1.4.1" 695 | slash "^3.0.0" 696 | 697 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 698 | version "4.2.11" 699 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 700 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 701 | 702 | graphemer@^1.4.0: 703 | version "1.4.0" 704 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 705 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 706 | 707 | has-flag@^4.0.0: 708 | version "4.0.0" 709 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 710 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 711 | 712 | i18next@^23.10.1: 713 | version "23.11.5" 714 | resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" 715 | integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== 716 | dependencies: 717 | "@babel/runtime" "^7.23.2" 718 | 719 | ignore@^5.2.0: 720 | version "5.3.1" 721 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" 722 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 723 | 724 | import-fresh@^3.2.1: 725 | version "3.3.0" 726 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 727 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 728 | dependencies: 729 | parent-module "^1.0.0" 730 | resolve-from "^4.0.0" 731 | 732 | imurmurhash@^0.1.4: 733 | version "0.1.4" 734 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 735 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 736 | 737 | inflight@^1.0.4: 738 | version "1.0.6" 739 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 740 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 741 | dependencies: 742 | once "^1.3.0" 743 | wrappy "1" 744 | 745 | inherits@2: 746 | version "2.0.4" 747 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 748 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 749 | 750 | is-binary-path@~2.1.0: 751 | version "2.1.0" 752 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 753 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 754 | dependencies: 755 | binary-extensions "^2.0.0" 756 | 757 | is-extglob@^2.1.1: 758 | version "2.1.1" 759 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 760 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 761 | 762 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 763 | version "4.0.3" 764 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 765 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 766 | dependencies: 767 | is-extglob "^2.1.1" 768 | 769 | is-number@^7.0.0: 770 | version "7.0.0" 771 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 772 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 773 | 774 | is-path-inside@^3.0.3: 775 | version "3.0.3" 776 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 777 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 778 | 779 | isexe@^2.0.0: 780 | version "2.0.0" 781 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 782 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 783 | 784 | js-yaml@^4.1.0: 785 | version "4.1.0" 786 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 787 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 788 | dependencies: 789 | argparse "^2.0.1" 790 | 791 | json-buffer@3.0.1: 792 | version "3.0.1" 793 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 794 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 795 | 796 | json-schema-traverse@^0.4.1: 797 | version "0.4.1" 798 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 799 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 800 | 801 | json-stable-stringify-without-jsonify@^1.0.1: 802 | version "1.0.1" 803 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 804 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 805 | 806 | jsonfile@^6.0.1: 807 | version "6.1.0" 808 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 809 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 810 | dependencies: 811 | universalify "^2.0.0" 812 | optionalDependencies: 813 | graceful-fs "^4.1.6" 814 | 815 | keyv@^4.5.3: 816 | version "4.5.4" 817 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 818 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 819 | dependencies: 820 | json-buffer "3.0.1" 821 | 822 | levn@^0.4.1: 823 | version "0.4.1" 824 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 825 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 826 | dependencies: 827 | prelude-ls "^1.2.1" 828 | type-check "~0.4.0" 829 | 830 | locate-path@^6.0.0: 831 | version "6.0.0" 832 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 833 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 834 | dependencies: 835 | p-locate "^5.0.0" 836 | 837 | lodash.merge@^4.6.2: 838 | version "4.6.2" 839 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 840 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 841 | 842 | make-dir@~3.1.0: 843 | version "3.1.0" 844 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 845 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 846 | dependencies: 847 | semver "^6.0.0" 848 | 849 | merge2@^1.3.0, merge2@^1.4.1: 850 | version "1.4.1" 851 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 852 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 853 | 854 | micromatch@^4.0.4: 855 | version "4.0.7" 856 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" 857 | integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== 858 | dependencies: 859 | braces "^3.0.3" 860 | picomatch "^2.3.1" 861 | 862 | mime@~2.5.2: 863 | version "2.5.2" 864 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" 865 | integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== 866 | 867 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 868 | version "3.1.2" 869 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 870 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 871 | dependencies: 872 | brace-expansion "^1.1.7" 873 | 874 | minimatch@~3.0.4: 875 | version "3.0.8" 876 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" 877 | integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== 878 | dependencies: 879 | brace-expansion "^1.1.7" 880 | 881 | ms@2.1.2: 882 | version "2.1.2" 883 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 884 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 885 | 886 | nanoid@^3.3.8: 887 | version "3.3.11" 888 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" 889 | integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== 890 | 891 | natural-compare@^1.4.0: 892 | version "1.4.0" 893 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 894 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 895 | 896 | normalize-path@^3.0.0, normalize-path@~3.0.0: 897 | version "3.0.0" 898 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 899 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 900 | 901 | once@^1.3.0: 902 | version "1.4.0" 903 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 904 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 905 | dependencies: 906 | wrappy "1" 907 | 908 | optionator@^0.9.3: 909 | version "0.9.4" 910 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 911 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 912 | dependencies: 913 | deep-is "^0.1.3" 914 | fast-levenshtein "^2.0.6" 915 | levn "^0.4.1" 916 | prelude-ls "^1.2.1" 917 | type-check "^0.4.0" 918 | word-wrap "^1.2.5" 919 | 920 | p-limit@^3.0.2: 921 | version "3.1.0" 922 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 923 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 924 | dependencies: 925 | yocto-queue "^0.1.0" 926 | 927 | p-locate@^5.0.0: 928 | version "5.0.0" 929 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 930 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 931 | dependencies: 932 | p-limit "^3.0.2" 933 | 934 | parent-module@^1.0.0: 935 | version "1.0.1" 936 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 937 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 938 | dependencies: 939 | callsites "^3.0.0" 940 | 941 | path-exists@^4.0.0: 942 | version "4.0.0" 943 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 944 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 945 | 946 | path-is-absolute@^1.0.0: 947 | version "1.0.1" 948 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 949 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 950 | 951 | path-key@^3.1.0: 952 | version "3.1.1" 953 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 954 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 955 | 956 | path-type@^4.0.0: 957 | version "4.0.0" 958 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 959 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 960 | 961 | picocolors@^1.1.1: 962 | version "1.1.1" 963 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 964 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 965 | 966 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 967 | version "2.3.1" 968 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 969 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 970 | 971 | postcss-url@^10.1.3: 972 | version "10.1.3" 973 | resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-10.1.3.tgz#54120cc910309e2475ec05c2cfa8f8a2deafdf1e" 974 | integrity sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw== 975 | dependencies: 976 | make-dir "~3.1.0" 977 | mime "~2.5.2" 978 | minimatch "~3.0.4" 979 | xxhashjs "~0.2.2" 980 | 981 | postcss@^8.5.3: 982 | version "8.5.3" 983 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" 984 | integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== 985 | dependencies: 986 | nanoid "^3.3.8" 987 | picocolors "^1.1.1" 988 | source-map-js "^1.2.1" 989 | 990 | prelude-ls@^1.2.1: 991 | version "1.2.1" 992 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 993 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 994 | 995 | prettier@^3.5.3: 996 | version "3.5.3" 997 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" 998 | integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== 999 | 1000 | punycode@^2.1.0: 1001 | version "2.3.1" 1002 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1003 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1004 | 1005 | queue-microtask@^1.2.2: 1006 | version "1.2.3" 1007 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1008 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1009 | 1010 | readdirp@~3.6.0: 1011 | version "3.6.0" 1012 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1013 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1014 | dependencies: 1015 | picomatch "^2.2.1" 1016 | 1017 | regenerator-runtime@^0.14.0: 1018 | version "0.14.1" 1019 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" 1020 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 1021 | 1022 | resolve-from@^4.0.0: 1023 | version "4.0.0" 1024 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1025 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1026 | 1027 | reusify@^1.0.4: 1028 | version "1.0.4" 1029 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1030 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1031 | 1032 | rimraf@^3.0.2: 1033 | version "3.0.2" 1034 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1035 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1036 | dependencies: 1037 | glob "^7.1.3" 1038 | 1039 | run-parallel@^1.1.9: 1040 | version "1.2.0" 1041 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1042 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1043 | dependencies: 1044 | queue-microtask "^1.2.2" 1045 | 1046 | semver@^6.0.0, semver@^6.3.1: 1047 | version "6.3.1" 1048 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1049 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1050 | 1051 | shebang-command@^2.0.0: 1052 | version "2.0.0" 1053 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1054 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1055 | dependencies: 1056 | shebang-regex "^3.0.0" 1057 | 1058 | shebang-regex@^3.0.0: 1059 | version "3.0.0" 1060 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1061 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1062 | 1063 | slash@^3.0.0: 1064 | version "3.0.0" 1065 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1066 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1067 | 1068 | source-map-js@^1.2.1: 1069 | version "1.2.1" 1070 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 1071 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1072 | 1073 | strip-ansi@^6.0.1: 1074 | version "6.0.1" 1075 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1076 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1077 | dependencies: 1078 | ansi-regex "^5.0.1" 1079 | 1080 | strip-json-comments@^3.1.1: 1081 | version "3.1.1" 1082 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1083 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1084 | 1085 | supports-color@^7.1.0: 1086 | version "7.2.0" 1087 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1088 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1089 | dependencies: 1090 | has-flag "^4.0.0" 1091 | 1092 | text-table@^0.2.0: 1093 | version "0.2.0" 1094 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1095 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1096 | 1097 | to-regex-range@^5.0.1: 1098 | version "5.0.1" 1099 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1100 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1101 | dependencies: 1102 | is-number "^7.0.0" 1103 | 1104 | type-check@^0.4.0, type-check@~0.4.0: 1105 | version "0.4.0" 1106 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1107 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1108 | dependencies: 1109 | prelude-ls "^1.2.1" 1110 | 1111 | type-fest@^0.20.2: 1112 | version "0.20.2" 1113 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1114 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1115 | 1116 | universalify@^2.0.0: 1117 | version "2.0.1" 1118 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1119 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1120 | 1121 | uri-js@^4.2.2: 1122 | version "4.4.1" 1123 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1124 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1125 | dependencies: 1126 | punycode "^2.1.0" 1127 | 1128 | which@^2.0.1: 1129 | version "2.0.2" 1130 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1131 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1132 | dependencies: 1133 | isexe "^2.0.0" 1134 | 1135 | word-wrap@^1.2.5: 1136 | version "1.2.5" 1137 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1138 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1139 | 1140 | wrappy@1: 1141 | version "1.0.2" 1142 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1143 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1144 | 1145 | xxhashjs@~0.2.2: 1146 | version "0.2.2" 1147 | resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" 1148 | integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== 1149 | dependencies: 1150 | cuint "^0.2.2" 1151 | 1152 | yocto-queue@^0.1.0: 1153 | version "0.1.0" 1154 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1155 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1156 | --------------------------------------------------------------------------------