From 807fdb9c23065b0c3d5e9522df3ccd697314ef7d Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Thu, 22 Jun 2023 15:09:54 -0300 Subject: [PATCH 01/27] =?UTF-8?q?chore(banners):=20=F0=9F=94=A7=20create?= =?UTF-8?q?=20@maknow/banners=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created the boilerplate/config files for the @marknow/banners package --- apps/www/package.json | 1 + packages/banners/.eslintignore | 1 + packages/banners/.eslintrc.cjs | 3 + packages/banners/.gitignore | 1 + packages/banners/.lintstagedrc | 4 + packages/banners/jsconfig.json | 17 + packages/banners/package.json | 32 + pnpm-lock.yaml | 1341 ++++++++++++++++++++++++++++++-- 8 files changed, 1336 insertions(+), 64 deletions(-) create mode 100644 packages/banners/.eslintignore create mode 100644 packages/banners/.eslintrc.cjs create mode 100644 packages/banners/.gitignore create mode 100644 packages/banners/.lintstagedrc create mode 100644 packages/banners/jsconfig.json create mode 100644 packages/banners/package.json diff --git a/apps/www/package.json b/apps/www/package.json index ef6360b..9089796 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -22,6 +22,7 @@ "@iconify-json/svg-spinners": "^1.1.1", "@iconify/types": "^2.0.0", "@iconify/utils": "^2.1.6", + "@marknow/banners": "workspace:*", "@poppanator/sveltekit-svg": "^3.0.1", "@sveltejs/adapter-vercel": "^3.0.1", "@sveltejs/kit": "^1.20.2", diff --git a/packages/banners/.eslintignore b/packages/banners/.eslintignore new file mode 100644 index 0000000..9b1c8b1 --- /dev/null +++ b/packages/banners/.eslintignore @@ -0,0 +1 @@ +/dist diff --git a/packages/banners/.eslintrc.cjs b/packages/banners/.eslintrc.cjs new file mode 100644 index 0000000..b053888 --- /dev/null +++ b/packages/banners/.eslintrc.cjs @@ -0,0 +1,3 @@ +module.exports = { + root: false, +}; diff --git a/packages/banners/.gitignore b/packages/banners/.gitignore new file mode 100644 index 0000000..9b1c8b1 --- /dev/null +++ b/packages/banners/.gitignore @@ -0,0 +1 @@ +/dist diff --git a/packages/banners/.lintstagedrc b/packages/banners/.lintstagedrc new file mode 100644 index 0000000..c768074 --- /dev/null +++ b/packages/banners/.lintstagedrc @@ -0,0 +1,4 @@ +{ + "gitDir": "../../.git", + "*": "eslint --fix" +} diff --git a/packages/banners/jsconfig.json b/packages/banners/jsconfig.json new file mode 100644 index 0000000..4bcf596 --- /dev/null +++ b/packages/banners/jsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "checkJs": true, + "allowJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "module": "ES2022", + "target": "ES2022", + "alwaysStrict": true + }, + "include": ["./src/**/*"], + "exclude": ["./node_modules/**", "./dist/**"] +} diff --git a/packages/banners/package.json b/packages/banners/package.json new file mode 100644 index 0000000..66c04eb --- /dev/null +++ b/packages/banners/package.json @@ -0,0 +1,32 @@ +{ + "name": "@marknow/banners", + "type": "module", + "version": "1.0.0", + "description": "", + "source": "./src/index.js", + "author": "", + "license": "ISC", + "keywords": [], + "exports": { + "types": "./src/index.d.ts", + "require": "./dist/index.cjs", + "import": "./src/index.js", + "default": "./src/index.js" + }, + "main": "./dist/index.cjs", + "module": "./src/index.js", + "types": "./src/index.d.ts", + "scripts": { + "build:cjs": "microbundle --compress false --pkg-main false --strict --tsconfig ./jsconfig.json --generateTypes false -f cjs --target node", + "build": "pnpm run build:cjs", + "dev": "microbundle -w --compress false" + }, + "dependencies": { + "satori": "^0.10.1", + "satori-html": "^0.3.2" + }, + "devDependencies": { + "@types/node": "^20.3.1", + "microbundle": "^0.15.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5448cc4..5bf9a80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: '@iconify/utils': specifier: ^2.1.6 version: 2.1.6 + '@marknow/banners': + specifier: workspace:* + version: link:../../packages/banners '@poppanator/sveltekit-svg': specifier: ^3.0.1 version: 3.0.1(svelte@3.59.1)(vite@4.3.9) @@ -91,10 +94,10 @@ importers: version: 3.59.1 svelte-check: specifier: ^3.4.3 - version: 3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) + version: 3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + version: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) tslib: specifier: ^2.5.3 version: 2.5.3 @@ -118,7 +121,23 @@ importers: version: 0.2.8 vite: specifier: ^4.3.9 - version: 4.3.9(sass@1.63.4) + version: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + + packages/banners: + dependencies: + satori: + specifier: ^0.10.1 + version: 0.10.1 + satori-html: + specifier: ^0.3.2 + version: 0.3.2 + devDependencies: + '@types/node': + specifier: ^20.3.1 + version: 20.3.1 + microbundle: + specifier: ^0.15.1 + version: 0.15.1 packages: @@ -551,6 +570,18 @@ packages: '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.22.5) dev: true + /@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.22.5): + resolution: {integrity: sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/helper-plugin-utils': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -617,6 +648,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} @@ -941,6 +982,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) dev: true + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) + dev: true + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} @@ -1201,6 +1253,51 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + dev: true + + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} engines: {node: '>=6.9.0'} @@ -1422,6 +1519,18 @@ packages: - supports-color dev: true + /@babel/preset-flow@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.5) + dev: true + /@babel/preset-modules@0.1.5(@babel/core@7.22.5): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: @@ -1435,6 +1544,21 @@ packages: esutils: 2.0.3 dev: true + /@babel/preset-react@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.5) + dev: true + /@babel/preset-typescript@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} engines: {node: '>=6.9.0'} @@ -2075,6 +2199,13 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/source-map@0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -2175,7 +2306,7 @@ packages: dependencies: svelte: 3.59.1 svgo: 3.0.2 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) dev: true /@radix-ui/colors@0.1.8: @@ -2198,6 +2329,85 @@ packages: source-map: 0.7.4 dev: true + /@rollup/plugin-alias@3.1.9(rollup@2.79.1): + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + rollup: 2.79.1 + slash: 3.0.0 + dev: true + + /@rollup/plugin-babel@5.3.1(@babel/core@7.22.5)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: true + + /@rollup/plugin-commonjs@17.1.0(rollup@2.79.1): + resolution: {integrity: sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.30.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.2 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-json@4.1.0(rollup@2.79.1): + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.2 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -2227,7 +2437,6 @@ packages: dependencies: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 - dev: true /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} @@ -2238,6 +2447,15 @@ packages: engines: {node: '>=10'} dev: true + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: true + /@sveltejs/adapter-vercel@3.0.1(@sveltejs/kit@1.20.2): resolution: {integrity: sha512-PBY3YRm7Q7Prax07mxD/rvcho2CntGkYncAIkz2DtG5NTcVG5JZ1RM627it5zYYtc2/RB3YjMkZuCMBqDCiPkA==} peerDependencies: @@ -2274,7 +2492,7 @@ packages: svelte: 3.59.1 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) transitivePeerDependencies: - supports-color dev: true @@ -2290,7 +2508,7 @@ packages: '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) debug: 4.3.4 svelte: 3.59.1 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) transitivePeerDependencies: - supports-color dev: true @@ -2309,7 +2527,7 @@ packages: magic-string: 0.30.0 svelte: 3.59.1 svelte-hmr: 0.15.2(svelte@3.59.1) - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color @@ -2394,6 +2612,10 @@ packages: '@types/estree': 1.0.1 dev: true + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: true @@ -2450,7 +2672,7 @@ packages: /@types/node-fetch@2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: - '@types/node': 14.18.33 + '@types/node': 20.3.1 form-data: 3.0.1 dev: true @@ -2466,10 +2688,20 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.3.1 + dev: true + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: @@ -2816,7 +3048,7 @@ packages: chokidar: 3.5.3 fast-glob: 3.2.12 magic-string: 0.30.0 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) transitivePeerDependencies: - rollup dev: true @@ -3224,11 +3456,21 @@ packages: type-fest: 0.21.3 dev: true + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -3359,15 +3601,48 @@ packages: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} dev: true + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true + /asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + dev: true + + /autoprefixer@10.4.14(postcss@8.4.24): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.9 + caniuse-lite: 1.0.30001503 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.5 + cosmiconfig: 7.1.0 + resolve: 1.22.2 + dev: true + /babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.5): resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==} peerDependencies: @@ -3404,6 +3679,19 @@ packages: - supports-color dev: true + /babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + dev: true + + /babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.22.5): + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/parser': 7.22.5 + dev: true + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: true @@ -3415,7 +3703,6 @@ packages: /base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} - dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3488,6 +3775,13 @@ packages: fill-range: 7.0.1 dev: true + /brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + dependencies: + duplexer: 0.1.1 + dev: true + /browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} dependencies: @@ -3604,14 +3898,38 @@ packages: engines: {node: '>=6'} dev: true + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.21.9 + caniuse-lite: 1.0.30001503 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 dev: true /caniuse-lite@1.0.30001503: resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} dev: true + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3719,6 +4037,15 @@ packages: engines: {node: '>= 10'} dev: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: @@ -3753,13 +4080,16 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: true + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true @@ -3775,11 +4105,19 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: true + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} dev: true + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: @@ -3791,6 +4129,12 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + dependencies: + source-map: 0.6.1 + dev: true + /consola@3.1.0: resolution: {integrity: sha512-rrrJE6rP0qzl/Srg+C9x/AE5Kxfux7reVm1Wh0wCjuXvih6DqZgqDZe8auTD28fzJ9TF0mHlSDrPpWlujQRo1Q==} dev: true @@ -3853,6 +4197,17 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -3868,15 +4223,31 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - dev: true /css-box-shadow@1.0.0-3: resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - dev: true /css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + + /css-declaration-sorter@6.4.0(postcss@8.4.24): + resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.24 + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 dev: true /css-select@5.1.0: @@ -3895,6 +4266,13 @@ packages: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 dev: true /css-tree@2.2.1: @@ -3924,6 +4302,72 @@ packages: hasBin: true dev: true + /cssnano-preset-default@5.2.14(postcss@8.4.24): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.0(postcss@8.4.24) + cssnano-utils: 3.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-calc: 8.2.4(postcss@8.4.24) + postcss-colormin: 5.3.1(postcss@8.4.24) + postcss-convert-values: 5.1.3(postcss@8.4.24) + postcss-discard-comments: 5.1.2(postcss@8.4.24) + postcss-discard-duplicates: 5.1.0(postcss@8.4.24) + postcss-discard-empty: 5.1.1(postcss@8.4.24) + postcss-discard-overridden: 5.1.0(postcss@8.4.24) + postcss-merge-longhand: 5.1.7(postcss@8.4.24) + postcss-merge-rules: 5.1.4(postcss@8.4.24) + postcss-minify-font-values: 5.1.0(postcss@8.4.24) + postcss-minify-gradients: 5.1.1(postcss@8.4.24) + postcss-minify-params: 5.1.4(postcss@8.4.24) + postcss-minify-selectors: 5.2.1(postcss@8.4.24) + postcss-normalize-charset: 5.1.0(postcss@8.4.24) + postcss-normalize-display-values: 5.1.0(postcss@8.4.24) + postcss-normalize-positions: 5.1.1(postcss@8.4.24) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.24) + postcss-normalize-string: 5.1.0(postcss@8.4.24) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.24) + postcss-normalize-unicode: 5.1.1(postcss@8.4.24) + postcss-normalize-url: 5.1.0(postcss@8.4.24) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.24) + postcss-ordered-values: 5.1.3(postcss@8.4.24) + postcss-reduce-initial: 5.1.2(postcss@8.4.24) + postcss-reduce-transforms: 5.1.0(postcss@8.4.24) + postcss-svgo: 5.1.0(postcss@8.4.24) + postcss-unique-selectors: 5.1.1(postcss@8.4.24) + dev: true + + /cssnano-utils@3.1.0(postcss@8.4.24): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + dev: true + + /cssnano@5.1.15(postcss@8.4.24): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.24) + lilconfig: 2.1.0 + postcss: 8.4.24 + yaml: 1.10.2 + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + /csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -4021,6 +4465,11 @@ packages: engines: {node: '>=10'} dev: true + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -4121,6 +4570,14 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + /dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} dependencies: @@ -4133,6 +4590,13 @@ packages: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + /domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -4140,6 +4604,14 @@ packages: domelementtype: 2.3.0 dev: true + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + /domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: @@ -4160,6 +4632,10 @@ packages: engines: {node: '>=12'} dev: true + /duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + dev: true + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -4193,13 +4669,20 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + /electron-to-chromium@1.4.431: resolution: {integrity: sha512-m232JTVmCawA2vG+1azVxhKZ9Sv1Q//xxNv5PkP5rWxGgQE8c3CiZFrh8Xnp+d1NmNxlu3QQrGIfdeW5TtXX5w==} dev: true /emoji-regex@10.2.1: resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4221,6 +4704,10 @@ packages: once: 1.4.0 dev: true + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -4585,7 +5072,6 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -5063,6 +5549,14 @@ packages: '@types/unist': 2.0.6 dev: true + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true @@ -5090,6 +5584,10 @@ packages: require-like: 0.1.2 dev: true + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -5210,6 +5708,13 @@ packages: /fflate@0.7.4: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + + /figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 dev: true /figures@3.2.0: @@ -5235,6 +5740,17 @@ packages: engines: {node: '>= 6'} dev: true + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} + dev: true + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -5257,6 +5773,15 @@ packages: - supports-color dev: true + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5310,6 +5835,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -5417,6 +5946,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -5594,6 +6128,13 @@ packages: through2: 2.0.5 dev: true + /gzip-size@3.0.0: + resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} + engines: {node: '>=0.12.0'} + dependencies: + duplexer: 0.1.2 + dev: true + /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -5601,6 +6142,13 @@ packages: duplexer: 0.1.2 dev: true + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -5685,7 +6233,6 @@ packages: /hex-rgb@4.3.0: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} - dev: true /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -5767,6 +6314,10 @@ packages: safer-buffer: 2.1.2 dev: true + /icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + dev: true + /icss-utils@5.1.0(postcss@8.4.24): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -5789,6 +6340,13 @@ packages: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} dev: true + /import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + dependencies: + import-from: 3.0.0 + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -5797,6 +6355,13 @@ packages: resolve-from: 4.0.0 dev: true + /import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + /import-meta-resolve@2.2.2: resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} dev: true @@ -5975,6 +6540,12 @@ packages: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} dev: true + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6010,6 +6581,10 @@ packages: engines: {node: '>=8'} dev: true + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -6052,6 +6627,12 @@ packages: engines: {node: '>=12'} dev: true + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: @@ -6113,6 +6694,13 @@ packages: call-bind: 1.0.2 dev: true + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: true @@ -6125,10 +6713,30 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + /javascript-stringify@2.1.0: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} dev: true + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.3.1 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + /jiti@1.18.2: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true @@ -6275,7 +6883,6 @@ packages: dependencies: base64-js: 0.0.8 unicode-trie: 2.0.0 - dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -6322,10 +6929,18 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true @@ -6365,6 +6980,12 @@ packages: engines: {node: '>=12'} dev: true + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} @@ -6395,6 +7016,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /maxmin@2.1.0: + resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + figures: 1.7.0 + gzip-size: 3.0.0 + pretty-bytes: 3.0.1 + dev: true + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: @@ -6533,6 +7164,10 @@ packages: '@types/mdast': 3.0.11 dev: true + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true @@ -6586,6 +7221,58 @@ packages: engines: {node: '>= 0.6'} dev: true + /microbundle@0.15.1: + resolution: {integrity: sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==} + hasBin: true + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.22.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.5) + '@babel/preset-env': 7.22.5(@babel/core@7.22.5) + '@babel/preset-flow': 7.22.5(@babel/core@7.22.5) + '@babel/preset-react': 7.22.5(@babel/core@7.22.5) + '@rollup/plugin-alias': 3.1.9(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.5)(rollup@2.79.1) + '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.1) + '@rollup/plugin-json': 4.1.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + asyncro: 3.0.0 + autoprefixer: 10.4.14(postcss@8.4.24) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-async-to-promises: 0.8.18 + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.22.5) + brotli-size: 4.0.0 + builtin-modules: 3.3.0 + camelcase: 6.3.0 + escape-string-regexp: 4.0.0 + filesize: 6.4.0 + gzip-size: 6.0.0 + kleur: 4.1.5 + lodash.merge: 4.6.2 + postcss: 8.4.24 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-bundle-size: 1.0.3 + rollup-plugin-postcss: 4.0.2(postcss@8.4.24) + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + rollup-plugin-typescript2: 0.32.1(rollup@2.79.1)(typescript@4.9.5) + rollup-plugin-visualizer: 5.9.2(rollup@2.79.1) + sade: 1.8.1 + terser: 5.18.1 + tiny-glob: 0.2.9 + tslib: 2.5.3 + typescript: 4.9.5 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + - ts-node + dev: true + /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: @@ -6924,6 +7611,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} @@ -7116,6 +7810,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -7143,6 +7842,11 @@ packages: boolbase: 1.0.0 dev: true + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -7204,6 +7908,15 @@ packages: mimic-fn: 2.1.0 dev: true + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -7257,6 +7970,11 @@ packages: engines: {node: '>=8'} dev: true + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -7292,6 +8010,21 @@ packages: aggregate-error: 3.1.0 dev: true + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -7325,7 +8058,6 @@ packages: /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -7339,7 +8071,6 @@ packages: dependencies: color-name: 1.1.4 hex-rgb: 4.3.0 - dev: true /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -7458,6 +8189,18 @@ packages: engines: {node: '>=8.6'} dev: true + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: @@ -7471,6 +8214,49 @@ packages: engines: {node: '>=4'} dev: true + /postcss-calc@8.2.4(postcss@8.4.24): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-colormin@5.3.1(postcss@8.4.24): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-convert-values@5.1.3(postcss@8.4.24): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-discard-comments@5.1.2(postcss@8.4.24): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + dev: true + /postcss-discard-duplicates@5.1.0(postcss@8.4.24): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -7480,6 +8266,24 @@ packages: postcss: 8.4.24 dev: true + /postcss-discard-empty@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-discard-overridden@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + dev: true + /postcss-load-config@3.1.4(postcss@8.4.24): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -7514,6 +8318,74 @@ packages: yaml: 2.3.1 dev: true + /postcss-merge-longhand@5.1.7(postcss@8.4.24): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.24) + dev: true + + /postcss-merge-rules@5.1.4(postcss@8.4.24): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-minify-font-values@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-gradients@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-params@5.1.4(postcss@8.4.24): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + cssnano-utils: 3.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-selectors@5.2.1(postcss@8.4.24): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + /postcss-modules-extract-imports@3.0.0(postcss@8.4.24): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} @@ -7555,6 +8427,22 @@ packages: postcss: 8.4.24 dev: true + /postcss-modules@4.3.1(postcss@8.4.24): + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.4.24 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.24) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.24) + postcss-modules-scope: 3.0.0(postcss@8.4.24) + postcss-modules-values: 4.0.0(postcss@8.4.24) + string-hash: 1.1.3 + dev: true + /postcss-modules@6.0.0(postcss@8.4.24): resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} peerDependencies: @@ -7571,6 +8459,129 @@ packages: string-hash: 1.1.3 dev: true + /postcss-normalize-charset@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + dev: true + + /postcss-normalize-display-values@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-positions@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-string@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-unicode@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-url@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-whitespace@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-ordered-values@5.1.3(postcss@8.4.24): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.24) + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-reduce-initial@5.1.2(postcss@8.4.24): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + caniuse-api: 3.0.0 + postcss: 8.4.24 + dev: true + + /postcss-reduce-transforms@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + /postcss-safe-parser@6.0.0(postcss@8.4.24): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} @@ -7588,9 +8599,29 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-svgo@5.1.0(postcss@8.4.24): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + dev: true + + /postcss-unique-selectors@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true /postcss@8.4.24: resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} @@ -7617,6 +8648,13 @@ packages: hasBin: true dev: true + /pretty-bytes@3.0.1: + resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -7651,6 +8689,11 @@ packages: optional: true dev: true + /promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + dev: true + /property-information@6.2.0: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: true @@ -7731,6 +8774,12 @@ packages: engines: {node: '>=10'} dev: true + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -7938,6 +8987,11 @@ packages: unified: 10.1.2 dev: true + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -8003,6 +9057,96 @@ packages: glob: 7.2.3 dev: true + /rollup-plugin-bundle-size@1.0.3: + resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + dependencies: + chalk: 1.1.3 + maxmin: 2.1.0 + dev: true + + /rollup-plugin-postcss@4.0.2(postcss@8.4.24): + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.4.24) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.4.24 + postcss-load-config: 3.1.4(postcss@8.4.24) + postcss-modules: 4.3.1(postcss@8.4.24) + promise.series: 0.2.0 + resolve: 1.22.2 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.5 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.18.1 + dev: true + + /rollup-plugin-typescript2@0.32.1(rollup@2.79.1)(typescript@4.9.5): + resolution: {integrity: sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + find-cache-dir: 3.3.2 + fs-extra: 10.1.0 + resolve: 1.22.2 + rollup: 2.79.1 + tslib: 2.5.3 + typescript: 4.9.5 + dev: true + + /rollup-plugin-visualizer@5.9.2(rollup@2.79.1): + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 2.79.1 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rollup@3.25.1: resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -8043,6 +9187,10 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true + /safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + dev: true + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: @@ -8084,7 +9232,6 @@ packages: resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} dependencies: ultrahtml: 1.2.0 - dev: true /satori@0.10.1: resolution: {integrity: sha512-F4bTCkDp931tLb7+UCNPBuSQwXhikrUkI4fBQo6fA8lF0Evqqgg3nDyUpRktQpR5Ry1DIiIVqLyEwkAms87ykg==} @@ -8100,7 +9247,6 @@ packages: parse-css-color: 0.2.1 postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 - dev: true /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} @@ -8158,6 +9304,12 @@ packages: - supports-color dev: true + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -8292,6 +9444,11 @@ packages: engines: {node: '>= 8'} dev: true + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: true @@ -8325,6 +9482,11 @@ packages: minipass: 3.3.6 dev: true + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -8354,6 +9516,18 @@ packages: /string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 dev: true /string.prototype.trim@1.2.7: @@ -8404,6 +9578,13 @@ packages: character-entities-legacy: 3.0.0 dev: true + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -8439,12 +9620,32 @@ packages: acorn: 8.8.2 dev: true + /style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + dev: true + /style-to-object@0.4.1: resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} dependencies: inline-style-parser: 0.1.1 dev: true + /stylehacks@5.1.1(postcss@8.4.24): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.9 + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -8464,7 +9665,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): + /svelte-check@3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): resolution: {integrity: sha512-O07soQFY3X0VDt+bcGc6D5naz0cLtjwnmNP9JsEBPVyMemFEqUhL2OdLqvkl5H/u8Jwm50EiAU4BPRn5iin/kg==} hasBin: true peerDependencies: @@ -8477,7 +9678,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.59.1 - svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + svelte-preprocess: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) typescript: 5.1.3 transitivePeerDependencies: - '@babel/core' @@ -8514,7 +9715,7 @@ packages: svelte: 3.59.1 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3): + /svelte-preprocess@5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -8552,6 +9753,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.22.5 '@types/pug': 2.0.6 detect-indent: 6.1.0 magic-string: 0.27.0 @@ -8568,6 +9770,20 @@ packages: engines: {node: '>= 8'} dev: true + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + /svgo@3.0.2: resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} engines: {node: '>=14.0.0'} @@ -8613,6 +9829,17 @@ packages: yallist: 4.0.0 dev: true + /terser@5.18.1: + resolution: {integrity: sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -8644,7 +9871,6 @@ packages: /tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: true /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -8894,7 +10120,6 @@ packages: /ultrahtml@1.2.0: resolution: {integrity: sha512-vxZM2yNvajRmCj/SknRYGNXk2tqiy6kRNvZjJLaleG3zJbSh/aNkOqD1/CVzypw8tyHyhpzYuwQgMMhUB4ZVNQ==} - dev: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -8948,7 +10173,6 @@ packages: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: true /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -9337,39 +10561,6 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.3.9(sass@1.63.4): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.17.19 - postcss: 8.4.24 - rollup: 3.25.1 - sass: 1.63.4 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vitefu@0.2.4(vite@4.3.9): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -9378,7 +10569,7 @@ packages: vite: optional: true dependencies: - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) dev: true /vm2@3.9.19: @@ -9562,6 +10753,11 @@ packages: engines: {node: '>=0.4'} dev: true + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -9589,6 +10785,24 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -9601,7 +10815,6 @@ packages: /yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - dev: true /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From 00af431a9e16e5b263f849490b94f47764d0bd26 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Thu, 22 Jun 2023 15:13:21 -0300 Subject: [PATCH 02/27] =?UTF-8?q?chore(deps):=20=F0=9F=94=97=20remove=20sa?= =?UTF-8?q?tori=20from=20apps/www?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/www/package.json | 2 -- pnpm-lock.yaml | 83 +++++++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/apps/www/package.json b/apps/www/package.json index 9089796..6048722 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -32,8 +32,6 @@ "mdsvex": "^0.10.6", "rehype-external-links": "^2.1.0", "sass": "^1.63.4", - "satori": "^0.10.1", - "satori-html": "^0.3.2", "svelte": "^3.59.1", "svelte-check": "^3.4.3", "svelte-preprocess": "^5.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bf9a80..411606a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,21 +83,15 @@ importers: sass: specifier: ^1.63.4 version: 1.63.4 - satori: - specifier: ^0.10.1 - version: 0.10.1 - satori-html: - specifier: ^0.3.2 - version: 0.3.2 svelte: specifier: ^3.59.1 version: 3.59.1 svelte-check: specifier: ^3.4.3 - version: 3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) + version: 3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + version: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) tslib: specifier: ^2.5.3 version: 2.5.3 @@ -121,7 +115,7 @@ importers: version: 0.2.8 vite: specifier: ^4.3.9 - version: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + version: 4.3.9(sass@1.63.4) packages/banners: dependencies: @@ -2306,7 +2300,7 @@ packages: dependencies: svelte: 3.59.1 svgo: 3.0.2 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) dev: true /@radix-ui/colors@0.1.8: @@ -2437,6 +2431,7 @@ packages: dependencies: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 + dev: false /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} @@ -2492,7 +2487,7 @@ packages: svelte: 3.59.1 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) transitivePeerDependencies: - supports-color dev: true @@ -2508,7 +2503,7 @@ packages: '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) debug: 4.3.4 svelte: 3.59.1 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) transitivePeerDependencies: - supports-color dev: true @@ -2527,7 +2522,7 @@ packages: magic-string: 0.30.0 svelte: 3.59.1 svelte-hmr: 0.15.2(svelte@3.59.1) - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color @@ -3048,7 +3043,7 @@ packages: chokidar: 3.5.3 fast-glob: 3.2.12 magic-string: 0.30.0 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) transitivePeerDependencies: - rollup dev: true @@ -3703,6 +3698,7 @@ packages: /base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} + dev: false /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3905,6 +3901,7 @@ packages: /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -4223,13 +4220,16 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + dev: false /css-box-shadow@1.0.0-3: resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + dev: false /css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + dev: false /css-declaration-sorter@6.4.0(postcss@8.4.24): resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} @@ -4266,6 +4266,7 @@ packages: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 + dev: false /css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} @@ -4683,6 +4684,7 @@ packages: /emoji-regex@10.2.1: resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5708,6 +5710,7 @@ packages: /fflate@0.7.4: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + dev: false /figures@1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} @@ -6233,6 +6236,7 @@ packages: /hex-rgb@4.3.0: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} + dev: false /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -6883,6 +6887,7 @@ packages: dependencies: base64-js: 0.0.8 unicode-trie: 2.0.0 + dev: false /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8071,6 +8076,7 @@ packages: dependencies: color-name: 1.1.4 hex-rgb: 4.3.0 + dev: false /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -9232,6 +9238,7 @@ packages: resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} dependencies: ultrahtml: 1.2.0 + dev: false /satori@0.10.1: resolution: {integrity: sha512-F4bTCkDp931tLb7+UCNPBuSQwXhikrUkI4fBQo6fA8lF0Evqqgg3nDyUpRktQpR5Ry1DIiIVqLyEwkAms87ykg==} @@ -9247,6 +9254,7 @@ packages: parse-css-color: 0.2.1 postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 + dev: false /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} @@ -9516,6 +9524,7 @@ packages: /string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + dev: false /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} @@ -9665,7 +9674,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): + /svelte-check@3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): resolution: {integrity: sha512-O07soQFY3X0VDt+bcGc6D5naz0cLtjwnmNP9JsEBPVyMemFEqUhL2OdLqvkl5H/u8Jwm50EiAU4BPRn5iin/kg==} hasBin: true peerDependencies: @@ -9678,7 +9687,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.59.1 - svelte-preprocess: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) typescript: 5.1.3 transitivePeerDependencies: - '@babel/core' @@ -9715,7 +9724,7 @@ packages: svelte: 3.59.1 dev: true - /svelte-preprocess@5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3): + /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -9753,7 +9762,6 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.5 '@types/pug': 2.0.6 detect-indent: 6.1.0 magic-string: 0.27.0 @@ -9871,6 +9879,7 @@ packages: /tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + dev: false /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -10120,6 +10129,7 @@ packages: /ultrahtml@1.2.0: resolution: {integrity: sha512-vxZM2yNvajRmCj/SknRYGNXk2tqiy6kRNvZjJLaleG3zJbSh/aNkOqD1/CVzypw8tyHyhpzYuwQgMMhUB4ZVNQ==} + dev: false /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -10173,6 +10183,7 @@ packages: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 + dev: false /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -10561,6 +10572,39 @@ packages: fsevents: 2.3.2 dev: true + /vite@4.3.9(sass@1.63.4): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.17.19 + postcss: 8.4.24 + rollup: 3.25.1 + sass: 1.63.4 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vitefu@0.2.4(vite@4.3.9): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -10569,7 +10613,7 @@ packages: vite: optional: true dependencies: - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(sass@1.63.4) dev: true /vm2@3.9.19: @@ -10815,6 +10859,7 @@ packages: /yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + dev: false /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From 23908cdc5bff4ef173c087ecaacd3dd151aee0a4 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Thu, 22 Jun 2023 15:23:11 -0300 Subject: [PATCH 03/27] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20move=20a?= =?UTF-8?q?nd=20refactor=20code=20to=20the=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moved and refactored most of the banner creation code to the @marknow/banner package. --- .eslintrc.cjs | 1 + apps/www/.eslintignore | 2 - apps/www/src/routes/api.svg/+server.ts | 33 ++----- apps/www/src/routes/api.svg/Banner.html | 48 ---------- packages/banners/.eslintignore | 2 + .../src}/assets/Mona-Sans-Regular.woff | Bin .../src}/assets/Mona-Sans-SemiBold.woff | Bin packages/banners/src/fonts.js | 29 ++++++ packages/banners/src/html.js | 85 ++++++++++++++++++ packages/banners/src/index.d.ts | 3 + packages/banners/src/index.js | 43 +++++++++ packages/banners/src/types.d.ts | 46 ++++++++++ 12 files changed, 215 insertions(+), 77 deletions(-) delete mode 100644 apps/www/src/routes/api.svg/Banner.html rename {apps/www/src/lib => packages/banners/src}/assets/Mona-Sans-Regular.woff (100%) rename {apps/www/src/lib => packages/banners/src}/assets/Mona-Sans-SemiBold.woff (100%) create mode 100644 packages/banners/src/fonts.js create mode 100644 packages/banners/src/html.js create mode 100644 packages/banners/src/index.d.ts create mode 100644 packages/banners/src/index.js create mode 100644 packages/banners/src/types.d.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 204d07c..daf05fd 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -226,6 +226,7 @@ module.exports = { 'duotone', 'tsconfig', 'workspace', + 'woff', ], minLength: 4, }], diff --git a/apps/www/.eslintignore b/apps/www/.eslintignore index c191179..7c1958c 100644 --- a/apps/www/.eslintignore +++ b/apps/www/.eslintignore @@ -1,5 +1,3 @@ /src/lib/components.d.ts /src/lib/imports.d.ts /.eslint-auto-import.json -*.woff -*.woff2 diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index da95891..4457ad2 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -1,33 +1,12 @@ import type { RequestHandler } from '@sveltejs/kit'; -import satori from 'satori'; -import { html as satoriHtml } from 'satori-html'; -import Banner from './Banner.html?raw'; -import font400 from '$lib/assets/Mona-Sans-Regular.woff?url'; -import font600 from '$lib/assets/Mona-Sans-SemiBold.woff?url'; +import newBanner from '@marknow/banners'; -export const GET = (async ({ fetch }): Promise => { - const html = satoriHtml(Banner); +export const GET = (async (): Promise => { + const banner = await newBanner({ + title: 'Hello world', + }); - const banner = await satori(html, - { - width: 1000, - height: 180, - fonts: [ - { - name: 'Mona Sans', - weight: 400, - style: 'normal', - data: await (await fetch(font400)).arrayBuffer(), - }, - { - name: 'Mona Sans', - weight: 600, - style: 'normal', - data: await (await fetch(font600)).arrayBuffer(), - }], - }); - - return new Response(banner, { + return new Response(`${banner.toString()}`, { status: 200, headers: { 'Content-type': 'image/svg+xml', diff --git a/apps/www/src/routes/api.svg/Banner.html b/apps/www/src/routes/api.svg/Banner.html deleted file mode 100644 index a0066b4..0000000 --- a/apps/www/src/routes/api.svg/Banner.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
-
- - - - - - -
-
-
-

Marknow

- - Create beautiful markdown for your projects with ease - -
-
-
-
diff --git a/packages/banners/.eslintignore b/packages/banners/.eslintignore index 9b1c8b1..090e4b1 100644 --- a/packages/banners/.eslintignore +++ b/packages/banners/.eslintignore @@ -1 +1,3 @@ /dist +*.woff +*.woff2 diff --git a/apps/www/src/lib/assets/Mona-Sans-Regular.woff b/packages/banners/src/assets/Mona-Sans-Regular.woff similarity index 100% rename from apps/www/src/lib/assets/Mona-Sans-Regular.woff rename to packages/banners/src/assets/Mona-Sans-Regular.woff diff --git a/apps/www/src/lib/assets/Mona-Sans-SemiBold.woff b/packages/banners/src/assets/Mona-Sans-SemiBold.woff similarity index 100% rename from apps/www/src/lib/assets/Mona-Sans-SemiBold.woff rename to packages/banners/src/assets/Mona-Sans-SemiBold.woff diff --git a/packages/banners/src/fonts.js b/packages/banners/src/fonts.js new file mode 100644 index 0000000..5604b0a --- /dev/null +++ b/packages/banners/src/fonts.js @@ -0,0 +1,29 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +/** + * @param {import('./types').Reader | undefined} reader + * @typedef {import('satori').SatoriOptions['fonts'][0]} Font + * @returns {Promise<{regular: Font, bold: Font}>} + */ +export async function getMonaSansFonts(reader) { + reader ||= (await import('node:fs/promises')).readFile; + + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + + return { + regular: { + name: 'Mona Sans', + weight: 400, + style: 'normal', + data: await reader(join(__dirname, './assets/Mona-Sans-Regular.woff')), + }, + bold: { + name: 'Mona Sans', + weight: 600, + style: 'normal', + data: await reader(join(__dirname, './assets/Mona-Sans-SemiBold.woff')), + }, + }; +} diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js new file mode 100644 index 0000000..eb40e1d --- /dev/null +++ b/packages/banners/src/html.js @@ -0,0 +1,85 @@ +/* eslint-disable complexity */ +/* eslint-disable @typescript-eslint/indent */ +/** + * Returns the html string of the banner to be used by satori. + * Use the params to customize and complete it. + * + * @param {'vertical' | 'horizontal'} layout + * @param {{width: number, height: number}} dimensions + * + * @return {string} + */ +export function generateBannerHtml(layout, dimensions) { + /** @type {boolean} */ + const horizontal = layout === 'horizontal'; + + return ` +
+
+
+ + + + + + +
+
+
+

+ %%MARKNOW-PLACEHOLDER-TITLE%% +

+ + %%MARKNOW-PLACEHOLDER-SUBTILE%% + +
+
+
+
+ `; +} diff --git a/packages/banners/src/index.d.ts b/packages/banners/src/index.d.ts new file mode 100644 index 0000000..3f1888b --- /dev/null +++ b/packages/banners/src/index.d.ts @@ -0,0 +1,3 @@ +import type { BannerOptions, Banner } from "./types"; + +export default async function banner(options: BannerOptions): Promise; diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js new file mode 100644 index 0000000..50705af --- /dev/null +++ b/packages/banners/src/index.js @@ -0,0 +1,43 @@ +import { html as htmlToVNodes } from 'satori-html'; +import satori from 'satori'; +import { generateBannerHtml } from './html'; +import { getMonaSansFonts } from './fonts'; + +/** + * @param {import('./types').BannerOptions} options + * @returns {Promise} + */ +export default async function banner({ + title, + subtitle = '', + layout = 'horizontal', + config, +}) { + const dimensions = { + width: 1000, + height: layout === 'horizontal' ? 180 : 680, + }; + + const bannerFonts = await getMonaSansFonts(config?.reader); + + const html = generateBannerHtml(layout, dimensions) + .replace('%%MARKNOW-PLACEHOLDER-TITLE%%', title) + .replace('%%MARKNOW-PLACEHOLDER-SUBTILE%%', subtitle); + + const vNodes = htmlToVNodes(html); + + const svg = await satori(vNodes, { + ...dimensions, + fonts: [ + bannerFonts.bold, + bannerFonts.regular, + ], + }); + + return { + html, + vNodes, + svg, + toString() { return svg; }, + }; +} diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts new file mode 100644 index 0000000..e632df3 --- /dev/null +++ b/packages/banners/src/types.d.ts @@ -0,0 +1,46 @@ +import type { Abortable } from "node:events"; +import type { OpenMode, PathLike } from "node:fs"; +import type { FileHandle } from "node:fs/promises"; + +export type Reader = ( + path: PathLike | FileHandle, +) => Promise + +/** + * Options object for creating a banner. + * + * @package `@marknow/banners` + */ +export interface BannerOptions { + title: string, + subtitle?: string, + layout?: 'horizontal' | 'vertical' = 'horizontal', + config?: { + reader?: Reader, + } +} + +/** + * + */ +export interface Banner { + toString(): string, + html: string, + svg: string, + vNodes: VNode, +} + +/** + * **Copied from the satori-html package,** + * React-element-like objects / VDOM object used in satori. + * + * @package `satori-html` + */ +export interface VNode { + type: string; + props: { + style?: Record; + children?: string | VNode | VNode[]; + [prop: string]: any; + }; +} From 04b5d9aa3831e2eb79ee3a7fffa7f137150bcd95 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:25:50 -0300 Subject: [PATCH 04/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20truncate?= =?UTF-8?q?=20long=20titles=20and=20subtitles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/index.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 50705af..4df729f 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -13,6 +13,15 @@ export default async function banner({ layout = 'horizontal', config, }) { + if (layout === 'horizontal') { + title = truncateText(title, 45); + subtitle = truncateText(subtitle, 100); + } + else { + title = truncateText(title, 90); + subtitle = truncateText(subtitle, 200); + } + const dimensions = { width: 1000, height: layout === 'horizontal' ? 180 : 680, @@ -41,3 +50,8 @@ export default async function banner({ toString() { return svg; }, }; } + +/** @type {(string: string, maxChar: number) => string} */ +function truncateText(string, maxChar) { + return string.length > maxChar ? `${string.slice(0, maxChar)}...` : string; +} From 7e979862365de3f7b567063552d2d2b8f03f9714 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:44:53 -0300 Subject: [PATCH 05/27] =?UTF-8?q?fix(deps):=20=F0=9F=90=9B=20(temporally)?= =?UTF-8?q?=20fix=20satori=20deps=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It seems that the satori package of @marknow/banners is not being correctly bundled and transformed by Vite. The `satori > linebreak > unicode-trie` dependency is not transformed from commonjs to esm. But, installing satori as a dependency seems to fix it. --- apps/www/package.json | 3 +- pnpm-lock.yaml | 260 +++++++++++++++++++++++++++++++++--------- 2 files changed, 208 insertions(+), 55 deletions(-) diff --git a/apps/www/package.json b/apps/www/package.json index 6048722..7d9e2f6 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -31,7 +31,8 @@ "@unocss/extractor-svelte": "^0.52.7", "mdsvex": "^0.10.6", "rehype-external-links": "^2.1.0", - "sass": "^1.63.4", + "sass": "^1.63.6", + "satori": "^0.10.1", "svelte": "^3.59.1", "svelte-check": "^3.4.3", "svelte-preprocess": "^5.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 411606a..8b512c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,10 +67,10 @@ importers: version: 1.20.2(svelte@3.59.1)(vite@4.3.9) '@typescript-eslint/eslint-plugin': specifier: ^5.59.11 - version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3) + version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.43.0)(typescript@5.1.3) '@typescript-eslint/parser': specifier: ^5.59.11 - version: 5.59.11(eslint@8.42.0)(typescript@5.1.3) + version: 5.59.11(eslint@8.43.0)(typescript@5.1.3) '@unocss/extractor-svelte': specifier: ^0.52.7 version: 0.52.7 @@ -81,17 +81,20 @@ importers: specifier: ^2.1.0 version: 2.1.0 sass: - specifier: ^1.63.4 - version: 1.63.4 + specifier: ^1.63.6 + version: 1.63.6 + satori: + specifier: ^0.10.1 + version: 0.10.1 svelte: specifier: ^3.59.1 version: 3.59.1 svelte-check: specifier: ^3.4.3 - version: 3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) + version: 3.4.3(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1) svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + version: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) tslib: specifier: ^2.5.3 version: 2.5.3 @@ -115,7 +118,7 @@ importers: version: 0.2.8 vite: specifier: ^4.3.9 - version: 4.3.9(sass@1.63.4) + version: 4.3.9(sass@1.63.6) packages/banners: dependencies: @@ -2085,6 +2088,16 @@ packages: eslint-visitor-keys: 3.4.1 dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.43.0 + eslint-visitor-keys: 3.4.1 + dev: true + /@eslint-community/regexpp@4.5.1: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -2112,6 +2125,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.43.0: + resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@fontsource-variable/fira-code@5.0.3: resolution: {integrity: sha512-OfishGTVN3fUM8M27P0NYV4UvugpLigP8DjMHnG9kars9ZRbRPTnfW4lGJELGCXFf6IQVJ2uRyjUKWNIx/Sd2w==} dev: true @@ -2300,7 +2318,7 @@ packages: dependencies: svelte: 3.59.1 svgo: 3.0.2 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) dev: true /@radix-ui/colors@0.1.8: @@ -2431,7 +2449,6 @@ packages: dependencies: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 - dev: false /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} @@ -2487,7 +2504,7 @@ packages: svelte: 3.59.1 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) transitivePeerDependencies: - supports-color dev: true @@ -2503,7 +2520,7 @@ packages: '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) debug: 4.3.4 svelte: 3.59.1 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) transitivePeerDependencies: - supports-color dev: true @@ -2522,7 +2539,7 @@ packages: magic-string: 0.30.0 svelte: 3.59.1 svelte-hmr: 0.15.2(svelte@3.59.1) - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color @@ -2739,6 +2756,34 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/parser': 5.59.11(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/type-utils': 5.59.11(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.11(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.43.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@5.59.11(eslint@8.42.0)(typescript@5.1.3): resolution: {integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2759,6 +2804,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@5.59.11(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.43.0 + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@5.59.11: resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2787,6 +2852,26 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils@5.59.11(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.11(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.43.0 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@5.59.11: resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2833,6 +2918,26 @@ packages: - typescript dev: true + /@typescript-eslint/utils@5.59.11(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) + eslint: 8.43.0 + eslint-scope: 5.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.59.11: resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3043,7 +3148,7 @@ packages: chokidar: 3.5.3 fast-glob: 3.2.12 magic-string: 0.30.0 - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) transitivePeerDependencies: - rollup dev: true @@ -3084,9 +3189,9 @@ packages: find-up: 5.0.0 javascript-stringify: 2.1.0 lodash: 4.17.21 - mlly: 1.3.0 + mlly: 1.4.0 outdent: 0.8.0 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) vite-node: 0.28.5(@types/node@14.18.33) transitivePeerDependencies: - '@types/node' @@ -3285,7 +3390,7 @@ packages: cacache: 15.3.0 chalk: 4.1.2 chokidar: 3.5.3 - dotenv: 16.1.4 + dotenv: 16.3.1 esbuild: 0.17.6 esbuild-plugin-polyfill-node: 0.2.0(esbuild@0.17.6) execa: 5.1.1 @@ -3386,12 +3491,12 @@ packages: negotiator: 0.6.3 dev: true - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.9.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.9.0 dev: true /acorn-walk@8.2.0: @@ -3405,6 +3510,12 @@ packages: hasBin: true dev: true + /acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3698,7 +3809,6 @@ packages: /base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} - dev: false /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3901,7 +4011,6 @@ packages: /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -4220,16 +4329,13 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - dev: false /css-box-shadow@1.0.0-3: resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - dev: false /css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} - dev: false /css-declaration-sorter@6.4.0(postcss@8.4.24): resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} @@ -4266,7 +4372,6 @@ packages: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 - dev: false /css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} @@ -4628,8 +4733,8 @@ packages: is-obj: 2.0.0 dev: true - /dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} dev: true @@ -4684,7 +4789,6 @@ packages: /emoji-regex@10.2.1: resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5472,6 +5576,54 @@ packages: - supports-color dev: true + /eslint@8.43.0: + resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.43.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} dev: true @@ -5480,8 +5632,8 @@ packages: resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.1 dev: true @@ -5710,7 +5862,6 @@ packages: /fflate@0.7.4: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - dev: false /figures@1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} @@ -6236,7 +6387,6 @@ packages: /hex-rgb@4.3.0: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} - dev: false /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -6887,7 +7037,6 @@ packages: dependencies: base64-js: 0.0.8 unicode-trie: 2.0.0 - dev: false /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -7359,8 +7508,8 @@ packages: /micromark-extension-mdxjs@1.0.1: resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -7701,6 +7850,15 @@ packages: ufo: 1.1.2 dev: true + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.9.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -8076,7 +8234,6 @@ packages: dependencies: color-name: 1.1.4 hex-rgb: 4.3.0 - dev: false /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -9224,8 +9381,8 @@ packages: rimraf: 2.7.1 dev: true - /sass@1.63.4: - resolution: {integrity: sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ==} + /sass@1.63.6: + resolution: {integrity: sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -9254,7 +9411,6 @@ packages: parse-css-color: 0.2.1 postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 - dev: false /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} @@ -9524,7 +9680,6 @@ packages: /string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - dev: false /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} @@ -9674,7 +9829,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@3.4.3(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): + /svelte-check@3.4.3(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1): resolution: {integrity: sha512-O07soQFY3X0VDt+bcGc6D5naz0cLtjwnmNP9JsEBPVyMemFEqUhL2OdLqvkl5H/u8Jwm50EiAU4BPRn5iin/kg==} hasBin: true peerDependencies: @@ -9687,7 +9842,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.59.1 - svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3) + svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) typescript: 5.1.3 transitivePeerDependencies: - '@babel/core' @@ -9724,7 +9879,7 @@ packages: svelte: 3.59.1 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@5.1.3): + /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -9766,7 +9921,7 @@ packages: detect-indent: 6.1.0 magic-string: 0.27.0 postcss: 8.4.24 - sass: 1.63.4 + sass: 1.63.6 sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 3.59.1 @@ -9879,7 +10034,6 @@ packages: /tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: false /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -10183,7 +10337,6 @@ packages: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: false /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -10522,12 +10675,12 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.3.0 + mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.4) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) transitivePeerDependencies: - '@types/node' - less @@ -10538,7 +10691,7 @@ packages: - terser dev: true - /vite@4.3.9(@types/node@14.18.33)(sass@1.63.4): + /vite@4.3.9(@types/node@14.18.33)(sass@1.63.6): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -10567,12 +10720,12 @@ packages: esbuild: 0.17.19 postcss: 8.4.24 rollup: 3.25.1 - sass: 1.63.4 + sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 dev: true - /vite@4.3.9(sass@1.63.4): + /vite@4.3.9(sass@1.63.6): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -10600,7 +10753,7 @@ packages: esbuild: 0.17.19 postcss: 8.4.24 rollup: 3.25.1 - sass: 1.63.4 + sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 dev: true @@ -10613,7 +10766,7 @@ packages: vite: optional: true dependencies: - vite: 4.3.9(sass@1.63.4) + vite: 4.3.9(sass@1.63.6) dev: true /vm2@3.9.19: @@ -10621,7 +10774,7 @@ packages: engines: {node: '>=6.0'} hasBin: true dependencies: - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 dev: true @@ -10859,7 +11012,6 @@ packages: /yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - dev: false /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From 950c6cbe8901b83aa09de8d16d67eb2f8dbbf3fe Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:13:19 -0300 Subject: [PATCH 06/27] =?UTF-8?q?refactor(banners):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20rename=20`config`=20param=20to=20`libConfig`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/index.js | 2 +- packages/banners/src/types.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 4df729f..68b3006 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -11,7 +11,7 @@ export default async function banner({ title, subtitle = '', layout = 'horizontal', - config, + libConfig: config, }) { if (layout === 'horizontal') { title = truncateText(title, 45); diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index e632df3..16e03d8 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -15,7 +15,7 @@ export interface BannerOptions { title: string, subtitle?: string, layout?: 'horizontal' | 'vertical' = 'horizontal', - config?: { + libConfig?: { reader?: Reader, } } From af66581c4ef34c7b9d596499a34f81945ecfb077 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:21:37 -0300 Subject: [PATCH 07/27] =?UTF-8?q?feat(banners):=20=E2=9C=A8=20custom=20fon?= =?UTF-8?q?ts=20support=20#10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added custom fonts support for the package. This feature needed to be added earlier than 1.1, so the package could be more easily integrated in the app/web environment. --- apps/www/.eslintignore | 1 + apps/www/src/routes/api.svg/+server.ts | 17 ++++++++++++++++- apps/www/static/Mona-Sans-Regular.woff | Bin 0 -> 19832 bytes apps/www/static/Mona-Sans-SemiBold.woff | Bin 0 -> 19832 bytes packages/banners/src/fonts.js | 6 +++--- packages/banners/src/html.js | 12 ++++++++---- packages/banners/src/index.d.ts | 8 +++++--- packages/banners/src/index.js | 20 +++++++++++--------- packages/banners/src/types.d.ts | 4 ++++ 9 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 apps/www/static/Mona-Sans-Regular.woff create mode 100644 apps/www/static/Mona-Sans-SemiBold.woff diff --git a/apps/www/.eslintignore b/apps/www/.eslintignore index 7c1958c..4ea4c0c 100644 --- a/apps/www/.eslintignore +++ b/apps/www/.eslintignore @@ -1,3 +1,4 @@ /src/lib/components.d.ts /src/lib/imports.d.ts /.eslint-auto-import.json +/static diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index 4457ad2..347a0a3 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -1,9 +1,24 @@ import type { RequestHandler } from '@sveltejs/kit'; import newBanner from '@marknow/banners'; -export const GET = (async (): Promise => { +export const GET = (async ({ fetch }): Promise => { const banner = await newBanner({ title: 'Hello world', + subtitle: 'This is a test!', + font: { + title: { + data: await (await fetch('/Mona-Sans-SemiBold.woff')).arrayBuffer(), + name: 'Mona Sans', + weight: 600, + style: 'normal', + }, + subtitle: { + data: await (await fetch('/Mona-Sans-Regular.woff')).arrayBuffer(), + name: 'Mona Sans', + weight: 400, + style: 'normal', + }, + }, }); return new Response(`${banner.toString()}`, { diff --git a/apps/www/static/Mona-Sans-Regular.woff b/apps/www/static/Mona-Sans-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..d31c6ed0ee68b64d87b3811fc390f1ce3b007b2f GIT binary patch literal 19832 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¨$-|_@;LxR| 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 CoZJ8a literal 0 HcmV?d00001 diff --git a/apps/www/static/Mona-Sans-SemiBold.woff b/apps/www/static/Mona-Sans-SemiBold.woff new file mode 100644 index 0000000000000000000000000000000000000000..b57fb154f4edde4319c05d83f31171a54906a32b GIT binary patch literal 19832 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 + * @returns {Promise<{subtitle: Font, title: Font}>} */ export async function getMonaSansFonts(reader) { reader ||= (await import('node:fs/promises')).readFile; @@ -13,13 +13,13 @@ export async function getMonaSansFonts(reader) { const __dirname = dirname(__filename); return { - regular: { + subtitle: { name: 'Mona Sans', weight: 400, style: 'normal', data: await reader(join(__dirname, './assets/Mona-Sans-Regular.woff')), }, - bold: { + title: { name: 'Mona Sans', weight: 600, style: 'normal', diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index eb40e1d..e1800a3 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -4,12 +4,15 @@ * Returns the html string of the banner to be used by satori. * Use the params to customize and complete it. * + * @typedef {import('satori').SatoriOptions['fonts'][0]} Font + * * @param {'vertical' | 'horizontal'} layout * @param {{width: number, height: number}} dimensions + * @param {{subtitle: Font, title: Font}} fonts * * @return {string} */ -export function generateBannerHtml(layout, dimensions) { +export function generateBannerHtml(layout, dimensions, fonts) { /** @type {boolean} */ const horizontal = layout === 'horizontal'; @@ -24,7 +27,6 @@ export function generateBannerHtml(layout, dimensions) {

; +/** + * @param {import('./types').BannerOptions} options + * @returns {Promise} + */ +export default function banner({ title, subtitle, icon, layout, config, }: import('./types').BannerOptions): Promise; diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 68b3006..a7bc97f 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -11,8 +11,14 @@ export default async function banner({ title, subtitle = '', layout = 'horizontal', + font: customFonts, libConfig: config, }) { + const dimensions = { + width: 1000, + height: 180, + }; + if (layout === 'horizontal') { title = truncateText(title, 45); subtitle = truncateText(subtitle, 100); @@ -20,16 +26,12 @@ export default async function banner({ else { title = truncateText(title, 90); subtitle = truncateText(subtitle, 200); + dimensions.height = 680; } - const dimensions = { - width: 1000, - height: layout === 'horizontal' ? 180 : 680, - }; + const bannerFonts = customFonts ?? await getMonaSansFonts(config?.reader); - const bannerFonts = await getMonaSansFonts(config?.reader); - - const html = generateBannerHtml(layout, dimensions) + const html = generateBannerHtml(layout, dimensions, bannerFonts) .replace('%%MARKNOW-PLACEHOLDER-TITLE%%', title) .replace('%%MARKNOW-PLACEHOLDER-SUBTILE%%', subtitle); @@ -38,8 +40,8 @@ export default async function banner({ const svg = await satori(vNodes, { ...dimensions, fonts: [ - bannerFonts.bold, - bannerFonts.regular, + bannerFonts.title, + bannerFonts.subtitle, ], }); diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index 16e03d8..2905fae 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -15,6 +15,10 @@ export interface BannerOptions { title: string, subtitle?: string, layout?: 'horizontal' | 'vertical' = 'horizontal', + font?: { + title: Font, + subtitle: Font, + }, libConfig?: { reader?: Reader, } From a22aae7c73e8d4809d1db5ee3857e97656ef9543 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:47:59 -0300 Subject: [PATCH 08/27] =?UTF-8?q?feat(banners):=20=E2=9C=A8=20custom=20col?= =?UTF-8?q?ors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feature (Banners): Custom colors #9 --- apps/www/src/routes/api.svg/+server.ts | 4 ++++ packages/banners/src/html.js | 6 ++++-- packages/banners/src/index.js | 6 +++++- packages/banners/src/types.d.ts | 14 ++++++++++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index 347a0a3..e7cd25a 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -5,6 +5,10 @@ export const GET = (async ({ fetch }): Promise => { const banner = await newBanner({ title: 'Hello world', subtitle: 'This is a test!', + colors: { + background: '#000000', + foreground: '#ffffff', + }, font: { title: { data: await (await fetch('/Mona-Sans-SemiBold.woff')).arrayBuffer(), diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index e1800a3..7664053 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -9,10 +9,11 @@ * @param {'vertical' | 'horizontal'} layout * @param {{width: number, height: number}} dimensions * @param {{subtitle: Font, title: Font}} fonts + * @param {import('./types').Colors} colors * * @return {string} */ -export function generateBannerHtml(layout, dimensions, fonts) { +export function generateBannerHtml(layout, dimensions, fonts, colors) { /** @type {boolean} */ const horizontal = layout === 'horizontal'; @@ -27,7 +28,8 @@ export function generateBannerHtml(layout, dimensions, fonts) {
Date: Fri, 23 Jun 2023 13:48:36 -0300 Subject: [PATCH 09/27] =?UTF-8?q?chore(banners):=20=F0=9F=94=A7=20dev=20sc?= =?UTF-8?q?ript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/banners/package.json b/packages/banners/package.json index 66c04eb..3263fe7 100644 --- a/packages/banners/package.json +++ b/packages/banners/package.json @@ -19,7 +19,7 @@ "scripts": { "build:cjs": "microbundle --compress false --pkg-main false --strict --tsconfig ./jsconfig.json --generateTypes false -f cjs --target node", "build": "pnpm run build:cjs", - "dev": "microbundle -w --compress false" + "dev": "pnpm run build -w" }, "dependencies": { "satori": "^0.10.1", From 1759852c4038ee44bc2af1208e014d6225f60634 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:19:55 -0300 Subject: [PATCH 10/27] =?UTF-8?q?feat(banners):=20=E2=9C=A8=20right-to-lef?= =?UTF-8?q?t=20layout/lang=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/www/src/routes/api.svg/+server.ts | 1 + packages/banners/src/html.js | 40 ++++++++++++++++++++------ packages/banners/src/index.js | 5 +++- packages/banners/src/types.d.ts | 1 + 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index e7cd25a..6f6c90b 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -23,6 +23,7 @@ export const GET = (async ({ fetch }): Promise => { style: 'normal', }, }, + rtl: true, }); return new Response(`${banner.toString()}`, { diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index 7664053..d4658a0 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -6,14 +6,24 @@ * * @typedef {import('satori').SatoriOptions['fonts'][0]} Font * - * @param {'vertical' | 'horizontal'} layout - * @param {{width: number, height: number}} dimensions - * @param {{subtitle: Font, title: Font}} fonts - * @param {import('./types').Colors} colors + * @typedef {{ + * layout: 'vertical' | 'horizontal', + * dimensions: { width: number, height: number } + * fonts: { title: Font, subtitle: Font } + * colors: import('./types').Colors + * rtl: boolean + * }} Props + * @param {Props} properties * * @return {string} */ -export function generateBannerHtml(layout, dimensions, fonts, colors) { +export function generateBannerHtml({ + layout, + dimensions, + colors, + fonts, + rtl, +}) { /** @type {boolean} */ const horizontal = layout === 'horizontal'; @@ -35,8 +45,10 @@ export function generateBannerHtml(layout, dimensions, fonts, colors) { padding: ${horizontal ? '1.2' : '2.5'}em 2.5em; display: flex; ${horizontal - ? 'flex-direction: row;' - : 'flex-direction: column;' + ? rtl + ? 'flex-direction: row-reverse;' + : 'flex-direction: row;' + : 'flex-direction: column;' } align-items: center; min-width: 98%; @@ -69,7 +81,12 @@ export function generateBannerHtml(layout, dimensions, fonts, colors) { font-family: ${fonts.title.name}; text-overflow: ellipsis; max-width: 50em; - ${horizontal ? 'text-align: start;' : 'text-align: center;'} + display: flex; + flex-direction: ${rtl ? 'row-reverse' : 'row'}; + ${horizontal + ? 'text-align: start;' + : 'text-align: center;' + } "> %%MARKNOW-PLACEHOLDER-TITLE%%

@@ -79,7 +96,12 @@ export function generateBannerHtml(layout, dimensions, fonts, colors) { font-family: ${fonts.subtitle.name}; text-overflow: ellipsis; max-width: 50em; - ${horizontal ? 'text-align: start;' : 'text-align: center;'} + display: flex; + flex-direction: ${rtl ? 'row-reverse' : 'row'}; + ${horizontal + ? 'text-align: start;' + : 'text-align: center;' + } "> %%MARKNOW-PLACEHOLDER-SUBTILE%% diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 2c907b4..d22c434 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -16,6 +16,7 @@ export default async function banner({ }, layout = 'horizontal', font: customFonts, + rtl = false, libConfig: config, }) { const dimensions = { @@ -35,7 +36,9 @@ export default async function banner({ const bannerFonts = customFonts ?? await getMonaSansFonts(config?.reader); - const html = generateBannerHtml(layout, dimensions, bannerFonts, colors) + const htmlTemplate = generateBannerHtml({ layout, dimensions, fonts: bannerFonts, colors, rtl }); + + const html = htmlTemplate .replace('%%MARKNOW-PLACEHOLDER-TITLE%%', title) .replace('%%MARKNOW-PLACEHOLDER-SUBTILE%%', subtitle); diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index 869cfb4..07660da 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -29,6 +29,7 @@ export interface BannerOptions { subtitle: Font, } colors?: Colors, + rtl?: boolean, libConfig?: { reader?: Reader, } From 78ca4fc4ba72c81b23c721451e7dab9b2c896e97 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:41:17 -0300 Subject: [PATCH 11/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20vertical?= =?UTF-8?q?=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/html.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index d4658a0..b75039b 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -51,6 +51,7 @@ export function generateBannerHtml({ : 'flex-direction: column;' } align-items: center; + justify-content: center; min-width: 98%; min-height: 20%; gap: 1em; @@ -76,17 +77,13 @@ export function generateBannerHtml({ ">

%%MARKNOW-PLACEHOLDER-TITLE%%

@@ -99,8 +96,8 @@ export function generateBannerHtml({ display: flex; flex-direction: ${rtl ? 'row-reverse' : 'row'}; ${horizontal - ? 'text-align: start;' - : 'text-align: center;' + ? 'margin: 0;' + : 'margin: 0 auto;' } "> %%MARKNOW-PLACEHOLDER-SUBTILE%% From b2069b920fda72abf0a4eb52f3d0772bb1e9f734 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:46:24 -0300 Subject: [PATCH 12/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20vertical/h?= =?UTF-8?q?orizontal=20layout=20toggle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/html.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index b75039b..fd68429 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -51,7 +51,10 @@ export function generateBannerHtml({ : 'flex-direction: column;' } align-items: center; - justify-content: center; + ${horizontal + ? 'justify-content: flex-start;' + : 'justify-content: center;' + } min-width: 98%; min-height: 20%; gap: 1em; From 4452ac2d2496c524448e70f404465081d61278e1 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:47:46 -0300 Subject: [PATCH 13/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20vertical?= =?UTF-8?q?=20layout=20height?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index d22c434..3cee6dc 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -31,7 +31,7 @@ export default async function banner({ else { title = truncateText(title, 90); subtitle = truncateText(subtitle, 200); - dimensions.height = 680; + dimensions.height = 1300; } const bannerFonts = customFonts ?? await getMonaSansFonts(config?.reader); From 1bf5c1ff608722283b7749c28e115b551914d16d Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:04:38 -0300 Subject: [PATCH 14/27] =?UTF-8?q?feat(banners):=20=E2=9C=A8=20custom=20ico?= =?UTF-8?q?n=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/www/src/routes/api.svg/+server.ts | 5 ++- packages/banners/src/html.js | 12 ++--- packages/banners/src/icons.js | 62 ++++++++++++++++++++++++++ packages/banners/src/index.js | 14 ++++-- packages/banners/src/types.d.ts | 10 ++++- 5 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 packages/banners/src/icons.js diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index 6f6c90b..e617b97 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -5,6 +5,7 @@ export const GET = (async ({ fetch }): Promise => { const banner = await newBanner({ title: 'Hello world', subtitle: 'This is a test!', + icon: 'https://raw.githubusercontent.com/LoredDev/.github/main/assets/designs/dots-icon-dark.svg', colors: { background: '#000000', foreground: '#ffffff', @@ -23,7 +24,9 @@ export const GET = (async ({ fetch }): Promise => { style: 'normal', }, }, - rtl: true, + libConfig: { + fetcher: fetch, + }, }); return new Response(`${banner.toString()}`, { diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index fd68429..dc35e30 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -63,16 +63,10 @@ export function generateBannerHtml({ align-items: center; display: flex; margin: ${horizontal ? '1.5' : '0'}em 0; + width: 3.5em; + height: 3.5em; "> - - - - - - + %%MARKNOW-PLACEHOLDER-ICON%%
getIcon(icon, config?.fetcher); + const dimensions = { width: 1000, height: 180, @@ -38,9 +42,12 @@ export default async function banner({ const htmlTemplate = generateBannerHtml({ layout, dimensions, fonts: bannerFonts, colors, rtl }); + const iconSvg = await config.iconHandler(icon); + const html = htmlTemplate .replace('%%MARKNOW-PLACEHOLDER-TITLE%%', title) - .replace('%%MARKNOW-PLACEHOLDER-SUBTILE%%', subtitle); + .replace('%%MARKNOW-PLACEHOLDER-SUBTILE%%', subtitle) + .replace('%%MARKNOW-PLACEHOLDER-ICON%%', iconSvg); const vNodes = htmlToVNodes(html); @@ -56,6 +63,7 @@ export default async function banner({ html, vNodes, svg, + icon: iconSvg, toString() { return svg; }, }; } diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index 07660da..5dedb02 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -10,6 +10,10 @@ export type Colors = { background: string; } +export type Fetcher = ( + input: RequestInfo | URL, + init?: RequestInit +) => Promise; export type Reader = ( path: PathLike | FileHandle, @@ -21,6 +25,7 @@ export type Reader = ( * @package `@marknow/banners` */ export interface BannerOptions { + icon?: string, title: string, subtitle?: string, layout?: 'horizontal' | 'vertical', @@ -31,7 +36,9 @@ export interface BannerOptions { colors?: Colors, rtl?: boolean, libConfig?: { + fetcher?: Fetcher = fetch, reader?: Reader, + iconHandler?: (icon: string) => string | Promise } } @@ -42,8 +49,9 @@ export interface Banner { toString(): string, html: string, svg: string, + icon: string, vNodes: VNode, -} +}; /** * **Copied from the satori-html package,** From c2d25da670a36d5de4c998ca14801f519b8f5ad3 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:15:02 -0300 Subject: [PATCH 15/27] =?UTF-8?q?refactor(banners):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20improve=20code=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 2 +- apps/www/src/routes/api.svg/+server.ts | 4 ++-- packages/banners/src/html.js | 10 +++++----- packages/banners/src/index.js | 25 ++++++++----------------- packages/banners/src/types.d.ts | 2 +- 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index daf05fd..0682156 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -188,7 +188,7 @@ module.exports = { '@typescript-eslint/semi': ['error', 'always'], 'max-depth': ['error', 3], 'max-nested-callbacks': ['error', 3], - 'complexity': ['error', 4], + 'complexity': ['error', 8], 'no-tabs': ['error', { allowIndentationTabs: true }], 'spellcheck/spell-checker': ['error', { skipWords: [ diff --git a/apps/www/src/routes/api.svg/+server.ts b/apps/www/src/routes/api.svg/+server.ts index e617b97..1884ce0 100644 --- a/apps/www/src/routes/api.svg/+server.ts +++ b/apps/www/src/routes/api.svg/+server.ts @@ -5,12 +5,12 @@ export const GET = (async ({ fetch }): Promise => { const banner = await newBanner({ title: 'Hello world', subtitle: 'This is a test!', - icon: 'https://raw.githubusercontent.com/LoredDev/.github/main/assets/designs/dots-icon-dark.svg', + icon: 'solar:hand-shake-bold-duotone', colors: { background: '#000000', foreground: '#ffffff', }, - font: { + fonts: { title: { data: await (await fetch('/Mona-Sans-SemiBold.woff')).arrayBuffer(), name: 'Mona Sans', diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index dc35e30..2bbbfe3 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -7,11 +7,11 @@ * @typedef {import('satori').SatoriOptions['fonts'][0]} Font * * @typedef {{ - * layout: 'vertical' | 'horizontal', - * dimensions: { width: number, height: number } - * fonts: { title: Font, subtitle: Font } - * colors: import('./types').Colors - * rtl: boolean + * dimensions: { width: number, height: number }, + * fonts: { title: Font, subtitle: Font }, + * layout: 'vertical' | 'horizontal', + * colors: import('./types').Colors, + * rtl: boolean, * }} Props * @param {Props} properties * diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index b64d2a3..83bcc80 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -18,29 +18,20 @@ export default async function banner({ foreground: '#000000', }, libConfig: config = {}, - font: customFonts, + fonts, rtl = false, }) { config.iconHandler ||= icon => getIcon(icon, config?.fetcher); + fonts ||= await getMonaSansFonts(config?.reader); + title = truncateText(title, layout === 'horizontal' ? 45 : 90); + subtitle = truncateText(subtitle, layout === 'horizontal' ? 100 : 200); const dimensions = { width: 1000, - height: 180, + height: layout === 'horizontal' ? 180 : 1300, }; - if (layout === 'horizontal') { - title = truncateText(title, 45); - subtitle = truncateText(subtitle, 100); - } - else { - title = truncateText(title, 90); - subtitle = truncateText(subtitle, 200); - dimensions.height = 1300; - } - - const bannerFonts = customFonts ?? await getMonaSansFonts(config?.reader); - - const htmlTemplate = generateBannerHtml({ layout, dimensions, fonts: bannerFonts, colors, rtl }); + const htmlTemplate = generateBannerHtml({ layout, dimensions, fonts, colors, rtl }); const iconSvg = await config.iconHandler(icon); @@ -54,8 +45,8 @@ export default async function banner({ const svg = await satori(vNodes, { ...dimensions, fonts: [ - bannerFonts.title, - bannerFonts.subtitle, + fonts.title, + fonts.subtitle, ], }); diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index 5dedb02..e34a475 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -29,7 +29,7 @@ export interface BannerOptions { title: string, subtitle?: string, layout?: 'horizontal' | 'vertical', - font?: { + fonts?: { title: Font, subtitle: Font, } From fcaa77aceaedcb933057dc948e24a02ddafe4843 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Fri, 23 Jun 2023 16:26:28 -0300 Subject: [PATCH 16/27] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20use=20im?= =?UTF-8?q?g=20tag=20instead=20of=20inline=20svg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/www/src/routes/+page.svelte | 16 +++++----------- apps/www/src/routes/+page.ts | 6 ------ 2 files changed, 5 insertions(+), 17 deletions(-) delete mode 100644 apps/www/src/routes/+page.ts diff --git a/apps/www/src/routes/+page.svelte b/apps/www/src/routes/+page.svelte index 12fee3d..d3cb2d7 100644 --- a/apps/www/src/routes/+page.svelte +++ b/apps/www/src/routes/+page.svelte @@ -1,28 +1,22 @@ - -
- {@html data.banner} +
- {@html data.banner} +
- {@html data.banner} +
- {@html data.banner} +
- {@html data.banner} +
diff --git a/apps/www/src/routes/+page.ts b/apps/www/src/routes/+page.ts deleted file mode 100644 index 472c77b..0000000 --- a/apps/www/src/routes/+page.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { PageLoad } from './$types'; - -export const load = (async ({ fetch }): Promise<{ banner: string }> => { - const banner = await (await fetch('/api.svg')).text(); - return { banner }; -}) satisfies PageLoad; From 3ebc02115f2506904393861770594426a49687ab Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 10:42:29 -0300 Subject: [PATCH 17/27] =?UTF-8?q?refactor(banners):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20code=20readability=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/html.js | 5 ++--- packages/banners/src/icons.js | 40 +++++++++++++++++++-------------- packages/banners/src/index.d.ts | 2 ++ packages/banners/src/index.js | 27 +++++++++++----------- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index 2bbbfe3..aa653ff 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -17,14 +17,13 @@ * * @return {string} */ -export function generateBannerHtml({ - layout, +export default function html({ dimensions, + layout, colors, fonts, rtl, }) { - /** @type {boolean} */ const horizontal = layout === 'horizontal'; return ` diff --git a/packages/banners/src/icons.js b/packages/banners/src/icons.js index 68fc0b9..9ff2234 100644 --- a/packages/banners/src/icons.js +++ b/packages/banners/src/icons.js @@ -5,20 +5,36 @@ * @return {Promise} */ export async function getIcon(icon, fetcher = fetch) { - if ((!isIconName(icon) && !isValidUrl(icon))) { + if (!isIconName(icon) && !isValidUrl(icon)) { return icon; } else if (isValidUrl(icon)) { const svg = (await fetcher(icon)).text(); - - return setIconDimensions(await svg); + return svg; } const [collection, iconName] = icon.split(':'); - const svg = (await fetcher(`https://api.iconify.design/${collection}/${iconName}.svg`)).text(); - return setIconDimensions(await svg); + return svg; +} + +export function setIconDimensions(svg, { width, height }) { + width = typeof width === 'number' + ? `width="${width}px"` + : !width + ? '' + : `width="${width}"`; + + height = typeof height === 'number' + ? `height="${height}px"` + : !height + ? '' + : `height="${height}"`; + + return svg + .replace(/width="([^"]*)"/, width) + .replace(/height="([^"]*)"/, height); } /** @@ -27,9 +43,9 @@ export async function getIcon(icon, fetcher = fetch) { * @param {string} iconName * @return {boolean} */ -function isIconName(iconName) { +function isIconName(string) { try { - const [collection, icon] = iconName.split(':'); + const [collection, icon] = string.split(':'); return Boolean(collection) && Boolean(icon); } catch (_) { @@ -50,13 +66,3 @@ function isValidUrl(string) { return false; } } - -/** - * @param {string} svg - * @return {string} - */ -function setIconDimensions(svg) { - return svg - .replace(/width="([^"]*)"/, 'width="3.5em"') - .replace(/height="([^"]*)"/, ''); -} diff --git a/packages/banners/src/index.d.ts b/packages/banners/src/index.d.ts index ede10f2..01e68c9 100644 --- a/packages/banners/src/index.d.ts +++ b/packages/banners/src/index.d.ts @@ -3,3 +3,5 @@ * @returns {Promise} */ export default function banner({ title, subtitle, icon, layout, config, }: import('./types').BannerOptions): Promise; + +export type { BannerOptions, Banner } from './types' diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 83bcc80..8c0367e 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -1,8 +1,8 @@ import { html as htmlToVNodes } from 'satori-html'; import satori from 'satori'; -import { generateBannerHtml } from './html'; +import bannerHtml from './html'; import { getMonaSansFonts } from './fonts'; -import { getIcon } from './icons'; +import { getIcon, setIconDimensions } from './icons'; /** * @param {import('./types').BannerOptions} options @@ -10,19 +10,20 @@ import { getIcon } from './icons'; */ export default async function banner({ title, - subtitle = '', + fonts, icon = '', + rtl = false, + subtitle = '', layout = 'horizontal', + libConfig: config = {}, colors = { background: '#ffffff', foreground: '#000000', }, - libConfig: config = {}, - fonts, - rtl = false, }) { - config.iconHandler ||= icon => getIcon(icon, config?.fetcher); fonts ||= await getMonaSansFonts(config?.reader); + config.iconHandler ||= icon => getIcon(icon, config?.fetcher); + title = truncateText(title, layout === 'horizontal' ? 45 : 90); subtitle = truncateText(subtitle, layout === 'horizontal' ? 100 : 200); @@ -31,9 +32,9 @@ export default async function banner({ height: layout === 'horizontal' ? 180 : 1300, }; - const htmlTemplate = generateBannerHtml({ layout, dimensions, fonts, colors, rtl }); + const htmlTemplate = bannerHtml({ layout, dimensions, fonts, colors, rtl }); - const iconSvg = await config.iconHandler(icon); + const iconSvg = setIconDimensions(await config.iconHandler(icon), { width: '3.5em' }); const html = htmlTemplate .replace('%%MARKNOW-PLACEHOLDER-TITLE%%', title) @@ -51,11 +52,11 @@ export default async function banner({ }); return { - html, - vNodes, - svg, - icon: iconSvg, toString() { return svg; }, + icon: iconSvg, + vNodes, + html, + svg, }; } From 00b4440751bd4c2e546dc48ec8d590cc7276a337 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 10:45:09 -0300 Subject: [PATCH 18/27] =?UTF-8?q?docs(banners):=20=F0=9F=93=9A=EF=B8=8F=20?= =?UTF-8?q?add=20JSDocs=20documentation=20and=20infos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 4 + packages/banners/src/fonts.js | 7 +- packages/banners/src/html.js | 11 +- packages/banners/src/icons.js | 51 ++++++-- packages/banners/src/index.d.ts | 53 +++++++- packages/banners/src/index.js | 53 +++++++- packages/banners/src/types.d.ts | 225 +++++++++++++++++++++++++++----- 7 files changed, 349 insertions(+), 55 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 0682156..54ea248 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -227,6 +227,10 @@ module.exports = { 'tsconfig', 'workspace', 'woff', + 'marknow', + 'lored', + 'guz013', + 'xml', ], minLength: 4, }], diff --git a/packages/banners/src/fonts.js b/packages/banners/src/fonts.js index a2ba759..86c25ff 100644 --- a/packages/banners/src/fonts.js +++ b/packages/banners/src/fonts.js @@ -2,9 +2,14 @@ import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; /** - * @param {import('./types').Reader | undefined} reader + * @param {import('./types').Reader | undefined} [reader=import('node:fs').readFile] + * The function to be used as reader of the local files. + * * @typedef {import('satori').SatoriOptions['fonts'][0]} Font * @returns {Promise<{subtitle: Font, title: Font}>} + * + * @module \@marknow/banners + * @access protected */ export async function getMonaSansFonts(reader) { reader ||= (await import('node:fs/promises')).readFile; diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index aa653ff..8118b2a 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -1,11 +1,10 @@ /* eslint-disable complexity */ /* eslint-disable @typescript-eslint/indent */ /** - * Returns the html string of the banner to be used by satori. - * Use the params to customize and complete it. + * Constructor of the HTML banner converted to VNodes to be used in satori. + * Use the properties to customize and complete it. * * @typedef {import('satori').SatoriOptions['fonts'][0]} Font - * * @typedef {{ * dimensions: { width: number, height: number }, * fonts: { title: Font, subtitle: Font }, @@ -14,8 +13,12 @@ * rtl: boolean, * }} Props * @param {Props} properties + * Properties to be applied on the html. * - * @return {string} + * @returns {string} + * + * @module \@marknow/banners + * @access protected */ export default function html({ dimensions, diff --git a/packages/banners/src/icons.js b/packages/banners/src/icons.js index 9ff2234..1dc3be3 100644 --- a/packages/banners/src/icons.js +++ b/packages/banners/src/icons.js @@ -1,8 +1,20 @@ /** - * @param {string} icon - * @param {import('./types').Fetcher | undefined} fetcher +/** + * Utility function used to get a SVG icon from Iconify OR from an url passed as the icon. * - * @return {Promise} + * If the `icon` parameter is not a valid icon name or url, + * it returns the `icon` itself. + * + * @param {string} icon + * The icon's name or url endpoint. + * + * @param {import('./types').Fetcher | undefined} [fetcher=globalThis.fetch] + * Fetch function to be used. + * + * @returns {Promise} + * + * @module \@marknow/banners + * @access protected */ export async function getIcon(icon, fetcher = fetch) { if (!isIconName(icon) && !isValidUrl(icon)) { @@ -19,6 +31,20 @@ export async function getIcon(icon, fetcher = fetch) { return svg; } +/** + * Utility function used to set the icons SVG width and height to the specified dimensions. + * + * @param {string} svg + * The svg string. + * + * @param {{width?: string | number, height?: string | number}} dimensions + * The dimensions values, if type number it is converted to pixels. + * + * @returns {string} + * + * @module \@marknow/banners + * @access protected + */ export function setIconDimensions(svg, { width, height }) { width = typeof width === 'number' ? `width="${width}px"` @@ -38,10 +64,14 @@ export function setIconDimensions(svg, { width, height }) { } /** - * Checks if a given string is a valid [Iconify](https://iconify.design/)/[Icônes](https://icones.js.org/)-like icon name. + * Checks if a given string is a valid + * [Iconify](https://iconify.design/)/[Icônes](https://icones.js.org/)-like icon name. * - * @param {string} iconName - * @return {boolean} + * @param {string} string The string to be checked. + * @returns {boolean} + * + * @module \@marknow/banners + * @access package */ function isIconName(string) { try { @@ -54,8 +84,13 @@ function isIconName(string) { } /** - * @param {string} string - * @return {boolean} + * Checks if string is a valid URL. + * + * @param {string} string The string to be checked. + * @returns {boolean} + * + * @module \@marknow/banners + * @access package */ function isValidUrl(string) { try { diff --git a/packages/banners/src/index.d.ts b/packages/banners/src/index.d.ts index 01e68c9..060446a 100644 --- a/packages/banners/src/index.d.ts +++ b/packages/banners/src/index.d.ts @@ -1,7 +1,50 @@ -/** - * @param {import('./types').BannerOptions} options - * @returns {Promise} - */ -export default function banner({ title, subtitle, icon, layout, config, }: import('./types').BannerOptions): Promise; +/** + +/** + * The banner constructor function. Use the options to customize the + * appearance of the resulting banner. + * + * @param {import('./types').BannerOptions} options + * Options object for customizing the banner appearance. + * + * @returns {Promise} + * + * @example + * import newBanner from '@marknow/banners'; + * + * export async function GET({ fetch }) { + * const banner = await newBanner({ + * title: 'Hello world', + * subtitle: 'This is a example api endpoint.' + * icon: 'material-symbols:api' + * fonts: { + * title: { + * data: await (await fetch('/Mona-Sans-SemiBold.woff')).arrayBuffer(), + * name: 'Mona Sans', + * weight: 600, + * }, + * subtitle: { + * data: await (await fetch('/Mona-Sans-Regular.woff')).arrayBuffer(), + * name: 'Mona Sans', + * weight: 400, + * }, + * }, + * libConfig: { + * fetcher: fetch, + * }, + * }); + * + * return new Response(banner.toString(), { + * status: 200, + * headers: { + * 'Content-type': 'image/svg+xml', + * }, + * }); + * } + * + * @module \@marknow/banners + * @access public + */ +export default function banner({ title, subtitle, icon, layout, config, }: import('./types').BannerOptions): Promise; export type { BannerOptions, Banner } from './types' diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 8c0367e..e100ede 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -5,8 +5,49 @@ import { getMonaSansFonts } from './fonts'; import { getIcon, setIconDimensions } from './icons'; /** + * The banner constructor function. Use the options to customize the + * appearance of the resulting banner. + * * @param {import('./types').BannerOptions} options + * Options object for customizing the banner appearance. + * * @returns {Promise} + * + * @example + * import newBanner from '@marknow/banners'; + * + * export async function GET({ fetch }) { + * const banner = await newBanner({ + * title: 'Hello world', + * subtitle: 'This is a example api endpoint.' + * icon: 'material-symbols:api' + * fonts: { + * title: { + * data: await (await fetch('/Mona-Sans-SemiBold.woff')).arrayBuffer(), + * name: 'Mona Sans', + * weight: 600, + * }, + * subtitle: { + * data: await (await fetch('/Mona-Sans-Regular.woff')).arrayBuffer(), + * name: 'Mona Sans', + * weight: 400, + * }, + * }, + * libConfig: { + * fetcher: fetch, + * }, + * }); + * + * return new Response(banner.toString(), { + * status: 200, + * headers: { + * 'Content-type': 'image/svg+xml', + * }, + * }); + * } + * + * @module \@marknow/banners + * @access public */ export default async function banner({ title, @@ -60,7 +101,17 @@ export default async function banner({ }; } -/** @type {(string: string, maxChar: number) => string} */ +/** + * Small utility function used to truncate long texts on the banner + * + * @param {string} string - Text string to be truncated. + * @param {number} maxChar - Maximum number of characters. + * + * @returns {string} + * + * @module \@marknow/banners + * @access package + */ function truncateText(string, maxChar) { return string.length > maxChar ? `${string.slice(0, maxChar)}...` : string; } diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index e34a475..d20a321 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -3,6 +3,170 @@ import type { OpenMode, PathLike } from "node:fs"; import type { FileHandle } from "node:fs/promises"; import type { SatoriOptions } from "satori/wasm"; +/** + * Options object for customizing the banner appearance. + * + * @module \@marknow/banners + * @access public + */ +export interface BannerOptions { + /** + * **(REQUIRED)** Title to be displayed in the banner. + */ + title: string, + + /** + * (Optional) Set the text direction right-to-left. + */ + rtl?: boolean = false, + + /** + * (Optional) {@link https://iconify.design/ Iconify}/{@link https://icones.js.org/ Icônes}-like + * icon name OR url for svg file of the icon to be used in the banner. + */ + icon?: string = '', + + /** + * (Optional) Subtitle/legend to be displayed in the banner + * bellow the title. + */ + subtitle?: string = '', + + /** + * (Optional) Customize the colors of the banner. + * + * Customize the background color and foreground (title, subtitle + * and icon) colors. + */ + colors?: Colors = { background: '#ffffff', foreground: '#000000' }, + + /** + * (Optional) Customize the layout of the banner and position of elements. + */ + layout?: 'horizontal' | 'vertical' = 'horizontal', + + /** + * (Optional) Customize the fonts used on the banner. + * + * Changes the default font file used for the title and subtitle. + * Defaults is {@link https://github.com/github/mona-sans Github's Mona Sans} + * semi-bold and regular respectively. + * + * @see {@link https://github.com/vercel/satori#fonts} + */ + fonts?: { + title: Font, + subtitle: Font, + } + + /** + * (Optional) Customize the behavior of the package. + * + * Provide functions or polyfills to be used by the package + * for better compatibility or customization of the banner + * creation. + */ + libConfig?: { + /** + * (Optional) Fetch function used by the package to retrieve + * icons from {@link https://iconify.design/ Iconify} and custom + * icons provided as url. + * + * Default function used is the + * {@link https://developer.mozilla.org/en-US/docs/Web/API/fetch globalThis.fetch} + * function. Compatible with modern browsers, Node.js (version 18 and greater), + * Deno and Bun. + * + * @see {@link BannerOptions.icon} + * + * @param {RequestInfo} input - The request url/info. + * @param {RequestInit} - Request options. + * @returns {Promise} + */ + fetcher?: Fetcher = globalThis.fetch, + + /** + * (Optional) The function used to read the font files and return a Buffer or + * ArrayBuffer from them. + * + * Default function used is the {@link https://nodejs.org/api/fs.html#fsreadfilepath-options-callback fs.readFile} + * from the Node file system promises api ({@link https://nodejs.org/api/fs.html#file-system node:fs/promises}). + * Compatible with Node.js (version 10 and greater), Deno and Bun. + * + * @param {PathLike | FileHandle} path - The path to the font files. + * @returns {Promise} + */ + reader?: Reader = import ('node:fs/promises').readFile, + + /** + * (Optional) The function used to get the icon svg file from {@link https://iconify.design/ Iconify} + * or URL endpoint passed. + * + * @see {@link BannerOptions.icon} + * + * @param {string} icon - Icon name or URL. + * @returns {string | Promise} + */ + iconHandler?: (icon: string) => string | Promise + } +} + +/** + * The resulting banner object. + * + * Has a `toString()` function to be used in string literals + * that returns the svg string of the banner. + * + * @module \@marknow/banners + * @access public + */ +export interface Banner { + /** + * The resulting svg of the banner. + * @readonly + */ + svg: string, + /** + * The raw html used to create the banner. + * @readonly + */ + html: string, + /** + * The used icon's svg. + * @readonly + */ + icon: string, + /** + * React-element-like objects / VDOM used to create the banner. + * @readonly + */ + vNodes: VNode, + /** + * Returns the {@link Banner.svg svg string} of the banner. + * Useful when using the banner object directly on a string. + * + * @example + * import newBanner from '@marknow/banners'; + * + * const banner = await newBanner({ ... }); + * + * // Prints the resulting svg instead of the banner object itself. + * console.log(`Banner svg:\n${banner}`) + * + * @readonly + */ + toString(): string, +}; + +/** + * Font object for the banner passed to the `satori` package. + * + * @see {@link BannerOptions.fonts} + * @see {@link https://github.com/vercel/satori#fonts} + * + * @module \@marknow/banners > satori + * @access protected + */ export type Font = SatoriOptions['fonts'][0]; export type Colors = { @@ -10,54 +174,43 @@ export type Colors = { background: string; } +/** + * "Global Fetch"-like function used by the package to retrieve + * icons from [Iconify](https://iconify.design/) and custom + * icons provided as url. + * + * @param {RequestInfo} input - The request url/info. + * @param {RequestInit} - Request options. + * @returns {Promise} + * + * @module \@marknow/banners + * @access protected + */ export type Fetcher = ( input: RequestInfo | URL, init?: RequestInit ) => Promise; +/** + * "Node.js' `fs.readFile`"-like function used to read the font files + * and return a Buffer or ArrayBuffer from them. + * + * @param {RequestInfo} input - The request url/info. + * @param {RequestInit} - Request options. + * @returns {Promise} + * + * @module \@marknow/banners + * @access protected + */ export type Reader = ( path: PathLike | FileHandle, ) => Promise /** - * Options object for creating a banner. - * - * @package `@marknow/banners` - */ -export interface BannerOptions { - icon?: string, - title: string, - subtitle?: string, - layout?: 'horizontal' | 'vertical', - fonts?: { - title: Font, - subtitle: Font, - } - colors?: Colors, - rtl?: boolean, - libConfig?: { - fetcher?: Fetcher = fetch, - reader?: Reader, - iconHandler?: (icon: string) => string | Promise - } -} - -/** - * - */ -export interface Banner { - toString(): string, - html: string, - svg: string, - icon: string, - vNodes: VNode, -}; - -/** - * **Copied from the satori-html package,** * React-element-like objects / VDOM object used in satori. * - * @package `satori-html` + * @module \@marknow/banners > satori-html + * @access protected */ export interface VNode { type: string; From dd3a8595060c74742ab5f23ef869adfb13b97420 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 10:47:34 -0300 Subject: [PATCH 19/27] =?UTF-8?q?docs(banners):=20=F0=9F=93=9A=EF=B8=8F=20?= =?UTF-8?q?files=20documentations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/fonts.js | 13 +++++++++++++ packages/banners/src/html.js | 8 ++++++++ packages/banners/src/icons.js | 12 ++++++++++++ packages/banners/src/index.d.ts | 16 ++++++++++++++++ packages/banners/src/index.js | 15 +++++++++++++++ packages/banners/src/types.d.ts | 14 +++++++++++++- 6 files changed, 77 insertions(+), 1 deletion(-) diff --git a/packages/banners/src/fonts.js b/packages/banners/src/fonts.js index 86c25ff..12e14f6 100644 --- a/packages/banners/src/fonts.js +++ b/packages/banners/src/fonts.js @@ -1,3 +1,16 @@ +/** + * @file + * Utility functions used to retrieve and manipulate fonts' objects. + * + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + * + * @module \@marknow/banners + */ + import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; diff --git a/packages/banners/src/html.js b/packages/banners/src/html.js index 8118b2a..ff24e5f 100644 --- a/packages/banners/src/html.js +++ b/packages/banners/src/html.js @@ -1,3 +1,11 @@ +/** + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + */ + /* eslint-disable complexity */ /* eslint-disable @typescript-eslint/indent */ /** diff --git a/packages/banners/src/icons.js b/packages/banners/src/icons.js index 1dc3be3..9c23d67 100644 --- a/packages/banners/src/icons.js +++ b/packages/banners/src/icons.js @@ -1,4 +1,16 @@ /** + * @file + * Utility functions used to retrieve and manipulate icons SVG strings. + * + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + * + * @module \@marknow/banners + */ + /** * Utility function used to get a SVG icon from Iconify OR from an url passed as the icon. * diff --git a/packages/banners/src/index.d.ts b/packages/banners/src/index.d.ts index 060446a..de1053e 100644 --- a/packages/banners/src/index.d.ts +++ b/packages/banners/src/index.d.ts @@ -1,4 +1,20 @@ /** + * @file + * This file contains all public functions and types declaration of the + * `@marknow/banners` package. Anything declared here can be accessed directly + * by the library consumers and has an @access public access level. + * + * The JSDocs of the functions are duplicated from the source files, so that + * it is more compatible with Typescript syntax and code documentation. + * + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + * + * @module \@marknow/banners + */ /** * The banner constructor function. Use the options to customize the diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index e100ede..0748a74 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -1,3 +1,18 @@ +/** + * @file + * Main entry point of the `@marknow/banners` package. This file contains + * all ESModules exports of the public APIs and functions of the library. + * Anything exported here should have an @access public access level and + * declared on {@link ./index.d.ts types declaration} file. + * + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + * + * @module \@marknow/banners + */ import { html as htmlToVNodes } from 'satori-html'; import satori from 'satori'; import bannerHtml from './html'; diff --git a/packages/banners/src/types.d.ts b/packages/banners/src/types.d.ts index d20a321..c6e5cda 100644 --- a/packages/banners/src/types.d.ts +++ b/packages/banners/src/types.d.ts @@ -1,4 +1,16 @@ -import type { Abortable } from "node:events"; +/** + * @file + * Definitions of more complex or shared Typescript types used in the package. + * + * @author + * Guz013 (under the Lored organization) + * + * @copyright + * Gustavo "Guz013" L. de Mello + * + * @module \@marknow/banners + */ + import type { OpenMode, PathLike } from "node:fs"; import type { FileHandle } from "node:fs/promises"; import type { SatoriOptions } from "satori/wasm"; From e74d3b6bc292a6763e7211a10269f34645ec0763 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:50:47 -0300 Subject: [PATCH 20/27] =?UTF-8?q?test(banners):=20=F0=9F=9A=A8=20add=20pac?= =?UTF-8?q?kage=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 2 + .vscode/project.code-workspace | 4 + .vscode/settings.json | 3 +- package.json | 5 +- packages/banners/.eslintrc.cjs | 2 + packages/banners/package.json | 5 +- .../tests/__snapshots__/withComplete.svg | 1 + .../banners/tests/__snapshots__/withIcon.svg | 1 + .../tests/__snapshots__/withSubtitle.svg | 1 + .../banners/tests/__snapshots__/withTitle.svg | 1 + packages/banners/tests/results.edge.test.js | 34 ++ packages/banners/tests/results.node.test.js | 34 ++ packages/banners/vitest.config.js | 11 + pnpm-lock.yaml | 405 ++++++++++++++++-- turbo.json | 29 +- vitest.workspace.json | 4 + 16 files changed, 496 insertions(+), 46 deletions(-) create mode 100644 packages/banners/tests/__snapshots__/withComplete.svg create mode 100644 packages/banners/tests/__snapshots__/withIcon.svg create mode 100644 packages/banners/tests/__snapshots__/withSubtitle.svg create mode 100644 packages/banners/tests/__snapshots__/withTitle.svg create mode 100644 packages/banners/tests/results.edge.test.js create mode 100644 packages/banners/tests/results.node.test.js create mode 100644 packages/banners/vitest.config.js create mode 100644 vitest.workspace.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 54ea248..5c95226 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -231,6 +231,8 @@ module.exports = { 'lored', 'guz013', 'xml', + 'jsconfig', + 'vitest', ], minLength: 4, }], diff --git a/.vscode/project.code-workspace b/.vscode/project.code-workspace index 51af971..e3765c6 100644 --- a/.vscode/project.code-workspace +++ b/.vscode/project.code-workspace @@ -4,6 +4,10 @@ "path": "../apps/www", "name": "apps/www" }, + { + "path": "../packages/banners", + "name": "@marknow/banners" + }, { "path": "../", "name": "ROOT" diff --git a/.vscode/settings.json b/.vscode/settings.json index f54b539..285b8db 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,6 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, - "unocss.root": "apps/www" + "unocss.root": "apps/www", + "vitest.enable": true } diff --git a/package.json b/package.json index 24f5674..852c960 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "keywords": [], "main": "index.js", "scripts": { + "test": "turbo run test", + "test:watch": "vitest watch", "prepare": "husky install", "lint": "eslint . && turbo run lint", "lint:fix": "eslint . --fix && turbo run lint -- --fix", @@ -24,6 +26,7 @@ "eslint-plugin-svelte": "^2.30.0", "husky": "^8.0.3", "turbo": "^1.10.3", - "vercel": "^30.2.2" + "vercel": "^30.2.2", + "vitest": "^0.32.2" } } diff --git a/packages/banners/.eslintrc.cjs b/packages/banners/.eslintrc.cjs index b053888..5ca8240 100644 --- a/packages/banners/.eslintrc.cjs +++ b/packages/banners/.eslintrc.cjs @@ -1,3 +1,5 @@ +process.env.ESLINT_TSCONFIG = 'jsconfig.json'; + module.exports = { root: false, }; diff --git a/packages/banners/package.json b/packages/banners/package.json index 3263fe7..d542722 100644 --- a/packages/banners/package.json +++ b/packages/banners/package.json @@ -17,9 +17,12 @@ "module": "./src/index.js", "types": "./src/index.d.ts", "scripts": { + "test": "vitest run", + "test:watch": "vitest watch", "build:cjs": "microbundle --compress false --pkg-main false --strict --tsconfig ./jsconfig.json --generateTypes false -f cjs --target node", "build": "pnpm run build:cjs", - "dev": "pnpm run build -w" + "dev": "pnpm run build -w", + "lint": "eslint ." }, "dependencies": { "satori": "^0.10.1", diff --git a/packages/banners/tests/__snapshots__/withComplete.svg b/packages/banners/tests/__snapshots__/withComplete.svg new file mode 100644 index 0000000..621052c --- /dev/null +++ b/packages/banners/tests/__snapshots__/withComplete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/withIcon.svg b/packages/banners/tests/__snapshots__/withIcon.svg new file mode 100644 index 0000000..ffaad23 --- /dev/null +++ b/packages/banners/tests/__snapshots__/withIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/withSubtitle.svg b/packages/banners/tests/__snapshots__/withSubtitle.svg new file mode 100644 index 0000000..888aff2 --- /dev/null +++ b/packages/banners/tests/__snapshots__/withSubtitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/withTitle.svg b/packages/banners/tests/__snapshots__/withTitle.svg new file mode 100644 index 0000000..e945ba8 --- /dev/null +++ b/packages/banners/tests/__snapshots__/withTitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/results.edge.test.js b/packages/banners/tests/results.edge.test.js new file mode 100644 index 0000000..9bacd63 --- /dev/null +++ b/packages/banners/tests/results.edge.test.js @@ -0,0 +1,34 @@ +import { expect, it } from 'vitest'; +import banner from '../src/index'; + +it('With Title', async () => { + const result = await banner({ + title: 'Hello World', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withTitle.svg'); +}); + +it('With Subtitle', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withSubtitle.svg'); +}); + +it('With Icon', async () => { + const result = await banner({ + title: 'Hello World', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withIcon.svg'); +}); + +it('With Subtitle and Icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withComplete.svg'); +}); diff --git a/packages/banners/tests/results.node.test.js b/packages/banners/tests/results.node.test.js new file mode 100644 index 0000000..9bacd63 --- /dev/null +++ b/packages/banners/tests/results.node.test.js @@ -0,0 +1,34 @@ +import { expect, it } from 'vitest'; +import banner from '../src/index'; + +it('With Title', async () => { + const result = await banner({ + title: 'Hello World', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withTitle.svg'); +}); + +it('With Subtitle', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withSubtitle.svg'); +}); + +it('With Icon', async () => { + const result = await banner({ + title: 'Hello World', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withIcon.svg'); +}); + +it('With Subtitle and Icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withComplete.svg'); +}); diff --git a/packages/banners/vitest.config.js b/packages/banners/vitest.config.js new file mode 100644 index 0000000..c7b2366 --- /dev/null +++ b/packages/banners/vitest.config.js @@ -0,0 +1,11 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environmentMatchGlobs: [ + ['**\/*{,.node}.test.{js,ts}', 'node'], + ['**\/*.edge.test.{js,ts}', 'edge-runtime'], + ], + include: ['./tests/**/*.test.js'], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b512c6..e80a530 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: vercel: specifier: ^30.2.2 version: 30.2.2(@types/node@14.18.33) + vitest: + specifier: ^0.32.2 + version: 0.32.2 apps/www: devDependencies: @@ -91,10 +94,10 @@ importers: version: 3.59.1 svelte-check: specifier: ^3.4.3 - version: 3.4.3(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1) + version: 3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1) svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) + version: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) tslib: specifier: ^2.5.3 version: 2.5.3 @@ -118,7 +121,7 @@ importers: version: 0.2.8 vite: specifier: ^4.3.9 - version: 4.3.9(sass@1.63.6) + version: 4.3.9(@types/node@14.18.33)(sass@1.63.6) packages/banners: dependencies: @@ -2318,7 +2321,7 @@ packages: dependencies: svelte: 3.59.1 svgo: 3.0.2 - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) dev: true /@radix-ui/colors@0.1.8: @@ -2504,7 +2507,7 @@ packages: svelte: 3.59.1 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) transitivePeerDependencies: - supports-color dev: true @@ -2520,7 +2523,7 @@ packages: '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) debug: 4.3.4 svelte: 3.59.1 - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) transitivePeerDependencies: - supports-color dev: true @@ -2539,7 +2542,7 @@ packages: magic-string: 0.30.0 svelte: 3.59.1 svelte-hmr: 0.15.2(svelte@3.59.1) - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color @@ -2602,6 +2605,16 @@ packages: '@types/responselike': 1.0.0 dev: true + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} dev: true @@ -3148,7 +3161,7 @@ packages: chokidar: 3.5.3 fast-glob: 3.2.12 magic-string: 0.30.0 - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) transitivePeerDependencies: - rollup dev: true @@ -3191,7 +3204,7 @@ packages: lodash: 4.17.21 mlly: 1.4.0 outdent: 0.8.0 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33) vite-node: 0.28.5(@types/node@14.18.33) transitivePeerDependencies: - '@types/node' @@ -3259,7 +3272,7 @@ packages: dependencies: '@mapbox/node-pre-gyp': 1.0.10 '@rollup/pluginutils': 4.2.1 - acorn: 8.8.2 + acorn: 8.9.0 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -3280,7 +3293,7 @@ packages: dependencies: '@mapbox/node-pre-gyp': 1.0.10 '@rollup/pluginutils': 4.2.1 - acorn: 8.8.2 + acorn: 8.9.0 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -3475,6 +3488,45 @@ packages: ts-morph: 12.0.0 dev: true + /@vitest/expect@0.32.2: + resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} + dependencies: + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.32.2: + resolution: {integrity: sha512-06vEL0C1pomOEktGoLjzZw+1Fb+7RBRhmw/06WkDrd1akkT9i12su0ku+R/0QM69dfkIL/rAIDTG+CSuQVDcKw==} + dependencies: + '@vitest/utils': 0.32.2 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.32.2: + resolution: {integrity: sha512-JwhpeH/PPc7GJX38vEfCy9LtRzf9F4er7i4OsAJyV7sjPwjj+AIR8cUgpMTWK4S3TiamzopcTyLsZDMuldoi5A==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.1 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.32.2: + resolution: {integrity: sha512-Q/ZNILJ4ca/VzQbRM8ur3Si5Sardsh1HofatG9wsJY1RfEaw0XKP8IVax2lI1qnrk9YPuG9LA2LkZ0EI/3d4ug==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.32.2: + resolution: {integrity: sha512-lnJ0T5i03j0IJaeW73hxe2AuVnZ/y1BhhCOuIcl9LIzXnbpXJT9Lrt6brwKHXLOiA7MZ6N5hSJjt0xE1dGNCzQ==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + /@web3-storage/multipart-parser@1.0.0: resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} dev: true @@ -3504,12 +3556,6 @@ packages: engines: {node: '>=0.4.0'} dev: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn@8.9.0: resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} @@ -3591,6 +3637,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3674,6 +3725,10 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -3837,6 +3892,10 @@ packages: readable-stream: 3.6.2 dev: true + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4025,6 +4084,19 @@ packages: resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} dev: true + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -4085,6 +4157,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -4241,6 +4317,20 @@ packages: source-map: 0.6.1 dev: true + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.1 + well-known-symbols: 2.0.0 + dev: true + /consola@3.1.0: resolution: {integrity: sha512-rrrJE6rP0qzl/Srg+C9x/AE5Kxfux7reVm1Wh0wCjuXvih6DqZgqDZe8auTD28fzJ9TF0mHlSDrPpWlujQRo1Q==} dev: true @@ -4490,6 +4580,13 @@ packages: engines: {node: '>= 6'} dev: true + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + /deasync@0.1.28: resolution: {integrity: sha512-QqLF6inIDwiATrfROIyQtwOQxjZuek13WRYZ7donU5wJPLoP67MnYxA6QtqdvdBy2mMqv5m3UefBVdJjvevOYg==} engines: {node: '>=0.11.0'} @@ -4547,6 +4644,13 @@ packages: mimic-response: 3.1.0 dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -4645,6 +4749,11 @@ packages: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -5818,6 +5927,10 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.2.11: resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} engines: {node: '>=8.6.0'} @@ -6105,6 +6218,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -6896,6 +7013,11 @@ packages: hasBin: true dev: true + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -6968,7 +7090,7 @@ packages: resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 eslint-visitor-keys: 3.4.1 espree: 9.5.2 semver: 7.5.1 @@ -7111,6 +7233,12 @@ packages: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: true + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -7180,6 +7308,13 @@ packages: pretty-bytes: 3.0.1 dev: true + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: @@ -7841,15 +7976,6 @@ packages: hasBin: true dev: true - /mlly@1.3.0: - resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.1.2 - dev: true - /mlly@1.4.0: resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} dependencies: @@ -8152,6 +8278,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -8323,6 +8456,10 @@ packages: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} dependencies: @@ -8368,7 +8505,7 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.3.0 + mlly: 1.4.0 pathe: 1.1.1 dev: true @@ -8823,6 +8960,15 @@ packages: engines: {node: '>=6'} dev: true + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} @@ -8968,6 +9114,10 @@ packages: unpipe: 1.0.0 dev: true + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} @@ -9518,6 +9668,10 @@ packages: object-inspect: 1.12.3 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -9651,11 +9805,19 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: true + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true @@ -9781,7 +9943,7 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 dev: true /style-inject@0.3.0: @@ -9829,7 +9991,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@3.4.3(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1): + /svelte-check@3.4.3(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1): resolution: {integrity: sha512-O07soQFY3X0VDt+bcGc6D5naz0cLtjwnmNP9JsEBPVyMemFEqUhL2OdLqvkl5H/u8Jwm50EiAU4BPRn5iin/kg==} hasBin: true peerDependencies: @@ -9842,7 +10004,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.59.1 - svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) + svelte-preprocess: 5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3) typescript: 5.1.3 transitivePeerDependencies: - '@babel/core' @@ -9879,7 +10041,7 @@ packages: svelte: 3.59.1 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3): + /svelte-preprocess@5.0.4(@babel/core@7.22.5)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -9917,6 +10079,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.22.5 '@types/pug': 2.0.6 detect-indent: 6.1.0 magic-string: 0.27.0 @@ -9998,7 +10161,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.9.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -10025,6 +10188,11 @@ packages: convert-hrtime: 3.0.0 dev: true + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -10035,6 +10203,20 @@ packages: /tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -10103,7 +10285,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.18.33 - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -10229,6 +10411,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -10358,7 +10545,7 @@ packages: fast-glob: 3.2.12 local-pkg: 0.4.3 magic-string: 0.30.0 - mlly: 1.3.0 + mlly: 1.4.0 pathe: 1.1.1 pkg-types: 1.0.3 scule: 1.0.0 @@ -10552,7 +10739,7 @@ packages: /unplugin@1.3.1: resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -10680,7 +10867,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33) transitivePeerDependencies: - '@types/node' - less @@ -10691,6 +10878,60 @@ packages: - terser dev: true + /vite-node@0.32.2(@types/node@20.3.1): + resolution: {integrity: sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.3.9(@types/node@14.18.33): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 14.18.33 + esbuild: 0.17.19 + postcss: 8.4.24 + rollup: 3.25.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vite@4.3.9(@types/node@14.18.33)(sass@1.63.6): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -10725,7 +10966,7 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.3.9(sass@1.63.6): + /vite@4.3.9(@types/node@20.3.1): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -10750,10 +10991,10 @@ packages: terser: optional: true dependencies: + '@types/node': 20.3.1 esbuild: 0.17.19 postcss: 8.4.24 rollup: 3.25.1 - sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 dev: true @@ -10766,7 +11007,72 @@ packages: vite: optional: true dependencies: - vite: 4.3.9(sass@1.63.6) + vite: 4.3.9(@types/node@14.18.33)(sass@1.63.6) + dev: true + + /vitest@0.32.2: + resolution: {integrity: sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.3.1 + '@vitest/expect': 0.32.2 + '@vitest/runner': 0.32.2 + '@vitest/snapshot': 0.32.2 + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + acorn: 8.9.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.5.0 + vite: 4.3.9(@types/node@20.3.1) + vite-node: 0.32.2(@types/node@20.3.1) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser dev: true /vm2@3.9.19: @@ -10819,6 +11125,11 @@ packages: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -10856,6 +11167,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -11010,6 +11330,11 @@ packages: engines: {node: '>=10'} dev: true + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} diff --git a/turbo.json b/turbo.json index 2074674..7cfcf07 100644 --- a/turbo.json +++ b/turbo.json @@ -2,16 +2,39 @@ "$schema": "https://turbo.build/schema.json", "pipeline": { "build": { - "outputs": ["dist/**"] + "dependsOn": [ + "^test", + "test" + ], + "outputs": [ + "dist/**" + ] }, "lint": {}, + "test": { + "dependsOn": [ + "^lint", + "lint" + ] + }, + "test:watch": { + "dependsOn": [ + "^lint", + "lint" + ], + "persistent": true + }, "dev": { - "dependsOn": ["^build"], + "dependsOn": [ + "^build" + ], "cache": false, "persistent": true }, "preview": { - "dependsOn": ["^build"], + "dependsOn": [ + "^build" + ], "persistent": true } } diff --git a/vitest.workspace.json b/vitest.workspace.json new file mode 100644 index 0000000..089b886 --- /dev/null +++ b/vitest.workspace.json @@ -0,0 +1,4 @@ +[ + "packages/*/vitest.config.{js,ts}", + "apps/*/vitest.config.{js,ts}" +] From afb5d3742e397e922be26fb04c8899787b87d54a Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:26:43 -0300 Subject: [PATCH 21/27] =?UTF-8?q?test(banners):=20=F0=9F=9A=A8=20remove=20?= =?UTF-8?q?edge=20test=20environments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/tests/results.edge.test.js | 34 --------------------- packages/banners/tests/results.node.test.js | 34 --------------------- packages/banners/vitest.config.js | 1 - 3 files changed, 69 deletions(-) delete mode 100644 packages/banners/tests/results.edge.test.js delete mode 100644 packages/banners/tests/results.node.test.js diff --git a/packages/banners/tests/results.edge.test.js b/packages/banners/tests/results.edge.test.js deleted file mode 100644 index 9bacd63..0000000 --- a/packages/banners/tests/results.edge.test.js +++ /dev/null @@ -1,34 +0,0 @@ -import { expect, it } from 'vitest'; -import banner from '../src/index'; - -it('With Title', async () => { - const result = await banner({ - title: 'Hello World', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withTitle.svg'); -}); - -it('With Subtitle', async () => { - const result = await banner({ - title: 'Hello World', - subtitle: 'This is a test', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withSubtitle.svg'); -}); - -it('With Icon', async () => { - const result = await banner({ - title: 'Hello World', - icon: 'solar:test-tube-bold-duotone', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withIcon.svg'); -}); - -it('With Subtitle and Icon', async () => { - const result = await banner({ - title: 'Hello World', - subtitle: 'This is a test', - icon: 'solar:test-tube-bold-duotone', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withComplete.svg'); -}); diff --git a/packages/banners/tests/results.node.test.js b/packages/banners/tests/results.node.test.js deleted file mode 100644 index 9bacd63..0000000 --- a/packages/banners/tests/results.node.test.js +++ /dev/null @@ -1,34 +0,0 @@ -import { expect, it } from 'vitest'; -import banner from '../src/index'; - -it('With Title', async () => { - const result = await banner({ - title: 'Hello World', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withTitle.svg'); -}); - -it('With Subtitle', async () => { - const result = await banner({ - title: 'Hello World', - subtitle: 'This is a test', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withSubtitle.svg'); -}); - -it('With Icon', async () => { - const result = await banner({ - title: 'Hello World', - icon: 'solar:test-tube-bold-duotone', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withIcon.svg'); -}); - -it('With Subtitle and Icon', async () => { - const result = await banner({ - title: 'Hello World', - subtitle: 'This is a test', - icon: 'solar:test-tube-bold-duotone', - }); - expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withComplete.svg'); -}); diff --git a/packages/banners/vitest.config.js b/packages/banners/vitest.config.js index c7b2366..90a689f 100644 --- a/packages/banners/vitest.config.js +++ b/packages/banners/vitest.config.js @@ -4,7 +4,6 @@ export default defineProject({ test: { environmentMatchGlobs: [ ['**\/*{,.node}.test.{js,ts}', 'node'], - ['**\/*.edge.test.{js,ts}', 'edge-runtime'], ], include: ['./tests/**/*.test.js'], }, From 5b5505612b58f433707fddb3c235a0049fec7af1 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:27:59 -0300 Subject: [PATCH 22/27] =?UTF-8?q?test(banners):=20=F0=9F=9A=A8=20tests=20f?= =?UTF-8?q?or=20vertical=20and=20rtl=20layouts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/__snapshots__/rtl-withComplete.svg | 1 + .../tests/__snapshots__/rtl-withIcon.svg | 1 + .../tests/__snapshots__/rtl-withSubtitle.svg | 1 + .../tests/__snapshots__/rtl-withTitle.svg | 1 + .../__snapshots__/vertical-withComplete.svg | 1 + .../tests/__snapshots__/vertical-withIcon.svg | 1 + .../__snapshots__/vertical-withSubtitle.svg | 1 + .../__snapshots__/vertical-withTitle.svg | 1 + packages/banners/tests/results.test.js | 36 +++++++++++++++++ packages/banners/tests/rtl-results.test.js | 40 +++++++++++++++++++ .../banners/tests/vertical-result.test.js | 40 +++++++++++++++++++ 11 files changed, 124 insertions(+) create mode 100644 packages/banners/tests/__snapshots__/rtl-withComplete.svg create mode 100644 packages/banners/tests/__snapshots__/rtl-withIcon.svg create mode 100644 packages/banners/tests/__snapshots__/rtl-withSubtitle.svg create mode 100644 packages/banners/tests/__snapshots__/rtl-withTitle.svg create mode 100644 packages/banners/tests/__snapshots__/vertical-withComplete.svg create mode 100644 packages/banners/tests/__snapshots__/vertical-withIcon.svg create mode 100644 packages/banners/tests/__snapshots__/vertical-withSubtitle.svg create mode 100644 packages/banners/tests/__snapshots__/vertical-withTitle.svg create mode 100644 packages/banners/tests/results.test.js create mode 100644 packages/banners/tests/rtl-results.test.js create mode 100644 packages/banners/tests/vertical-result.test.js diff --git a/packages/banners/tests/__snapshots__/rtl-withComplete.svg b/packages/banners/tests/__snapshots__/rtl-withComplete.svg new file mode 100644 index 0000000..801a0f9 --- /dev/null +++ b/packages/banners/tests/__snapshots__/rtl-withComplete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/rtl-withIcon.svg b/packages/banners/tests/__snapshots__/rtl-withIcon.svg new file mode 100644 index 0000000..04a6dd2 --- /dev/null +++ b/packages/banners/tests/__snapshots__/rtl-withIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/rtl-withSubtitle.svg b/packages/banners/tests/__snapshots__/rtl-withSubtitle.svg new file mode 100644 index 0000000..34ec15c --- /dev/null +++ b/packages/banners/tests/__snapshots__/rtl-withSubtitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/rtl-withTitle.svg b/packages/banners/tests/__snapshots__/rtl-withTitle.svg new file mode 100644 index 0000000..7fdf09b --- /dev/null +++ b/packages/banners/tests/__snapshots__/rtl-withTitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withComplete.svg b/packages/banners/tests/__snapshots__/vertical-withComplete.svg new file mode 100644 index 0000000..79f2357 --- /dev/null +++ b/packages/banners/tests/__snapshots__/vertical-withComplete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withIcon.svg b/packages/banners/tests/__snapshots__/vertical-withIcon.svg new file mode 100644 index 0000000..ac05751 --- /dev/null +++ b/packages/banners/tests/__snapshots__/vertical-withIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg b/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg new file mode 100644 index 0000000..ba5030a --- /dev/null +++ b/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withTitle.svg b/packages/banners/tests/__snapshots__/vertical-withTitle.svg new file mode 100644 index 0000000..06bf8c5 --- /dev/null +++ b/packages/banners/tests/__snapshots__/vertical-withTitle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/results.test.js b/packages/banners/tests/results.test.js new file mode 100644 index 0000000..2956a99 --- /dev/null +++ b/packages/banners/tests/results.test.js @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; +import banner from '../src/index'; + +describe('Horizontal Layout', async () => { + it('With Title', async () => { + const result = await banner({ + title: 'Hello World', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withTitle.svg'); + }); + + it('With Subtitle', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withSubtitle.svg'); + }); + + it('With Icon', async () => { + const result = await banner({ + title: 'Hello World', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withIcon.svg'); + }); + + it('With Subtitle and Icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'solar:test-tube-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/withComplete.svg'); + }); +}); diff --git a/packages/banners/tests/rtl-results.test.js b/packages/banners/tests/rtl-results.test.js new file mode 100644 index 0000000..6bb914e --- /dev/null +++ b/packages/banners/tests/rtl-results.test.js @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest'; +import banner from '../src/index'; + +describe('Horizontal Layout', async () => { + it('With Title', async () => { + const result = await banner({ + title: 'Hello World', + rtl: true, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/rtl-withTitle.svg'); + }); + + it('With Subtitle', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + rtl: true, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/rtl-withSubtitle.svg'); + }); + + it('With Icon', async () => { + const result = await banner({ + title: 'Hello World', + icon: 'solar:test-tube-bold-duotone', + rtl: true, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/rtl-withIcon.svg'); + }); + + it('With Subtitle and Icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'solar:test-tube-bold-duotone', + rtl: true, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/rtl-withComplete.svg'); + }); +}); diff --git a/packages/banners/tests/vertical-result.test.js b/packages/banners/tests/vertical-result.test.js new file mode 100644 index 0000000..bd804ca --- /dev/null +++ b/packages/banners/tests/vertical-result.test.js @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest'; +import banner from '../src/index'; + +describe('Vertical Layout', async () => { + it('With Title', async () => { + const result = await banner({ + title: 'Hello World', + layout: 'vertical', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/vertical-withTitle.svg'); + }); + + it('With Subtitle', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + layout: 'vertical', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/vertical-withSubtitle.svg'); + }); + + it('With Icon', async () => { + const result = await banner({ + title: 'Hello World', + icon: 'solar:test-tube-bold-duotone', + layout: 'vertical', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/vertical-withIcon.svg'); + }); + + it('With Subtitle and Icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'solar:test-tube-bold-duotone', + layout: 'vertical', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/vertical-withComplete.svg'); + }); +}); From 376c49e8c98a436260e7aa87d02813cd2ffd562e Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:02:51 -0300 Subject: [PATCH 23/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20iconify's?= =?UTF-8?q?=20icon=20name=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/icons.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/banners/src/icons.js b/packages/banners/src/icons.js index 9c23d67..8223579 100644 --- a/packages/banners/src/icons.js +++ b/packages/banners/src/icons.js @@ -86,13 +86,7 @@ export function setIconDimensions(svg, { width, height }) { * @access package */ function isIconName(string) { - try { - const [collection, icon] = string.split(':'); - return Boolean(collection) && Boolean(icon); - } - catch (_) { - return false; - } + return /^[a-z0-9-]+:[a-z0-9-]+(\[\])?$/.test(string); } /** From 4ab529fd53e7cff8208726e5e52a274ff990c689 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:30:34 -0300 Subject: [PATCH 24/27] =?UTF-8?q?fix(banners):=20=F0=9F=90=9B=20vertical?= =?UTF-8?q?=20layout=20height?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/src/index.js | 2 +- packages/banners/tests/__snapshots__/vertical-withComplete.svg | 2 +- packages/banners/tests/__snapshots__/vertical-withIcon.svg | 2 +- packages/banners/tests/__snapshots__/vertical-withSubtitle.svg | 2 +- packages/banners/tests/__snapshots__/vertical-withTitle.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/banners/src/index.js b/packages/banners/src/index.js index 0748a74..da73e14 100644 --- a/packages/banners/src/index.js +++ b/packages/banners/src/index.js @@ -85,7 +85,7 @@ export default async function banner({ const dimensions = { width: 1000, - height: layout === 'horizontal' ? 180 : 1300, + height: layout === 'horizontal' ? 180 : 280, }; const htmlTemplate = bannerHtml({ layout, dimensions, fonts, colors, rtl }); diff --git a/packages/banners/tests/__snapshots__/vertical-withComplete.svg b/packages/banners/tests/__snapshots__/vertical-withComplete.svg index 79f2357..d9a8ac4 100644 --- a/packages/banners/tests/__snapshots__/vertical-withComplete.svg +++ b/packages/banners/tests/__snapshots__/vertical-withComplete.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withIcon.svg b/packages/banners/tests/__snapshots__/vertical-withIcon.svg index ac05751..ac34190 100644 --- a/packages/banners/tests/__snapshots__/vertical-withIcon.svg +++ b/packages/banners/tests/__snapshots__/vertical-withIcon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg b/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg index ba5030a..eef3e42 100644 --- a/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg +++ b/packages/banners/tests/__snapshots__/vertical-withSubtitle.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/vertical-withTitle.svg b/packages/banners/tests/__snapshots__/vertical-withTitle.svg index 06bf8c5..203ad30 100644 --- a/packages/banners/tests/__snapshots__/vertical-withTitle.svg +++ b/packages/banners/tests/__snapshots__/vertical-withTitle.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 0ffa3aa3b1af68a4d069dd1f18a71e76f1ee497f Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:35:01 -0300 Subject: [PATCH 25/27] =?UTF-8?q?test(banners):=20=F0=9F=9A=A8=20different?= =?UTF-8?q?=20icon=20providing=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/icons-withIconifyIcon.svg | 1 + packages/banners/tests/icons.test.js | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 packages/banners/tests/__snapshots__/icons-withIconifyIcon.svg create mode 100644 packages/banners/tests/icons.test.js diff --git a/packages/banners/tests/__snapshots__/icons-withIconifyIcon.svg b/packages/banners/tests/__snapshots__/icons-withIconifyIcon.svg new file mode 100644 index 0000000..dafc54d --- /dev/null +++ b/packages/banners/tests/__snapshots__/icons-withIconifyIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/icons.test.js b/packages/banners/tests/icons.test.js new file mode 100644 index 0000000..529c9fe --- /dev/null +++ b/packages/banners/tests/icons.test.js @@ -0,0 +1,44 @@ +import { describe, expect, it } from 'vitest'; +import banner from '../src/index'; + +describe('Iconify icons', async () => { + it('API\'s Iconify icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + // eslint-disable-next-line spellcheck/spell-checker + icon: 'solar:test-tube-minimalistic-bold-duotone', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/icons-withIconifyIcon.svg'); + }); + + it('Local Iconify icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: ` + + + + + + + + `.toString(), + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/icons-withIconifyIcon.svg'); + }); + + it('URL Iconify icon', async () => { + const result = await banner({ + title: 'Hello World', + subtitle: 'This is a test', + icon: 'https://api.iconify.design/solar:test-tube-minimalistic-bold-duotone.svg', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/icons-withIconifyIcon.svg'); + }); +}); From 0794bebebff7bbe0b7ef5027907e50736e7c9433 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:35:31 -0300 Subject: [PATCH 26/27] =?UTF-8?q?test(banners):=20=F0=9F=9A=A8=20complex?= =?UTF-8?q?=20banner=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/__snapshots__/banner-horizontal.svg | 1 + .../tests/__snapshots__/banner-rtl.svg | 1 + .../tests/__snapshots__/banner-vertical.svg | 1 + packages/banners/tests/banner.test.ts | 57 +++++++++++++++++++ packages/banners/vitest.config.js | 2 +- 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 packages/banners/tests/__snapshots__/banner-horizontal.svg create mode 100644 packages/banners/tests/__snapshots__/banner-rtl.svg create mode 100644 packages/banners/tests/__snapshots__/banner-vertical.svg create mode 100644 packages/banners/tests/banner.test.ts diff --git a/packages/banners/tests/__snapshots__/banner-horizontal.svg b/packages/banners/tests/__snapshots__/banner-horizontal.svg new file mode 100644 index 0000000..de164d0 --- /dev/null +++ b/packages/banners/tests/__snapshots__/banner-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/banner-rtl.svg b/packages/banners/tests/__snapshots__/banner-rtl.svg new file mode 100644 index 0000000..a03bc43 --- /dev/null +++ b/packages/banners/tests/__snapshots__/banner-rtl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/__snapshots__/banner-vertical.svg b/packages/banners/tests/__snapshots__/banner-vertical.svg new file mode 100644 index 0000000..2d98174 --- /dev/null +++ b/packages/banners/tests/__snapshots__/banner-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/banners/tests/banner.test.ts b/packages/banners/tests/banner.test.ts new file mode 100644 index 0000000..bb24967 --- /dev/null +++ b/packages/banners/tests/banner.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from 'vitest'; +import type { BannerOptions } from '../src/index'; +import banner from '../src/index'; + +describe('Complex banner', async () => { + const options: BannerOptions = { + title: '@marknow/banners', + subtitle: 'This is a more complex banner that uses most of the package settings', + icon: 'solar:inbox-unread-bold-duotone', + colors: { + foreground: '#feefec', + background: '#1d1412', + }, + fonts: { + title: { + // eslint-disable-next-line spellcheck/spell-checker + name: 'Quattrocento', + data: await (await fetch('https://fonts.bunny.net/quattrocento/files/quattrocento-latin-700-normal.woff')).arrayBuffer(), + weight: 700, + style: 'normal', + }, + subtitle: { + // eslint-disable-next-line spellcheck/spell-checker + name: 'Quattrocento Sans', + data: await (await fetch('https://fonts.bunny.net/quattrocento-sans/files/quattrocento-sans-latin-400-normal.woff')).arrayBuffer(), + weight: 400, + style: 'normal', + }, + }, + libConfig: { + fetcher: globalThis.fetch, + }, + }; + + it('Horizontal', async () => { + const result = await banner({ + ...options, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/banner-horizontal.svg'); + }); + + it('Horizontal RTL', async () => { + const result = await banner({ + ...options, + rtl: true, + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/banner-rtl.svg'); + }); + + it('Vertical', async () => { + const result = await banner({ + ...options, + layout: 'vertical', + }); + expect(result.toString()).toMatchFileSnapshot('./__snapshots__/banner-vertical.svg'); + }); +}); diff --git a/packages/banners/vitest.config.js b/packages/banners/vitest.config.js index 90a689f..d9b0e85 100644 --- a/packages/banners/vitest.config.js +++ b/packages/banners/vitest.config.js @@ -5,6 +5,6 @@ export default defineProject({ environmentMatchGlobs: [ ['**\/*{,.node}.test.{js,ts}', 'node'], ], - include: ['./tests/**/*.test.js'], + include: ['./tests/**/*.test.{js,ts}'], }, }); From b35dfebfa9f8709c4e5acad31d33bdeb02247678 Mon Sep 17 00:00:00 2001 From: Guz013 <43732358+Guz013@users.noreply.github.com> Date: Mon, 26 Jun 2023 16:36:32 -0300 Subject: [PATCH 27/27] =?UTF-8?q?chore(banners):=20=F0=9F=94=A7=20markdown?= =?UTF-8?q?=20for=20easily=20preview=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/banners/tests/PREVIEWS.md | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 packages/banners/tests/PREVIEWS.md diff --git a/packages/banners/tests/PREVIEWS.md b/packages/banners/tests/PREVIEWS.md new file mode 100644 index 0000000..c020b22 --- /dev/null +++ b/packages/banners/tests/PREVIEWS.md @@ -0,0 +1,42 @@ + +### [`banner.test.ts`](./banner.test.ts) + +![horizontal](__snapshots__/banner-horizontal.svg) + +![vertical](__snapshots__/banner-vertical.svg) + +![rtl](__snapshots__/banner-rtl.svg) + +### [`results.test.js`](./results.test.js); +![withTitle](__snapshots__/withTitle.svg) + +![withSubtitle](__snapshots__/withSubtitle.svg) + +![withIcon](__snapshots__/withIcon.svg) + +![withComplete](__snapshots__/withComplete.svg) + +### [`vertical-results.test.js`](./vertical-results.test.js); + +![withTitle](__snapshots__/vertical-withTitle.svg) + +![withSubtitle](__snapshots__/vertical-withSubtitle.svg) + +![withIcon](__snapshots__/vertical-withIcon.svg) + +![withComplete](__snapshots__/vertical-withComplete.svg) + +### [`rtl-results.test.js`](./rtl-results.test.js); + +![withTitle](__snapshots__/rtl-withTitle.svg) + +![withSubtitle](__snapshots__/rtl-withSubtitle.svg) + +![withIcon](__snapshots__/rtl-withIcon.svg) + +![withComplete](__snapshots__/rtl-withComplete.svg) + +### [`icons.test.js`](./icons.test.js) + +![icons](__snapshots__/icons-withIconifyIcon.svg) +