From fd70e659f3224ad08955d54b67fc8ccf7585a5f0 Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 11 Oct 2022 22:06:36 +0900 Subject: [PATCH 01/17] wip: external og --- package.json | 5 +- src/md/markdown.ts | 195 ++++++++++++++++++------ yarn.lock | 366 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 509 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index b204ec7..8cfdffb 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,12 @@ "@typescript-eslint/parser": "5.39.0", "eslint": "8.25.0", "eslint-config-preact": "1.3.0", - "wmr": "3.8.0", - "typescript": "4.8.3" + "typescript": "4.8.3", + "wmr": "3.8.0" }, "dependencies": { "hoofd": "^1.2.2", + "jsdom": "^20.0.1", "marked": "4.0.10", "preact": "^10.11.0", "preact-iso": "2.3.0" diff --git a/src/md/markdown.ts b/src/md/markdown.ts index 7ebb72a..a9a5c73 100644 --- a/src/md/markdown.ts +++ b/src/md/markdown.ts @@ -1,4 +1,41 @@ import { marked } from "marked"; +import { JSDOM } from "jsdom"; + +export const getMetaTags = (html, link) => { + const description = html.getElementsByName("description")[0]; + const favicon = + html.querySelector('link[rel="icon"]') ?? + html.querySelector('link[rel="shortcut icon"]'); + + const domain = link.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1]; + let image; + if (favicon === undefined) { + image = ""; + } else if (favicon.href.slice(0, 5) === "https") { + const file = favicon.href; + const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); + + if (fileLink === null) image = `https://${domain}${file.slice(7)}`; + else if (fileLink[1] !== domain) { + const filePathSplit = file.split("/")[3]; + image = `https://${fileLink[1]}/${filePathSplit}`; + } + } else { + const file = favicon.href; + const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); + if (fileLink === null) image = `https://${domain}${file.slice(7)}`; + else { + const filePathSplit = file.split("/").slice(3).join("/"); + image = `https://${domain}/${filePathSplit}`; + } + } + + return { + title: html.title, + description: description === undefined ? "" : description.content, + image: image ?? "", + }; +}; const twitter = { name: "twitter", @@ -28,42 +65,114 @@ const twitter = { }, }; -// const og = { -// name: "og", -// level: "block", -// start(src) { -// return src.match(/^@og/)?.index; -// }, -// tokenizer(src, tokens) { -// const rule = /^@og\[.*\]/; -// const match = rule.exec(src); +const fetchExternalHtml = async (url) => { + const res = await fetch(url); + const html = await res.text(); + return html; +}; + +const getHtml = async (url) => { + const htmlString = await fetchExternalHtml(url); + const html = new DOMParser().parseFromString(htmlString, "text/html"); + const { title, description, image } = getMetaTags(html, url); -// const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(src); -// // console.log(link); + return ` +
+ +
+ ${title} +
+
+

${title}

+

${description}

