From 1ee490173010bd189c63f6ed9d500ba075e980bb Mon Sep 17 00:00:00 2001 From: Stephen Zhou Date: Sat, 14 Sep 2024 11:02:27 +0800 Subject: [PATCH] fix: homepage feed --- package.json | 1 + pnpm-lock.yaml | 121 +++++++++++++++++++++++++++++++++++++++ src/lib/server-helper.ts | 22 ++++--- 3 files changed, 136 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 664b0a47..031775a4 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "isomorphic-dompurify": "2.11.0", "js-yaml": "4.1.0", "jsdom": "24.0.0", + "jsonfeed-to-rss": "^3.0.8", "katex": "0.16.10", "langchain": "0.1.37", "lottie-react": "2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97c24c6b..54c67542 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -206,6 +206,9 @@ importers: jsdom: specifier: 24.0.0 version: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + jsonfeed-to-rss: + specifier: ^3.0.8 + version: 3.0.8 katex: specifier: 0.16.10 version: 0.16.10 @@ -668,6 +671,9 @@ packages: '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@bret/truthy@1.0.1': + resolution: {integrity: sha512-mFVhqy/yrh+BZwzqQQptGcTq5SJ+T0uhWQ/hmBkU0RFV3YN2UkcDhxvAzUuMDibOi6s66YM01BUGAi1y/92QGw==} + '@codemirror/autocomplete@6.16.0': resolution: {integrity: sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==} peerDependencies: @@ -2124,6 +2130,9 @@ packages: '@tanstack/virtual-core@3.5.0': resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + '@textlint/ast-node-types@13.4.1': + resolution: {integrity: sha512-qrZyhCh8Ekk6nwArx3BROybm9BnX6vF7VcZbijetV/OM3yfS4rTYhoMWISmhVEP2H2re0CtWEyMl/XF+WdvVLQ==} + '@tianfeng98/hls.js@1.0.2': resolution: {integrity: sha512-IHSLEBxlAllx5oecRfCvzsd23yuBuiSU2BmrNKDBwAf4dLjYcZW8TASG5i+SZg/rFyzXm4OWrLJKwPgwvSg5uA==} @@ -2491,6 +2500,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + add-zero@1.0.0: + resolution: {integrity: sha512-WpPiUgy7h9Kd7NY0aTuhfx7vjub3XYbZCq1W2e/LMvUsEmYK/hz8xgFDmd0GnKpk44HXFwIFu1hEOivc+MzJ0Q==} + aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -2732,6 +2744,9 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + boundary@2.0.0: + resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2867,6 +2882,10 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + clean-deep@3.4.0: + resolution: {integrity: sha512-Lo78NV5ItJL/jl+B5w0BycAisaieJGXK1qYi/9m4SjR8zbqmrUtO7Yhro40wEShGmmxs/aJLI/A+jNhdkXK8mw==} + engines: {node: '>=4'} + clear-module@4.1.2: resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} engines: {node: '>=8'} @@ -3705,6 +3724,9 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + existy@1.0.1: + resolution: {integrity: sha512-YeYTp9rIyoArnYubrTXHUOpuxwSdlQEctcw9zUgViSof/uJE+LlsiZb9BpIrCqLRcjiCCeF5cxX3wcfKZMqVzg==} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -4532,6 +4554,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfeed-to-rss@3.0.8: + resolution: {integrity: sha512-KW5qhFGZxGyrT+oaAfS/xxiVindm406x0L6rsQLwG4nXSB4tcXebwXmXuUvg7FDfBniBTB8HgDRUTgZ67BE2rQ==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -4818,15 +4843,27 @@ packages: lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isempty@4.4.0: + resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.transform@4.6.0: + resolution: {integrity: sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -5601,6 +5638,9 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + podcast-categories@2.0.0: + resolution: {integrity: sha512-WcntiTmj4ERPwaevHeR59Lc6yk37YVwksflBaCu7/J2ChjPA02J703rZMVq4gnoa+XHFHqpjK+qSc8Fv6N62EA==} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -6188,6 +6228,9 @@ packages: engines: {node: '>=10'} hasBin: true + sentence-splitter@5.0.0: + resolution: {integrity: sha512-9Mvf7L8vwpPzkH0/HtXzCbmVkyj4aQXdeG7h8ighRvO0hvcZEy2OUEjeIlnM/z4EX4vBacEfpESC65Oa2rWOig==} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6392,6 +6435,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + striptags@3.2.0: + resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==} + + structured-source@4.0.0: + resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} + style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} @@ -6552,9 +6601,17 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} + trim-left@1.0.1: + resolution: {integrity: sha512-quyxKUsLsY7+lgue8TQ6R8C4kwTe5No3/fvliPNTZd8CIK1KXFaIw+Z7SwAWiWUF5Ge5j7ppbjml3EKa02uPWA==} + engines: {node: '>=0.10.0'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-right@1.0.1: + resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} + engines: {node: '>=0.10.0'} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -7059,6 +7116,10 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -7315,6 +7376,10 @@ snapshots: '@braintree/sanitize-url@6.0.4': {} + '@bret/truthy@1.0.1': + dependencies: + existy: 1.0.1 + '@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)': dependencies: '@codemirror/language': 6.10.1 @@ -9027,6 +9092,8 @@ snapshots: '@tanstack/virtual-core@3.5.0': {} + '@textlint/ast-node-types@13.4.1': {} + '@tianfeng98/hls.js@1.0.2': {} '@types/async-lock@1.4.2': {} @@ -9705,6 +9772,8 @@ snapshots: acorn@8.11.3: {} + add-zero@1.0.0: {} + aes-js@3.1.2: {} agent-base@7.1.1: @@ -9997,6 +10066,8 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 + boundary@2.0.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -10144,6 +10215,12 @@ snapshots: classnames@2.5.1: {} + clean-deep@3.4.0: + dependencies: + lodash.isempty: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.transform: 4.6.0 + clear-module@4.1.2: dependencies: parent-module: 2.0.0 @@ -11174,6 +11251,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + existy@1.0.1: {} + expand-template@2.0.3: {} exponential-backoff@3.1.1: {} @@ -12105,6 +12184,21 @@ snapshots: json5@2.2.3: {} + jsonfeed-to-rss@3.0.8: + dependencies: + '@bret/truthy': 1.0.1 + add-zero: 1.0.0 + clean-deep: 3.4.0 + existy: 1.0.1 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + podcast-categories: 2.0.0 + sentence-splitter: 5.0.0 + striptags: 3.2.0 + trim-left: 1.0.1 + trim-right: 1.0.1 + xmlbuilder: 15.1.1 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -12357,12 +12451,20 @@ snapshots: lodash.defaults@4.2.0: {} + lodash.get@4.4.2: {} + lodash.isarguments@3.1.0: {} + lodash.isempty@4.4.0: {} + lodash.isequal@4.5.0: {} + lodash.isplainobject@4.0.6: {} + lodash.merge@4.6.2: {} + lodash.transform@4.6.0: {} + lodash@4.17.21: {} log-update@6.0.0: @@ -13504,6 +13606,8 @@ snapshots: pngjs@5.0.0: {} + podcast-categories@2.0.0: {} + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.4.38): @@ -14186,6 +14290,11 @@ snapshots: semver@7.6.2: {} + sentence-splitter@5.0.0: + dependencies: + '@textlint/ast-node-types': 13.4.1 + structured-source: 4.0.0 + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -14410,6 +14519,12 @@ snapshots: strip-json-comments@3.1.1: {} + striptags@3.2.0: {} + + structured-source@4.0.0: + dependencies: + boundary: 2.0.0 + style-mod@4.1.2: {} style-to-object@1.0.6: @@ -14584,8 +14699,12 @@ snapshots: dependencies: punycode: 2.3.1 + trim-left@1.0.1: {} + trim-lines@3.0.1: {} + trim-right@1.0.1: {} + trough@2.2.0: {} ts-api-utils@1.3.0(typescript@5.4.5): @@ -15131,6 +15250,8 @@ snapshots: xmlbuilder@11.0.1: {} + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} xregexp@5.1.1: diff --git a/src/lib/server-helper.ts b/src/lib/server-helper.ts index d5792a0a..a6444ebf 100644 --- a/src/lib/server-helper.ts +++ b/src/lib/server-helper.ts @@ -1,3 +1,6 @@ +// @ts-ignore +import jsonfeedToRSS from "jsonfeed-to-rss" + export const getQuery = (req: Request) => { const url = new URL(req.url) const searchParams = url.searchParams @@ -66,15 +69,18 @@ export class NextServerResponse { rss(data: any, format = "json") { if (format === "xml") { - return new Response(data, { - status: this.#status, - headers: { - "Content-Type": "application/xml; charset=utf-8", - "Access-Control-Allow-Methods": "GET", - "Access-Control-Allow-Origin": "*", - "Cache-Control": "public, max-age=1800", + return new Response( + typeof data === "string" ? data : jsonfeedToRSS(data), + { + status: this.#status, + headers: { + "Content-Type": "application/xml; charset=utf-8", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Origin": "*", + "Cache-Control": "public, max-age=1800", + }, }, - }) + ) } else { return new Response(JSON.stringify(data), { status: this.#status,