diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index 91e89d3..2f72e7d 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: "18.16.0" + node-version: "20.12.2" registry-url: "https://registry.npmjs.org" - name: Set version number to environment variable run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0614479..9e54deb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: "18.16.0" + node-version: "20.12.2" - run: yarn install - run: yarn run lint @@ -63,7 +63,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: "18.16.0" + node-version: "20.12.2" - run: yarn install - run: yarn run build env: diff --git a/.node-version b/.node-version index 6d80269..8783404 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18.16.0 +20.12.2 diff --git a/actions/publish/action.yml b/actions/publish/action.yml index 1f035be..012fc1a 100644 --- a/actions/publish/action.yml +++ b/actions/publish/action.yml @@ -16,9 +16,9 @@ runs: steps: - uses: actions/setup-node@v4 with: - node-version: "18.16.0" + node-version: "20.12.2" - name: Install qiita-cli - run: npm install -g @qiita/qiita-cli@v1.4.1 + run: npm install -g @qiita/qiita-cli@v1.4.2 shell: bash - name: Publish articles run: qiita publish --all --root ${{ inputs.root }} diff --git a/package.json b/package.json index 698faac..2518072 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@qiita/qiita-cli", - "version": "1.4.1", + "version": "1.4.2", "description": "Qiita CLI is a tool that allows you to write, preview and publish articles on Qiita from local environment.", "keywords": [ "Qiita" @@ -26,9 +26,9 @@ "@types/debug": "^4.1.12", "@types/express": "^4.17.21", "@types/jest": "^29.5.12", - "@types/node": "^18.16.18", + "@types/node": "^20.12.8", "@types/react": "^18.2.73", - "@types/react-dom": "^18.2.19", + "@types/react-dom": "^18.2.25", "@types/webpack": "^5.28.5", "@types/ws": "^8.5.10", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -36,16 +36,16 @@ "classnames": "^2.5.1", "eslint": "^8.57.0", "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-hooks": "^4.6.2", "html-webpack-plugin": "^5.6.0", "husky": "^9.0.11", "jest": "^29.7.0", "lint-staged": "^15.2.2", "npm-run-all": "^4.1.5", - "prettier": "^3.2.5", + "prettier": "^3.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.15.0", + "react-router-dom": "^6.23.1", "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", "typescript": "^5.4.3", @@ -75,13 +75,13 @@ "arg": "^5.0.2", "boxen": "^7.1.1", "chalk": "^5.3.0", - "chokidar": "^3.5.3", - "debug": "^4.3.4", + "chokidar": "^3.6.0", + "debug": "^4.3.5", "dotenv": "^16.4.5", "express": "^4.19.2", "gray-matter": "^4.0.3", "open": "^10.1.0", - "ws": "^8.16.0" + "ws": "^8.17.0" }, "packageManager": "yarn@1.22.19", "engines": { diff --git a/src/commands/publish.ts b/src/commands/publish.ts index 31cb3f8..0968955 100644 --- a/src/commands/publish.ts +++ b/src/commands/publish.ts @@ -6,7 +6,11 @@ import { getFileSystemRepo } from "../lib/get-file-system-repo"; import { getQiitaApiInstance } from "../lib/get-qiita-api-instance"; import { syncArticlesFromQiita } from "../lib/sync-articles-from-qiita"; import { validateItem } from "../lib/validators/item-validator"; -import { Item } from "../qiita-api"; +import { + Item, + QiitaForbiddenError, + QiitaForbiddenOrBadRequestError, +} from "../qiita-api"; export const publish = async (argv: string[]) => { const args = arg( @@ -117,6 +121,14 @@ export const publish = async (argv: string[]) => { await fileSystemRepo.saveItem(responseItem, false, true); }); - await Promise.all(promises); + try { + await Promise.all(promises); + } catch (err) { + if (err instanceof QiitaForbiddenError) { + // patchItem and postItem is possible to return 403 by bad request. + throw new QiitaForbiddenOrBadRequestError(err.message, { cause: err }); + } + throw err; + } console.log("Successful!"); }; diff --git a/src/lib/error-handler.ts b/src/lib/error-handler.ts index 7a02f4a..3dc7357 100644 --- a/src/lib/error-handler.ts +++ b/src/lib/error-handler.ts @@ -2,6 +2,7 @@ import { QiitaBadRequestError, QiitaFetchError, QiitaForbiddenError, + QiitaForbiddenOrBadRequestError, QiitaInternalServerError, QiitaNotFoundError, QiitaRateLimitError, @@ -44,6 +45,14 @@ export const handleError = async (error: Error) => { ); console.error(chalk.red("")); break; + case QiitaForbiddenOrBadRequestError.name: + console.error(chalk.red.bold("Qiita APIへのリクエストに失敗しました")); + console.error(chalk.red(" 記事ファイルに不備がないかご確認ください")); + console.error( + chalk.red(" または、Qiitaのアクセストークンが正しいかご確認ください"), + ); + console.error(chalk.red("")); + break; case QiitaNotFoundError.name: console.error(chalk.red.bold("記事が見つかりませんでした")); console.error( diff --git a/src/qiita-api/errors.ts b/src/qiita-api/errors.ts index f925eaa..9bfe96a 100644 --- a/src/qiita-api/errors.ts +++ b/src/qiita-api/errors.ts @@ -53,3 +53,11 @@ export class QiitaUnknownError extends Error { this.name = "QiitaUnknownError"; } } + +export class QiitaForbiddenOrBadRequestError extends Error { + constructor(message: string, options?: { cause?: Error }) { + // @ts-expect-error This error is fixed in ES2022. + super(message, options); + this.name = "QiitaForbiddenOrBadRequestError"; + } +} diff --git a/yarn.lock b/yarn.lock index 73620e8..0cc5985 100644 --- a/yarn.lock +++ b/yarn.lock @@ -977,10 +977,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@remix-run/router@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.8.0.tgz#e848d2f669f601544df15ce2a313955e4bf0bafc" - integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg== +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -1155,10 +1155,12 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^18.16.18": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== +"@types/node@*", "@types/node@^20.12.8": + version "20.12.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.8.tgz#35897bf2bfe3469847ab04634636de09552e8256" + integrity sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w== + dependencies: + undici-types "~5.26.4" "@types/parse-json@^4.0.0": version "4.0.0" @@ -1180,10 +1182,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^18.2.19": - version "18.2.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58" - integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA== +"@types/react-dom@^18.2.25": + version "18.2.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" + integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== dependencies: "@types/react" "*" @@ -1991,10 +1993,10 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2266,13 +2268,20 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" @@ -2790,10 +2799,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.34.1: version "7.34.1" @@ -5072,10 +5081,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +prettier@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac" + integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg== pretty-error@^4.0.0: version "4.0.0" @@ -5181,20 +5190,20 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-router-dom@^6.15.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.15.0.tgz#6da7db61e56797266fbbef0d5e324d6ac443ee40" - integrity sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ== +react-router-dom@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== dependencies: - "@remix-run/router" "1.8.0" - react-router "6.15.0" + "@remix-run/router" "1.16.1" + react-router "6.23.1" -react-router@6.15.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.15.0.tgz#bf2cb5a4a7ed57f074d4ea88db0d95033f39cac8" - integrity sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg== +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== dependencies: - "@remix-run/router" "1.8.0" + "@remix-run/router" "1.16.1" react@^18.2.0: version "18.2.0" @@ -6114,6 +6123,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -6382,10 +6396,10 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^8.16.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== +ws@^8.17.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== y18n@^5.0.5: version "5.0.8"
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: