From 78067afbb2056c4ab825c196c662a4f2e0cdff6b Mon Sep 17 00:00:00 2001 From: Dmitriy Mozgovoy Date: Mon, 19 Aug 2024 09:41:53 +0300 Subject: [PATCH] Improve sponsor list generator (#200) * feat: add sponsor list generator; * feat: added deploy action; * fix: fixed layout; * fix: use utm links inside tooltips; * fix(CI): set engine version; * chore: reverted the start button title change; * fix: add the ability to retry the request to get a list of sponsors; * chore: change sponsors config & fix sponsor card layout; * chore: hide 'incognito' sponsor from the list of sponsors; * chore: add Route4Me sponsor; * chore: fixed resolution of utm link for manually added sponsors; * chore: fixed sponsors' tiers resolving; * chore: draft; * chore(sponsors): disable utm links generation for `slotozilla-deutschland`; * chore(draft): Improve sponsors list generator; * chore(draft): fix origin preset; * chore(draft): delete generated icon; * chore(draft): add check to ensure dir exists; * chore(draft): add check to ensure dir exists; * chore(draft): activate GitHub data pulling; * chore(draft): fix crown chevron styling; * chore(draft): reduce logo min-width; * chore(draft): add missed `route4me` light logo; * chore(draft): add a title for readme sponsor block; * chore(draft): fix description resolving; * chore(draft): add utm links for sponsors rendered to markdown; * chore(draft): respect autoUTMLinks for utm links generation; * chore(draft): set user theme timeout to 24 hours; * chore(draft): set utm link for markdown output; * chore(draft): add sponsors' logos; * chore(draft): fix sponsor.json; * chore(draft): fix sponsor.json; * chore(draft): add principal logo; * chore(draft): add a hotfix for svg logos; * chore(draft): use image metadata instead of file extension to determine image format; * chore(draft): add Stytch & Descope links; * chore(draft): fix utm link generator to respect sponsor's params; * chore(draft): add page active link rendering; * chore(draft): notes block refactoring; * chore(draft): remove graphql packages; --- assets/icons/crown.svg | 14 + assets/sponsors/descope.png | Bin 0 -> 45670 bytes assets/sponsors/descope_white.png | Bin 0 -> 36632 bytes assets/sponsors/principal.svg | 1 + ...e4b23adce0b1e9f721fc797800e1839c230f79.png | Bin 1376 -> 0 bytes assets/sponsors/route4me_white.png | Bin 0 -> 19155 bytes assets/sponsors/stytch.png | Bin 0 -> 14229 bytes assets/sponsors/stytch_white.png | Bin 0 -> 11538 bytes data/sponsors.json | 58 +- en.lang.js | 12 +- inert.config.js | 2 +- package-lock.json | 553 ++++++++++++++- package.json | 5 +- posts/en/api_intro.md | 3 +- posts/en/sponsor.md | 90 +++ scripts/updateData.js | 650 +++++++++++++++--- scss/home.scss | 149 ++-- scss/index.scss | 19 + scss/post.scss | 37 + scss/sponsors.scss | 406 +++++++++++ scss/variables.scss | 2 + templates/home.ejs | 111 ++- templates/post.ejs | 167 ++++- templates/sponsors.hbs | 31 + 24 files changed, 2061 insertions(+), 249 deletions(-) create mode 100644 assets/icons/crown.svg create mode 100644 assets/sponsors/descope.png create mode 100644 assets/sponsors/descope_white.png create mode 100644 assets/sponsors/principal.svg delete mode 100644 assets/sponsors/route4me_icon_55e4b23adce0b1e9f721fc797800e1839c230f79.png create mode 100644 assets/sponsors/route4me_white.png create mode 100644 assets/sponsors/stytch.png create mode 100644 assets/sponsors/stytch_white.png create mode 100644 posts/en/sponsor.md create mode 100644 scss/post.scss create mode 100644 scss/sponsors.scss create mode 100644 templates/sponsors.hbs diff --git a/assets/icons/crown.svg b/assets/icons/crown.svg new file mode 100644 index 0000000..280be59 --- /dev/null +++ b/assets/icons/crown.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/sponsors/descope.png b/assets/sponsors/descope.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1e74dcd4910ad73e3d1f5b206b187622ed9fb0 GIT binary patch literal 45670 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 literal 0 HcmV?d00001 diff --git a/assets/sponsors/descope_white.png b/assets/sponsors/descope_white.png new file mode 100644 index 0000000000000000000000000000000000000000..449e1a0a59b2e7a8eb52f81d1baec6184a2644e7 GIT binary patch literal 36632 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 R%mP6%;pyt>of8tMQ5 literal 0 HcmV?d00001 diff --git a/assets/sponsors/principal.svg b/assets/sponsors/principal.svg new file mode 100644 index 0000000..57b2c0a --- /dev/null +++ b/assets/sponsors/principal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/sponsors/route4me_icon_55e4b23adce0b1e9f721fc797800e1839c230f79.png b/assets/sponsors/route4me_icon_55e4b23adce0b1e9f721fc797800e1839c230f79.png deleted file mode 100644 index 5142814aac729a10c2a407d1e6cdaa6bd9f0c46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 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 literal 0 HcmV?d00001 diff --git a/assets/sponsors/stytch.png b/assets/sponsors/stytch.png new file mode 100644 index 0000000000000000000000000000000000000000..264d97eb9e60bfb77b84ab825d9090bfc9adc2b8 GIT binary patch literal 14229 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 you for considering supporting our project.

-

You will be automatically added to this list within 24 hours if the tier you select provides this benefit.

` +

You will be automatically added to this list within 24 hours if the tier you select provides this benefit.

+ + ` }, // `t` stands fot `translation`. This will contain translations of single words or phrases t: { @@ -38,7 +40,8 @@ module.exports = { "Axios Project Copy Right Footer": undefined, "License Label Footer": undefined, "Sponsors": undefined, - "Become a sponsor": undefined + "Become a sponsor": undefined, + "Gold Sponsors": undefined }, sidebar: [ { @@ -127,6 +130,11 @@ module.exports = { type: "heading", text: "Contributors", }, + { + type: "link", + href: "/docs/sponsor", + text: "Sponsoring Axios", + }, { type: "link", href: "https://github.com/axios/axios/blob/master/CODE_OF_CONDUCT.md", diff --git a/inert.config.js b/inert.config.js index 06495cd..f656ece 100644 --- a/inert.config.js +++ b/inert.config.js @@ -328,7 +328,7 @@ module.exports = { }, ...langs.map( (lang) => ({ - folder: `posts/${lang.postsDir || lang.prefix.slice(1, -1)}`, + folder: `posts/${lang.postsDir || lang.prefix.slice(1, -1)}`, build: { traverseLevel: "recursive", filePipeline: [ diff --git a/package-lock.json b/package-lock.json index 4f0f557..164c84e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,20 +8,50 @@ "name": "axios-docs", "version": "0.4.0", "license": "MIT", + "dependencies": { + "graphql": "^16.9.0", + "graphql-request": "^7.1.0" + }, "devDependencies": { "axios": "^1.3.2", "cheerio": "^1.0.0-rc.12", + "handlebars": "^4.7.8", "html-escaper": "^2.0.2", "http-server": "^14.1.0", "inert-ssg": "^2.0.0-alpha.15", + "joi": "^17.13.3", "mime-types": "^2.1.35", - "sharp": "^0.31.3" + "sharp": "^0.31.3", + "showdown": "^2.1.0" }, "engines": { "node": "16", "npm": "8" } }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@jsbits/get-package-version": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@jsbits/get-package-version/-/get-package-version-1.0.3.tgz", @@ -31,12 +61,120 @@ "node": ">=4.2" } }, + "node_modules/@molt/command": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@molt/command/-/command-0.9.0.tgz", + "integrity": "sha512-1JI8dAlpqlZoXyKWVQggX7geFNPxBpocHIXQCsnxDjKy+3WX4SGyZVJXuLlqRRrX7FmQCuuMAfx642ovXmPA9g==", + "dependencies": { + "@molt/types": "0.2.0", + "alge": "0.8.1", + "chalk": "^5.3.0", + "lodash.camelcase": "^4.3.0", + "lodash.snakecase": "^4.1.1", + "readline-sync": "^1.4.10", + "string-length": "^6.0.0", + "strip-ansi": "^7.1.0", + "ts-toolbelt": "^9.6.0", + "type-fest": "^4.3.1", + "zod": "^3.22.2" + } + }, + "node_modules/@molt/command/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@molt/command/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@molt/command/node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "dependencies": { + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@molt/command/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@molt/types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@molt/types/-/types-0.2.0.tgz", + "integrity": "sha512-p6ChnEZDGjg9PYPec9BK6Yp5/DdSrYQvXTBAtgrnqX6N36cZy37ql1c8Tc5LclfIYBNG7EZp8NBcRTYJwyi84g==", + "dependencies": { + "ts-toolbelt": "^9.6.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, + "node_modules/alge": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/alge/-/alge-0.8.1.tgz", + "integrity": "sha512-kiV9nTt+XIauAXsowVygDxMZLplZxDWt0W8plE/nB32/V2ziM/P/TxDbSVK7FYIUt2Xo16h3/htDh199LNPCKQ==", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "remeda": "^1.0.0", + "ts-toolbelt": "^9.6.0", + "zod": "^3.17.3" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -514,6 +652,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -998,6 +1145,71 @@ "node": ">= 6" } }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-request": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.1.0.tgz", + "integrity": "sha512-Ouu/lYVFhARS1aXeZoVJWnGT6grFJXTLwXJuK4mUGGRo0EUk1JkyYp43mdGmRgUVezpRm6V5Sq3t8jBDQcajng==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "@molt/command": "^0.9.0", + "zod": "^3.23.8" + }, + "bin": { + "graffle": "build/cli/generate.js" + }, + "peerDependencies": { + "@dprint/formatter": "^0.3.0", + "@dprint/typescript": "^0.91.1", + "dprint": "^0.46.2", + "graphql": "14 - 16" + }, + "peerDependenciesMeta": { + "@dprint/formatter": { + "optional": true + }, + "@dprint/typescript": { + "optional": true + }, + "dprint": { + "optional": true + } + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1569,6 +1781,19 @@ "node": ">=4" } }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -1597,12 +1822,22 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=", "dev": true }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==" + }, "node_modules/lodash.kebabcase": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", @@ -1613,6 +1848,11 @@ "lodash.words": "^4.0.0" } }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, "node_modules/lodash.words": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", @@ -1821,6 +2061,12 @@ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node_modules/node-abi": { "version": "3.33.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", @@ -2176,6 +2422,19 @@ "node": ">=8.10.0" } }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/remeda": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-1.61.0.tgz", + "integrity": "sha512-caKfSz9rDeSKBQQnlJnVW3mbVdFgxgGWQKq1XlFokqjf+hQD5gxutLGTTY2A/x24UxVyJe9gH5fAkFI63ULw4A==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -2307,6 +2566,22 @@ "node": ">=8" } }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "dev": true, + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -2381,6 +2656,15 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2535,6 +2819,11 @@ "node": ">=8.0" } }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2547,12 +2836,36 @@ "node": "*" } }, + "node_modules/type-fest": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", + "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "node_modules/uglify-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unidecode": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", @@ -2691,21 +3004,136 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { + "@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "requires": {} + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, "@jsbits/get-package-version": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@jsbits/get-package-version/-/get-package-version-1.0.3.tgz", "integrity": "sha512-IJy1jRL01x7p6UEpgKa1lVLstMUx8EiIR8pPoS5sBfsHEoeLkzYiNpAfxPx8zLDUJyS1yBbChJjcWdPqyH285w==", "dev": true }, + "@molt/command": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@molt/command/-/command-0.9.0.tgz", + "integrity": "sha512-1JI8dAlpqlZoXyKWVQggX7geFNPxBpocHIXQCsnxDjKy+3WX4SGyZVJXuLlqRRrX7FmQCuuMAfx642ovXmPA9g==", + "requires": { + "@molt/types": "0.2.0", + "alge": "0.8.1", + "chalk": "^5.3.0", + "lodash.camelcase": "^4.3.0", + "lodash.snakecase": "^4.1.1", + "readline-sync": "^1.4.10", + "string-length": "^6.0.0", + "strip-ansi": "^7.1.0", + "ts-toolbelt": "^9.6.0", + "type-fest": "^4.3.1", + "zod": "^3.22.2" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + }, + "string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "requires": { + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "@molt/types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@molt/types/-/types-0.2.0.tgz", + "integrity": "sha512-p6ChnEZDGjg9PYPec9BK6Yp5/DdSrYQvXTBAtgrnqX6N36cZy37ql1c8Tc5LclfIYBNG7EZp8NBcRTYJwyi84g==", + "requires": { + "ts-toolbelt": "^9.6.0" + } + }, + "@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, + "alge": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/alge/-/alge-0.8.1.tgz", + "integrity": "sha512-kiV9nTt+XIauAXsowVygDxMZLplZxDWt0W8plE/nB32/V2ziM/P/TxDbSVK7FYIUt2Xo16h3/htDh199LNPCKQ==", + "requires": { + "lodash.ismatch": "^4.4.0", + "remeda": "^1.0.0", + "ts-toolbelt": "^9.6.0", + "zod": "^3.17.3" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -3073,6 +3501,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3431,6 +3865,42 @@ "is-glob": "^4.0.1" } }, + "graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==" + }, + "graphql-request": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.1.0.tgz", + "integrity": "sha512-Ouu/lYVFhARS1aXeZoVJWnGT6grFJXTLwXJuK4mUGGRo0EUk1JkyYp43mdGmRgUVezpRm6V5Sq3t8jBDQcajng==", + "requires": { + "@graphql-typed-document-node/core": "^3.2.0", + "@molt/command": "^0.9.0", + "zod": "^3.23.8" + } + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3865,6 +4335,19 @@ } } }, + "joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -3890,12 +4373,22 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=", "dev": true }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==" + }, "lodash.kebabcase": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", @@ -3906,6 +4399,11 @@ "lodash.words": "^4.0.0" } }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, "lodash.words": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", @@ -4068,6 +4566,12 @@ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-abi": { "version": "3.33.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", @@ -4346,6 +4850,16 @@ "picomatch": "^2.2.1" } }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==" + }, + "remeda": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-1.61.0.tgz", + "integrity": "sha512-caKfSz9rDeSKBQQnlJnVW3mbVdFgxgGWQKq1XlFokqjf+hQD5gxutLGTTY2A/x24UxVyJe9gH5fAkFI63ULw4A==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -4435,6 +4949,15 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "dev": true, + "requires": { + "commander": "^9.0.0" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -4478,6 +5001,12 @@ "is-arrayish": "^0.3.1" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4604,6 +5133,11 @@ "is-number": "^7.0.0" } }, + "ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4613,12 +5147,24 @@ "safe-buffer": "^5.0.1" } }, + "type-fest": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", + "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==" + }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "uglify-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "dev": true, + "optional": true + }, "unidecode": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", @@ -4729,6 +5275,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" } } } diff --git a/package.json b/package.json index aa499ee..08d1ebb 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,13 @@ "devDependencies": { "axios": "^1.3.2", "cheerio": "^1.0.0-rc.12", + "handlebars": "^4.7.8", "html-escaper": "^2.0.2", "http-server": "^14.1.0", "inert-ssg": "^2.0.0-alpha.15", + "joi": "^17.13.3", "mime-types": "^2.1.35", - "sharp": "^0.31.3" + "sharp": "^0.31.3", + "showdown": "^2.1.0" } } diff --git a/posts/en/api_intro.md b/posts/en/api_intro.md index 2141970..e0c4e7b 100644 --- a/posts/en/api_intro.md +++ b/posts/en/api_intro.md @@ -58,5 +58,4 @@ For convenience aliases have been provided for all supported request methods. ##### axios.putForm(url[, data[, config]]) ##### axios.patchForm(url[, data[, config]]) -###### NOTE -When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config. +> NOTE: When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config. diff --git a/posts/en/sponsor.md b/posts/en/sponsor.md new file mode 100644 index 0000000..eb4f576 --- /dev/null +++ b/posts/en/sponsor.md @@ -0,0 +1,90 @@ +--- +title: 'Sponsoring Axios' +--- + +Thank you for considering supporting our project. Your donation will be used to maintain and develop Axios. + +As a benefit to our major sponsors, we provide the opportunity to add your logo and brief +information to our website and/or Readme.md depending on the tier of support you choose. +This process is fully automated if you donate through [OpenCollective.com](https://opencollective.com/axios/contribute), +so your logo will be added within 24 hours. + +Your logo can be placed: +- in the carousel on the main page +- in carousels on each page of the documentation +- at the top of Readme.md in our repo + +Place in the carousel depends on: +- newness of the sponsor (new sponsors temporarily receive higher places) +- selected support tier +- total amount of money donated +- consistency of donations + +If you donate through [GitHub](https://github.com/sponsors/axios), you will need to contact us later if you want your logo to be promoted according +to our support tiers. + +### Tiers + +See tiers list on [Open Collective](https://opencollective.com/axios/contribute) + +| | Bronze | Silver | Gold | Platinum | +|---------------------------------------------|:----------:|:-----------:|:-----------:|:----------------:| +| Main page | small logo | medium logo | large logo | extra large logo | +| Docs pages | | | medium logo | large logo | +| [Readme.md](https://github.com/axios/axios) | | | small logo | medium logo | +| Data merging from sponsor's Github repo | | + | + | + | +| Links block in tooltip* | | | + | + | +| Embedded Youtube video in tooltip* | | | + | + | +| Max description length in Readme.md (chars) | | | 100 | 150 | + +> Note: +> The extra links block and video can only be set via `sponsors.json` + +### Backer tier + +You can create a custom tier, in which case you will get the benefits of the highest existing tier whose price +is covered by your donation. The extra donation amount above the existing tier will be taken into account +when sorting sponsors in a carousel. + +### Sponsor logo + +Your logo will be downloaded to our server, optimized, trimmed empty borders and resized with preservation of proportions. +If the width of the logo is significantly greater than its height, then the text caption will be hidden, +and the logo will take up all the available space. The maximum logo height is the same for all tiers. + +### Description + +If the description is not provided, we will try to parse it from the sponsor's site meta tags. + +### GitHub + +If you have set up your GitHub profile in your Open Collective profile, +you can create a special repository called `axios-sponsor` with `sponsor.json` in its root to manage your sponsor profile data. + +The data from this file will be merged with your Open Collective profile which allows you to provide some extra info for advertising. + +`sponsor.json` has the following structure (each field is optional): + +```json + { + "displayName": "Umbrella Corporation", + "targetLink": "https://umbrellacorp.com/", + "alt": "Umbrella Corporation", + "image": "https://fake.com/logo.png", + "image_dark": "https://fake.com/logo_dark.png", + "description": "The Umbrella Corporation is a pharmaceutical company", + "website": "https://google.com/", + "github": "https://github.com/fakeGitHib", + "icon": "https://fake.com/icon.png", + "video": "https://www.youtube.com/embed/isosE4Bowh0", + "twitter": "https://x.com/profile", + "showCaption": true, + "crown": false, + "hide": false, + "links": { + "link1": "https://google.com/", + "link2": "https://google.com/" + } + } +``` +Every 24 hour our backend will pull this data when update sponsors list on the website. diff --git a/scripts/updateData.js b/scripts/updateData.js index 5724dc8..42571d3 100644 --- a/scripts/updateData.js +++ b/scripts/updateData.js @@ -5,13 +5,91 @@ const sharp = require('sharp'); const cheerio = require('cheerio'); const html = require('html-escaper'); const crypto = require('crypto'); +const Joi = require('joi'); +const showdown = require('showdown'); +const Handlebars = require('handlebars'); +const axios = require('axios'); -const axios = require("axios").create({ +const origin = 'https://axios-http.com/'; +//const origin = 'http://127.0.0.1:8080/'; + +const absoluteURI = (path) => new URL(path, origin); + +/*const converter = new showdown.Converter();*/ + +Handlebars.registerHelper("sep", function(options){ + if(options.data.last) { + return options.inverse(); + } else { + return options.fn(this); + } +}); + +Handlebars.registerHelper("short", function (...args) { + const options = args.pop(); + const [max = 50] = args; + + let s = options.fn(this)?.trim(); + + if (s.length > max) { + s = s.slice(0, max) + '...'; + } + + return new Handlebars.SafeString(s); +}); + +Handlebars.registerHelper("table", function(...args) { + const options = args.pop(); + const [context, columns = 1, separate] = args; + + const rows = [[]]; + let arr = rows[0]; + + const last = context.length - 1; + + const width = 100 / columns; + + context.forEach((that, i) => { + arr.push(`${options.fn(that)}`); + if (i !== last && arr.length === columns) { + rows.push(arr = []); + } + }); + + return new Handlebars + .SafeString(separate ? + rows.map(cells => `${cells.join('')}
`).join('') : + `${rows.map(cells => `${cells.join('')}`).join('')}
` + ); +}); + +const removeExtraLineBreaks = (str) => str.replace(/(?:\r\n|\r|\n){3,}/gm, '\r\n\r\n'); + +const cleanTemplate = template => template + .replace(/\s\s+/g, ' ') + .replace(/\n +/g, '\n') + .replace(/^ +/, '') + .replace(/\n\n\n+/g, '\n\n') + .replace(/\n\n$/, '\n'); + +const renderTemplate = async (data, template) => { + const compile = Handlebars.compile(String(await fs.readFile(template))) + + const content = compile(data); + + return removeExtraLineBreaks(cleanTemplate(content)); +} + + + +const axiosInstance = axios.create({ headers: { "User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' } }); + + const social = { website: 'website.png', facebook: 'facebook.png', @@ -31,10 +109,22 @@ const parseURL = (url) => { } } -const MONTH = 30 * 24 * 3600 * 1000; +const DAY = 24 * 3600; +const MONTH = 30 * DAY; +const PERIOD = 30; const readJSON = async (fileName) => JSON.parse(String(await fs.readFile(fileName))); const writeJSON = async (fileName, data) => await fs.writeFile(fileName, JSON.stringify(data, null, 2)); +const openJSON = async (filePath) => { + try { + return await readJSON(filePath); + } catch(err) { + if (err.code === 'ENOENT') { + return null; + } + throw err; + } +} const ensurePath = async (path) => { try { @@ -44,28 +134,34 @@ const ensurePath = async (path) => { } } -const makeUTMURL = (url, params, bypass) => { - const urlObj = new URL(url); - - const {searchParams} = urlObj; +const makeUTMURL = (url, bypass, params) => { + try { + const urlObj = new URL(url); + + const {searchParams} = urlObj; + + if(!bypass) { + Object.entries({ + utm_source: 'axios', + utm_medium: 'sponsorlist', + utm_campaign: 'sponsorship', + ...params + }).forEach(([param, value]) => { + !searchParams.has(param) && searchParams.set(param, value) + }); + } - if (!bypass && !searchParams.utm_source && !searchParams.utm_campaign) { - Object.entries({ - utm_source: 'axios', - utm_medium: 'sponsorlist', - utm_campaign: 'sponsorship', - ...params - }).forEach(([param, value]) => searchParams.set(param, value)); + return urlObj.toString(); + } catch (err) { + console.warn(`Failed to make UTM link for [${url}]: ${err}`); } - - return urlObj.toString(); } const getWithRetry = (url, retries = 3) => { let counter = 0; const doRequest = async () => { try { - return await axios.get(url) + return await axiosInstance.get(url) } catch (err) { if (counter++ >= retries) { throw err; @@ -81,15 +177,14 @@ const getWithRetry = (url, retries = 3) => { const pullSponsors = async (collective, {type = 'organizations'} = {}) => { const {data} = await getWithRetry(`https://opencollective.com/${collective}/members/${type}.json`); - return data.map(({lastTransactionAt, ...entry}) => { - const {profile} = entry; - + return data.map((sponsor) => { + const {profile} = sponsor; const login = new URL(profile).pathname.split('/').pop(); console.log(`Open Collective member: ${login}`); return { - ...entry, + ...sponsor, login } }); @@ -99,31 +194,37 @@ const processAvatars = async (sponsorsData, avatarsPath = './assets/sponsors/ope await ensurePath(avatarsPath); await Promise.all(Object.values(sponsorsData).map(async (sponsor) => { - const {image, profile} = sponsor; + const {image, profile, displayName} = sponsor; + + console.log(`Process avatar [${image}] for [${displayName}]`); try { if (!/^https?:/.test(image)) { return; } - const {data, headers} = await axios.get(image, {responseType: 'arraybuffer'}); + const {data, headers} = await axiosInstance.get(image, {responseType: 'arraybuffer'}); - const login = new URL(profile).pathname.split('/').pop(); + const login = profile ? new URL(profile).pathname.split('/').pop() : undefined; const ext = mime.extension(headers.getContentType()) || ''; - const localAvatarPath = path.join(avatarsPath, `${login}${ext ? '.' + ext : ''}`); + const localAvatarPath = path.join(avatarsPath, `${login || displayName}${ext ? '.' + ext : ''}`); - sponsor.image = '/' + localAvatarPath; - - await sharp(data) + const sharpImage = await sharp(data) + .trim({ + background: {r: 255, g: 255, b: 255, alpha: 0} + }) .resize(400, 150, { fit: sharp.fit.inside, withoutEnlargement: true - }) - .png() - .toFile(localAvatarPath) + }); + + await sharpImage.png().toFile(localAvatarPath); + sponsor.image = '/' + localAvatarPath; + + console.log(`Avatar for [${displayName}] saved as [${sponsor.image}]`); } catch(err){ console.log(`Error while loading logo [${image}]: ${err}`); sponsor.image = ''; @@ -131,6 +232,23 @@ const processAvatars = async (sponsorsData, avatarsPath = './assets/sponsors/ope })); } +const addImageMetadata = async (sponsors) => { + await Promise.all(Object.values(sponsors).map(async (sponsor) => { + const {image} = sponsor; + if(!image) return; + try { + const {width, height, format} = await sharp('.' + image).metadata(); + + sponsor.imageWidth = width; + sponsor.imageHeight = height; + sponsor.isWideImage = sponsor.showCaption === undefined && width > height * 1.8; + sponsor.imageType = format; + } catch(err) { + console.log(`Error while reading image metadata [${image}]: ${err}`); + } + })); +} + const downloadImage = async (src, maxWidth = 32, maxHeight = 32, imagesPath = './assets/sponsors/') => { let buffer; let name, ext; @@ -139,12 +257,12 @@ const downloadImage = async (src, maxWidth = 32, maxHeight = 32, imagesPath = '. try { if (/^https?:/.test(src)) { - const {data, headers} = await axios.get(src, {responseType: 'arraybuffer'}); + const {data, headers} = await axiosInstance.get(src, {responseType: 'arraybuffer'}); name = new URL(src).pathname.split('/').pop(); ext = mime.extension(headers.getContentType()) || ''; buffer = data; } else { - buffer = await fs.readFile(src); + buffer = await fs.readFile(src.replace(/^\//, './')); ext = path.extname(src); name = path.basename(src, ext); ext = ext.replace(/^\./, ''); @@ -174,7 +292,7 @@ const downloadImage = async (src, maxWidth = 32, maxHeight = 32, imagesPath = '. const getPageDescription = async (website) => { try { - const {data} = await axios.get(website); + const {data} = await axiosInstance.get(website); const $ = cheerio.load(data); return $('head > meta[name=description]').first().attr('content') || $('head > meta[name=title]').first().attr('content'); @@ -183,142 +301,466 @@ const getPageDescription = async (website) => { } } -const processSponsors = async (sponsorsData, sponsorsConfig = './data/sponsors.json') => { - const computedSponsors = {}; +const fitInRect = (w, h, mw = w, mh = h) => { + const ws = w / mw; + const hs = h / mh; + + if (ws > hs) { + return ws > 1 ? [mw, Math.round(h / ws)] : [w, h]; + } else { + return hs > 1 ? [Math.round(w / hs), mh] : [w, h]; + } +} + +const renderMarkdownSponsors = async (sponsors) => { + const render = async (sponsors, caption = 'Sponsors', cells, width = 300, height= 70, separate = false) => { + + return await renderTemplate({ + caption, + cells, + separate, + sponsors: sponsors.map(sponsor => { + const [w = 0, h = 0] = sponsor.image ? fitInRect(sponsor.imageWidth, sponsor.imageHeight, width, height) : []; + + const links = {}; + + sponsor.links && Object.entries(sponsor.links).forEach(([name, href]) =>{ + links[name] = href ? makeUTMURL(href, { + utm_source: 'axios', + utm_medium: 'readme_sponsorlist', + utm_campaign: 'sponsorship', + }, !sponsor.autoUTMLinks) : ''; + }); + + return { + ...sponsor, + links, + image: sponsor.image && absoluteURI(sponsor.image), + image_black: sponsor.image && absoluteURI(sponsor.image_black), + readmeImageWidth: w, + readmeImageHeight: h + }; + }), + }, './templates/sponsors.hbs'); + } + + const filterSponsors = (fn) => Object.values(sponsors).filter(fn); + + const rendered = []; + + rendered.push(await render(filterSponsors(({benefits, isActive, tierId}) => { + return isActive && benefits.readme && tierId === 'platinum'; + }), '💎 Platinum sponsors', 1, 300, 90, true)); + + rendered.push(await render(filterSponsors(({benefits, isActive, tierId}) => { + return isActive && benefits.readme && tierId === 'gold'; + }), '🥇 Gold sponsors', 3, 200, 70)); + + rendered.push(await render(filterSponsors(({benefits, isActive, tierId}) => { + return isActive && benefits.readme && tierId === 'silver'; + }), '🥈 Silver sponsors', 4, 150, 50)); + + return rendered.join('\n'); +} + +/*const updateReadmeSponsors = async (dest, path, sponsors, marker = '