+ +
+
+
`; +}; -// if (match !== null) { -// const token = { -// type: "og", -// raw: match[0], -// text: match[0].trim(), -// tokens: [], -// }; -// this.lexer.inline(token.text, token.tokens); -// return token; -// } -// }, -// renderer(token) { -// return `hoge`; -// }, -// }; +const og = { + extensions: [ + { + name: "og", + level: "block", + start(src) { + return src.match(/^@og\[(.*)\]/)?.index; + }, + // eslint-disable-next-line no-unused-vars + tokenizer(src, tokens) { + const rule = /^@og\[(.*)\]/; + const match = rule.exec(src); + if (match !== null) { + const token = { + type: "og", + raw: match[0], + url: match[1].trim(), + html: "", + tokens: [], + }; + // @ts-ignore + this.lexer.inline(token.text, token.tokens); + return token; + } + }, + renderer(token) { + return token.html; + }, + }, + ], + async: true, + async walkTokens(token) { + if (token.type === "og") { + const html = await getHtml(token.url); + token.html = html; + } + }, +}; const renderer = { - twitter(type, raw, text) { - const tweetId = text.split("/").pop(); - return ` -
- `; - }, heading(text, level) { if (level === 1) { return `${text}`; @@ -103,17 +212,6 @@ const renderer = { `; }, link(href, title, text) { - // const isTwitterLink = /^https:\/\/twitter\.com\/\w+\/status\/\d+/.test( - // href - // ); - - // if (isTwitterLink) { - // const tweetId = href.split("/").pop(); - // return ` - //
- // `; - // } - return ` ${text} `; @@ -125,13 +223,12 @@ const renderer = { // TODO: rintonmd // https://github.com/takurinton/rintonmd -export const markdown = (md: string): string => { +export const markdown = async (md: string) => { marked.use({ - extensions: [ - twitter, - // og - ], + extensions: [twitter], }); + marked.use(og); marked.use({ renderer }); - return marked.parse(md); + const html = await marked.parse(md); + return html; }; diff --git a/yarn.lock b/yarn.lock index d49b219..7f2527c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -329,6 +329,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -477,16 +482,41 @@ "@typescript-eslint/types" "5.39.0" eslint-visitor-keys "^3.3.0" +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.1.0, acorn@^8.8.0: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -554,6 +584,11 @@ ast-metadata-inferer@^0.7.0: dependencies: "@mdn/browser-compat-data" "^3.3.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -643,6 +678,13 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -669,14 +711,45 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, 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" -deep-is@^0.1.3: +decimal.js@^10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" + integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -689,6 +762,11 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -710,11 +788,23 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + electron-to-chromium@^1.4.202: version "1.4.246" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz#802132d1bbd3ff32ce82fcd6a6ed6ab59b4366dc" integrity sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA== +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: version "1.20.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3" @@ -775,6 +865,18 @@ 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== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-preact@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-config-preact/-/eslint-config-preact-1.3.0.tgz#17b72813078f4d1d4d2b79938ec21f92338bc9c0" @@ -922,6 +1024,11 @@ espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" @@ -972,7 +1079,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -1019,6 +1126,15 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1167,6 +1283,37 @@ hoofd@^1.2.2: resolved "https://registry.yarnpkg.com/hoofd/-/hoofd-1.5.2.tgz#3ebfbda25f90abc27bed4cc851b2d4146b39acaa" integrity sha512-zzxE0JmS6KbbRDrCVqcH6VJMNGKnphuQlQHO08EBSlAyT/+e895c6PswOj7wscbk3S4uV1pkApBZU2OOrMzDjg== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -1270,6 +1417,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1328,6 +1480,38 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^20.0.1: + version "20.0.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.1.tgz#d95b4a3b6e1eec6520aa01d9d908eade8c6ba153" + integrity sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A== + dependencies: + abab "^2.0.6" + acorn "^8.8.0" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.9.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -1364,6 +1548,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1413,6 +1605,18 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1435,6 +1639,11 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1502,6 +1711,18 @@ once@^1.3.0: dependencies: wrappy "1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -1535,6 +1756,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse5@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" + integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + dependencies: + entities "^4.4.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1585,6 +1813,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -1594,11 +1827,21 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -punycode@^2.1.0: +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -1623,6 +1866,11 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -1661,6 +1909,18 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + semver@7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -1706,6 +1966,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + string.prototype.matchall@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -1769,6 +2034,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -1786,6 +2056,23 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -1805,6 +2092,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -1825,6 +2119,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + update-browserslist-db@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz#16279639cff1d0f800b14792de43d97df2d11b7d" @@ -1840,6 +2139,46 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -1863,7 +2202,7 @@ wmr@3.8.0: resolved "https://registry.yarnpkg.com/wmr/-/wmr-3.8.0.tgz#f816b54f2be60d831861994bf983c3b8e8e1f021" integrity sha512-W3f2nB80C9Y0uNZXWMoxINkz4HdBRxt5MvxmcFcMlO87Ybsf6ny23kVUUzU8RA2LX86CpReMHl2Y0BTMLezLRg== -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -1873,6 +2212,21 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From f0ce68773bebbf7c103d021036965a17a3eea797 Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 11 Oct 2022 22:17:53 +0900 Subject: [PATCH 02/17] ... --- src/md/getHtml.ts | 103 +++++++++++++++++++++++++++ src/md/markdown.ts | 172 +++++++++------------------------------------ 2 files changed, 135 insertions(+), 140 deletions(-) create mode 100644 src/md/getHtml.ts diff --git a/src/md/getHtml.ts b/src/md/getHtml.ts new file mode 100644 index 0000000..dcdbf80 --- /dev/null +++ b/src/md/getHtml.ts @@ -0,0 +1,103 @@ +const getMetaTags = (html, link) => { + const description = html.getElementsByName("description")[0]; + const favicon = + html.querySelector('link[rel="icon"]') ?? + html.querySelector('link[rel="shortcut icon"]'); + + const domain = link.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1]; + let image; + if (favicon === undefined) { + image = ""; + } else if (favicon.href.slice(0, 5) === "https") { + const file = favicon.href; + const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); + + if (fileLink === null) image = `https://${domain}${file.slice(7)}`; + else if (fileLink[1] !== domain) { + const filePathSplit = file.split("/")[3]; + image = `https://${fileLink[1]}/${filePathSplit}`; + } + } else { + const file = favicon.href; + const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); + if (fileLink === null) image = `https://${domain}${file.slice(7)}`; + else { + const filePathSplit = file.split("/").slice(3).join("/"); + image = `https://${domain}/${filePathSplit}`; + } + } + + return { + title: html.title, + description: description === undefined ? "" : description.content, + image: image ?? "", + }; +}; + +const fetchExternalHtml = async (url) => { + const res = await fetch(url); + const html = await res.text(); + return html; +}; + +export const getHtml = async (url) => { + const htmlString = await fetchExternalHtml(url); + const html = new DOMParser().parseFromString(htmlString, "text/html"); + const { title, description, image } = getMetaTags(html, url); + + return ` + `; +}; diff --git a/src/md/markdown.ts b/src/md/markdown.ts index a9a5c73..a84c477 100644 --- a/src/md/markdown.ts +++ b/src/md/markdown.ts @@ -1,140 +1,36 @@ import { marked } from "marked"; import { JSDOM } from "jsdom"; +import { getHtml } from "./getHtml"; -export const getMetaTags = (html, link) => { - const description = html.getElementsByName("description")[0]; - const favicon = - html.querySelector('link[rel="icon"]') ?? - html.querySelector('link[rel="shortcut icon"]'); - - const domain = link.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1]; - let image; - if (favicon === undefined) { - image = ""; - } else if (favicon.href.slice(0, 5) === "https") { - const file = favicon.href; - const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); - - if (fileLink === null) image = `https://${domain}${file.slice(7)}`; - else if (fileLink[1] !== domain) { - const filePathSplit = file.split("/")[3]; - image = `https://${fileLink[1]}/${filePathSplit}`; - } - } else { - const file = favicon.href; - const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); - if (fileLink === null) image = `https://${domain}${file.slice(7)}`; - else { - const filePathSplit = file.split("/").slice(3).join("/"); - image = `https://${domain}/${filePathSplit}`; - } - } - - return { - title: html.title, - description: description === undefined ? "" : description.content, - image: image ?? "", - }; -}; - -const twitter = { - name: "twitter", - level: "block", - start(src) { - return src.match(/^@twitter\[.*\]$/)?.index; - }, - // eslint-disable-next-line no-unused-vars - tokenizer(src, tokens) { - const rule = /^@twitter\[(.*)\]/; - const match = rule.exec(src); - if (match !== null) { - const token = { - type: "twitter", - raw: match[0], - text: match[1], - id: match[1].split("/").pop(), - tokens: [], - }; - // @ts-ignore - this.lexer.inline(token.text, token.tokens); - return token; - } - }, - renderer(token) { - return ``; - }, -}; - -const fetchExternalHtml = async (url) => { - const res = await fetch(url); - const html = await res.text(); - return html; -}; - -const getHtml = async (url) => { - const htmlString = await fetchExternalHtml(url); - const html = new DOMParser().parseFromString(htmlString, "text/html"); - const { title, description, image } = getMetaTags(html, url); - - return ` -`; -}; - -const og = { +const plugin = { extensions: [ + { + name: "twitter", + level: "block", + start(src) { + return src.match(/^@twitter\[.*\]$/)?.index; + }, + // eslint-disable-next-line no-unused-vars + tokenizer(src, tokens) { + const rule = /^@twitter\[(.*)\]/; + const match = rule.exec(src); + if (match !== null) { + const token = { + type: "twitter", + raw: match[0], + text: match[1], + id: match[1].split("/").pop(), + tokens: [], + }; + // @ts-ignore + this.lexer.inline(token.text, token.tokens); + return token; + } + }, + renderer(token) { + return ``; + }, + }, { name: "og", level: "block", @@ -223,12 +119,8 @@ const renderer = { // TODO: rintonmd // https://github.com/takurinton/rintonmd -export const markdown = async (md: string) => { - marked.use({ - extensions: [twitter], - }); - marked.use(og); - marked.use({ renderer }); - const html = await marked.parse(md); +export const markdown = (md: string) => { + marked.use({ renderer, ...plugin }); + const html = marked.parse(md); return html; }; From b16f108e93171d9978ea6aa5408af9b1bdc5101f Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 11 Oct 2022 22:23:21 +0900 Subject: [PATCH 03/17] ... --- src/hooks/usePost.ts | 10 ++++-- src/md/markdown.ts | 76 +++----------------------------------------- src/md/plugin.ts | 67 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 74 deletions(-) create mode 100644 src/md/plugin.ts diff --git a/src/hooks/usePost.ts b/src/hooks/usePost.ts index 0ca4bb6..bfbeef7 100644 --- a/src/hooks/usePost.ts +++ b/src/hooks/usePost.ts @@ -27,6 +27,7 @@ async function fetchPost(url?: string): Promise { export function usePost(id: string): Response { const url = `/contents/${id}.md`; const [, setPost] = useState(0); + const [, setContent] = useState(""); let post = CACHE.get(url); if (post === undefined) { post = fetchPost(url); @@ -46,16 +47,21 @@ export function usePost(id: string): Response { if (post.value !== undefined) { const md = new MarkdownInit(post.value.mdStr); const title = md.getTitle(); - const content = markdown(md.getContent()); + // const content = markdown(md.getContent()); const createdAt = md.getCreatedAt(); const description = `${title} について書きました。`; + markdown(md.getContent()).then((value) => { + post.c = value; + setContent(value); + }); + return { id, title, description, createdAt, - content, + content: post.c ?? "", }; } if (post.error !== undefined) throw new Error(post.error); diff --git a/src/md/markdown.ts b/src/md/markdown.ts index a84c477..e6dc4b7 100644 --- a/src/md/markdown.ts +++ b/src/md/markdown.ts @@ -1,72 +1,5 @@ import { marked } from "marked"; -import { JSDOM } from "jsdom"; -import { getHtml } from "./getHtml"; - -const plugin = { - extensions: [ - { - name: "twitter", - level: "block", - start(src) { - return src.match(/^@twitter\[.*\]$/)?.index; - }, - // eslint-disable-next-line no-unused-vars - tokenizer(src, tokens) { - const rule = /^@twitter\[(.*)\]/; - const match = rule.exec(src); - if (match !== null) { - const token = { - type: "twitter", - raw: match[0], - text: match[1], - id: match[1].split("/").pop(), - tokens: [], - }; - // @ts-ignore - this.lexer.inline(token.text, token.tokens); - return token; - } - }, - renderer(token) { - return ``; - }, - }, - { - name: "og", - level: "block", - start(src) { - return src.match(/^@og\[(.*)\]/)?.index; - }, - // eslint-disable-next-line no-unused-vars - tokenizer(src, tokens) { - const rule = /^@og\[(.*)\]/; - const match = rule.exec(src); - if (match !== null) { - const token = { - type: "og", - raw: match[0], - url: match[1].trim(), - html: "", - tokens: [], - }; - // @ts-ignore - this.lexer.inline(token.text, token.tokens); - return token; - } - }, - renderer(token) { - return token.html; - }, - }, - ], - async: true, - async walkTokens(token) { - if (token.type === "og") { - const html = await getHtml(token.url); - token.html = html; - } - }, -}; +import { plugin } from "./plugin"; const renderer = { heading(text, level) { @@ -117,10 +50,9 @@ const renderer = { }, }; -// TODO: rintonmd -// https://github.com/takurinton/rintonmd -export const markdown = (md: string) => { +export const markdown = async (md: string) => { marked.use({ renderer, ...plugin }); - const html = marked.parse(md); + const html = await marked.parse(md); + console.log(html); return html; }; diff --git a/src/md/plugin.ts b/src/md/plugin.ts new file mode 100644 index 0000000..63292e9 --- /dev/null +++ b/src/md/plugin.ts @@ -0,0 +1,67 @@ +import { getHtml } from "./getHtml"; + +export const plugin = { + extensions: [ + { + name: "twitter", + level: "block", + start(src) { + return src.match(/^@twitter\[.*\]$/)?.index; + }, + // eslint-disable-next-line no-unused-vars + tokenizer(src, tokens) { + const rule = /^@twitter\[(.*)\]/; + const match = rule.exec(src); + if (match !== null) { + const token = { + type: "twitter", + raw: match[0], + text: match[1], + id: match[1].split("/").pop(), + tokens: [], + }; + // @ts-ignore + this.lexer.inline(token.text, token.tokens); + return token; + } + }, + renderer(token) { + return ``; + }, + }, + { + name: "og", + level: "block", + start(src) { + return src.match(/^@og\[(.*)\]/)?.index; + }, + // eslint-disable-next-line no-unused-vars + tokenizer(src, tokens) { + const rule = /^@og\[(.*)\]/; + const match = rule.exec(src); + if (match !== null) { + const token = { + type: "og", + raw: match[0], + url: match[1].trim(), + html: "", + tokens: [], + }; + // @ts-ignore + this.lexer.inline(token.text, token.tokens); + return token; + } + }, + renderer(token) { + return token.html; + }, + }, + ], + async: true, + async walkTokens(token) { + if (token.type === "og") { + const html = await getHtml(token.url); + token.html = html; + } + }, +}; From 23a0695a6e9d2be9e0e188962528bd297534569d Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 11 Oct 2022 22:41:49 +0900 Subject: [PATCH 04/17] ... --- src/hooks/usePost.ts | 38 +++++++++++++++----------------------- src/md/markdown.ts | 4 ++-- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/hooks/usePost.ts b/src/hooks/usePost.ts index bfbeef7..978b8dc 100644 --- a/src/hooks/usePost.ts +++ b/src/hooks/usePost.ts @@ -27,15 +27,26 @@ async function fetchPost(url?: string): Promise { export function usePost(id: string): Response { const url = `/contents/${id}.md`; const [, setPost] = useState(0); - const [, setContent] = useState(""); let post = CACHE.get(url); if (post === undefined) { post = fetchPost(url); CACHE.set(url, post); post.then( (value: FetchPost) => { - post.value = value; - setPost(post); + const md = new MarkdownInit(value.mdStr); + const title = md.getTitle(); + const createdAt = md.getCreatedAt(); + const description = `${title} について書きました。`; + post.value = { + id, + title, + description, + createdAt, + }; + markdown(md.getContent()).then((content) => { + post.value.content = content; + setPost(post); + }); }, (error: any) => { post.error = error; @@ -44,26 +55,7 @@ export function usePost(id: string): Response { ); } - if (post.value !== undefined) { - const md = new MarkdownInit(post.value.mdStr); - const title = md.getTitle(); - // const content = markdown(md.getContent()); - const createdAt = md.getCreatedAt(); - const description = `${title} について書きました。`; - - markdown(md.getContent()).then((value) => { - post.c = value; - setContent(value); - }); - - return { - id, - title, - description, - createdAt, - content: post.c ?? "", - }; - } + if (post.value !== undefined) return post.value; if (post.error !== undefined) throw new Error(post.error); throw post; } diff --git a/src/md/markdown.ts b/src/md/markdown.ts index e6dc4b7..51455b9 100644 --- a/src/md/markdown.ts +++ b/src/md/markdown.ts @@ -50,9 +50,9 @@ const renderer = { }, }; -export const markdown = async (md: string) => { +export async function markdown(md: string) { marked.use({ renderer, ...plugin }); const html = await marked.parse(md); console.log(html); return html; -}; +} From 73211f80d520b41a53200a3adc9d0857637dc739 Mon Sep 17 00:00:00 2001 From: takurinton Date: Tue, 11 Oct 2022 23:06:50 +0900 Subject: [PATCH 05/17] ... --- package.json | 2 +- src/md/getHtml.ts | 25 +++++++++++++++++-------- src/md/markdown.ts | 4 ++-- yarn.lock | 8 ++++---- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 8cfdffb..a1da2ac 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "hoofd": "^1.2.2", "jsdom": "^20.0.1", - "marked": "4.0.10", + "marked": "4.1.0", "preact": "^10.11.0", "preact-iso": "2.3.0" }, diff --git a/src/md/getHtml.ts b/src/md/getHtml.ts index dcdbf80..f549e17 100644 --- a/src/md/getHtml.ts +++ b/src/md/getHtml.ts @@ -1,15 +1,14 @@ const getMetaTags = (html, link) => { const description = html.getElementsByName("description")[0]; - const favicon = - html.querySelector('link[rel="icon"]') ?? - html.querySelector('link[rel="shortcut icon"]'); + + const ogImage = html.querySelector('meta[property="og:image"]'); const domain = link.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1]; let image; - if (favicon === undefined) { + if (ogImage === undefined) { image = ""; - } else if (favicon.href.slice(0, 5) === "https") { - const file = favicon.href; + } else if (ogImage.content.slice(0, 5) === "https") { + const file = ogImage.content; const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); if (fileLink === null) image = `https://${domain}${file.slice(7)}`; @@ -18,7 +17,7 @@ const getMetaTags = (html, link) => { image = `https://${fileLink[1]}/${filePathSplit}`; } } else { - const file = favicon.href; + const file = ogImage.content; const fileLink = file.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/); if (fileLink === null) image = `https://${domain}${file.slice(7)}`; else { @@ -41,10 +40,20 @@ const fetchExternalHtml = async (url) => { }; export const getHtml = async (url) => { + let html; const htmlString = await fetchExternalHtml(url); - const html = new DOMParser().parseFromString(htmlString, "text/html"); + + if (typeof window === "undefined") { + const { JSDOM } = await import("jsdom"); + const { document } = JSDOM(htmlString).window; + html = document; + } else { + html = new DOMParser().parseFromString(htmlString, "text/html"); + } + const { title, description, image } = getMetaTags(html, url); + // TODO: 毎回スタイルがレンダリングされるのは無駄なので解消する return ` + if (typeof window !== "undefined") { + const el = document.getElementById(id); + if (el === null) return; + + el.innerHTML = ` `; + + const style = Object.assign(document.createElement("style"), { + innerHTML: ` +.og > a { + border: 1px gray solid; + border-radius: 5px; + width: 80%; + padding: 10px; + display: flex; + text-decoration: none; + color: #222222; +} +.left { + height: 100px; + width: 100px; + text-align: center; + padding-right: 40px; +} +.left > img { + height: 100px; + width: 100px; +} +.right { + display: block; + overflow: hidden; +} +.right > h1, +.right > p, +.right > a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-overflow: ellipsis; +} +.right > h1 { + height: 50px; + margin: 0; +} +.right > p { + margin: 0; +} +.link { + color: gray; +} + `, + }); + + document.head.appendChild(style); + } }; diff --git a/src/md/plugin.ts b/src/md/plugin.ts index 9231d3b..3f36fee 100644 --- a/src/md/plugin.ts +++ b/src/md/plugin.ts @@ -1,4 +1,4 @@ -import { getHtml } from "./getHtml"; +import { setHtml } from "./getHtml"; export const plugin = { extensions: [ @@ -39,13 +39,14 @@ export const plugin = { tokenizer(src, tokens) { const rule = /^@og\[(.*)\]/; const match = rule.exec(src); + const id = Math.random().toString(36).slice(-8); if (match !== null) { const token = { + id, type: "og", raw: match[0], url: match[1].trim(), - text: "", - html: "", + html: `
`, tokens: [], }; // @ts-ignore @@ -58,11 +59,9 @@ export const plugin = { }, }, ], - async: true, async walkTokens(token) { if (token.type === "og") { - const html = await getHtml(token.url); - token.html = html; + await setHtml(token.url, token.id); } }, }; From 7af1694b57b5737d8206607740232a39cbe5b86a Mon Sep 17 00:00:00 2001 From: takurinton Date: Sat, 19 Nov 2022 07:30:27 +0900 Subject: [PATCH 15/17] update @types/node --- package.json | 10 +++++----- yarn.lock | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 71b1583..42b0fbd 100644 --- a/package.json +++ b/package.json @@ -14,20 +14,20 @@ }, "devDependencies": { "@types/marked": "4.0.1", - "@types/node": "^18.7.16", + "@types/node": "18.11.9", "@typescript-eslint/eslint-plugin": "5.43.0", "@typescript-eslint/parser": "5.43.0", "eslint": "8.27.0", "eslint-config-preact": "1.3.0", - "wmr": "3.8.0", - "typescript": "4.9.3" + "typescript": "4.9.3", + "wmr": "3.8.0" }, "dependencies": { "hoofd": "^1.2.2", "jsdom": "^20.0.1", "marked": "4.1.0", - "preact": "^10.11.0", - "preact-iso": "2.3.0" + "preact": "^10.11.3", + "preact-iso": "^2.3.1" }, "author": "takurinton", "eslintConfig": { diff --git a/yarn.lock b/yarn.lock index 1dc6a2b..890af53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -344,10 +344,10 @@ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.1.tgz#d588a7bbc4d6551c5e75249bc106ffda96ae33c5" integrity sha512-ZigEmCWdNUU7IjZEuQ/iaimYdDHWHfTe3kg8ORfKjyGYd9RWumPoOJRQXB0bO+XLkNwzCthW3wUIQtANaEZ1ag== -"@types/node@^18.7.16": - version "18.7.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.16.tgz#0eb3cce1e37c79619943d2fd903919fc30850601" - integrity sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg== +"@types/node@18.11.9": + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== "@types/semver@^7.3.12": version "7.3.12" @@ -1817,15 +1817,15 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -preact-iso@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/preact-iso/-/preact-iso-2.3.0.tgz#ab6c5de28df9e0f7a0589dd2175a83ba821f69ec" - integrity sha512-taJmRidbWrjHEhoVoxXS2Kvxa6X3jXSsTtD7rSYeJuxnPNr1ghCu1JUzCrRxmZwTUNWIqwUpNi+AJoLtvCPN7g== +preact-iso@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/preact-iso/-/preact-iso-2.3.1.tgz#31ee75082c6acceb395171996b2c59f45df49ab4" + integrity sha512-PtiG0dJlyvIDfvqROCybIFq96CS2s8nLg8ZR4Yporx3mPQ5FgWGNKb+ejjewtjEDMdCUlYmMT8SdapWEAxVJ2Q== -preact@^10.11.0: - version "10.11.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.0.tgz#26af45a0613f4e17a197cc39d7a1ea23e09b2532" - integrity sha512-Fk6+vB2kb6mSJfDgODq0YDhMfl0HNtK5+Uc9QqECO4nlyPAQwCI+BKyWO//idA7ikV7o+0Fm6LQmNuQi1wXI1w== +preact@^10.11.3: + version "10.11.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== prelude-ls@^1.2.1: version "1.2.1" From 9089c5afd06fafafc09e2b6c093de1095a73815e Mon Sep 17 00:00:00 2001 From: takurinton Date: Sat, 19 Nov 2022 07:42:17 +0900 Subject: [PATCH 16/17] downgrade preact version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 42b0fbd..6c7d4c5 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "hoofd": "^1.2.2", "jsdom": "^20.0.1", "marked": "4.1.0", - "preact": "^10.11.3", + "preact": "10.11.0", "preact-iso": "^2.3.1" }, "author": "takurinton", diff --git a/yarn.lock b/yarn.lock index 890af53..abf1005 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1822,10 +1822,10 @@ preact-iso@^2.3.1: resolved "https://registry.yarnpkg.com/preact-iso/-/preact-iso-2.3.1.tgz#31ee75082c6acceb395171996b2c59f45df49ab4" integrity sha512-PtiG0dJlyvIDfvqROCybIFq96CS2s8nLg8ZR4Yporx3mPQ5FgWGNKb+ejjewtjEDMdCUlYmMT8SdapWEAxVJ2Q== -preact@^10.11.3: - version "10.11.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" - integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== +preact@10.11.0: + version "10.11.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.0.tgz#26af45a0613f4e17a197cc39d7a1ea23e09b2532" + integrity sha512-Fk6+vB2kb6mSJfDgODq0YDhMfl0HNtK5+Uc9QqECO4nlyPAQwCI+BKyWO//idA7ikV7o+0Fm6LQmNuQi1wXI1w== prelude-ls@^1.2.1: version "1.2.1" From c0ad5d70cd82df15c6fa7c8b44db4d8f35562a28 Mon Sep 17 00:00:00 2001 From: takurinton Date: Sat, 19 Nov 2022 07:45:12 +0900 Subject: [PATCH 17/17] remove: test post --- public/contents/112.md | 12 ------------ public/contents/posts.json | 3 +-- 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 public/contents/112.md diff --git a/public/contents/112.md b/public/contents/112.md deleted file mode 100644 index 1d6e10d..0000000 --- a/public/contents/112.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: 112 -title: og -description: og について -created_at: 2022-10-11 ---- - -hogehoge - -@og[https://blog.takurinton.dev/post/111] - -@twitter[https://twitter.com/takurinton/status/1579390918603706368] diff --git a/public/contents/posts.json b/public/contents/posts.json index 1c164bf..c61aa68 100644 --- a/public/contents/posts.json +++ b/public/contents/posts.json @@ -358,6 +358,5 @@ "title": "SHA-256 algorithm", "description": "SHA-256 algorithm について", "created_at": "2022-10-10" - }, - { "id": 112, "title": "aa", "description": "aa", "created_at": "2022-10-11" } + } ]