diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f826da92ba41..7664e5d83994 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ on: jobs: lint-biome: + name: Lint Biome runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -25,6 +26,7 @@ jobs: - run: yarn lint-biome && git diff --exit-code lint-ts: + name: Lint TypeScript runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -37,6 +39,7 @@ jobs: - run: yarn lint-ts lint-secretlint: + name: Lint Secretlint runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -48,7 +51,8 @@ jobs: - run: yarn install - run: yarn lint-secretlint - validate-renovate-config: + lint-renovate-config: + name: Lint Renovate config runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -59,7 +63,15 @@ jobs: - name: Validate Renovate config run: npx --yes --package renovate -- renovate-config-validator --strict + check-typo: + name: Check typos + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: crate-ci/typos@v1.25.0 + test: + name: Test runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -72,6 +84,7 @@ jobs: - run: yarn test-coverage generate: + name: Generate feed and site runs-on: ubuntu-24.04 timeout-minutes: 20 steps: diff --git a/.typos.toml b/.typos.toml new file mode 100644 index 000000000000..7e76eaf7c7ce --- /dev/null +++ b/.typos.toml @@ -0,0 +1,4 @@ +[files] +extend-exclude = [ + "src/resources/feed-info-list.ts" +] diff --git a/package.json b/package.json index a74e75db8ac0..e521cfd372ad 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "@types/http-server": "^0.12.1", "@types/node": "^20.10.4", "@types/open-graph-scraper": "^4.8.1", - "@types/request": "^2.48.8", "@vitest/coverage-v8": "^2.0.3", "async-retry": "^1.3.3", "await-to-js": "^3.0.0", @@ -59,7 +58,6 @@ "log4js": "^6.9.1", "open-graph-scraper": "^6.5.1", "renovate": "^37.253.1", - "request": "^2.88.2", "rss-parser": "^3.12.0", "secretlint": "^8.3.0", "sharp-ico": "^0.1.5", diff --git a/src/feed/generate-feed-command.ts b/src/feed/generate-feed-command.ts index 9135bc49f93f..ab3b45f9b07e 100644 --- a/src/feed/generate-feed-command.ts +++ b/src/feed/generate-feed-command.ts @@ -6,6 +6,7 @@ import { FeedGenerator } from './utils/feed-generator'; import { ImagePrecacher as FeedImagePrecacher } from './utils/feed-image-precacher'; import { FeedStorer } from './utils/feed-storer'; import { FeedValidator } from './utils/feed-validator'; +import { logger } from './utils/logger'; const dirName = url.fileURLToPath(new URL('.', import.meta.url)); @@ -43,19 +44,6 @@ const feedImagePrecacher = new FeedImagePrecacher(); MAX_FEED_CONTENT_LENGTH, ); - // まとめフィードのバリデーション。エラーならすぐに終了する - try { - await feedValidator.assertFeed(generateFeedsResult.aggregatedFeed); - await feedValidator.assertXmlFeed('atom', generateFeedsResult.feedDistributionSet.atom); - await feedValidator.assertXmlFeed('rss', generateFeedsResult.feedDistributionSet.rss); - } catch (e) { - const error = new Error('Failed to validate feed', { - cause: e, - }); - console.error(error); - throw error; - } - // ファイル出力 try { await feedStorer.storeFeeds( @@ -89,4 +77,21 @@ const feedImagePrecacher = new FeedImagePrecacher(); console.error(error); throw error; } + + // 最後にまとめフィードのバリデーション + try { + logger.info('フィードのバリデーション開始'); + + await feedValidator.assertFeed(generateFeedsResult.aggregatedFeed); + await feedValidator.assertXmlFeed('atom', generateFeedsResult.feedDistributionSet.atom); + await feedValidator.assertXmlFeed('rss', generateFeedsResult.feedDistributionSet.rss); + + logger.info('フィードのバリデーション完了'); + } catch (e) { + const error = new Error('Failed to validate feed', { + cause: e, + }); + console.error(error); + throw error; + } })(); diff --git a/src/feed/register-index-command.ts b/src/feed/register-index-command.ts index 05d4db8991b2..a3dd4ec4048f 100644 --- a/src/feed/register-index-command.ts +++ b/src/feed/register-index-command.ts @@ -1,5 +1,4 @@ import { google } from 'googleapis'; -import * as request from 'request'; import constants from '../common/constants'; import { sleep } from './utils/common-util'; import type { BlogFeed } from './utils/feed-storer'; @@ -45,30 +44,29 @@ jwtClient.authorize(async (err, tokens) => { } for (const indexTargetUrl of indexTargetUrls) { - const options: request.CoreOptions = { + const options = { method: 'POST', headers: { 'Content-Type': 'application/json', + Authorization: `Bearer ${tokens.access_token || ''}`, }, - auth: { bearer: tokens.access_token || '' }, - json: { + body: JSON.stringify({ url: indexTargetUrl, type: 'URL_UPDATED', - }, + }), }; - await request.post(GOOGLE_INDEXING_API_END_POINT, options, async (error, response, body) => { - if (error) { - console.error(error); - return; - } - if (response.statusCode !== 200) { - console.error(response.statusCode, body); - return; + try { + const response = await fetch(GOOGLE_INDEXING_API_END_POINT, options); + if (!response.ok) { + console.error(response.status, await response.text()); + continue; } - + const body = await response.json(); console.log(`[index api] success! url: ${body.urlNotificationMetadata.url}`); - }); + } catch (error) { + console.error(error); + } await sleep(1000); } diff --git a/src/feed/utils/common-util.ts b/src/feed/utils/common-util.ts index 33fa24e1e76f..be068734e8cc 100644 --- a/src/feed/utils/common-util.ts +++ b/src/feed/utils/common-util.ts @@ -32,16 +32,6 @@ export const removeInvalidUnicode = (text: string) => { return text.replace(/[\x00-\x1F\x7F-\x9F]/g, ''); }; -export const escapeTextForXml = (text: string) => { - let escapedText = text; - - if (text.includes('&')) { - escapedText = text.replace(/&/g, '&'); - } - - return escapedText; -}; - export const isValidHttpUrl = (url: string) => { let urlObject: URL; diff --git a/src/feed/utils/feed-crawler.ts b/src/feed/utils/feed-crawler.ts index f79f4b446d14..aabee18abed2 100644 --- a/src/feed/utils/feed-crawler.ts +++ b/src/feed/utils/feed-crawler.ts @@ -15,6 +15,7 @@ import { removeInvalidUnicode, urlRemoveQueryParams, } from './common-util'; +import { FeedValidator } from './feed-validator'; import { logger } from './logger'; export type CustomOgObject = OgObject & { @@ -44,6 +45,7 @@ export interface ClawlFeedsResult { export class FeedCrawler { private rssParser; + private feedValidator; constructor() { this.rssParser = new RssParser({ @@ -53,6 +55,7 @@ export class FeedCrawler { 'user-agent': constants.requestUserAgent, }, }); + this.feedValidator = new FeedValidator(); } public async crawlFeeds( @@ -113,6 +116,10 @@ export class FeedCrawler { } const feedData = await response.text(); + + // バリデーション + await this.feedValidator.assertXmlFeed('fetched-feed', feedData); + return this.rssParser.parseString(feedData) as Promise; }), ); diff --git a/src/feed/utils/feed-generator.ts b/src/feed/utils/feed-generator.ts index 6f971734bb2d..04587e4fe316 100644 --- a/src/feed/utils/feed-generator.ts +++ b/src/feed/utils/feed-generator.ts @@ -1,6 +1,6 @@ import { Feed, type FeedOptions } from 'feed'; import constants from '../../common/constants.js'; -import { escapeTextForXml, textToMd5Hash, textTruncate } from './common-util'; +import { textToMd5Hash, textTruncate } from './common-util'; import type { CustomRssParserItem, FeedItemHatenaCountMap, OgObjectMap } from './feed-crawler'; import { logger } from './logger'; @@ -14,6 +14,13 @@ export interface GenerateFeedResult { aggregatedFeed: Feed; feedDistributionSet: FeedDistributionSet; } +const escapeTextForXml = (text: string) => { + return text.replace(/&/g, '&').replace(//g, '>'); +}; + +const escapeAmpersand = (text: string) => { + return text.replace(/&/g, '&'); +}; export class FeedGenerator { public generateFeeds( @@ -35,8 +42,8 @@ export class FeedGenerator { aggregatedFeed, feedDistributionSet: { // 出力されているXMLで & がエスケープされていないのでパッチ対応 - atom: escapeTextForXml(aggregatedFeed.atom1()), - rss: escapeTextForXml(aggregatedFeed.rss2()), + atom: escapeAmpersand(aggregatedFeed.atom1()), + rss: escapeAmpersand(aggregatedFeed.rss2()), json: aggregatedFeed.json1(), }, }; @@ -70,9 +77,12 @@ export class FeedGenerator { const feedItemContent = (feedItem.summary || feedItem.contentSnippet || '').replace(/(\n|\t+|\s+)/g, ' '); const ogObject = feedItemOgObjectMap.get(feedItem.link); - // 配列になっているが2つ目以降を使う理由もないので0を使う const ogImage = ogObject?.customOgImage; + if (ogImage && ogImage.alt) { + ogImage.alt = escapeTextForXml(ogImage.alt); + } + // 日付がないものは入れない if (!feedItem.isoDate) { logger.warn('[feed-item] フィードの日付がありません。', feedItem.isoDate, feedItem.title); @@ -83,20 +93,20 @@ export class FeedGenerator { id: feedItemId, guid: feedItemId, // 「記事タイトル | ブログ名」の形にする。タイトルだけでどの企業かわかるように - title: `${feedItem.title} | ${feedItem.blogTitle}`, - description: textTruncate(feedItemContent, maxFeedDescriptionLength), - content: textTruncate(feedItemContent, maxFeedContentLength), + title: escapeTextForXml(`${feedItem.title} | ${feedItem.blogTitle}`), + description: escapeTextForXml(textTruncate(feedItemContent, maxFeedDescriptionLength)), + content: escapeTextForXml(textTruncate(feedItemContent, maxFeedContentLength)), link: feedItem.link, category: (feedItem.categories || []).map((category) => { return { - name: category, + name: escapeTextForXml(category), }; }), author: feedItem.creator && typeof feedItem.creator === 'string' ? [ { - name: feedItem.creator, + name: escapeTextForXml(feedItem.creator), }, ] : undefined, @@ -108,8 +118,8 @@ export class FeedGenerator { name: '_custom', objects: { hatenaCount: allFeedItemHatenaCountMap.get(feedItem.link) || 0, - originalTitle: feedItem.title, - blogTitle: feedItem.blogTitle, + originalTitle: escapeTextForXml(feedItem.title ?? ''), + blogTitle: escapeTextForXml(feedItem.blogTitle), blogLink: feedItem.blogLink, blogLinkMd5Hash: textToMd5Hash(feedItem.blogLink), favicon: ogObject?.favicon, diff --git a/src/feed/utils/feed-validator.ts b/src/feed/utils/feed-validator.ts index c08b7205ee84..0b24f9852f4e 100644 --- a/src/feed/utils/feed-validator.ts +++ b/src/feed/utils/feed-validator.ts @@ -3,15 +3,12 @@ import { XMLValidator } from 'fast-xml-parser'; import type { Feed } from 'feed'; import libxmljs from 'libxmljs'; import RssParser from 'rss-parser'; -import { logger } from './logger'; /** * フィードのバリデーション */ export class FeedValidator { public async assertFeed(feed: Feed): Promise { - logger.info('[FeedValidator] フィードのバリデーション開始'); - // 一つでもimageがあればok let isImageFound = false; for (const item of feed.items) { @@ -23,20 +20,19 @@ export class FeedValidator { if (!isImageFound) { throw new Error('フィードに画像情報が一つもありません'); } - - logger.info('[FeedValidator] フィードのバリデーション完了'); } public async assertXmlFeed(label: string, feedXml: string): Promise { const rssParser = new RssParser(); - logger.info(`[FeedValidator] XMLフィードのバリデーション開始。 label: ${label}`); - // rss-parser で変換してみてエラーが出ないか確認 const [rssParserError] = await to(rssParser.parseString(feedXml)); if (rssParserError) { throw new Error( `rss-parserによるフィードのバリデーションエラーです。 label: ${label}, error: ${rssParserError}}`, + { + cause: rssParserError, + }, ); } @@ -45,6 +41,9 @@ export class FeedValidator { if (atomValidateResult !== true) { throw new Error( `fast-xml-parser XMLValidatorによるフィードのバリデーションエラーです。 label: ${label}, result: ${atomValidateResult}`, + { + cause: atomValidateResult, + }, ); } @@ -53,10 +52,13 @@ export class FeedValidator { libxmljs.parseXml(feedXml); } catch (libxmljsError) { if (libxmljsError instanceof Error) { - throw new Error(`libxmljsによるフィードのバリデーションエラーです。 error: ${libxmljsError.message}`); + throw new Error( + `libxmljsによるフィードのバリデーションエラーです。 label: ${label}, error: ${libxmljsError.message}`, + { + cause: libxmljsError, + }, + ); } } - - logger.info(`[FeedValidator] XMLフィードのバリデーション完了。 label: ${label}`); } } diff --git a/src/resources/feed-info-list.ts b/src/resources/feed-info-list.ts index 0cc5a40de87a..68d66946aca6 100644 --- a/src/resources/feed-info-list.ts +++ b/src/resources/feed-info-list.ts @@ -267,7 +267,7 @@ export const FEED_INFO_LIST: FeedInfo[] = createFeedInfoList([ ['SmartHR', 'https://tech.smarthr.jp/feed'], ['SmartNews', 'https://developer.smartnews.com/blog/feed'], ['SmartNewsメディア担当チーム', 'https://www.mediatechnology.jp/feed'], - ['Snowlfake', 'https://zenn.dev/p/dataheroes/feed'], + ['Snowflake', 'https://zenn.dev/p/dataheroes/feed'], ['Social Databank', 'https://zenn.dev/p/sdb_blog/feed'], ['Speee', 'https://tech.speee.jp/feed'], ['Spiral.AI', 'https://zenn.dev/p/spiralai/feed'], diff --git a/yarn.lock b/yarn.lock index 6b1cc16b4ab4..a54b27e992ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3924,13 +3924,6 @@ __metadata: languageName: node linkType: hard -"@types/caseless@npm:*": - version: 0.12.5 - resolution: "@types/caseless@npm:0.12.5" - checksum: 10/f6a3628add76d27005495914c9c3873a93536957edaa5b69c63b46fe10b4649a6fecf16b676c1695f46aab851da47ec6047dcf3570fa8d9b6883492ff6d074e0 - languageName: node - linkType: hard - "@types/clean-css@npm:^4.2.11": version: 4.2.11 resolution: "@types/clean-css@npm:4.2.11" @@ -4053,18 +4046,6 @@ __metadata: languageName: node linkType: hard -"@types/request@npm:^2.48.8": - version: 2.48.12 - resolution: "@types/request@npm:2.48.12" - dependencies: - "@types/caseless": "npm:*" - "@types/node": "npm:*" - "@types/tough-cookie": "npm:*" - form-data: "npm:^2.5.0" - checksum: 10/a7b3f9f14cacc18fe235bb8e57eff1232a04bd3fa3dad29371f24a5d96db2cd295a0c8b6b34ed7efa3efbbcff845febb02c9635cd68c54811c947ea66ae22090 - languageName: node - linkType: hard - "@types/responselike@npm:^1.0.0": version: 1.0.3 resolution: "@types/responselike@npm:1.0.3" @@ -4104,13 +4085,6 @@ __metadata: languageName: node linkType: hard -"@types/tough-cookie@npm:*": - version: 4.0.5 - resolution: "@types/tough-cookie@npm:4.0.5" - checksum: 10/01fd82efc8202670865928629697b62fe9bf0c0dcbc5b1c115831caeb073a2c0abb871ff393d7df1ae94ea41e256cb87d2a5a91fd03cdb1b0b4384e08d4ee482 - languageName: node - linkType: hard - "@types/treeify@npm:^1.0.0": version: 1.0.3 resolution: "@types/treeify@npm:1.0.3" @@ -4436,18 +4410,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.3": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c - languageName: node - linkType: hard - "ajv@npm:^8.0.1, ajv@npm:^8.17.1": version: 8.17.1 resolution: "ajv@npm:8.17.1" @@ -4651,22 +4613,6 @@ __metadata: languageName: node linkType: hard -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: "npm:~2.1.0" - checksum: 10/cf629291fee6c1a6f530549939433ebf32200d7849f38b810ff26ee74235e845c0c12b2ed0f1607ac17383d19b219b69cefa009b920dab57924c5c544e495078 - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 10/f4f991ae2df849cc678b1afba52d512a7cbf0d09613ba111e72255409ff9158550c775162a47b12d015d1b82b3c273e8e25df0e4783d3ddb008a293486d00a07 - languageName: node - linkType: hard - "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -4736,14 +4682,7 @@ __metadata: languageName: node linkType: hard -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: 10/2ac497d739f71be3264cf096a33ab256a1fea7fe80b87dc51ec29374505bd5a661279ef1c22989d68528ea61ed634021ca63b31cf1d3c2a3682ffc106f7d0e96 - languageName: node - linkType: hard - -"aws4@npm:1.12.0, aws4@npm:^1.8.0": +"aws4@npm:1.12.0": version: 1.12.0 resolution: "aws4@npm:1.12.0" checksum: 10/2b8455fe1eee87f0e7d5f32e81e7fec74dce060c72d03f528c8c631fa74209cef53aab6fede182ea17d0c9520cb1e5e3023c5fedb4f1139ae9f067fc720869a5 @@ -4836,15 +4775,6 @@ __metadata: languageName: node linkType: hard -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: "npm:^0.14.3" - checksum: 10/13a4cde058250dbf1fa77a4f1b9a07d32ae2e3b9e28e88a0c7a1827835bc3482f3e478c4a0cfd4da6ff0c46dae07da1061123a995372b32cc563d9975f975404 - languageName: node - linkType: hard - "before-after-hook@npm:^2.2.0": version: 2.2.3 resolution: "before-after-hook@npm:2.2.3" @@ -5181,13 +5111,6 @@ __metadata: languageName: node linkType: hard -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: 10/ea1efdf430975fdbac3505cdd21007f7ac5aa29b6d4d1c091f965853cd1bf87e4b08ea07b31a6d688b038872b7cdf0589d9262d59c699d199585daad052aeb20 - languageName: node - linkType: hard - "chai@npm:^5.1.1": version: 5.1.1 resolution: "chai@npm:5.1.1" @@ -5461,7 +5384,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -5540,13 +5463,6 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 10/d0f7587346b44a1fe6c269267e037dd34b4787191e473c3e685f507229d88561c40eb18872fabfff02977301815d474300b7bfbd15396c13c5377393f7e87ec3 - languageName: node - linkType: hard - "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -5608,15 +5524,6 @@ __metadata: languageName: node linkType: hard -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 10/137b287fa021201ce100cef772c8eeeaaafdd2aa7282864022acf3b873021e54cb809e9c060fa164840bf54ff72d00d6e2d8da1ee5a86d7200eeefa1123a8f7f - languageName: node - linkType: hard - "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -6050,16 +5957,6 @@ __metadata: languageName: node linkType: hard -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.1.0" - checksum: 10/d43591f2396196266e186e6d6928038cc11c76c3699a912cb9c13757060f7bbc7f17f47c4cb16168cdeacffc7965aef021142577e646fb3cb88810c15173eb57 - languageName: node - linkType: hard - "ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -6679,7 +6576,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.0, extend@npm:^3.0.2, extend@npm:~3.0.2": +"extend@npm:^3.0.0, extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10/59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -6703,21 +6600,7 @@ __metadata: languageName: node linkType: hard -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: 10/26967d6c7ecbfb5bc5b7a6c43503dc5fafd9454802037e9fa1665e41f615da4ff5918bd6cb871a3beabed01a31eca1ccd0bdfb41231f50ad50d405a430f78377 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: 10/bfd6d55f3c0c04d826fe0213264b383c03f32825af6b1ff777f3f2dc49467e599361993568d75b7b19a8ea1bb08c8e7cd8c3d87d179ced91bb0dcf81ca6938e0 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": +"fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: 10/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d @@ -6737,13 +6620,6 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e - languageName: node - linkType: hard - "fast-uri@npm:^3.0.1": version: 3.0.2 resolution: "fast-uri@npm:3.0.2" @@ -6918,24 +6794,6 @@ __metadata: languageName: node linkType: hard -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 10/c1e1644d5e074ac063ecbc3fb8582013ef91fff0e3fa41e76db23d2f62bc6d9677aac86db950917deed4fe1fdd772df780cfaa352075f23deec9c015313afb97 - languageName: node - linkType: hard - -"form-data@npm:^2.5.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - checksum: 10/2e2e5e927979ba3623f9b4c4bcc939275fae3f2dea9dafc8db3ca656a3d75476605de2c80f0e6f1487987398e056f0b4c738972d6e1edd83392d5686d0952eed - languageName: node - linkType: hard - "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -6947,17 +6805,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - checksum: 10/1b6f3ccbf4540e535887b42218a2431a3f6cfdea320119c2affa2a7a374ad8fdd1e60166fc865181f45d49b1684c3e90e7b2190d3fe016692957afb9cf0d0d02 - languageName: node - linkType: hard - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -7181,15 +7028,6 @@ __metadata: languageName: node linkType: hard -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 10/ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - "git-raw-commits@npm:^2.0.0": version: 2.0.11 resolution: "git-raw-commits@npm:2.0.11" @@ -7510,23 +7348,6 @@ __metadata: languageName: node linkType: hard -"har-schema@npm:^2.0.0": - version: 2.0.0 - resolution: "har-schema@npm:2.0.0" - checksum: 10/d8946348f333fb09e2bf24cc4c67eabb47c8e1d1aa1c14184c7ffec1140a49ec8aa78aa93677ae452d71d5fc0fdeec20f0c8c1237291fc2bcb3f502a5d204f9b - languageName: node - linkType: hard - -"har-validator@npm:~5.1.3": - version: 5.1.5 - resolution: "har-validator@npm:5.1.5" - dependencies: - ajv: "npm:^6.12.3" - har-schema: "npm:^2.0.0" - checksum: 10/b998a7269ca560d7f219eedc53e2c664cd87d487e428ae854a6af4573fc94f182fe9d2e3b92ab968249baec7ebaf9ead69cf975c931dc2ab282ec182ee988280 - languageName: node - linkType: hard - "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -7799,17 +7620,6 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.2.0": - version: 1.2.0 - resolution: "http-signature@npm:1.2.0" - dependencies: - assert-plus: "npm:^1.0.0" - jsprim: "npm:^1.2.2" - sshpk: "npm:^1.7.0" - checksum: 10/2ff7112e6b0d8f08b382dfe705078c655501f2ddd76cf589d108445a9dd388a0a9be928c37108261519a7f53e6bbd1651048d74057b804807cce1ec49e87a95b - languageName: node - linkType: hard - "http2-wrapper@npm:^1.0.0-beta.5.2": version: 1.0.3 resolution: "http2-wrapper@npm:1.0.3" @@ -8399,7 +8209,7 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": +"is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" checksum: 10/4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c @@ -8474,13 +8284,6 @@ __metadata: languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 10/22d9c181015226d4534a227539256897bbbcb7edd1066ca4fc4d3a06dbd976325dfdd16b3983c7d236a89f256805c1a685a772e0364e98873d3819b064ad35a1 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -8586,13 +8389,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: 10/5450133242845100e694f0ef9175f44c012691a9b770b2571e677314e6f70600abb10777cdfc9a0c6a9f2ac6d134577403633de73e2fcd0f97875a67744e2d14 - languageName: node - linkType: hard - "json-bigint@npm:^1.0.0": version: 1.0.0 resolution: "json-bigint@npm:1.0.0" @@ -8632,13 +8428,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10/7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - "json-schema-traverse@npm:^1.0.0": version: 1.0.0 resolution: "json-schema-traverse@npm:1.0.0" @@ -8646,13 +8435,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 - languageName: node - linkType: hard - "json-stringify-pretty-compact@npm:3.0.0": version: 3.0.0 resolution: "json-stringify-pretty-compact@npm:3.0.0" @@ -8660,7 +8442,7 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": +"json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c @@ -8715,18 +8497,6 @@ __metadata: languageName: node linkType: hard -"jsprim@npm:^1.2.2": - version: 1.4.2 - resolution: "jsprim@npm:1.4.2" - dependencies: - assert-plus: "npm:1.0.0" - extsprintf: "npm:1.3.0" - json-schema: "npm:0.4.0" - verror: "npm:1.10.0" - checksum: 10/df2bf234eab1b5078d01bcbff3553d50a243f7b5c10a169745efeda6344d62798bd1d85bcca6a8446f3b5d0495e989db45f9de8dae219f0f9796e70e0c776089 - languageName: node - linkType: hard - "junk@npm:^1.0.1": version: 1.0.3 resolution: "junk@npm:1.0.3" @@ -9260,7 +9030,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -9575,11 +9345,11 @@ __metadata: linkType: hard "nan@npm:^2.17.0": - version: 2.18.0 - resolution: "nan@npm:2.18.0" + version: 2.22.0 + resolution: "nan@npm:2.22.0" dependencies: node-gyp: "npm:latest" - checksum: 10/5520e22c64e2b5b495b1d765d6334c989b848bbe1502fec89c5857cabcc7f9f0474563377259e7574bff1c8a041d3b90e9ffa1f5e15502ffddee7b2550cc26a0 + checksum: 10/ab165ba910e549fcc21fd561a33f534d86e81ae36c97b1019dcfe506b09692ff867c97794a54b49c9a83b8b485f529f0f58d24966c3a11863c97dc70814f4d50 languageName: node linkType: hard @@ -9806,13 +9576,6 @@ __metadata: languageName: node linkType: hard -"oauth-sign@npm:~0.9.0": - version: 0.9.0 - resolution: "oauth-sign@npm:0.9.0" - checksum: 10/1809a366d258f41fdf4ab5310cff3d1e15f96b187503bc7333cef4351de7bd0f52cb269bc95800f1fae5fb04dd886287df1471985fd67e8484729fdbcf857119 - languageName: node - linkType: hard - "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -10244,13 +10007,6 @@ __metadata: languageName: node linkType: hard -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 10/534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - "pgp-utils@npm:0.0.35": version: 0.0.35 resolution: "pgp-utils@npm:0.0.35" @@ -10463,13 +10219,6 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 - languageName: node - linkType: hard - "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -10487,13 +10236,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 - languageName: node - linkType: hard - "purepack@npm:^1.0.6": version: 1.0.6 resolution: "purepack@npm:1.0.6" @@ -10519,13 +10261,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:~6.5.2": - version: 6.5.3 - resolution: "qs@npm:6.5.3" - checksum: 10/485c990fba7ad17671e16c92715fb064c1600337738f5d140024eb33a49fbc1ed31890d3db850117c760caeb9c9cc9f4ba22a15c20dd119968e41e3d3fe60b28 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -10914,34 +10649,6 @@ __metadata: languageName: node linkType: hard -"request@npm:^2.88.2": - version: 2.88.2 - resolution: "request@npm:2.88.2" - dependencies: - aws-sign2: "npm:~0.7.0" - aws4: "npm:^1.8.0" - caseless: "npm:~0.12.0" - combined-stream: "npm:~1.0.6" - extend: "npm:~3.0.2" - forever-agent: "npm:~0.6.1" - form-data: "npm:~2.3.2" - har-validator: "npm:~5.1.3" - http-signature: "npm:~1.2.0" - is-typedarray: "npm:~1.0.0" - isstream: "npm:~0.1.2" - json-stringify-safe: "npm:~5.0.1" - mime-types: "npm:~2.1.19" - oauth-sign: "npm:~0.9.0" - performance-now: "npm:^2.1.0" - qs: "npm:~6.5.2" - safe-buffer: "npm:^5.1.2" - tough-cookie: "npm:~2.5.0" - tunnel-agent: "npm:^0.6.0" - uuid: "npm:^3.3.2" - checksum: 10/005b8b237b56f1571cfd4ecc09772adaa2e82dcb884fc14ea2bb25e23dbf7c2009f9929e0b6d3fd5802e33ed8ee705a3b594c8f9467c1458cd973872bf89db8e - languageName: node - linkType: hard - "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" @@ -11204,7 +10911,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -11247,7 +10954,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -11888,27 +11595,6 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.7.0": - version: 1.18.0 - resolution: "sshpk@npm:1.18.0" - dependencies: - asn1: "npm:~0.2.3" - assert-plus: "npm:^1.0.0" - bcrypt-pbkdf: "npm:^1.0.0" - dashdash: "npm:^1.12.0" - ecc-jsbn: "npm:~0.1.1" - getpass: "npm:^0.1.1" - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.0.2" - tweetnacl: "npm:~0.14.0" - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: 10/858339d43e3c6b6a848772a66f69442ce74f1a37655d9f35ba9d1f85329499ff0000af9f8ab83dbb39ad24c0c370edabe0be1e39863f70c6cded9924b8458c34 - languageName: node - linkType: hard - "ssri@npm:^10.0.0": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -12251,7 +11937,6 @@ __metadata: "@types/http-server": "npm:^0.12.1" "@types/node": "npm:^20.10.4" "@types/open-graph-scraper": "npm:^4.8.1" - "@types/request": "npm:^2.48.8" "@vitest/coverage-v8": "npm:^2.0.3" async-retry: "npm:^1.3.3" await-to-js: "npm:^3.0.0" @@ -12267,7 +11952,6 @@ __metadata: log4js: "npm:^6.9.1" open-graph-scraper: "npm:^6.5.1" renovate: "npm:^37.253.1" - request: "npm:^2.88.2" rss-parser: "npm:^3.12.0" secretlint: "npm:^8.3.0" sharp-ico: "npm:^0.1.5" @@ -12435,16 +12119,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:~2.5.0": - version: 2.5.0 - resolution: "tough-cookie@npm:2.5.0" - dependencies: - psl: "npm:^1.1.28" - punycode: "npm:^2.1.1" - checksum: 10/024cb13a4d1fe9af57f4323dff765dd9b217cc2a69be77e3b8a1ca45600aa33a097b6ad949f225d885e904f4bd3ceccef104741ef202d8378e6ca78e850ff82f - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -12558,13 +12232,6 @@ __metadata: languageName: node linkType: hard -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 10/04ee27901cde46c1c0a64b9584e04c96c5fe45b38c0d74930710751ea991408b405747d01dfae72f80fc158137018aea94f9c38c651cb9c318f0861a310c3679 - languageName: node - linkType: hard - "tweetnacl@npm:^1.0.3": version: 1.0.3 resolution: "tweetnacl@npm:1.0.3" @@ -12957,15 +12624,6 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10/b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb - languageName: node - linkType: hard - "url-join@npm:4.0.1, url-join@npm:^4.0.1": version: 4.0.1 resolution: "url-join@npm:4.0.1" @@ -13007,15 +12665,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.3.2": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 10/4f2b86432b04cc7c73a0dd1bcf11f1fc18349d65d2e4e32dd0fc658909329a1e0cc9244aa93f34c0cccfdd5ae1af60a149251a5f420ec3ac4223a3dab198fb2e - languageName: node - linkType: hard - "uuid@npm:^9.0.0, uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" @@ -13044,17 +12693,6 @@ __metadata: languageName: node linkType: hard -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: "npm:^1.0.0" - core-util-is: "npm:1.0.2" - extsprintf: "npm:^1.2.0" - checksum: 10/da548149dd9c130a8a2587c9ee71ea30128d1526925707e2d01ed9c5c45c9e9f86733c66a328247cdd5f7c1516fb25b0f959ba754bfbe15072aa99ff96468a29 - languageName: node - linkType: hard - "vfile-message@npm:^2.0.0": version: 2.0.4 resolution: "vfile-message@npm:2.0.4"