') => { + let {data} = await getWithRetry(`https://api.github.com/repos/axios/axios/contents/${dest}`); + + let content = Buffer.from(data.content, 'base64').toString(); + + const index = content.indexOf(marker); + + if(index >= 0) { + const sponsorBlock = await renderMarkdownSponsors(sponsors) + + content = sponsorBlock + '\n' + content.slice(index); + + await fs.writeFile(path, content); + } else { + console.warn(`Can not find marker (${marker}) in ${uri}`); + } +};*/ + + + + + + + + + + + + + + +const schema = Joi.object({ + github: Joi.string().alphanum().max(255), + displayName: Joi.string().alphanum().min(1).max(64), + website: Joi.string().alphanum().max(255), + alt: Joi.string().alphanum().max(255), + icon: Joi.string().alphanum().max(255), + image: Joi.string().alphanum().max(255), + image_dark: Joi.string().alphanum().max(255), + targetLink: Joi.string().alphanum().max(255), + twitter: Joi.string().alphanum().max(255), + video: Joi.string().alphanum().max(255), + description: Joi.string().alphanum().max(1000), + links: Joi.object({}).unknown(true), + showCaption: Joi.boolean(), + crown: Joi.boolean(), + hide: Joi.boolean() +}).unknown(true); + +const processGithub = async (sponsor, repo = 'axios-sponsor', file = 'sponsor.json') => { + let {github, displayName} = sponsor; + + console.log(`Process github (${github}) of ${displayName}...`); + + if (github && (github = github.trim())) { + try { + const url = new URL(github); + if (url.hostname === 'github.com') { + const [githubUser] = url.pathname.slice(1).split('/'); + + if (githubUser) { + const targetURI = `https://raw.githubusercontent.com/${githubUser}/${repo}/main/${file}`; + + console.log(`Pull sponsor content from [${targetURI}]`); + + const {data} = await axiosInstance.get(targetURI); + + schema.validate(data); + + ['github', 'displayName', 'website', 'alt', 'image', 'image_dark', 'description', 'icon', 'video', 'twitter', 'targetLink'] + .forEach(key => { + if (data[key] !== undefined) { + sponsor[key] = String(data[key]); + } + }); + + data.links && (sponsor.links = data.links); + + 'showCaption' in data && (sponsor.showCaption = !!data.showCaption); + data.crown === false && (sponsor.benefits.crown = false); + data.hide === true && (sponsor.hide = true); + } + } + } catch (err) { + console.warn(String(err)); + } + } +} + +const addMonths = (date, months) => { + const d = date.getDate(); + date.setMonth(+months + date.getMonth()); + date.getDate() !== d && date.setDate(0); + return date; +} + + + +const renderTooltip = async (sponsor) => { + let {icon, isActive, displayName, tier, associatedTierId, lastTransactionAmount, price, description, website, benefits, video, autoUTMLinks, links} = sponsor; + + const iconSrc = icon && (await downloadImage(icon)); + + const iconHTML = iconSrc ? `` : ''; + + const renderedTier = isActive && tier.toLowerCase() === 'backer' ? `${price || lastTransactionAmount || 0}$ a month` : tier; + + let tooltip = `

