diff --git a/.github/actions/reviewers/action.js b/.github/actions/reviewers/action.js index 374f9502..b89e9107 100644 --- a/.github/actions/reviewers/action.js +++ b/.github/actions/reviewers/action.js @@ -10,12 +10,20 @@ try { const { owner, repo } = context.repo const pull_number = context.issue.number - await octokit.rest.pulls.requestReviewers({ + const response = await octokit.rest.pulls.listRequestedReviewers({ owner, repo, pull_number, - reviewers: reviewers, }) + + if (response.data.users.length < 2) { + await octokit.rest.pulls.requestReviewers({ + owner, + repo, + pull_number, + reviewers: reviewers, + }) + } } catch (error) { setFailed(error.message) } diff --git a/package-lock.json b/package-lock.json index 0b435179..97eb6231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "sidepeek", "version": "0.0.0", - "hasInstallScript": true, "dependencies": { "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", @@ -24,6 +23,7 @@ "react-router-dom": "^6.22.0", "rollup": "^4.10.0", "styled-components": "^6.1.8", + "swiper": "^11.0.6", "zustand": "^4.5.0" }, "devDependencies": { @@ -57,6 +57,7 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1798,6 +1799,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1812,6 +1814,7 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1820,6 +1823,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1842,6 +1846,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1851,6 +1856,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -1865,6 +1871,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1876,6 +1883,7 @@ "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1892,6 +1900,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1905,6 +1914,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1914,6 +1924,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1925,6 +1936,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { "node": ">=12.22" }, @@ -1936,7 +1948,8 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true }, "node_modules/@jest/schemas": { "version": "29.6.3", @@ -2043,6 +2056,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2055,6 +2069,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -2063,6 +2078,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3005,7 +3021,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vitejs/plugin-react": { "version": "4.2.1", @@ -3160,6 +3177,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3171,6 +3189,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3188,6 +3207,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3230,6 +3250,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3261,7 +3282,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/aria-hidden": { "version": "1.2.3", @@ -3522,7 +3544,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -4000,7 +4023,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -4044,6 +4068,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4094,6 +4119,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -4121,7 +4147,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/defaults": { "version": "1.0.4", @@ -4219,6 +4246,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -4435,6 +4463,7 @@ "version": "8.56.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4489,7 +4518,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "devOptional": true, + "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -4853,6 +4882,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4868,6 +4898,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4879,6 +4910,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4893,6 +4925,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4902,6 +4935,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4917,6 +4951,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4927,12 +4962,14 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -4944,6 +4981,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -4958,6 +4996,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4966,6 +5005,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4977,6 +5017,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4988,6 +5029,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -5004,6 +5046,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -5015,6 +5058,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5026,6 +5070,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -5043,6 +5088,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5102,7 +5148,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", @@ -5141,17 +5188,20 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5175,6 +5225,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -5203,6 +5254,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5218,6 +5270,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -5230,7 +5283,8 @@ "node_modules/flatted": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, "node_modules/focus-lock": { "version": "1.0.0", @@ -5341,7 +5395,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -5489,6 +5544,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5508,6 +5564,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -5519,6 +5576,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5528,6 +5586,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5600,7 +5659,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/graphql": { "version": "16.8.1", @@ -5764,6 +5824,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { "node": ">= 4" } @@ -5787,6 +5848,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -5795,6 +5857,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5803,7 +5866,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/inquirer": { "version": "8.2.6", @@ -6182,6 +6246,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6229,6 +6294,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6300,6 +6366,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6453,7 +6520,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/iterator.prototype": { "version": "1.1.2", @@ -6492,6 +6560,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -6514,7 +6583,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -6524,12 +6594,14 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -6568,6 +6640,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -6594,6 +6667,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -6701,6 +6775,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6720,7 +6795,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.mergewith": { "version": "4.6.2", @@ -7041,7 +7117,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/msw": { "version": "1.3.2", @@ -7197,7 +7274,8 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/node-fetch": { "version": "2.7.0", @@ -7406,6 +7484,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -7585,6 +7664,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7599,6 +7679,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -7641,6 +7722,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -7649,6 +7731,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7657,6 +7740,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -7772,6 +7856,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -7780,6 +7865,7 @@ "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7853,6 +7939,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -7861,6 +7948,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -8223,6 +8311,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8238,6 +8327,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -8292,6 +8382,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -8466,6 +8557,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8477,6 +8569,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -8721,6 +8814,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8753,6 +8847,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -8864,6 +8959,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swiper": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.0.6.tgz", + "integrity": "sha512-W/Me7MQl5rNgdM5x9i3Gll76WsyVpnHn91GhBOyL7RCFUeg62aVnflzlVfIpXzZ/87FtJOfAoDH79ZH2Yq76zA==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "engines": { + "node": ">= 4.7.0" + } + }, "node_modules/synckit": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", @@ -8889,7 +9002,8 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/through": { "version": "2.3.8", @@ -9063,6 +9177,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -9083,6 +9198,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -9245,6 +9361,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -9527,6 +9644,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9773,6 +9891,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 2578c05f..c5c814bd 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react-router-dom": "^6.22.0", "rollup": "^4.10.0", "styled-components": "^6.1.8", + "swiper": "^11.0.6", "zustand": "^4.5.0" }, "devDependencies": { diff --git a/src/mocks/handlers.ts b/src/mocks/handlers.ts index 2df982fc..2414eb05 100644 --- a/src/mocks/handlers.ts +++ b/src/mocks/handlers.ts @@ -1,3 +1,34 @@ +import { rest } from "msw" + import { searchHandlers } from "@components/Search/mocks" -export const handlers = [...searchHandlers] +import { projectDetailHandlers } from "@pages/ProjectDetailPage/mocks" + +import { postEmailLogin } from "./auth/postEmailLogin.mock" +import { postEmailRefresh } from "./auth/postEmailRefresh.mock" + +export const handlers = [ + rest.get("/api/v1/skills", (_, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + skills: [ + { + id: 2, + name: "spring", + iconImageUrl: "https://www.iconimageurl.com", + }, + { + id: 3, + name: "swift", + iconImageUrl: "https://www.iconimageurl.com", + }, + ], + }), + ) + }), + ...projectDetailHandlers, + ...searchHandlers, + postEmailRefresh, + postEmailLogin, +] diff --git a/src/pages/ProjectDetailPage/ProjectDetailPage.tsx b/src/pages/ProjectDetailPage/ProjectDetailPage.tsx index 5c63f7f8..65cc928c 100644 --- a/src/pages/ProjectDetailPage/ProjectDetailPage.tsx +++ b/src/pages/ProjectDetailPage/ProjectDetailPage.tsx @@ -1,5 +1,18 @@ +import { useParams } from "react-router-dom" + +import { Center } from "@chakra-ui/react" + +import ProjectDetailSummary from "./components/ProjectDetailSummary" +import useProjectDetailQuery from "./hooks/queries/useProjectDetailQuery" + const ProjectDetailPage = () => { - return
ProjectDetailPage
+ const { projectId } = useParams() + + const { data } = useProjectDetailQuery(Number(projectId)) + if (!data) { + return
Loading
+ } + return } export default ProjectDetailPage diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummary.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummary.tsx new file mode 100644 index 00000000..e39bbd3c --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummary.tsx @@ -0,0 +1,61 @@ +import { Box, Center, Flex } from "@chakra-ui/react" +import { Project } from "api-models" + +import ProjectDetailSummaryContent from "./ProjectDetailSummaryContent/ProjectDetailSummaryContent" +import ProjectDetailSummaryTitle from "./ProjectDetailSummaryTitle/ProjectDetailSummaryTitle" +import ProjectDetailSummaryTop from "./ProjectDetailSummaryTop/ProjectDetailSummaryTop" + +interface ProjectDetailSummaryProps { + projects: Project[] +} +const ProjectDetailSummary = ({ projects }: ProjectDetailSummaryProps) => { + const { + deployUrl, + githubUrl, + name, + subName, + overviewImageUrl, + viewCount, + likeCount, + commentCount, + overview, + } = projects[0] + return ( + + + + + +
+ + +
+
+
+
+ ) +} + +export default ProjectDetailSummary diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryContent.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryContent.tsx new file mode 100644 index 00000000..e9b58999 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryContent.tsx @@ -0,0 +1,36 @@ +import { Flex } from "@chakra-ui/react" +import { ProjectOverViewUrl } from "api-models" + +import ProjectDetailSummaryLeft from "./ProjectDetailSummaryLeft" +import ProjectDetailSummaryRight from "./ProjectDetailSummaryRight" + +interface ProjectDetailSummaryContentProps { + deployUrl: string + githubUrl: string + overviewImageUrl: ProjectOverViewUrl[] + overview: string +} + +const ProjectDetailSummaryContent = ({ + deployUrl, + githubUrl, + overviewImageUrl, + overview, +}: ProjectDetailSummaryContentProps) => { + return ( + + + + + ) +} + +export default ProjectDetailSummaryContent diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLeft.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLeft.tsx new file mode 100644 index 00000000..c7be5d03 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLeft.tsx @@ -0,0 +1,31 @@ +import { Flex } from "@chakra-ui/react" + +import ProjectDetailSummaryLink from "./ProjectDetailSummaryLink" +import ProjectDetailSummaryText from "./ProjectDetailSummaryText" + +interface ProjectDetailSummaryLeftProps { + deployUrl: string + githubUrl: string + overview: string +} +const ProjectDetailSummaryLeft = ({ + deployUrl, + githubUrl, + overview, +}: ProjectDetailSummaryLeftProps) => { + return ( + + + + + ) +} + +export default ProjectDetailSummaryLeft diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLink.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLink.tsx new file mode 100644 index 00000000..b69334d7 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLink.tsx @@ -0,0 +1,40 @@ +import { FaGithub } from "react-icons/fa" +import { TbWorld } from "react-icons/tb" + +import { Flex } from "@chakra-ui/react" + +import ProjectDetailSummaryLinkButton from "./ProjectDetailSummaryLinkButton" + +interface ProjectDetailSummaryLinkProps { + deployUrl: string + githubUrl: string +} + +const handleOpenNewTab = (url: string) => { + window.open(url, "_blank", "noopener, noreferrer") +} + +const ProjectDetailSummaryLink = ({ + deployUrl, + githubUrl, +}: ProjectDetailSummaryLinkProps) => { + return ( + + } + bgColor="blue.100" + onClick={() => handleOpenNewTab(deployUrl)} + /> + + } + bgColor="blue.300" + linkName="GithUb" + onClick={() => handleOpenNewTab(githubUrl)} + /> + + ) +} + +export default ProjectDetailSummaryLink diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLinkButton.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLinkButton.tsx new file mode 100644 index 00000000..c42871e0 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryLinkButton.tsx @@ -0,0 +1,25 @@ +import { Button, ButtonProps } from "@chakra-ui/react" + +interface ProjectDetailSummaryLinkButtonProps extends ButtonProps { + linkName: string +} + +const ProjectDetailSummaryLinkButton = ({ + linkName, + ...props +}: ProjectDetailSummaryLinkButtonProps) => { + return ( + + ) +} + +export default ProjectDetailSummaryLinkButton diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRight.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRight.tsx new file mode 100644 index 00000000..3ed654cd --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRight.tsx @@ -0,0 +1,75 @@ +import { useRef } from "react" +import { MdArrowBackIosNew, MdArrowForwardIos } from "react-icons/md" + +import { Box, Image } from "@chakra-ui/react" +import { ProjectOverViewUrl } from "api-models" +import "swiper/css" +import "swiper/css/pagination" +import { Keyboard, Mousewheel, Navigation, Pagination } from "swiper/modules" +import { SwiperSlide } from "swiper/react" +import { Swiper as SwiperCore } from "swiper/types" + +import { StyledSwiper } from "../../styles/SwiperSlide.styles" +import ProjectDetailSummaryRightIcon from "./ProjectDetailSummaryRightIcon" + +interface ProjectDetailSummaryRightProps { + overviewImageUrl: ProjectOverViewUrl[] +} + +const swiperParams = { + loop: true, + pagination: { + clickable: true, + }, + modules: [Navigation, Pagination, Mousewheel, Keyboard], +} + +const ProjectDetailSummaryRight = ({ + overviewImageUrl, +}: ProjectDetailSummaryRightProps) => { + const swiperRef = useRef() + + return ( + + (swiperRef.current = swiper)}> + {overviewImageUrl.map((overviewImg) => ( + + project thumbnail + + ))} + + swiperRef.current?.slidePrev()} + icon={ + + } + /> + + swiperRef.current?.slideNext()} + icon={ + + } + /> + + ) +} + +export default ProjectDetailSummaryRight diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRightIcon.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRightIcon.tsx new file mode 100644 index 00000000..97e0f3e1 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryRightIcon.tsx @@ -0,0 +1,32 @@ +import { IconButton, IconButtonProps } from "@chakra-ui/react" + +interface ProjectDetailSummaryRightIconProps extends IconButtonProps { + direction: string + onClick: () => void +} + +const ProjectDetailSummaryRightIcon = ({ + direction, + onClick, + ...props +}: ProjectDetailSummaryRightIconProps) => { + const directionStyle = + direction === "left" ? { left: "-6%" } : { right: "-6%" } + + return ( + + ) +} + +export default ProjectDetailSummaryRightIcon diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryText.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryText.tsx new file mode 100644 index 00000000..d9b49f08 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryContent/ProjectDetailSummaryText.tsx @@ -0,0 +1,16 @@ +import { Box, Text } from "@chakra-ui/react" + +interface ProjectDetailSummaryTextProps { + overview: string +} +const ProjectDetailSummaryText = ({ + overview, +}: ProjectDetailSummaryTextProps) => { + return ( + + {overview} + + ) +} + +export default ProjectDetailSummaryText diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTitle/ProjectDetailSummaryTitle.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTitle/ProjectDetailSummaryTitle.tsx new file mode 100644 index 00000000..7bb504d8 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTitle/ProjectDetailSummaryTitle.tsx @@ -0,0 +1,29 @@ +import { Box, Text } from "@chakra-ui/react" + +interface ProjectDetailSummaryTitleProps { + name: string + subName: string +} + +const ProjectDetailSummaryTitle = ({ + name, + subName, +}: ProjectDetailSummaryTitleProps) => { + return ( + + + {name} + + + {subName} + + + ) +} + +export default ProjectDetailSummaryTitle diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTop.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTop.tsx new file mode 100644 index 00000000..b96b1d2c --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTop.tsx @@ -0,0 +1,70 @@ +import { FaRegComment } from "react-icons/fa" +import { IoMdHeartEmpty } from "react-icons/io" +import { MdRemoveRedEye } from "react-icons/md" +import { PiClipboardText } from "react-icons/pi" +import { useLocation } from "react-router-dom" + +import { Flex } from "@chakra-ui/react" + +import ProjectDetailSummaryTopIcon from "./ProjectDetailSummaryTopIcon" +import ProjectDetailSummaryTopIconButton from "./ProjectDetailSummaryTopIconButton" + +interface ProjectDetailSummaryTopProps { + likeCount: number + viewCount: number + commentCount: number +} +const ProjectDetailSummaryTop = ({ + likeCount, + viewCount, + commentCount, +}: ProjectDetailSummaryTopProps) => { + /* + TODO: 1. 좋아요 요청 + 2. 댓글 클릭시 댓글 창으로 스크롤 + 3. 클립보드 클릭시 완료 모달/토스트 띄우기 + 4. 클립보드 url baseurl로 바꾸기 + */ + + const location = useLocation() + const handleCopyClipBoard = async (text: string) => { + try { + await navigator.clipboard.writeText(text) + } catch (err) { + console.log(err) + } + } + return ( + + + + } + aria-label="good" + fontSize="2.7rem" + /> + } + aria-label="comment" + fontSize="2.3rem" + /> + + handleCopyClipBoard(`localhost:5173${location.pathname}`) + } + aria-label="clipboard" + fontSize="2.7rem" + icon={} + /> + + ) +} + +export default ProjectDetailSummaryTop diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIcon.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIcon.tsx new file mode 100644 index 00000000..1785e59e --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIcon.tsx @@ -0,0 +1,31 @@ +import { IconType } from "react-icons/lib" + +import { Flex, Icon, IconProps, Text } from "@chakra-ui/react" + +interface ProjectDetailSummaryTopIconProps extends IconProps { + count: number + icon: IconType +} + +const ProjectDetailSummaryTopIcon = ({ + count, + icon, + ...props +}: ProjectDetailSummaryTopIconProps) => { + return ( + + + {count} + + ) +} + +export default ProjectDetailSummaryTopIcon diff --git a/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIconButton.tsx b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIconButton.tsx new file mode 100644 index 00000000..f0ffd020 --- /dev/null +++ b/src/pages/ProjectDetailPage/components/ProjectDetailSummaryTop/ProjectDetailSummaryTopIconButton.tsx @@ -0,0 +1,27 @@ +import { Flex, IconButton, IconButtonProps, Text } from "@chakra-ui/react" + +interface ProjectDetailSummaryTopIconButtonProps extends IconButtonProps { + count?: number +} + +const ProjectDetailSummaryTopIconButton = ({ + count, + ...props +}: ProjectDetailSummaryTopIconButtonProps) => { + return ( + + + {count} + + ) +} + +export default ProjectDetailSummaryTopIconButton diff --git a/src/pages/ProjectDetailPage/hooks/queries/useProjectDetailQuery.ts b/src/pages/ProjectDetailPage/hooks/queries/useProjectDetailQuery.ts new file mode 100644 index 00000000..3c5c5652 --- /dev/null +++ b/src/pages/ProjectDetailPage/hooks/queries/useProjectDetailQuery.ts @@ -0,0 +1,13 @@ +import { useQuery } from "@tanstack/react-query" + +import { getProjectDetail } from "@/api/project/getProjectDetail" + +const QUERY_KEY_GET_PROJECT_DETAIL = "GET_PROJECT_DETAIL_1389471984712" +const useProjectDetailQuery = (projectId: number) => { + return useQuery({ + queryKey: [QUERY_KEY_GET_PROJECT_DETAIL, projectId], + queryFn: () => getProjectDetail({ projectId }), + }) +} + +export default useProjectDetailQuery diff --git a/src/pages/ProjectDetailPage/mocks/index.ts b/src/pages/ProjectDetailPage/mocks/index.ts new file mode 100644 index 00000000..0e771834 --- /dev/null +++ b/src/pages/ProjectDetailPage/mocks/index.ts @@ -0,0 +1,9 @@ +import { rest } from "msw" + +import { DUMMY_PROJECT_DETAIL } from "./mockData" + +export const projectDetailHandlers = [ + rest.get("/api/v1/projects/:projectId", (_, res, ctx) => { + return res(ctx.status(200), ctx.json(DUMMY_PROJECT_DETAIL)) + }), +] diff --git a/src/pages/ProjectDetailPage/mocks/mockData.ts b/src/pages/ProjectDetailPage/mocks/mockData.ts new file mode 100644 index 00000000..3efb6b02 --- /dev/null +++ b/src/pages/ProjectDetailPage/mocks/mockData.ts @@ -0,0 +1,91 @@ +export const DUMMY_PROJECT_DETAIL = { + projects: [ + { + // 개요 + id: "1", + name: "사이드픽👀", + subName: "요즘 사이드 플젝 뭐함? 사이드픽 👀", + overview: + "데브코스 5기 육개짱팀의 좌충우돌 우당탕탕 프로젝트 개발 일대기", + overviewImageUrl: [ + { + id: 1, + url: "https://i.postimg.cc/HnFs3QyH/image.png", + }, + { + id: 2, + url: "https://i.postimg.cc/MTqbTwc1/image.png", + }, + { + id: 3, + url: "https://i.postimg.cc/NjqjHktk/image.png", + }, + ], + thumbnailUrl: + "https://user-images.githubusercontent.com/37354708/144370579-763a962c-5076-413c-9ea6-1043985791f6.png", + githubUrl: "https://github.com/side-peek", + deployUrl: "https://sidepeek.netlify.app/", + viewCount: 20, + likeCount: 7, + commentCount: 2, + + // 기술 스택 + techStacks: [ + { + name: "React", + category: "프론트", + icon_image_url: + "https://cdn.iconscout.com/icon/free/png-512/free-react-1-282599.png?f=webp&w=256", + }, + { + name: "Spring", + category: "백", + icon_image_url: + "https://cdn.iconscout.com/icon/free/png-512/free-spring-16-283031.png?f=webp&w=256", + }, + { + name: "GitHub", + category: "협업툴", + icon_image_url: + "https://cdn.iconscout.com/icon/free/png-512/free-github-1521500-1288242.png?f=webp&w=256", + }, + ], + + // 프로젝트 기간 + startDate: "2024-01", + endDate: "2024-03", + + // 팀원 + members: [ + { + id: 1, + nickname: "의진", + profile_image_url: + "https://user-images.githubusercontent.com/37354708/144370579-763a962c-5076-413c-9ea6-1043985791f6.png", + category: "백", + }, + { + id: 2, + nickname: "동건", + profile_image_url: + "https://user-images.githubusercontent.com/37354708/144370579-763a962c-5076-413c-9ea6-1043985791f6.png", + category: "프론트", + }, + { + id: null, + nickname: "민호", + profile_image_url: null, + category: "프론트", + }, + ], + + // 기능 + description: + "# SidePeek ![License](https://img.shields.io/badge/license-MIT-blue) ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-green.svg)\n\nLogo\n\nAn immersive remote-working platform - Winner of [2021 Monte Jade Innovation Competition](http://www.montejadese.org/pages/mjic.html)\n\n- Come try it out - [Official Website](https://skyoffice.netlify.app/)\n- Why we built this - [Concept Video](https://www.youtube.com/watch?v=BpDqGTPh8pc)\n\nSkyOffice works on all PC browsers (mobile browsers are currently not supported)\n\n## Built with\n\n- [Phaser3](https://github.com/photonstorm/phaser) - Game Engine\n- [Colyseus](https://github.com/colyseus/colyseus) - WebSocket-based Server Framework\n- [React/Redux](https://github.com/facebook/react) - Front-end Framework\n- [PeerJS](https://github.com/peers/peerjs) - WebRTC for Video/screen sharing\n- [TypeScript](https://github.com/microsoft/TypeScript) and [ES6](https://github.com/eslint/eslint) - for both client and server sides\n\n## Features\n\n### Proximity Chat (distance-based interactive system)\n\n![image](https://user-images.githubusercontent.com/11501902/139960852-cf0e0883-8fbe-459d-bb11-3707d0ae1360.png)\n\n### Multifunctional Rooms\n\n![image](https://user-images.githubusercontent.com/11501902/139961091-1801bd4d-fbd6-4400-8503-85ece744e979.png)\n\n### Flexible & Immediate Screen Sharing\n\n![image](https://user-images.githubusercontent.com/11501902/139961155-44a85cd9-ac25-4563-9d82-6537ed7435f6.png)\n\n## Controls\n\n- `arrow keys` to move (video chat will start if you are close to someone else)\n- `E` to sit down\n- `R` to use computer (for screen sharing)\n\n## Prerequisites\n\nYou'll need [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/) installed.\n\n## Getting Started\n\nClone this repository to your local machine:\n\n```bash\ngit clone https://github.com/kevinshen56714/SkyOffice.git\n```\n\nThis will create a folder named `SkyOffice`. You can specify a different folder name like this:\n\n```bash\ngit clone https://github.com/kevinshen56714/SkyOffice.git my-folder-name\n```\n\nTo start a server, go into the project folder and install dependencies/run start command:\n\n```bash\ncd SkyOffice or 'my-folder-name'\nnpm install && npm run start\n```\n\nTo start a client, go into the client folder and install dependencies/run start command:\n\n```bash\ncd SkyOffice/client or 'my-folder-name/client'\nnpm install && npm run start\n```\n\n## Credits 🎉\n\nBig thanks to this great repo:\nhttps://github.com/ourcade/phaser3-typescript-parcel-template\n\n## License\n\n[MIT License](https://github.com/kevinshen56714/SkyOffice/blob/master/LICENSE)\n", + + // 트러블 슈팅 + troubleShooting: + "# SidePeek ![License](https://img.shields.io/badge/license-MIT-blue) ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-green.svg)\n\nLogo\n\nAn immersive remote-working platform - Winner of [2021 Monte Jade Innovation Competition](http://www.montejadese.org/pages/mjic.html)\n\n- Come try it out - [Official Website](https://skyoffice.netlify.app/)\n- Why we built this - [Concept Video](https://www.youtube.com/watch?v=BpDqGTPh8pc)\n\nSkyOffice works on all PC browsers (mobile browsers are currently not supported)\n\n## Built with\n\n- [Phaser3](https://github.com/photonstorm/phaser) - Game Engine\n- [Colyseus](https://github.com/colyseus/colyseus) - WebSocket-based Server Framework\n- [React/Redux](https://github.com/facebook/react) - Front-end Framework\n- [PeerJS](https://github.com/peers/peerjs) - WebRTC for Video/screen sharing\n- [TypeScript](https://github.com/microsoft/TypeScript) and [ES6](https://github.com/eslint/eslint) - for both client and server sides\n\n## Features\n\n### Proximity Chat (distance-based interactive system)\n\n![image](https://user-images.githubusercontent.com/11501902/139960852-cf0e0883-8fbe-459d-bb11-3707d0ae1360.png)\n\n### Multifunctional Rooms\n\n![image](https://user-images.githubusercontent.com/11501902/139961091-1801bd4d-fbd6-4400-8503-85ece744e979.png)\n\n### Flexible & Immediate Screen Sharing\n\n![image](https://user-images.githubusercontent.com/11501902/139961155-44a85cd9-ac25-4563-9d82-6537ed7435f6.png)\n\n## Controls\n\n- `arrow keys` to move (video chat will start if you are close to someone else)\n- `E` to sit down\n- `R` to use computer (for screen sharing)\n\n## Prerequisites\n\nYou'll need [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/) installed.\n\n## Getting Started\n\nClone this repository to your local machine:\n\n```bash\ngit clone https://github.com/kevinshen56714/SkyOffice.git\n```\n\nThis will create a folder named `SkyOffice`. You can specify a different folder name like this:\n\n```bash\ngit clone https://github.com/kevinshen56714/SkyOffice.git my-folder-name\n```\n\nTo start a server, go into the project folder and install dependencies/run start command:\n\n```bash\ncd SkyOffice or 'my-folder-name'\nnpm install && npm run start\n```\n\nTo start a client, go into the client folder and install dependencies/run start command:\n\n```bash\ncd SkyOffice/client or 'my-folder-name/client'\nnpm install && npm run start\n```\n\n## Credits 🎉\n\nBig thanks to this great repo:\nhttps://github.com/ourcade/phaser3-typescript-parcel-template\n\n## License\n\n[MIT License](https://github.com/kevinshen56714/SkyOffice/blob/master/LICENSE)\n", + }, + ], +} diff --git a/src/pages/ProjectDetailPage/styles/SwiperSlide.styles.ts b/src/pages/ProjectDetailPage/styles/SwiperSlide.styles.ts new file mode 100644 index 00000000..31dce4e0 --- /dev/null +++ b/src/pages/ProjectDetailPage/styles/SwiperSlide.styles.ts @@ -0,0 +1,22 @@ +import { Swiper } from "swiper/react" + +import styled from "styled-components" + +export const StyledSwiper = styled(Swiper)` + width: 100%; + height: 100%; + + .swiper-slide img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + } + + .swiper-pagination-bullet { + width: 1.5rem; + height: 1.5rem; + border-radius: 50%; + background-color: #ffc436; + } +` diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 3f52605c..e973c7a3 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -25,17 +25,16 @@ export const router = createBrowserRouter([ { path: "/project", element: , - children: [ - { - path: ":projectId", - element: , - }, - { - path: ":projectId/edit", - element: , - }, - ], }, + { + path: "/project/:projectId", + element: , + }, + { + path: "/project/:projectId/edit", + element: , + }, + { path: "/test", element: , diff --git a/src/styles/theme.ts b/src/styles/theme.ts index ac08c8d2..94a7de8f 100644 --- a/src/styles/theme.ts +++ b/src/styles/theme.ts @@ -5,6 +5,7 @@ import "./fonts/index.css" const themeConfig = { config: { initialColorMode: "light", useSystemColorMode: false }, + styles: { global: (props: StyleFunctionProps) => ({ html: { @@ -42,8 +43,11 @@ const themeConfig = { grey: { 100: "#F0F0F0", 200: "#ECECEC", - 300: "#D4D4D4", + 300: "#D9D9D9", + 400: "#D4D4D4", + 500: "#7a7a7a", }, + whiteSmoke: "#f5f5f5", }, fontWeights: { thin: 200, diff --git a/src/types/domain/apiDomain.d.ts b/src/types/domain/apiDomain.d.ts index b1834ae0..950e097a 100644 --- a/src/types/domain/apiDomain.d.ts +++ b/src/types/domain/apiDomain.d.ts @@ -36,11 +36,12 @@ declare module "api-models" { } export type Project = { + id: string name: string subName: string overview: string thumbnailUrl: string - overviewImageUrl: string[] + overviewImageUrl: ProjectOverViewUrl[] githubUrl: string deployUrl: string techStacks: TechStack[] @@ -48,6 +49,9 @@ declare module "api-models" { endDate: string ownerId: number members: Member[] + viewCount: number + commentCount: number + likeCount: number description: Description troubleShooting: Description } @@ -90,6 +94,11 @@ declare module "api-models" { nickname: string } + export type ProjectOverViewUrl = { + id: number + url: string + } + export type Comment = { id: number userId: string @@ -238,3 +247,5 @@ declare module "api-models" { projectId: number } } +// 맞아요 음.. 그러면 타입을 하나 둬야겠네요 하나더 +// 원래 그게 맞긴해요 일단 제가 메모해놓을게요