${iconHTML}${html.escape(displayName)} (${sponsor.totalAmountDonated || 0}$${' ' + renderedTier + ''})

`; + + if (!description && website) { + description = sponsor.description = await getPageDescription(website); + + console.log(`Website ${website} description: ${description}`); + } + + if (description) { + tooltip += `
${html.escape(description)}
`; + } + + if (benefits.video && video) { + try { + const {hostname} = new URL(video); + + if (/youtube.com$/.test(hostname)) { + tooltip += `
`; + } + } catch (e) { + console.warn(`Failed to include youtube link: ${e}`); + } + } + + const linksArray = Object.entries(links || {}); + + if (benefits.links && linksArray.length && benefits.links) { + const rendered = linksArray.slice(0, benefits.links).map(([text, entry]) => { + const {href} = typeof entry === 'string' ? { + href: entry + } : entry || {}; + + return `${html.escape(text)}`; + }).join(''); + + tooltip += `` + } + + const icons = Object.entries(social).map(([name, icon]) => { + const link = sponsor[name]; + + if(!link) return; + + return ``; + }).filter(Boolean).join(''); + + tooltip += `` + + return tooltip; +} + +const fitInRange = (v, min, max) => Math.max(Math.min(v, max), min); + +/*const mapObject = (obj, fn) => { + const newObj = {}; + + Object.entries(obj).forEach((key, value) => { + const ret = fn(key, value, obj); + + if() + }); +}*/ + +const findTier = (price, tiers) => { + let found; + let max = 0; + + price && Object.entries(tiers).forEach(([tier, data]) => { + if (data.price <= price && max < price) { + max = data.price; + found = tier; + } + }); + + return found; +} + +const processSponsors = async (collectiveSponsors, sponsorsConfig = './data/sponsors.json') => { + const { sponsors, tiers, - totalAmountDonatedThreshold = 100, - monthlyContributionThreshold = 10, - disappearCredit = 10, scoreTierPriceFactor = 0.5, - scoreTotalAmountFactor = 0.2 + scoreTotalAmountFactor = 0.2, + creditDays = 0 } = await readJSON(sponsorsConfig) || {}; + const mergedSponsors = {}; + // merge Open Collective sponsors - sponsorsData.forEach(sponsor => { - if (sponsor.role !== 'BACKER' && sponsor.role && sponsor.totalAmountDonated <= 0) { + collectiveSponsors.forEach(sponsor => { + if (sponsor.role !== 'BACKER' && sponsor.role) { return; } - computedSponsors[sponsor.login] = {...sponsor}; + const {isActive, totalAmountDonated, lastTransactionAmount} = sponsor; + + sponsor.isActive = !!(isActive && lastTransactionAmount > 0 && totalAmountDonated); + + mergedSponsors[sponsor.login] = {...sponsor}; }); - // merge config sponsors - Object.entries(sponsors).forEach(([login, entry]) => { - const existing = computedSponsors[login] || {}; + // merge sponsors from sponsors.json + Object.entries(sponsors).forEach(([login, local]) => { + let collective = mergedSponsors[login]; - computedSponsors[login] = {login, ...existing, ...entry}; + mergedSponsors[login] = { + login, + ...collective, + ...local, + localConfig: {...local}, + manualBilling: !!(local.lastTransactionAt && local.lastTransactionAmount || local.endDate) + } }); - await Promise.all(Object.values(computedSponsors).map(async (sponsor) => { - let {login, icon, website, displayName, description, links} = sponsor; - sponsor.displayName = displayName = displayName || sponsor.name || login; - console.log(`Process sponsor [${displayName}]`); + // normalize sponsors config + Object.entries(mergedSponsors).forEach(([login, sponsor]) => { + if (!sponsor.tier) { + sponsor.tier = 'backer'; + } + + let {isActive, tier, lastTransactionAmount = 0, createdAt, lastTransactionAt, totalAmountDonated, manualBilling, localConfig} = sponsor; + + const tierLower = tier.toLowerCase(); + + const tierData = tiers[tierLower]; + + if (!tierData) { + console.log(`Unknown tier [${tier}]`); + } + + const {price, benefits, period = PERIOD} = tierData || {}; + + console.log(sponsor.login); + + const isBacker = tierLower === 'backer'; - const iconHTML = icon ? `` : ''; + sponsor.tierId = tierLower; + sponsor.tierPrice = isBacker && isActive && lastTransactionAmount ? lastTransactionAmount : price; + sponsor.totalAmountDonated = sponsor.totalAmountDonated || lastTransactionAmount || 0; - let tooltip = `

${iconHTML}${displayName} (${sponsor.totalAmountDonated}$${sponsor.tier && sponsor.isActive ? ' ' + sponsor.tier + '' : ''})

`; + sponsor.associatedTierId = tierLower; - if (!description && website) { - description = await getPageDescription(website); - console.log(`Website ${website} description: ${description}`); + let assoc; + + if (localConfig?.isActive === false) { + sponsor.isActive = false; + } else if (tier && (manualBilling || tierLower === 'backer')) { + if(sponsor.endDate || lastTransactionAmount >= price) { + const pricePerSec = price / (period * DAY); + const timePaid = lastTransactionAmount / pricePerSec + const endDate = sponsor.endDate = sponsor.endDate || +(new Date(lastTransactionAt)) + timePaid * 1000; + const timeLeft = new Date(endDate) - Date.now(); + + sponsor.timeLeft = Math.round(timeLeft / 1000); // seconds + sponsor.isActive = sponsor.timeLeft > 0; + } else { + sponsor.isActive = false; + } } - if (description) { - tooltip += `
${description}
`; + if( Date.now() - new Date(sponsor.boostEnd) > 0) { + sponsor.boost = sponsor.boost || 1; } - sponsor.targetLink = website || sponsor.twitter || sponsor.github || sponsor.profile; + if (isActive && isBacker && !localConfig?.tier && (assoc = findTier(lastTransactionAmount, tiers))) { + const tier = assoc.toLowerCase(); + tier !== 'backer' && (sponsor.associatedTierId = tier); + } - const autoUTMLinks = sponsor.autoUTMLinks !== false; // hotfix + sponsor.isActive = sponsor.isActive === true; - const linksArray = Object.entries(links || {}); + sponsor.benefits = { + ...benefits, + ...sponsor.benefits + }; - if (linksArray.length) { - const rendered = linksArray.map(([text, entry]) => { - const {href} = typeof entry === 'string' ? { - href: entry - } : entry || {}; + sponsor.autoUTMLinks = sponsor.autoUTMLinks !== false; - return `${html.escape(text)}`; - }).join(''); + let displayName = sponsor.displayName || sponsor.name || sponsor.login || login; - tooltip += `