diff --git a/.eslintignore b/.eslintignore index 50812980..633369e9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,7 +2,5 @@ node_modules public *.cjs src/graphql/*.gen.ts -src/legacy_* -src/components/EditorExample dist/ .vercel/ diff --git a/.gitignore b/.gitignore index 1bcd6d2e..6211b583 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ pnpm-debug.log* public/upload/* src/graphql/introspec.gen.ts stats.html +*.scss.d.ts +pnpm-lock.yaml diff --git a/.npmrc b/.npmrc deleted file mode 100644 index ef83021a..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -# Expose Astro dependencies for `pnpm` users -shamefully-hoist=true diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c4b680bb..2ae9e1da 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,14 @@ +[0.8.0] +[+] i18next for ,solid +[-] i18n +[+] custom snackbar +[+] editor lazy load +[+] hygen +[-] astro removed +[+] vite ssr plugin + [0.7.1] -[+] reactions CRUL +[+] reactions CUDL [+] api/upload with storj [+] api/feedback [+] bumped astro pkgs versions diff --git a/LICENSE b/LICENSE index c5359825..2a51def1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021-2022 Discours +Copyright (c) 2021-2023 Discours Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/api/feedback.js b/api/feedback.js index ea40c6b2..deaf8931 100644 --- a/api/feedback.js +++ b/api/feedback.js @@ -1,5 +1,6 @@ const MG = require('mailgun.js') const fd = require('form-data') +const mailgun = new MG(fd) const mgOptions = { key: process.env.MAILGUN_API_KEY, @@ -7,6 +8,8 @@ const mgOptions = { username: 'discoursio' // FIXME } +const client = mailgun.client(mgOptions) + const messageData = (subject, text) => { return { from: 'Discours Feedback Robot ', @@ -18,8 +21,6 @@ const messageData = (subject, text) => { export default async function handler(req, res) { const { contact, subject, message } = req.query try { - const mailgun = new MG(fd) - const client = mailgun.client(mgOptions) const data = messageData(`${contact}: ${subject}`, message) client.messages.create(mgOptions.domain, data).then(console.log).catch(console.error) } catch (error) { diff --git a/api/newsletter.js b/api/newsletter.js index 42485d9e..29198971 100644 --- a/api/newsletter.js +++ b/api/newsletter.js @@ -1,5 +1,6 @@ const MG = require('mailgun.js') const fd = require('form-data') +const mailgun = new MG(fd) const mgOptions = { key: process.env.MAILGUN_API_KEY, @@ -7,13 +8,13 @@ const mgOptions = { username: 'discoursio' // FIXME } +const client = mailgun.client(mgOptions) + export default async (req, res) => { const { email } = req.query - const mailgun = new MG(fd) - const client = mailgun.client(mgOptions) try { - await client.lists.members.createMember(mgOptions.domain, { + const response = await client.lists.members.createMember(mgOptions.domain, { address: email, subscribed: true, upsert: 'yes' @@ -21,7 +22,8 @@ export default async (req, res) => { return res.status(200).json({ success: true, - message: 'Email added to newsletter list' + message: 'Email was added to newsletter list', + response: JSON.stringify(response) }) } catch (error) { return res.status(400).json({ diff --git a/api/ssr.js b/api/ssr.js new file mode 100644 index 00000000..9d6548a3 --- /dev/null +++ b/api/ssr.js @@ -0,0 +1,20 @@ +import { renderPage } from 'vite-plugin-ssr' + +export default async function handler(req, res) { + const { url, cookies } = req + + const pageContext = await renderPage({ urlOriginal: url, cookies }) + + const { httpResponse } = pageContext + + if (!httpResponse) { + res.statusCode = 200 + res.end() + return + } + + const { body, statusCode, contentType } = httpResponse + res.statusCode = statusCode + res.setHeader('Content-Type', contentType) + res.end(body) +} diff --git a/astro.config.ts b/astro.config.ts deleted file mode 100644 index e38676de..00000000 --- a/astro.config.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { defineConfig, AstroUserConfig } from 'astro/config' -import vercel from '@astrojs/vercel/serverless' -import solidJs from '@astrojs/solid-js' -import defaultGenerateScopedName from 'postcss-modules/build/generateScopedName' -import { isDev } from './src/utils/config' -// import { visualizer } from 'rollup-plugin-visualizer' - -const PATH_PREFIX = '/src/' - -const getDevCssClassPrefix = (filename: string): string => { - return filename - .slice(filename.indexOf(PATH_PREFIX) + PATH_PREFIX.length) - .replace('.module.scss', '') - .replaceAll(/[/?\\]/g, '-') -} - -const devGenerateScopedName = (name: string, filename: string, css: string) => - getDevCssClassPrefix(filename) + '_' + defaultGenerateScopedName(name, filename, css) - -const astroConfig: AstroUserConfig = { - site: 'https://new.discours.io', - integrations: [solidJs()], - output: 'server', - adapter: vercel(), - vite: { - build: { - chunkSizeWarningLimit: 777, - rollupOptions: { - // plugins: [visualizer()], - output: { - // eslint-disable-next-line sonarjs/cognitive-complexity - /* - manualChunks(id) { - if (id.includes('p2p')) return 'p2p' - if (id.includes('editor') || id.includes('Editor')) return 'editor' - if (id.includes('node_modules')) { - let chunkid - if (id.includes('solid')) chunkid = 'solid' - if (id.includes('swiper')) chunkid = 'swiper' - if (id.includes('acorn')) chunkid = 'acorn' - if (id.includes('prosemirror')) chunkid = 'editor' - if (id.includes('markdown') || id.includes('mdurl') || id.includes('yjs')) { - chunkid = 'codecs' - } - if ( - id.includes('p2p') || - id.includes('y-protocols') || - id.includes('y-webrtc') || - id.includes('simple-peer') - ) { - chunkid = 'p2p' - } - return chunkid - } - } - */ - }, - external: [] - } - }, - css: { - preprocessorOptions: { - scss: { - additionalData: '@import "src/styles/imports";\n' - } - }, - modules: { - generateScopedName: isDev ? devGenerateScopedName : defaultGenerateScopedName, - localsConvention: null - } - } - } -} - -// https://astro.build/config -export default defineConfig(astroConfig) diff --git a/docs/article.puml b/docs/article.puml index 3730f2fb..3897e1e6 100644 --- a/docs/article.puml +++ b/docs/article.puml @@ -2,7 +2,7 @@ actor User participant Browser participant Vercel -participant Astro +participant article.page.server.ts participant Solid participant Store @@ -10,17 +10,17 @@ User -> Browser: discours.io activate Browser Browser -> Vercel: GET activate Vercel -Vercel -> Astro: render -activate Astro -Astro -> apiClient: getArticle({ slug }) +Vercel -> article.page.server.ts: render +activate article.page.server.ts +article.page.server.ts -> apiClient: getArticle({ slug }) activate apiClient apiClient -> DB: query: articleBySlug activate DB DB --> apiClient: response deactivate DB -apiClient --> Astro: article data +apiClient --> article.page.server.ts: article data deactivate apiClient -Astro -> Solid: render +article.page.server.ts -> Solid: render activate Solid Solid -> Store: useCurrentArticleStore(article) activate Store @@ -28,11 +28,11 @@ Store -> Store: create store with initial data (server) Store --> Solid: currentArticle deactivate Store Solid -> Solid: render component -Solid --> Astro: rendered component +Solid --> article.page.server.ts: rendered component deactivate Solid -Astro --> Vercel: rendered page +article.page.server.ts --> Vercel: rendered page Vercel -> Vercel: save rendered page to CDN -deactivate Astro +deactivate article.page.server.ts Vercel --> Browser: rendered page deactivate Vercel Browser --> User: rendered page @@ -50,7 +50,7 @@ Solid -> Store: loadArticleComments activate Store Store -> apiClient: getArticleComments activate apiClient -apiClient -> DB: query: getReactionsForShouts +apiClient -> DB: query: getReactions activate DB DB --> apiClient: response deactivate DB diff --git a/docs/i18n.puml b/docs/i18n.puml new file mode 100644 index 00000000..6c04fce1 --- /dev/null +++ b/docs/i18n.puml @@ -0,0 +1,40 @@ +@startuml +actor User +participant Browser +participant Server + +User -> Browser: discours.io +activate Browser +Browser -> Server: GET\nquery { lng }\ncookies { lng } +opt lng in query +Server -> Server: lng = lng from query +else no lng in query +opt lng in cookies +Server -> Server: lng = lng from cookies +else no lng in cookies +Server -> Server: lng = 'ru' +end opt +end opt +note right +_dafault.page.server.ts render +end note + +opt i18next is not initialized +Server -> Server: initialize i18next with lng +else i18next not initialized +Server -> Server: change i18next language to lng +end opt +note right +all resources loaded synchronously +end note +Server --> Browser: pageContext { lng } +Browser -> Browser: init client side i18next with http backend +activate Browser +Browser -> Server: get translations for current language +Server --> Browser: translations JSON +deactivate Browser +Browser -> Browser: render page +Browser --> User: rendered page +deactivate Browser +@enduml + diff --git a/docs/routing.puml b/docs/routing.puml new file mode 100644 index 00000000..7ace8f8e --- /dev/null +++ b/docs/routing.puml @@ -0,0 +1,24 @@ +@startuml +actor User +participant Browser +participant Server + +User -> Browser: discours.io +activate Browser +Browser -> Server: GET +activate Server +Server -> Server: resolve route +note right +based on routes from +*.page.route.ts files +end note +Server -> Server: some.page.server.ts onBeforeRender +Server -> Server: _default.page.server.tsx render +Server --> Browser: pageContent +deactivate Server +Browser -> Browser: _default.page.client.tsx render(pageContext) + +Browser --> User: rendered page +deactivate Browser +@enduml + diff --git a/package-lock.json b/package-lock.json index 4857feae..694479cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,33 +1,29 @@ { "name": "discoursio-webapp", - "version": "0.7.1", + "version": "0.8.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "discoursio-webapp", - "version": "0.7.1", + "version": "0.8.0", "license": "MIT", "dependencies": { "@aws-sdk/abort-controller": "^3.266.0", "@aws-sdk/client-s3": "^3.216.0", "@aws-sdk/lib-storage": "^3.266.0", - "@connorskees/grass": "^0.12.0", - "@solid-primitives/share": "^2.0.1", - "astro-seo-meta": "^2.0.0", "formidable": "^2.1.1", + "i18next": "^22.4.9", "mailgun.js": "^8.0.6" }, "devDependencies": { - "@astrojs/solid-js": "^2.0.0", - "@astrojs/vercel": "^3.0.0", "@babel/core": "^7.20.12", - "@graphql-codegen/cli": "^2.16.4", - "@graphql-codegen/typescript": "^2.8.7", - "@graphql-codegen/typescript-operations": "^2.5.12", + "@graphql-codegen/cli": "^3.0.0", + "@graphql-codegen/typescript": "^3.0.0", + "@graphql-codegen/typescript-operations": "^3.0.0", "@graphql-codegen/typescript-urql": "^3.7.3", "@graphql-codegen/urql-introspection": "^2.2.1", - "@graphql-tools/url-loader": "^7.17.3", + "@graphql-tools/url-loader": "^7.17.13", "@graphql-typed-document-node/core": "^3.1.1", "@nanostores/router": "^0.8.1", "@nanostores/solid": "^0.3.2", @@ -35,18 +31,17 @@ "@solid-primitives/memo": "^1.1.3", "@solid-primitives/share": "^2.0.1", "@solid-primitives/storage": "^1.3.4", - "@solid-primitives/upload": "^0.0.105", + "@solid-primitives/upload": "^0.0.107", + "@solidjs/meta": "^0.28.2", "@types/express": "^4.17.15", "@types/node": "^18.11.18", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.48.2", - "@typescript-eslint/parser": "^5.48.2", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", "@urql/core": "^3.1.1", "@urql/devtools": "^2.0.3", "@urql/exchange-graphcache": "^5.0.8", - "astro": "^2.0.2", - "astro-eslint-parser": "^0.11.0", - "astro-seo-meta": "^2.0.0", + "babel-preset-solid": "^1.5.6", "bcryptjs": "^2.4.3", "bootstrap": "^5.2.3", "clsx": "^1.2.1", @@ -54,10 +49,9 @@ "cookie-signature": "^1.2.0", "cosmiconfig-toml-loader": "^1.0.0", "cross-env": "^7.0.3", - "eslint": "^8.32.0", - "eslint-config-stylelint": "^17.1.0", + "eslint": "^8.34.0", + "eslint-config-stylelint": "^18.0.0", "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-astro": "^0.23.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-promise": "^6.1.1", @@ -70,21 +64,21 @@ "hast-util-select": "^5.0.4", "husky": "^8.0.3", "hygen": "^6.2.11", + "i18next-http-backend": "^2.1.1", "idb": "^7.1.1", "jest": "^29.3.1", - "lint-staged": "^13.1.0", + "js-cookie": "^3.0.1", + "lint-staged": "^13.1.2", "loglevel": "^1.8.1", "loglevel-plugin-prefix": "^0.8.4", "markdown-it": "^13.0.1", "markdown-it-container": "^3.0.0", - "markdown-it-implicit-figures": "^0.10.0", + "markdown-it-implicit-figures": "^0.11.0", "markdown-it-mark": "^3.0.1", "markdown-it-replace-link": "^1.1.0", "nanostores": "^0.7.1", "orderedmap": "^2.1.0", - "postcss": "^8.4.21", - "postcss-modules": "5.0.0", - "prettier": "^2.8.3", + "prettier": "^2.7.1", "prettier-eslint": "^15.0.1", "prosemirror-commands": "^1.5.0", "prosemirror-dropcursor": "^1.6.1", @@ -92,33 +86,37 @@ "prosemirror-gapcursor": "^1.3.1", "prosemirror-history": "^1.3.0", "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", + "prosemirror-keymap": "^1.2.1", "prosemirror-markdown": "^1.10.1", "prosemirror-menu": "^1.2.1", "prosemirror-model": "^1.19.0", "prosemirror-schema-list": "^1.2.2", "prosemirror-state": "^1.4.2", "prosemirror-view": "^1.30.0", - "rollup": "^2.79.1", + "rollup": "^3.15.0", "rollup-plugin-visualizer": "^5.9.0", - "sass": "1.32.13", - "solid-js": "^1.6.9", + "sass": "^1.58.1", + "solid-js": "^1.6.11", "solid-transition-group": "^0.0.13", "sort-package-json": "^2.3.0", - "stylelint": "^14.16.1", + "stylelint": "^15.1.0", "stylelint-config-css-modules": "^4.1.0", "stylelint-config-prettier-scss": "^0.0.1", - "stylelint-config-standard-scss": "^6.1.0", + "stylelint-config-standard-scss": "^7.0.1", "stylelint-order": "^6.0.1", - "stylelint-scss": "^4.3.0", + "stylelint-scss": "^4.4.0", "swiper": "^8.4.7", "ts-node": "^10.9.1", "typescript": "^4.9.4", - "undici": "^5.15.1", + "undici": "^5.19.1", "unique-names-generator": "^4.7.1", "uuid": "^9.0.0", - "vite": "^3.2.5", - "ws": "^8.12.0", + "vite": "^4.1.1", + "vite-plugin-sass-dts": "^1.2.15", + "vite-plugin-solid": "^2.3.8", + "vite-plugin-ssr": "^0.4.38", + "wonka": "^6.2.3", + "ws": "^8.12.1", "y-prosemirror": "^1.2.0", "y-protocols": "^1.0.5", "y-webrtc": "^10.2.4", @@ -428,138 +426,6 @@ "node": ">=14" } }, - "node_modules/@astrojs/compiler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-1.1.0.tgz", - "integrity": "sha512-C4kTwirys+HafufMqaxCbML2wqkGaXJM+5AekXh/v1IIOnMIdcEON9GBYsG6qa8aAmLhZ58aUZGPhzcA3Dx7Uw==", - "dev": true - }, - "node_modules/@astrojs/language-server": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-0.28.3.tgz", - "integrity": "sha512-fPovAX/X46eE2w03jNRMpQ7W9m2mAvNt4Ay65lD9wl1Z5vIQYxlg7Enp9qP225muTr4jSVB5QiLumFJmZMAaVA==", - "dev": true, - "dependencies": { - "@vscode/emmet-helper": "^2.8.4", - "events": "^3.3.0", - "prettier": "^2.7.1", - "prettier-plugin-astro": "^0.7.0", - "source-map": "^0.7.3", - "vscode-css-languageservice": "^6.0.1", - "vscode-html-languageservice": "^5.0.0", - "vscode-languageserver": "^8.0.1", - "vscode-languageserver-protocol": "^3.17.1", - "vscode-languageserver-textdocument": "^1.0.4", - "vscode-languageserver-types": "^3.17.1", - "vscode-uri": "^3.0.3" - }, - "bin": { - "astro-ls": "bin/nodeServer.js" - } - }, - "node_modules/@astrojs/markdown-remark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-2.0.1.tgz", - "integrity": "sha512-xQF1rXGJN18m+zZucwRRtmNehuhPMMhZhi6HWKrtpEAKnHSPk8lqf1GXgKH7/Sypglu8ivdECZ+EGs6kOYVasQ==", - "dev": true, - "dependencies": { - "@astrojs/prism": "^2.0.0", - "github-slugger": "^1.4.0", - "import-meta-resolve": "^2.1.0", - "rehype-raw": "^6.1.1", - "rehype-stringify": "^9.0.3", - "remark-gfm": "^3.0.1", - "remark-parse": "^10.0.1", - "remark-rehype": "^10.1.0", - "remark-smartypants": "^2.0.0", - "shiki": "^0.11.1", - "unified": "^10.1.2", - "unist-util-visit": "^4.1.0", - "vfile": "^5.3.2" - }, - "peerDependencies": { - "astro": "^2.0.2" - } - }, - "node_modules/@astrojs/markdown-remark/node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "dev": true - }, - "node_modules/@astrojs/prism": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-2.0.0.tgz", - "integrity": "sha512-YgeoeEPqsxaEpg0rwe/bUq3653LqSQnMjrLlpYwrbQQMQQqz6Y5yXN+RX3SfLJ6ppNb4+Fu2+Z49EXjk48Ihjw==", - "dev": true, - "dependencies": { - "prismjs": "^1.28.0" - }, - "engines": { - "node": ">=16.12.0" - } - }, - "node_modules/@astrojs/solid-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/solid-js/-/solid-js-2.0.2.tgz", - "integrity": "sha512-fQMOfBcmvYHXJg8vR0LgoeBgrlLHrxnlzxxmPkDKrGPBRh9y3si2d/ChpMyMRL3ibAOqWTs7Xs5gOYqrFZbw3g==", - "dev": true, - "dependencies": { - "babel-preset-solid": "^1.4.2", - "vitefu": "^0.2.4" - }, - "engines": { - "node": ">=16.12.0" - }, - "peerDependencies": { - "solid-js": "^1.4.3" - } - }, - "node_modules/@astrojs/telemetry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-2.0.0.tgz", - "integrity": "sha512-RnWojVMIsql3GGWDP5pNWmhmBQVkCpxGNZ8yPr2cbmUqsUYGSvErhqfkLfro9j2/STi5UDmSpNgjPkQmXpgnKw==", - "dev": true, - "dependencies": { - "ci-info": "^3.3.1", - "debug": "^4.3.4", - "dlv": "^1.1.3", - "dset": "^3.1.2", - "is-docker": "^3.0.0", - "is-wsl": "^2.2.0", - "undici": "^5.14.0", - "which-pm-runs": "^1.1.0" - }, - "engines": { - "node": ">=16.12.0" - } - }, - "node_modules/@astrojs/vercel": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/vercel/-/vercel-3.1.1.tgz", - "integrity": "sha512-3u976waO1HjnmvImmdTiiHqlH+kCF/NAmppwtzWg86uTLj581gYy6OXIfzMxg5uvC1tODbciuauFJcmdEBThIw==", - "dev": true, - "dependencies": { - "@astrojs/webapi": "^2.0.0", - "@vercel/analytics": "^0.1.8", - "@vercel/nft": "^0.22.1", - "fast-glob": "^3.2.11", - "set-cookie-parser": "^2.5.1", - "web-vitals": "^3.1.1" - }, - "peerDependencies": { - "astro": "^2.0.10" - } - }, - "node_modules/@astrojs/webapi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/webapi/-/webapi-2.0.0.tgz", - "integrity": "sha512-gziwy+XvY+/B9mq/eurgJMZ4iFnkcqg1wb0tA8BsVfiUPwl7yQKAFrBxrs2rWfKMXyWlVaTFc8rAYcB5VXQEuw==", - "dev": true, - "dependencies": { - "undici": "^5.14.0" - } - }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", @@ -2804,11 +2670,44 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", + "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.12", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2871,10 +2770,26 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@connorskees/grass": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@connorskees/grass/-/grass-0.12.0.tgz", - "integrity": "sha512-nDICkb3SxivBAteLuUsosUk0EsB0qQW2hBtnkhFP0dP/yAV1zcrq4p38O12/Mw+Yt1DKTqQSyCZAoliaK/kw4g==" + "node_modules/@brillout/import": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@brillout/import/-/import-0.2.2.tgz", + "integrity": "sha512-JatRCkrFxss1iwRrFlnY3yPFyD2yGWIeFprMH++TmZ+wqnRlwfN0ECDJea0EyagSGXlb2CUxFIH3dBMBiV05sw==", + "dev": true + }, + "node_modules/@brillout/json-serializer": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@brillout/json-serializer/-/json-serializer-0.5.3.tgz", + "integrity": "sha512-IxlOMD5gOM0WfFGdeR98jHKiC82Ad1tUnSjvLS5jnRkfMEKBI+YzHA32Umw8W3Ccp5N4fNEX229BW6RaRpxRWQ==", + "dev": true + }, + "node_modules/@brillout/vite-plugin-import-build": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.4.tgz", + "integrity": "sha512-riBgrq/obzDJQTyI4vHUMOl+tZ/PReumAzweZryudzPz7GZBfUBxqlt3GIBfrX+OdcZQuPvfV29GykwfOh2UBw==", + "dev": true, + "dependencies": { + "@brillout/import": "^0.2.2" + } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -2898,6 +2813,52 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz", + "integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.0.0" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz", + "integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz", + "integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.0.0", + "@csstools/css-tokenizer": "^2.0.0" + } + }, "node_modules/@csstools/selector-specificity": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", @@ -2915,366 +2876,6 @@ "postcss-selector-parser": "^6.0.10" } }, - "node_modules/@emmetio/abbreviation": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.2.3.tgz", - "integrity": "sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==", - "dev": true, - "dependencies": { - "@emmetio/scanner": "^1.0.0" - } - }, - "node_modules/@emmetio/css-abbreviation": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz", - "integrity": "sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw==", - "dev": true, - "dependencies": { - "@emmetio/scanner": "^1.0.0" - } - }, - "node_modules/@emmetio/scanner": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.0.tgz", - "integrity": "sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==", - "dev": true - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/win32-x64": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", @@ -3357,18 +2958,18 @@ } }, "node_modules/@graphql-codegen/cli": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.16.5.tgz", - "integrity": "sha512-XYPIp+q7fB0xAGSAoRykiTe4oY80VU+z+dw5nuv4mLY0+pv7+pa2C6Nwhdw7a65lXOhFviBApWCCZeqd54SMnA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.0.0.tgz", + "integrity": "sha512-16nuFabHCfPQ/d+v52OvR1ueL8eiJvS/nRuvuEV8d9T1fkborHKRw4lhyKVebu9izFBs6G0CvVCLhgVzQwHSLw==", "dev": true, "dependencies": { "@babel/generator": "^7.18.13", "@babel/template": "^7.18.10", "@babel/types": "^7.18.13", - "@graphql-codegen/core": "^2.6.8", - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/core": "^3.0.0", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/apollo-engine-loader": "^7.3.6", - "@graphql-tools/code-file-loader": "^7.3.13", + "@graphql-tools/code-file-loader": "^7.3.17", "@graphql-tools/git-loader": "^7.2.13", "@graphql-tools/github-loader": "^7.3.20", "@graphql-tools/graphql-file-loader": "^7.5.0", @@ -3479,12 +3080,12 @@ } }, "node_modules/@graphql-codegen/core": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", - "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.0.0.tgz", + "integrity": "sha512-WUfAUTmUcgeHPR7F5ZQqaBqJLJb5+3Lvp6v9SrnupKOFed+Q3u8CvZL6sPTvDpqqW8Ucjy59DEZqumPLp99pdQ==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.1", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/schema": "^9.0.0", "@graphql-tools/utils": "^9.1.1", "tslib": "~2.4.0" @@ -3500,9 +3101,9 @@ "dev": true }, "node_modules/@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.0.0.tgz", + "integrity": "sha512-vgNGTanT36hC4RAC/LAThMEjDvnu3WCyx6MtKZcPUtfCWFxbUAr88+OarGl1LAEiOef0agIREC7tIBXCqjKkJA==", "dev": true, "dependencies": { "@graphql-tools/utils": "^9.0.0", @@ -3523,12 +3124,12 @@ "dev": true }, "node_modules/@graphql-codegen/schema-ast": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", - "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.0.tgz", + "integrity": "sha512-5gC8nNk/bxufS2LBSpaPExRgn6eNo8LQdtwDtwfM9XGEzt/F6rIBQoyOmqqwkiBmgu1PHHH8kLZMBYvYB1x5DA==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/utils": "^9.0.0", "tslib": "~2.4.0" }, @@ -3543,14 +3144,14 @@ "dev": true }, "node_modules/@graphql-codegen/typescript": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.8.tgz", - "integrity": "sha512-A0oUi3Oy6+DormOlrTC4orxT9OBZkIglhbJBcDmk34jAKKUgesukXRd4yOhmTrnbchpXz2T8IAOFB3FWIaK4Rw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.0.tgz", + "integrity": "sha512-FQWyuIUy1y+fxb9+EZfvdBHBQpYExlIBHV5sg2WGNCsyVyCqBTl0mO8icyOtsQPVg6YFMFe8JJO69vQbwHma5w==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/schema-ast": "^2.6.1", - "@graphql-codegen/visitor-plugin-common": "2.13.8", + "@graphql-codegen/plugin-helpers": "^4.0.0", + "@graphql-codegen/schema-ast": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "3.0.0", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, @@ -3559,14 +3160,14 @@ } }, "node_modules/@graphql-codegen/typescript-operations": { - "version": "2.5.13", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.13.tgz", - "integrity": "sha512-3vfR6Rx6iZU0JRt29GBkFlrSNTM6t+MSLF86ChvL4d/Jfo/JYAGuB3zNzPhirHYzJPCvLOAx2gy9ID1ltrpYiw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.0.tgz", + "integrity": "sha512-t+Lk+lxkUFDh6F0t8CErowOccP3bZwxhl66qmEeBcOrC7jQrSCnRZoFvOXhFKFBJe/y4DIJiizgSr34AqjiJIQ==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/typescript": "^2.8.8", - "@graphql-codegen/visitor-plugin-common": "2.13.8", + "@graphql-codegen/plugin-helpers": "^4.0.0", + "@graphql-codegen/typescript": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "3.0.0", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, @@ -3744,12 +3345,12 @@ "dev": true }, "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "2.13.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz", - "integrity": "sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.0.tgz", + "integrity": "sha512-ZoNlCmmkGClB137SpJT9og/nkihLN7Z4Ynl9Ir3OlbDuI20dbpyXsclpr9QGLcxEcfQeVfhGw9CooW7wZJJ8LA==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/optimize": "^1.3.0", "@graphql-tools/relay-operation-optimizer": "^6.5.0", "@graphql-tools/utils": "^9.0.0", @@ -3813,13 +3414,13 @@ } }, "node_modules/@graphql-tools/batch-execute": { - "version": "8.5.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.17.tgz", - "integrity": "sha512-ma6zlFIBG8VuqSwE8jhYhMbaFsJ1YdVsnpFmbQ0O/qJTmlgdAWCyAZTJH0aZ24fqNFfj/vW/Qtpqn7gRcF8QOw==", + "version": "8.5.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.18.tgz", + "integrity": "sha512-mNv5bpZMLLwhkmPA6+RP81A6u3KF4CSKLf3VX9hbomOkQR4db8pNs8BOvpZU54wKsUzMzdlws/2g/Dabyb2Vsg==", "dev": true, "dependencies": { "@graphql-tools/utils": "9.2.1", - "dataloader": "2.2.1", + "dataloader": "2.2.2", "tslib": "^2.4.0", "value-or-promise": "1.0.12" }, @@ -3844,16 +3445,16 @@ } }, "node_modules/@graphql-tools/delegate": { - "version": "9.0.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.26.tgz", - "integrity": "sha512-RPcjH+NnK3e4e9/6CwKbyv9DtVa+ojiwvsbW9Q6zMXRdlP0zazsQOe5+ktL3yE+d3zlzGAasp0WAiSLUS5vFRw==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.27.tgz", + "integrity": "sha512-goYewiPls/RDXiRTl1S2tRPlsyDQCxlDWqd0uEIzQZ6aWSyiutfwQnTzdbZPXK0qOblEVMIqFhSGrB6fp0OkBA==", "dev": true, "dependencies": { - "@graphql-tools/batch-execute": "8.5.17", + "@graphql-tools/batch-execute": "8.5.18", "@graphql-tools/executor": "0.0.14", "@graphql-tools/schema": "9.0.16", "@graphql-tools/utils": "9.2.1", - "dataloader": "2.2.1", + "dataloader": "2.2.2", "tslib": "~2.5.0", "value-or-promise": "1.0.12" }, @@ -3878,9 +3479,9 @@ } }, "node_modules/@graphql-tools/executor-graphql-ws": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.10.tgz", - "integrity": "sha512-5SxFvupyWe6+Egq8Zws0+mJZMKV18rTAwxHwhrx+KhRfGpilqkqS4I+qwVL94LNktWL2uy95cU5b5CQFyVaVEg==", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.11.tgz", + "integrity": "sha512-muRj6j897ks2iKqe3HchWFFzd+jFInSRuLPvHJ7e4WPrejFvaZx3BQ9gndfJvVkfYUZIFm13stCGXaJJTbVM0Q==", "dev": true, "dependencies": { "@graphql-tools/utils": "9.2.1", @@ -3889,21 +3490,21 @@ "graphql-ws": "5.11.3", "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "8.12.0" + "ws": "8.12.1" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/executor-http": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.6.tgz", - "integrity": "sha512-OPE730n7T8nMgQFujbDuclCJrEchaVKZ4G5rl8r8fY/a/clKtZDZONTPnVSgW3/cBJ/WIXJGDvJtXwx6F8Fepg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.8.tgz", + "integrity": "sha512-L3tldMlL760Bkdl6zdearvxqCA8cRmTWvd8SyZ0i/EpBWFkU1XcUF2/wqNt7URdNAE6+pO6wCgI4BEsKOgL7Qg==", "dev": true, "dependencies": { "@graphql-tools/utils": "^9.2.1", "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.7.0", + "@whatwg-node/fetch": "^0.8.1", "dset": "^3.1.2", "extract-files": "^11.0.0", "meros": "^1.2.1", @@ -3915,26 +3516,28 @@ } }, "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", - "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", "dev": true, "dependencies": { "@peculiar/webcrypto": "^1.4.0", - "@whatwg-node/node-fetch": "^0.1.0", + "@whatwg-node/node-fetch": "^0.3.0", "busboy": "^1.6.0", "urlpattern-polyfill": "^6.0.2", "web-streams-polyfill": "^3.2.1" } }, "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", - "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", "dev": true, "dependencies": { "@whatwg-node/events": "^0.0.2", "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", "tslib": "^2.3.1" }, "peerDependencies": { @@ -3942,16 +3545,16 @@ } }, "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.8.tgz", - "integrity": "sha512-NZfBijmr774rCO60cRTqbf2otRjn32sVikq6PdT+0vZfhVwX7wydNMdyfJZQ3WGuTyab5hrqOWD+UU8VcIbAeg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.9.tgz", + "integrity": "sha512-L7oDv7R5yoXzMH+KLKDB2WHVijfVW4dB2H+Ae1RdW3MFvwbYjhnIB6QzHqKEqksjp/FndtxZkbuTIuAOsYGTYw==", "dev": true, "dependencies": { "@graphql-tools/utils": "9.2.1", "@types/ws": "^8.0.0", "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "8.12.0" + "ws": "8.12.1" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" @@ -4149,6 +3752,91 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.10.tgz", + "integrity": "sha512-5SxFvupyWe6+Egq8Zws0+mJZMKV18rTAwxHwhrx+KhRfGpilqkqS4I+qwVL94LNktWL2uy95cU5b5CQFyVaVEg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "9.2.1", + "@repeaterjs/repeater": "3.0.4", + "@types/ws": "^8.0.0", + "graphql-ws": "5.11.3", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.12.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-legacy-ws": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.8.tgz", + "integrity": "sha512-NZfBijmr774rCO60cRTqbf2otRjn32sVikq6PdT+0vZfhVwX7wydNMdyfJZQ3WGuTyab5hrqOWD+UU8VcIbAeg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "9.2.1", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.12.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/url-loader": { + "version": "7.17.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.11.tgz", + "integrity": "sha512-zGTrdz5hVm/0+vLZJexhB/B4m95ZCP0eqD2QoNP0hsstaqTyn9u84kTtYUpbPlz7hAxZsdu+VcLaypE4qPGGGw==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^9.0.26", + "@graphql-tools/executor-graphql-ws": "^0.0.10", + "@graphql-tools/executor-http": "^0.1.6", + "@graphql-tools/executor-legacy-ws": "^0.0.8", + "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/wrap": "^9.3.5", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.7.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", + "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "dev": true, + "dependencies": { + "@peculiar/webcrypto": "^1.4.0", + "@whatwg-node/node-fetch": "^0.1.0", + "busboy": "^1.6.0", + "urlpattern-polyfill": "^6.0.2", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", + "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.0.2", + "busboy": "^1.6.0", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@types/node": "^18.0.6" + } + }, "node_modules/@graphql-tools/prisma-loader/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4219,6 +3907,27 @@ "node": ">=8" } }, + "node_modules/@graphql-tools/prisma-loader/node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@graphql-tools/relay-operation-optimizer": { "version": "6.5.17", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.17.tgz", @@ -4249,20 +3958,20 @@ } }, "node_modules/@graphql-tools/url-loader": { - "version": "7.17.11", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.11.tgz", - "integrity": "sha512-zGTrdz5hVm/0+vLZJexhB/B4m95ZCP0eqD2QoNP0hsstaqTyn9u84kTtYUpbPlz7hAxZsdu+VcLaypE4qPGGGw==", + "version": "7.17.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.13.tgz", + "integrity": "sha512-FEmbvw68kxeZLn4VYGAl+NuBPk09ZnxymjW07A6mCtiDayFgYfHdWeRzXn/iM5PzsEuCD73R1sExtNQ/ISiajg==", "dev": true, "dependencies": { "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^9.0.26", - "@graphql-tools/executor-graphql-ws": "^0.0.10", - "@graphql-tools/executor-http": "^0.1.6", - "@graphql-tools/executor-legacy-ws": "^0.0.8", + "@graphql-tools/delegate": "^9.0.27", + "@graphql-tools/executor-graphql-ws": "^0.0.11", + "@graphql-tools/executor-http": "^0.1.7", + "@graphql-tools/executor-legacy-ws": "^0.0.9", "@graphql-tools/utils": "^9.2.1", - "@graphql-tools/wrap": "^9.3.5", + "@graphql-tools/wrap": "^9.3.6", "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.7.0", + "@whatwg-node/fetch": "^0.8.0", "isomorphic-ws": "^5.0.0", "tslib": "^2.4.0", "value-or-promise": "^1.0.11", @@ -4273,26 +3982,28 @@ } }, "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", - "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", "dev": true, "dependencies": { "@peculiar/webcrypto": "^1.4.0", - "@whatwg-node/node-fetch": "^0.1.0", + "@whatwg-node/node-fetch": "^0.3.0", "busboy": "^1.6.0", "urlpattern-polyfill": "^6.0.2", "web-streams-polyfill": "^3.2.1" } }, "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", - "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", "dev": true, "dependencies": { "@whatwg-node/events": "^0.0.2", "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", "tslib": "^2.3.1" }, "peerDependencies": { @@ -4313,12 +4024,12 @@ } }, "node_modules/@graphql-tools/wrap": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.3.5.tgz", - "integrity": "sha512-D3jR6/ZDWa6bw4hc1odHKLIFLxjgXlL8FSkkNlViAcRgRaqUVgFQsk+dThdWkqKP6+uij4lBG+pd/XZfrI1zeQ==", + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.3.6.tgz", + "integrity": "sha512-HtQIYoPz48bzpMYZzoeMmzIIYuVxcaUuLD7dH7GtIhwe2f4hpPDE+JLUPxpYiaXdY10l7kP9wycK+FtRfCsFlw==", "dev": true, "dependencies": { - "@graphql-tools/delegate": "9.0.26", + "@graphql-tools/delegate": "9.0.27", "@graphql-tools/schema": "9.0.16", "@graphql-tools/utils": "9.2.1", "tslib": "^2.4.0", @@ -5252,65 +4963,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@ljharb/has-package-exports-patterns": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@ljharb/has-package-exports-patterns/-/has-package-exports-patterns-0.0.2.tgz", - "integrity": "sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@nanostores/router": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@nanostores/router/-/router-0.8.1.tgz", @@ -5427,6 +5079,12 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "node_modules/@popperjs/core": { "version": "2.11.6", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", @@ -5443,19 +5101,6 @@ "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", "dev": true }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/@sinclair/typebox": { "version": "0.25.21", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", @@ -5521,26 +5166,17 @@ } }, "node_modules/@solid-primitives/upload": { - "version": "0.0.105", - "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.105.tgz", - "integrity": "sha512-991xLetzr25NIeuAtWpYmJSA7lJ0HSOJT9sl3sRtgpR4+QJEDIsM4lw2iYYpw7XUFGBqqX2CHI5TitvYzy/Maw==", + "version": "0.0.107", + "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.107.tgz", + "integrity": "sha512-SOJbRk58Oa6Y9Bp0H/qAy6bmV4xhcOConPYUH+G+zyKwowZMtVEsi+TjyeSXpIk4iQo+/yO/BEXyBo5PXJsd3g==", "dev": true, "dependencies": { - "@solid-primitives/utils": "^4.0.0" + "@solid-primitives/utils": "^5.0.0" }, "peerDependencies": { "solid-js": "^1.6.0" } }, - "node_modules/@solid-primitives/upload/node_modules/@solid-primitives/utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-4.0.1.tgz", - "integrity": "sha512-06fSyBair7ZxCquMjIqJes29aNg65X776TVw4EUN7PBtdWsGUeIZ9F/H4ek7yrDSxaSDaPHeye5knEYsYAq2gA==", - "dev": true, - "peerDependencies": { - "solid-js": "^1.6.0" - } - }, "node_modules/@solid-primitives/utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-5.1.0.tgz", @@ -5550,6 +5186,15 @@ "solid-js": "^1.6.0" } }, + "node_modules/@solidjs/meta": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.28.2.tgz", + "integrity": "sha512-avlLgBPdk4KVxzRGFlYp/MIJo8B5jVgXPgk6OUnUP8km21Z+ovO+DUd7ZPA7ejv8PBdWi9GE3zCzw8RU2YuV2Q==", + "dev": true, + "peerDependencies": { + "solid-js": ">=1.4.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5643,15 +5288,6 @@ "@types/node": "*" } }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/eslint": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", @@ -5766,15 +5402,6 @@ "@types/node": "*" } }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -5787,21 +5414,6 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/nlcst": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.0.tgz", - "integrity": "sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/node": { "version": "18.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", @@ -5820,12 +5432,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -5844,12 +5450,6 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -5879,9 +5479,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", "dev": true }, "node_modules/@types/ws": { @@ -5909,14 +5509,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -5976,14 +5576,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" }, "engines": { @@ -6003,13 +5603,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6020,13 +5620,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -6047,9 +5647,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6060,13 +5660,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6120,16 +5720,16 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -6179,12 +5779,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6242,65 +5842,6 @@ "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@vercel/analytics": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-0.1.8.tgz", - "integrity": "sha512-PQrOI8BJ9qUiVJuQfnKiJd15eDjDJH9TBKsNeMrtelT4NAk7d9mBVz1CoZkvoFnHQ0OW7Xnqmr1F2nScfAnznQ==", - "dev": true, - "peerDependencies": { - "react": "^16.8||^17||^18" - } - }, - "node_modules/@vercel/nft": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.6.tgz", - "integrity": "sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==", - "dev": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@vscode/emmet-helper": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.8.6.tgz", - "integrity": "sha512-IIB8jbiKy37zN8bAIHx59YmnIelY78CGHtThnibD/d3tQOKRY83bYVi9blwmZVUZh6l9nfkYH3tvReaiNxY9EQ==", - "dev": true, - "dependencies": { - "emmet": "^2.3.0", - "jsonc-parser": "^2.3.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^2.1.2" - } - }, - "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", - "dev": true - }, - "node_modules/@vscode/l10n": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", - "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", - "dev": true - }, "node_modules/@whatwg-node/events": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz", @@ -6334,12 +5875,6 @@ "@types/node": "^18.0.6" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -6411,65 +5946,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -6543,25 +6019,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -6602,16 +6059,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -6700,309 +6147,12 @@ "node": ">=8" } }, - "node_modules/astro": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/astro/-/astro-2.0.10.tgz", - "integrity": "sha512-Jg2JYPA6Nlip27So1+O0p9VFL98H+LiDLEt+F65e6536LkWE5oiV0fDSbK8aI8hKeCvOQzLiEZiD21eXbug0XQ==", - "dev": true, - "dependencies": { - "@astrojs/compiler": "^1.1.0", - "@astrojs/language-server": "^0.28.3", - "@astrojs/markdown-remark": "^2.0.1", - "@astrojs/telemetry": "^2.0.0", - "@astrojs/webapi": "^2.0.0", - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", - "@babel/parser": "^7.18.4", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.4", - "@types/babel__core": "^7.1.19", - "@types/yargs-parser": "^21.0.0", - "acorn": "^8.8.1", - "boxen": "^6.2.1", - "ci-info": "^3.3.1", - "common-ancestor-path": "^1.0.1", - "cookie": "^0.5.0", - "debug": "^4.3.4", - "deepmerge-ts": "^4.2.2", - "devalue": "^4.2.0", - "diff": "^5.1.0", - "es-module-lexer": "^1.1.0", - "estree-walker": "^3.0.1", - "execa": "^6.1.0", - "fast-glob": "^3.2.11", - "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "html-escaper": "^3.0.3", - "kleur": "^4.1.4", - "magic-string": "^0.27.0", - "mime": "^3.0.0", - "ora": "^6.1.0", - "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.0.3", - "prompts": "^2.4.2", - "rehype": "^12.0.1", - "semver": "^7.3.8", - "server-destroy": "^1.0.1", - "shiki": "^0.11.1", - "slash": "^4.0.0", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "supports-esm": "^1.0.0", - "tsconfig-resolver": "^3.0.1", - "typescript": "*", - "unist-util-visit": "^4.1.0", - "vfile": "^5.3.2", - "vite": "^4.0.3", - "vitefu": "^0.2.4", - "yargs-parser": "^21.0.1", - "zod": "^3.17.3" - }, - "bin": { - "astro": "astro.js" - }, - "engines": { - "node": ">=16.12.0", - "npm": ">=6.14.0" - } - }, - "node_modules/astro-eslint-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/astro-eslint-parser/-/astro-eslint-parser-0.11.0.tgz", - "integrity": "sha512-vcz8KBQ20WNOot6qK6w7DQtz2hwg+aLLqlUa6nAnitJLqbR12GxJN/+96U3O+VI4da5Up+FMWqNoL9mywSENtA==", - "dev": true, - "dependencies": { - "@astrojs/compiler": "^1.0.0", - "@typescript-eslint/scope-manager": "^5.48.2", - "@typescript-eslint/types": "^5.25.0", - "astrojs-compiler-sync": "^0.3.0", - "debug": "^4.3.4", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/astro-seo-meta": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astro-seo-meta/-/astro-seo-meta-2.0.0.tgz", - "integrity": "sha512-T/c1nQQvmYz0Ub04UooYo6JLZux7OaVwYeolWDf9L7RhpaqyWX80lOczSIt19/9mNKZq1hNYRcJBXWOArI36ug==", - "dev": true, - "peerDependencies": { - "astro": "^2.0.0" - } - }, - "node_modules/astro/node_modules/@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" - } - }, - "node_modules/astro/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/astro/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/astro/node_modules/rollup": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", - "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/astro/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/astro/node_modules/vite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", - "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", - "dev": true, - "dependencies": { - "esbuild": "^0.16.14", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.10.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "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 - } - } - }, - "node_modules/astro/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/astrojs-compiler-sync": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/astrojs-compiler-sync/-/astrojs-compiler-sync-0.3.1.tgz", - "integrity": "sha512-IzPuzkwdiRIZoBhCTuFhuBMWVESXgthTdwQ24QS8LvLargcWAA4E21KmZo4wimsmOG5vj4KKs9QFpy9zhXuo9Q==", - "dev": true, - "dependencies": { - "synckit": "^0.8.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "@astrojs/compiler": ">=0.27.0" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -7314,16 +6464,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7379,50 +6519,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -7453,98 +6549,6 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7649,6 +6653,15 @@ "node": ">=10.16.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -7692,6 +6705,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -7745,16 +6767,6 @@ "upper-case-first": "^2.0.2" } }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -7816,36 +6828,6 @@ "node": ">=10" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -7879,15 +6861,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ci-info": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", @@ -7930,18 +6903,6 @@ "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -8154,15 +7115,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -8214,12 +7166,6 @@ "node": ">= 12.0.0" } }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -8235,12 +7181,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -8405,6 +7345,19 @@ "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", "dev": true }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -8430,9 +7383,9 @@ "dev": true }, "node_modules/dataloader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.1.tgz", - "integrity": "sha512-Zn+tVZo1RKu120rgoe0JsRk56UiKdefPSH47QROJsMHrX8/S9UJvi5A/A6+Sbuk6rE88z5JoM/wIJ09Z7BTfYA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", + "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==", "dev": true }, "node_modules/debounce": { @@ -8492,19 +7445,6 @@ "node": ">=0.10.0" } }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -8554,15 +7494,6 @@ "node": ">=0.10.0" } }, - "node_modules/deepmerge-ts": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz", - "integrity": "sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==", - "dev": true, - "engines": { - "node": ">=12.4.0" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -8620,12 +7551,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", @@ -8635,15 +7560,6 @@ "node": ">= 0.6.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -8653,15 +7569,6 @@ "node": ">=8" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8671,12 +7578,6 @@ "node": ">=8" } }, - "node_modules/devalue": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", - "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", - "dev": true - }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -8686,15 +7587,6 @@ "wrappy": "1" } }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.2.tgz", @@ -8904,16 +7796,6 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/emmet": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.3.6.tgz", - "integrity": "sha512-pLS4PBPDdxuUAmw7Me7+TcHbykTsBKN/S9XJbUOMFQrNv9MoshzyMFK/R57JBm94/6HSL4vHnDeEmxlC82NQ4A==", - "dev": true, - "dependencies": { - "@emmetio/abbreviation": "^2.2.3", - "@emmetio/css-abbreviation": "^2.1.4" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -9039,12 +7921,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.1.tgz", - "integrity": "sha512-n3ruqU8Te7I5prBd6d0darM8ajFuVNhLWvgo04hN7goWSaSrxe7ENOZitac7akN0A2o+8fMomBDsNPvW/eE3CQ==", - "dev": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -9086,9 +7962,9 @@ } }, "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", "dev": true, "hasInstallScript": true, "bin": { @@ -9098,348 +7974,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" } }, "node_modules/escalade": { @@ -9461,9 +8017,9 @@ } }, "node_modules/eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.4.1", @@ -9529,15 +8085,23 @@ } }, "node_modules/eslint-config-stylelint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-17.1.0.tgz", - "integrity": "sha512-W4wVdtIUdgjNpIAdWtFtsxuxCu7uSe+2WuTerH923UW800+B0FbO+9uk0ZFFvu9+MYdLyQ+RYU8GLjl9ZnCm8g==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-18.0.0.tgz", + "integrity": "sha512-oWiHn/Ep7lfsixeuI82eQbZpPNd6Pv0JvZQTNbH4nVVcYPRxnm3uVz5uBPThK1n8b2iDgU7FsiPUvNWbw1Qc7w==", "dev": true, "dependencies": { - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest": "^27.1.6", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-regexp": "^1.11.0" + "eslint-plugin-regexp": "^1.12.0" + }, + "peerDependencies": { + "eslint": ">= 8.33.0", + "eslint-plugin-jest": ">= 27.2.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } } }, "node_modules/eslint-import-resolver-node": { @@ -9630,29 +8194,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-astro": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-astro/-/eslint-plugin-astro-0.23.0.tgz", - "integrity": "sha512-KsIL1sOrz40qf/d9RP4E3sH6+p6nrIBBXB6rPuE9EWb5de+m9BWfvURuoECXfiXCmQh8UlHJUxgSWxn1bLsD8g==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "@typescript-eslint/types": "^5.25.0", - "astro-eslint-parser": "^0.11.0", - "eslint-utils": "^3.0.0", - "postcss": "^8.4.14", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -9751,6 +8292,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, @@ -10282,12 +8825,6 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -10353,24 +8890,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -10397,6 +8916,12 @@ "url": "https://github.com/sponsors/jaydenseric" } }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10431,6 +8956,30 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", + "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "dev": true, + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", @@ -10521,12 +9070,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -10585,16 +9128,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -10715,56 +9248,12 @@ "node": ">=12" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -10797,85 +9286,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10968,12 +9378,6 @@ "url": "https://github.com/fisker/git-hooks-list?sponsor=1" } }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "dev": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -11263,43 +9667,6 @@ "graphql": ">=0.11 <=16" } }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -11359,18 +9726,6 @@ "node": ">=4" } }, - "node_modules/has-package-exports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/has-package-exports/-/has-package-exports-1.3.0.tgz", - "integrity": "sha512-e9OeXPQnmPhYoJ63lXC4wWe34TxEGZDZ3OQX9XRqp2VwsfLl3bQBy7VehLnd34g3ef8CmYlBLGqEMKXuz8YazQ==", - "dev": true, - "dependencies": { - "@ljharb/has-package-exports-patterns": "^0.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -11421,31 +9776,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hast-util-from-parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.1.tgz", - "integrity": "sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-has-property": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", @@ -11456,42 +9786,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-select": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-5.0.5.tgz", @@ -11519,47 +9813,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", @@ -11583,23 +9836,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -11630,12 +9866,6 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true - }, "node_modules/html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", @@ -11648,16 +9878,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -12185,6 +10405,37 @@ "upper-case": "^1.1.1" } }, + "node_modules/i18next": { + "version": "22.4.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.9.tgz", + "integrity": "sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.1.1.tgz", + "integrity": "sha512-jByfUCDVgQ8+/Wens7queQhYYvMcGTW/lR4IJJNEDDXnmqjLrwi8ubXKpmp76/JIWEZHffNdWqnxFJcTVGeaOw==", + "dev": true, + "dependencies": { + "cross-fetch": "3.1.5" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12197,24 +10448,6 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -12335,16 +10568,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-meta-resolve": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", - "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12717,29 +10940,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, "node_modules/is-builtin-module": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", @@ -12794,30 +10994,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12872,18 +11048,6 @@ "node": ">=8" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", @@ -13145,6 +11309,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-what": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.8.tgz", + "integrity": "sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -15148,6 +13324,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -15255,12 +13440,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", - "dev": true - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -15380,15 +13559,6 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/known-css-properties": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz", @@ -15473,9 +13643,9 @@ } }, "node_modules/lint-staged": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.1.tgz", - "integrity": "sha512-LLJLO0Kdbcv2a+CvSF4p1M7jBZOajKSMpBUvyR8+bXccsqPER0/NxTFQSpNHjqwV9kM3tkHczYerTB5wI+bksQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.2.tgz", + "integrity": "sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -15825,61 +13995,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/load-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -15901,12 +14016,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -16221,16 +14330,6 @@ "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -16270,18 +14369,6 @@ "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/mailgun.js": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-8.0.6.tgz", @@ -16366,9 +14453,9 @@ "dev": true }, "node_modules/markdown-it-implicit-figures": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.10.0.tgz", - "integrity": "sha512-1TWr6+apyoJvRa4Z7eIolZdeajZCRBcc1ckVXon7XwdL8MfydIWsHnZOS5zRrpUNX5b0/O9giWcmuItSkleK5A==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.11.0.tgz", + "integrity": "sha512-ed32u3O8pTEM3TKgeBTMKw8ce86L8u5L41CuLvGee3yevYOq+1BoxjI84m/f7RcUaATcKgXTgZwieadvOH4afg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16390,16 +14477,6 @@ "htmlparser2": "^8.0.1" } }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -16410,233 +14487,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz", - "integrity": "sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true }, "node_modules/mdurl": { "version": "1.0.1", @@ -16751,6 +14606,21 @@ "node": ">=10" } }, + "node_modules/merge-anything": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.4.tgz", + "integrity": "sha512-7PWKwGOs5WWcpw+/OvbiFiAvEP6bv/QHiicigpqMGKIqPPAtGhBLR8LFJW+Zu6m9TXiR/a8+AiPlGG0ko1ruoQ==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -16783,571 +14653,6 @@ } } }, - "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz", - "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==", - "dev": true, - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", - "dev": true, - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz", - "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==", - "dev": true, - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", - "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", - "dev": true, - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", - "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", - "dev": true, - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", - "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", - "dev": true, - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", - "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", - "dev": true, - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -17361,18 +14666,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -17457,67 +14750,15 @@ "node": ">=0.10.0" } }, - "node_modules/minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { "node": ">=10" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -17563,19 +14804,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "node_modules/nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -17606,17 +14834,6 @@ } } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -17629,21 +14846,6 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -17707,18 +14909,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -17917,124 +15107,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/orderedmap": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", @@ -18158,27 +15230,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", - "dev": true, - "dependencies": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -18253,12 +15304,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -18298,15 +15343,6 @@ "node": ">=0.10" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -18413,90 +15449,31 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true }, - "node_modules/postcss-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-5.0.0.tgz", - "integrity": "sha512-rGvpTDOM3//3Ysn3Xtvhzaj8ab984wKCpP02TEF559tLbUjNay3RQDpPxb7BREmfBtJm3/1WbQOZ7fSXwYLZ/w==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", @@ -18569,21 +15546,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18652,28 +15614,6 @@ "ansi-styles": "^3.2.0" } }, - "node_modules/prettier-plugin-astro": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.2.tgz", - "integrity": "sha512-mmifnkG160BtC727gqoimoxnZT/dwr8ASxpoGGl6EHevhfblSOeu+pwH1LAm5Qu1MynizktztFujHHaijLCkww==", - "dev": true, - "dependencies": { - "@astrojs/compiler": "^0.31.3", - "prettier": "^2.7.1", - "sass-formatter": "^0.7.5", - "synckit": "^0.8.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0", - "pnpm": ">=7.14.0" - } - }, - "node_modules/prettier-plugin-astro/node_modules/@astrojs/compiler": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.31.4.tgz", - "integrity": "sha512-6bBFeDTtPOn4jZaiD3p0f05MEGQL9pw2Zbfj546oFETNmjJFWO3nzHz6/m+P53calknCvyVzZ5YhoBLIvzn5iw==", - "dev": true - }, "node_modules/pretty-format": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.2.tgz", @@ -18700,15 +15640,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -18823,9 +15754,9 @@ } }, "node_modules/prosemirror-keymap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz", + "integrity": "sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==", "dev": true, "dependencies": { "prosemirror-state": "^1.0.0", @@ -18984,19 +15915,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -19155,8 +16073,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp-ast-analysis": { "version": "0.5.1", @@ -19227,68 +16144,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/rehype": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", - "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "rehype-parse": "^8.0.0", - "rehype-stringify": "^9.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", - "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^6.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", - "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-to-html": "^8.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/relay-runtime": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", @@ -19300,67 +16155,6 @@ "invariant": "^2.2.4" } }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", - "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", - "dev": true, - "dependencies": { - "retext": "^8.1.0", - "retext-smartypants": "^5.1.0", - "unist-util-visit": "^4.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/remedial": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", @@ -19496,69 +16290,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/retext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", - "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "retext-latin": "^3.0.0", - "retext-stringify": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-latin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", - "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "parse-latin": "^5.0.0", - "unherit": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-smartypants": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", - "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", - "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -19591,15 +16322,16 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", + "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" @@ -19678,24 +16410,6 @@ "tslib": "^2.1.0" } }, - "node_modules/s.color": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", - "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", - "dev": true - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -19745,28 +16459,27 @@ "dev": true }, "node_modules/sass": { - "version": "1.32.13", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", - "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.0.0" } }, - "node_modules/sass-formatter": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz", - "integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==", - "dev": true, - "dependencies": { - "suf-log": "^2.5.3" - } + "node_modules/sass/node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true }, "node_modules/scslre": { "version": "0.1.6", @@ -19795,19 +16508,6 @@ "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", "dev": true }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -19828,24 +16528,12 @@ "upper-case-first": "^2.0.2" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", - "dev": true - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -19882,23 +16570,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" - } - }, - "node_modules/shiki/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -19977,6 +16648,20 @@ "ieee754": "^1.2.1" } }, + "node_modules/sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -20034,14 +16719,28 @@ } }, "node_modules/solid-js": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.10.tgz", - "integrity": "sha512-Sf0e6PQCEFkFtbPq0L+93Ua81YQOefBEbvDJ0YXT92b6Lzw0k7UvzSd2l1BbYM+yzE3UmepU1tyMDc/3nIByjA==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.11.tgz", + "integrity": "sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==", "dev": true, "dependencies": { "csstype": "^3.1.0" } }, + "node_modules/solid-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.4.3.tgz", + "integrity": "sha512-7+4/gYsVi0BlM4PzT1PU1TB5nW3Hv8FWuB+Kw/ofWui7KQkWBf+dVZOrReQYHEmLCzytHUa2JysUXgzVALJmSw==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/types": "^7.18.4" + }, + "peerDependencies": { + "solid-js": "^1.3" + } + }, "node_modules/solid-transition-group": { "version": "0.0.13", "resolved": "https://registry.npmjs.org/solid-transition-group/-/solid-transition-group-0.0.13.tgz", @@ -20288,12 +16987,6 @@ "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", "dev": true }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -20373,20 +17066,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "dev": true, - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -20411,15 +17090,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -20477,16 +17147,20 @@ } }, "node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.1.0.tgz", + "integrity": "sha512-Tw8OyIiYhxnIHUzgoLlCyWgCUKsPYiP3TDgs7M1VbayS+q5qZly2yxABg+YPe/hFRWiu0cOtptCtpyrn1CrnYw==", "dev": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.0.1", + "@csstools/css-tokenizer": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", + "cosmiconfig": "^8.0.0", "css-functions-list": "^3.1.0", + "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "fastest-levenshtein": "^1.0.16", @@ -20495,7 +17169,7 @@ "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.2.0", - "ignore": "^5.2.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", @@ -20505,7 +17179,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -20519,13 +17193,13 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.0" }, "bin": { "stylelint": "bin/stylelint.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -20580,27 +17254,27 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-10.0.1.tgz", + "integrity": "sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==", "dev": true, "peerDependencies": { - "stylelint": "^14.10.0" + "stylelint": "^15.0.0" } }, "node_modules/stylelint-config-recommended-scss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz", - "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-9.0.0.tgz", + "integrity": "sha512-5e9pn3Ztfncd8s9OqvvCW7tZpYe+vGmPi7VEXX7XEp+Kj38PnKCrvFCBL+hQ7rkD4d5QzjB3BxlFEyo/30UWUw==", "dev": true, "dependencies": { "postcss-scss": "^4.0.2", - "stylelint-config-recommended": "^9.0.0", - "stylelint-scss": "^4.0.0" + "stylelint-config-recommended": "^10.0.1", + "stylelint-scss": "^4.4.0" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^14.10.0" + "stylelint": "^15.0.0" }, "peerDependenciesMeta": { "postcss": { @@ -20609,29 +17283,29 @@ } }, "node_modules/stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-30.0.1.tgz", + "integrity": "sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==", "dev": true, "dependencies": { - "stylelint-config-recommended": "^9.0.0" + "stylelint-config-recommended": "^10.0.1" }, "peerDependencies": { - "stylelint": "^14.14.0" + "stylelint": "^15.0.0" } }, "node_modules/stylelint-config-standard-scss": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz", - "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-7.0.1.tgz", + "integrity": "sha512-m5sRdtsB1F5fnC1Ozla7ryftU47wVpO+HWd+JQTqeoG0g/oPh5EfbWfcVHbNCEtuoHfALIySiUWS20pz2hX6jA==", "dev": true, "dependencies": { - "stylelint-config-recommended-scss": "^8.0.0", - "stylelint-config-standard": "^29.0.0" + "stylelint-config-recommended-scss": "^9.0.0", + "stylelint-config-standard": "^30.0.1" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^14.14.0" + "stylelint": "^15.0.0" }, "peerDependenciesMeta": { "postcss": { @@ -20653,9 +17327,9 @@ } }, "node_modules/stylelint-scss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.3.0.tgz", - "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", + "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -20665,7 +17339,7 @@ "postcss-value-parser": "^4.1.0" }, "peerDependencies": { - "stylelint": "^14.5.1" + "stylelint": "^14.5.1 || ^15.0.0" } }, "node_modules/stylelint/node_modules/ansi-regex": { @@ -20683,6 +17357,21 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/stylelint/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -20730,13 +17419,17 @@ "node": ">=8" } }, - "node_modules/suf-log": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", - "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "dev": true, "dependencies": { - "s.color": "0.0.15" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/supports-color": { @@ -20751,15 +17444,6 @@ "node": ">=4" } }, - "node_modules/supports-esm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-esm/-/supports-esm-1.0.0.tgz", - "integrity": "sha512-96Am8CDqUaC0I2+C/swJ0yEvM8ZnGn4unoers/LSdE4umhX7mELzqyLzx3HnZAluq5PXIsGMKqa7NkqaeHMPcg==", - "dev": true, - "dependencies": { - "has-package-exports": "^1.1.0" - } - }, "node_modules/supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", @@ -21008,29 +17692,6 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -21115,22 +17776,21 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -21140,16 +17800,6 @@ "node": ">=8" } }, - "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ts-log": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.5.tgz", @@ -21241,41 +17891,6 @@ "node": ">=4" } }, - "node_modules/tsconfig-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", - "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.30", - "@types/resolve": "^1.17.0", - "json5": "^2.1.3", - "resolve": "^1.17.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ifiokjr" - } - }, - "node_modules/tsconfig-resolver/node_modules/@types/json5": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", - "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==", - "dev": true - }, - "node_modules/tsconfig-resolver/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -21323,18 +17938,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -21412,9 +18015,9 @@ } }, "node_modules/undici": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", - "integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", + "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", "dev": true, "dependencies": { "busboy": "^1.6.0" @@ -21423,35 +18026,6 @@ "node": ">=12.18" } }, - "node_modules/unherit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", - "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unique-names-generator": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", @@ -21461,16 +18035,6 @@ "node": ">=8" } }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-is": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", @@ -21481,46 +18045,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-modify-children": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", - "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "array-iterate": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -21536,19 +18060,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit-children": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", - "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-visit-parents": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", @@ -21677,24 +18188,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -21746,60 +18239,16 @@ "node": ">=12" } }, - "node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", - "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", + "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", "dev": true, "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", + "esbuild": "^0.16.14", + "postcss": "^8.4.21", "resolve": "^1.22.1", - "rollup": "^2.79.1" + "rollup": "^3.10.0" }, "bin": { "vite": "bin/vite.js" @@ -21839,6 +18288,79 @@ } } }, + "node_modules/vite-plugin-sass-dts": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/vite-plugin-sass-dts/-/vite-plugin-sass-dts-1.2.15.tgz", + "integrity": "sha512-XUbSD1fHi62VOYroWnqjff8GEhv1cYD0rm53YxiFFDx2IbsA2DSrCdPdVwy5wdpngzqMgZ7XzUlKnAEMMsB7Xg==", + "dev": true, + "dependencies": { + "postcss-js": "^4.0.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8", + "prettier": "^2.7", + "sass": "*", + "vite": "^3 || ^4" + } + }, + "node_modules/vite-plugin-solid": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.5.0.tgz", + "integrity": "sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/preset-typescript": "^7.18.6", + "babel-preset-solid": "^1.6.3", + "merge-anything": "^5.1.4", + "solid-refresh": "^0.4.1", + "vitefu": "^0.2.3" + }, + "peerDependencies": { + "solid-js": "^1.3.17 || ^1.4.0 || ^1.5.0 || ^1.6.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/vite-plugin-ssr": { + "version": "0.4.82", + "resolved": "https://registry.npmjs.org/vite-plugin-ssr/-/vite-plugin-ssr-0.4.82.tgz", + "integrity": "sha512-STvYzi4zl24WvCdrwRdKE56xGxiLIU+iSwhU9fY3a93VRHgGbeRJCxi7SImkjjHSUiJTsg6vIQ/bpVPL+Fn0QQ==", + "dev": true, + "dependencies": { + "@brillout/import": "^0.2.1", + "@brillout/json-serializer": "^0.5.3", + "@brillout/vite-plugin-import-build": "^0.2.4", + "cac": "^6.7.12", + "es-module-lexer": "^0.10.5", + "fast-glob": "^3.2.11", + "picocolors": "^1.0.0", + "sirv": "^2.0.2" + }, + "bin": { + "vite-plugin-ssr": "node/bin/vite-plugin-ssr.js" + }, + "engines": { + "node": ">=12.19.0" + }, + "peerDependencies": { + "react-streaming": ">=0.3.5", + "vite": ">=3.0.0" + }, + "peerDependenciesMeta": { + "react-streaming": { + "optional": true + } + } + }, + "node_modules/vite-plugin-ssr/node_modules/es-module-lexer": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", + "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", + "dev": true + }, "node_modules/vitefu": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", @@ -21853,91 +18375,6 @@ } } }, - "node_modules/vscode-css-languageservice": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.2.3.tgz", - "integrity": "sha512-EAyhyIVHpEaf+GjtI+tVe7SekdoANfG0aubnspsQwak3Qkimn/97FpAufNyXk636ngW05pjNKAR9zyTCzo6avQ==", - "dev": true, - "dependencies": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, - "node_modules/vscode-html-languageservice": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", - "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", - "dev": true, - "dependencies": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.17.2" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, "node_modules/vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", @@ -22041,16 +18478,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -22060,12 +18487,6 @@ "node": ">= 8" } }, - "node_modules/web-vitals": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.1.1.tgz", - "integrity": "sha512-qvllU+ZeQChqzBhZ1oyXmWsjJ8a2jHYpH8AMaVuf29yscOPZfTQTjQFRX6+eADTdsDE8IanOZ0cetweHMs8/2A==", - "dev": true - }, "node_modules/webcrypto-core": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", @@ -22153,28 +18574,6 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, - "node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "dev": true, - "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -22195,84 +18594,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wonka": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.1.tgz", - "integrity": "sha512-6et7xfxG/HtMwenqNsphz59PbYT1joKL11q9sY2en3JvzJZtR1alOROIl/1ibgBFdHJqKarF82Uqo1tr1ijzfQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.3.tgz", + "integrity": "sha512-EFOYiqDeYLXSzGYt2X3aVe9Hq1XJG+Hz/HjTRRT4dZE9q95khHl5+7pzUSXI19dbMO1/2UMrTf7JT7/7JrSQSQ==", "dev": true }, "node_modules/word-wrap": { @@ -22284,35 +18609,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -22332,9 +18628,9 @@ } }, "node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "dev": true, "engines": { "node": ">=10.0.0" @@ -22573,15 +18869,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "3.20.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.6.tgz", - "integrity": "sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -22827,119 +19114,6 @@ "node-fetch": "^2.6.1" } }, - "@astrojs/compiler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-1.1.0.tgz", - "integrity": "sha512-C4kTwirys+HafufMqaxCbML2wqkGaXJM+5AekXh/v1IIOnMIdcEON9GBYsG6qa8aAmLhZ58aUZGPhzcA3Dx7Uw==", - "dev": true - }, - "@astrojs/language-server": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-0.28.3.tgz", - "integrity": "sha512-fPovAX/X46eE2w03jNRMpQ7W9m2mAvNt4Ay65lD9wl1Z5vIQYxlg7Enp9qP225muTr4jSVB5QiLumFJmZMAaVA==", - "dev": true, - "requires": { - "@vscode/emmet-helper": "^2.8.4", - "events": "^3.3.0", - "prettier": "^2.7.1", - "prettier-plugin-astro": "^0.7.0", - "source-map": "^0.7.3", - "vscode-css-languageservice": "^6.0.1", - "vscode-html-languageservice": "^5.0.0", - "vscode-languageserver": "^8.0.1", - "vscode-languageserver-protocol": "^3.17.1", - "vscode-languageserver-textdocument": "^1.0.4", - "vscode-languageserver-types": "^3.17.1", - "vscode-uri": "^3.0.3" - } - }, - "@astrojs/markdown-remark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-2.0.1.tgz", - "integrity": "sha512-xQF1rXGJN18m+zZucwRRtmNehuhPMMhZhi6HWKrtpEAKnHSPk8lqf1GXgKH7/Sypglu8ivdECZ+EGs6kOYVasQ==", - "dev": true, - "requires": { - "@astrojs/prism": "^2.0.0", - "github-slugger": "^1.4.0", - "import-meta-resolve": "^2.1.0", - "rehype-raw": "^6.1.1", - "rehype-stringify": "^9.0.3", - "remark-gfm": "^3.0.1", - "remark-parse": "^10.0.1", - "remark-rehype": "^10.1.0", - "remark-smartypants": "^2.0.0", - "shiki": "^0.11.1", - "unified": "^10.1.2", - "unist-util-visit": "^4.1.0", - "vfile": "^5.3.2" - }, - "dependencies": { - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "dev": true - } - } - }, - "@astrojs/prism": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-2.0.0.tgz", - "integrity": "sha512-YgeoeEPqsxaEpg0rwe/bUq3653LqSQnMjrLlpYwrbQQMQQqz6Y5yXN+RX3SfLJ6ppNb4+Fu2+Z49EXjk48Ihjw==", - "dev": true, - "requires": { - "prismjs": "^1.28.0" - } - }, - "@astrojs/solid-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/solid-js/-/solid-js-2.0.2.tgz", - "integrity": "sha512-fQMOfBcmvYHXJg8vR0LgoeBgrlLHrxnlzxxmPkDKrGPBRh9y3si2d/ChpMyMRL3ibAOqWTs7Xs5gOYqrFZbw3g==", - "dev": true, - "requires": { - "babel-preset-solid": "^1.4.2", - "vitefu": "^0.2.4" - } - }, - "@astrojs/telemetry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-2.0.0.tgz", - "integrity": "sha512-RnWojVMIsql3GGWDP5pNWmhmBQVkCpxGNZ8yPr2cbmUqsUYGSvErhqfkLfro9j2/STi5UDmSpNgjPkQmXpgnKw==", - "dev": true, - "requires": { - "ci-info": "^3.3.1", - "debug": "^4.3.4", - "dlv": "^1.1.3", - "dset": "^3.1.2", - "is-docker": "^3.0.0", - "is-wsl": "^2.2.0", - "undici": "^5.14.0", - "which-pm-runs": "^1.1.0" - } - }, - "@astrojs/vercel": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/vercel/-/vercel-3.1.1.tgz", - "integrity": "sha512-3u976waO1HjnmvImmdTiiHqlH+kCF/NAmppwtzWg86uTLj581gYy6OXIfzMxg5uvC1tODbciuauFJcmdEBThIw==", - "dev": true, - "requires": { - "@astrojs/webapi": "^2.0.0", - "@vercel/analytics": "^0.1.8", - "@vercel/nft": "^0.22.1", - "fast-glob": "^3.2.11", - "set-cookie-parser": "^2.5.1", - "web-vitals": "^3.1.1" - } - }, - "@astrojs/webapi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/webapi/-/webapi-2.0.0.tgz", - "integrity": "sha512-gziwy+XvY+/B9mq/eurgJMZ4iFnkcqg1wb0tA8BsVfiUPwl7yQKAFrBxrs2rWfKMXyWlVaTFc8rAYcB5VXQEuw==", - "dev": true, - "requires": { - "undici": "^5.14.0" - } - }, "@aws-crypto/crc32": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", @@ -24688,11 +20862,32 @@ "@babel/helper-plugin-utils": "^7.18.9" } }, + "@babel/plugin-transform-typescript": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", + "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.12", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, "@babel/runtime": { "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } @@ -24743,10 +20938,26 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@connorskees/grass": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@connorskees/grass/-/grass-0.12.0.tgz", - "integrity": "sha512-nDICkb3SxivBAteLuUsosUk0EsB0qQW2hBtnkhFP0dP/yAV1zcrq4p38O12/Mw+Yt1DKTqQSyCZAoliaK/kw4g==" + "@brillout/import": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@brillout/import/-/import-0.2.2.tgz", + "integrity": "sha512-JatRCkrFxss1iwRrFlnY3yPFyD2yGWIeFprMH++TmZ+wqnRlwfN0ECDJea0EyagSGXlb2CUxFIH3dBMBiV05sw==", + "dev": true + }, + "@brillout/json-serializer": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@brillout/json-serializer/-/json-serializer-0.5.3.tgz", + "integrity": "sha512-IxlOMD5gOM0WfFGdeR98jHKiC82Ad1tUnSjvLS5jnRkfMEKBI+YzHA32Umw8W3Ccp5N4fNEX229BW6RaRpxRWQ==", + "dev": true + }, + "@brillout/vite-plugin-import-build": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.4.tgz", + "integrity": "sha512-riBgrq/obzDJQTyI4vHUMOl+tZ/PReumAzweZryudzPz7GZBfUBxqlt3GIBfrX+OdcZQuPvfV29GykwfOh2UBw==", + "dev": true, + "requires": { + "@brillout/import": "^0.2.2" + } }, "@cspotcode/source-map-support": { "version": "0.8.1", @@ -24769,6 +20980,26 @@ } } }, + "@csstools/css-parser-algorithms": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz", + "integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz", + "integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz", + "integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==", + "dev": true, + "requires": {} + }, "@csstools/selector-specificity": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", @@ -24776,177 +21007,6 @@ "dev": true, "requires": {} }, - "@emmetio/abbreviation": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.2.3.tgz", - "integrity": "sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==", - "dev": true, - "requires": { - "@emmetio/scanner": "^1.0.0" - } - }, - "@emmetio/css-abbreviation": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz", - "integrity": "sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw==", - "dev": true, - "requires": { - "@emmetio/scanner": "^1.0.0" - } - }, - "@emmetio/scanner": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.0.tgz", - "integrity": "sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==", - "dev": true - }, - "@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", - "dev": true, - "optional": true - }, "@esbuild/win32-x64": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", @@ -24998,18 +21058,18 @@ } }, "@graphql-codegen/cli": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.16.5.tgz", - "integrity": "sha512-XYPIp+q7fB0xAGSAoRykiTe4oY80VU+z+dw5nuv4mLY0+pv7+pa2C6Nwhdw7a65lXOhFviBApWCCZeqd54SMnA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.0.0.tgz", + "integrity": "sha512-16nuFabHCfPQ/d+v52OvR1ueL8eiJvS/nRuvuEV8d9T1fkborHKRw4lhyKVebu9izFBs6G0CvVCLhgVzQwHSLw==", "dev": true, "requires": { "@babel/generator": "^7.18.13", "@babel/template": "^7.18.10", "@babel/types": "^7.18.13", - "@graphql-codegen/core": "^2.6.8", - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/core": "^3.0.0", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/apollo-engine-loader": "^7.3.6", - "@graphql-tools/code-file-loader": "^7.3.13", + "@graphql-tools/code-file-loader": "^7.3.17", "@graphql-tools/git-loader": "^7.2.13", "@graphql-tools/github-loader": "^7.3.20", "@graphql-tools/graphql-file-loader": "^7.5.0", @@ -25092,12 +21152,12 @@ } }, "@graphql-codegen/core": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.8.tgz", - "integrity": "sha512-JKllNIipPrheRgl+/Hm/xuWMw9++xNQ12XJR/OHHgFopOg4zmN3TdlRSyYcv/K90hCFkkIwhlHFUQTfKrm8rxQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.0.0.tgz", + "integrity": "sha512-WUfAUTmUcgeHPR7F5ZQqaBqJLJb5+3Lvp6v9SrnupKOFed+Q3u8CvZL6sPTvDpqqW8Ucjy59DEZqumPLp99pdQ==", "dev": true, "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.1", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/schema": "^9.0.0", "@graphql-tools/utils": "^9.1.1", "tslib": "~2.4.0" @@ -25112,9 +21172,9 @@ } }, "@graphql-codegen/plugin-helpers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", - "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.0.0.tgz", + "integrity": "sha512-vgNGTanT36hC4RAC/LAThMEjDvnu3WCyx6MtKZcPUtfCWFxbUAr88+OarGl1LAEiOef0agIREC7tIBXCqjKkJA==", "dev": true, "requires": { "@graphql-tools/utils": "^9.0.0", @@ -25134,12 +21194,12 @@ } }, "@graphql-codegen/schema-ast": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz", - "integrity": "sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.0.tgz", + "integrity": "sha512-5gC8nNk/bxufS2LBSpaPExRgn6eNo8LQdtwDtwfM9XGEzt/F6rIBQoyOmqqwkiBmgu1PHHH8kLZMBYvYB1x5DA==", "dev": true, "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/utils": "^9.0.0", "tslib": "~2.4.0" }, @@ -25153,14 +21213,14 @@ } }, "@graphql-codegen/typescript": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.8.8.tgz", - "integrity": "sha512-A0oUi3Oy6+DormOlrTC4orxT9OBZkIglhbJBcDmk34jAKKUgesukXRd4yOhmTrnbchpXz2T8IAOFB3FWIaK4Rw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.0.tgz", + "integrity": "sha512-FQWyuIUy1y+fxb9+EZfvdBHBQpYExlIBHV5sg2WGNCsyVyCqBTl0mO8icyOtsQPVg6YFMFe8JJO69vQbwHma5w==", "dev": true, "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/schema-ast": "^2.6.1", - "@graphql-codegen/visitor-plugin-common": "2.13.8", + "@graphql-codegen/plugin-helpers": "^4.0.0", + "@graphql-codegen/schema-ast": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "3.0.0", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, @@ -25174,14 +21234,14 @@ } }, "@graphql-codegen/typescript-operations": { - "version": "2.5.13", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.13.tgz", - "integrity": "sha512-3vfR6Rx6iZU0JRt29GBkFlrSNTM6t+MSLF86ChvL4d/Jfo/JYAGuB3zNzPhirHYzJPCvLOAx2gy9ID1ltrpYiw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.0.tgz", + "integrity": "sha512-t+Lk+lxkUFDh6F0t8CErowOccP3bZwxhl66qmEeBcOrC7jQrSCnRZoFvOXhFKFBJe/y4DIJiizgSr34AqjiJIQ==", "dev": true, "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", - "@graphql-codegen/typescript": "^2.8.8", - "@graphql-codegen/visitor-plugin-common": "2.13.8", + "@graphql-codegen/plugin-helpers": "^4.0.0", + "@graphql-codegen/typescript": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "3.0.0", "auto-bind": "~4.0.0", "tslib": "~2.4.0" }, @@ -25334,12 +21394,12 @@ } }, "@graphql-codegen/visitor-plugin-common": { - "version": "2.13.8", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz", - "integrity": "sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.0.tgz", + "integrity": "sha512-ZoNlCmmkGClB137SpJT9og/nkihLN7Z4Ynl9Ir3OlbDuI20dbpyXsclpr9QGLcxEcfQeVfhGw9CooW7wZJJ8LA==", "dev": true, "requires": { - "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-codegen/plugin-helpers": "^4.0.0", "@graphql-tools/optimize": "^1.3.0", "@graphql-tools/relay-operation-optimizer": "^6.5.0", "@graphql-tools/utils": "^9.0.0", @@ -25398,13 +21458,13 @@ } }, "@graphql-tools/batch-execute": { - "version": "8.5.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.17.tgz", - "integrity": "sha512-ma6zlFIBG8VuqSwE8jhYhMbaFsJ1YdVsnpFmbQ0O/qJTmlgdAWCyAZTJH0aZ24fqNFfj/vW/Qtpqn7gRcF8QOw==", + "version": "8.5.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.18.tgz", + "integrity": "sha512-mNv5bpZMLLwhkmPA6+RP81A6u3KF4CSKLf3VX9hbomOkQR4db8pNs8BOvpZU54wKsUzMzdlws/2g/Dabyb2Vsg==", "dev": true, "requires": { "@graphql-tools/utils": "9.2.1", - "dataloader": "2.2.1", + "dataloader": "2.2.2", "tslib": "^2.4.0", "value-or-promise": "1.0.12" } @@ -25423,16 +21483,16 @@ } }, "@graphql-tools/delegate": { - "version": "9.0.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.26.tgz", - "integrity": "sha512-RPcjH+NnK3e4e9/6CwKbyv9DtVa+ojiwvsbW9Q6zMXRdlP0zazsQOe5+ktL3yE+d3zlzGAasp0WAiSLUS5vFRw==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.27.tgz", + "integrity": "sha512-goYewiPls/RDXiRTl1S2tRPlsyDQCxlDWqd0uEIzQZ6aWSyiutfwQnTzdbZPXK0qOblEVMIqFhSGrB6fp0OkBA==", "dev": true, "requires": { - "@graphql-tools/batch-execute": "8.5.17", + "@graphql-tools/batch-execute": "8.5.18", "@graphql-tools/executor": "0.0.14", "@graphql-tools/schema": "9.0.16", "@graphql-tools/utils": "9.2.1", - "dataloader": "2.2.1", + "dataloader": "2.2.2", "tslib": "~2.5.0", "value-or-promise": "1.0.12" } @@ -25451,9 +21511,9 @@ } }, "@graphql-tools/executor-graphql-ws": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.10.tgz", - "integrity": "sha512-5SxFvupyWe6+Egq8Zws0+mJZMKV18rTAwxHwhrx+KhRfGpilqkqS4I+qwVL94LNktWL2uy95cU5b5CQFyVaVEg==", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.11.tgz", + "integrity": "sha512-muRj6j897ks2iKqe3HchWFFzd+jFInSRuLPvHJ7e4WPrejFvaZx3BQ9gndfJvVkfYUZIFm13stCGXaJJTbVM0Q==", "dev": true, "requires": { "@graphql-tools/utils": "9.2.1", @@ -25462,18 +21522,18 @@ "graphql-ws": "5.11.3", "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "8.12.0" + "ws": "8.12.1" } }, "@graphql-tools/executor-http": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.6.tgz", - "integrity": "sha512-OPE730n7T8nMgQFujbDuclCJrEchaVKZ4G5rl8r8fY/a/clKtZDZONTPnVSgW3/cBJ/WIXJGDvJtXwx6F8Fepg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.8.tgz", + "integrity": "sha512-L3tldMlL760Bkdl6zdearvxqCA8cRmTWvd8SyZ0i/EpBWFkU1XcUF2/wqNt7URdNAE6+pO6wCgI4BEsKOgL7Qg==", "dev": true, "requires": { "@graphql-tools/utils": "^9.2.1", "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.7.0", + "@whatwg-node/fetch": "^0.8.1", "dset": "^3.1.2", "extract-files": "^11.0.0", "meros": "^1.2.1", @@ -25482,42 +21542,44 @@ }, "dependencies": { "@whatwg-node/fetch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", - "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", "dev": true, "requires": { "@peculiar/webcrypto": "^1.4.0", - "@whatwg-node/node-fetch": "^0.1.0", + "@whatwg-node/node-fetch": "^0.3.0", "busboy": "^1.6.0", "urlpattern-polyfill": "^6.0.2", "web-streams-polyfill": "^3.2.1" } }, "@whatwg-node/node-fetch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", - "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", "dev": true, "requires": { "@whatwg-node/events": "^0.0.2", "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", "tslib": "^2.3.1" } } } }, "@graphql-tools/executor-legacy-ws": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.8.tgz", - "integrity": "sha512-NZfBijmr774rCO60cRTqbf2otRjn32sVikq6PdT+0vZfhVwX7wydNMdyfJZQ3WGuTyab5hrqOWD+UU8VcIbAeg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.9.tgz", + "integrity": "sha512-L7oDv7R5yoXzMH+KLKDB2WHVijfVW4dB2H+Ae1RdW3MFvwbYjhnIB6QzHqKEqksjp/FndtxZkbuTIuAOsYGTYw==", "dev": true, "requires": { "@graphql-tools/utils": "9.2.1", "@types/ws": "^8.0.0", "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "8.12.0" + "ws": "8.12.1" } }, "@graphql-tools/git-loader": { @@ -25681,6 +21743,79 @@ "yaml-ast-parser": "^0.0.43" }, "dependencies": { + "@graphql-tools/executor-graphql-ws": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.10.tgz", + "integrity": "sha512-5SxFvupyWe6+Egq8Zws0+mJZMKV18rTAwxHwhrx+KhRfGpilqkqS4I+qwVL94LNktWL2uy95cU5b5CQFyVaVEg==", + "dev": true, + "requires": { + "@graphql-tools/utils": "9.2.1", + "@repeaterjs/repeater": "3.0.4", + "@types/ws": "^8.0.0", + "graphql-ws": "5.11.3", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.12.0" + } + }, + "@graphql-tools/executor-legacy-ws": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.8.tgz", + "integrity": "sha512-NZfBijmr774rCO60cRTqbf2otRjn32sVikq6PdT+0vZfhVwX7wydNMdyfJZQ3WGuTyab5hrqOWD+UU8VcIbAeg==", + "dev": true, + "requires": { + "@graphql-tools/utils": "9.2.1", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.12.0" + } + }, + "@graphql-tools/url-loader": { + "version": "7.17.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.11.tgz", + "integrity": "sha512-zGTrdz5hVm/0+vLZJexhB/B4m95ZCP0eqD2QoNP0hsstaqTyn9u84kTtYUpbPlz7hAxZsdu+VcLaypE4qPGGGw==", + "dev": true, + "requires": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^9.0.26", + "@graphql-tools/executor-graphql-ws": "^0.0.10", + "@graphql-tools/executor-http": "^0.1.6", + "@graphql-tools/executor-legacy-ws": "^0.0.8", + "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/wrap": "^9.3.5", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.7.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + } + }, + "@whatwg-node/fetch": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", + "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "dev": true, + "requires": { + "@peculiar/webcrypto": "^1.4.0", + "@whatwg-node/node-fetch": "^0.1.0", + "busboy": "^1.6.0", + "urlpattern-polyfill": "^6.0.2", + "web-streams-polyfill": "^3.2.1" + } + }, + "@whatwg-node/node-fetch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", + "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "dev": true, + "requires": { + "@whatwg-node/events": "^0.0.2", + "busboy": "^1.6.0", + "tslib": "^2.3.1" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -25729,6 +21864,13 @@ "requires": { "has-flag": "^4.0.0" } + }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "requires": {} } } }, @@ -25756,20 +21898,20 @@ } }, "@graphql-tools/url-loader": { - "version": "7.17.11", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.11.tgz", - "integrity": "sha512-zGTrdz5hVm/0+vLZJexhB/B4m95ZCP0eqD2QoNP0hsstaqTyn9u84kTtYUpbPlz7hAxZsdu+VcLaypE4qPGGGw==", + "version": "7.17.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.13.tgz", + "integrity": "sha512-FEmbvw68kxeZLn4VYGAl+NuBPk09ZnxymjW07A6mCtiDayFgYfHdWeRzXn/iM5PzsEuCD73R1sExtNQ/ISiajg==", "dev": true, "requires": { "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^9.0.26", - "@graphql-tools/executor-graphql-ws": "^0.0.10", - "@graphql-tools/executor-http": "^0.1.6", - "@graphql-tools/executor-legacy-ws": "^0.0.8", + "@graphql-tools/delegate": "^9.0.27", + "@graphql-tools/executor-graphql-ws": "^0.0.11", + "@graphql-tools/executor-http": "^0.1.7", + "@graphql-tools/executor-legacy-ws": "^0.0.9", "@graphql-tools/utils": "^9.2.1", - "@graphql-tools/wrap": "^9.3.5", + "@graphql-tools/wrap": "^9.3.6", "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.7.0", + "@whatwg-node/fetch": "^0.8.0", "isomorphic-ws": "^5.0.0", "tslib": "^2.4.0", "value-or-promise": "^1.0.11", @@ -25777,26 +21919,28 @@ }, "dependencies": { "@whatwg-node/fetch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.7.1.tgz", - "integrity": "sha512-rU/oS5pQLP0GOtTegi3sgzCkid5kbogXX16IaO0DYudhHJxbylKO7+xr7mbjM68XXYr7wkJ2BCmO1DHeg/XBuw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.1.tgz", + "integrity": "sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q==", "dev": true, "requires": { "@peculiar/webcrypto": "^1.4.0", - "@whatwg-node/node-fetch": "^0.1.0", + "@whatwg-node/node-fetch": "^0.3.0", "busboy": "^1.6.0", "urlpattern-polyfill": "^6.0.2", "web-streams-polyfill": "^3.2.1" } }, "@whatwg-node/node-fetch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.1.0.tgz", - "integrity": "sha512-SSEGg+uVCeGSROAFSuBHhh7KufoOVcs+ftcCQaCHawXdkWVX7+fHramK23H3tXXlKdxuYIHO0oDiIVbq9BE34Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz", + "integrity": "sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w==", "dev": true, "requires": { "@whatwg-node/events": "^0.0.2", "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", "tslib": "^2.3.1" } } @@ -25813,12 +21957,12 @@ } }, "@graphql-tools/wrap": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.3.5.tgz", - "integrity": "sha512-D3jR6/ZDWa6bw4hc1odHKLIFLxjgXlL8FSkkNlViAcRgRaqUVgFQsk+dThdWkqKP6+uij4lBG+pd/XZfrI1zeQ==", + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.3.6.tgz", + "integrity": "sha512-HtQIYoPz48bzpMYZzoeMmzIIYuVxcaUuLD7dH7GtIhwe2f4hpPDE+JLUPxpYiaXdY10l7kP9wycK+FtRfCsFlw==", "dev": true, "requires": { - "@graphql-tools/delegate": "9.0.26", + "@graphql-tools/delegate": "9.0.27", "@graphql-tools/schema": "9.0.16", "@graphql-tools/utils": "9.2.1", "tslib": "^2.4.0", @@ -26525,55 +22669,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "@ljharb/has-package-exports-patterns": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@ljharb/has-package-exports-patterns/-/has-package-exports-patterns-0.0.2.tgz", - "integrity": "sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "@nanostores/router": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@nanostores/router/-/router-0.8.1.tgz", @@ -26661,6 +22756,12 @@ "tslib": "^2.4.0" } }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "@popperjs/core": { "version": "2.11.6", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", @@ -26673,16 +22774,6 @@ "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", "dev": true }, - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, "@sinclair/typebox": { "version": "0.25.21", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", @@ -26739,21 +22830,12 @@ "requires": {} }, "@solid-primitives/upload": { - "version": "0.0.105", - "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.105.tgz", - "integrity": "sha512-991xLetzr25NIeuAtWpYmJSA7lJ0HSOJT9sl3sRtgpR4+QJEDIsM4lw2iYYpw7XUFGBqqX2CHI5TitvYzy/Maw==", + "version": "0.0.107", + "resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.107.tgz", + "integrity": "sha512-SOJbRk58Oa6Y9Bp0H/qAy6bmV4xhcOConPYUH+G+zyKwowZMtVEsi+TjyeSXpIk4iQo+/yO/BEXyBo5PXJsd3g==", "dev": true, "requires": { - "@solid-primitives/utils": "^4.0.0" - }, - "dependencies": { - "@solid-primitives/utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-4.0.1.tgz", - "integrity": "sha512-06fSyBair7ZxCquMjIqJes29aNg65X776TVw4EUN7PBtdWsGUeIZ9F/H4ek7yrDSxaSDaPHeye5knEYsYAq2gA==", - "dev": true, - "requires": {} - } + "@solid-primitives/utils": "^5.0.0" } }, "@solid-primitives/utils": { @@ -26763,6 +22845,13 @@ "dev": true, "requires": {} }, + "@solidjs/meta": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.28.2.tgz", + "integrity": "sha512-avlLgBPdk4KVxzRGFlYp/MIJo8B5jVgXPgk6OUnUP8km21Z+ovO+DUd7ZPA7ejv8PBdWi9GE3zCzw8RU2YuV2Q==", + "dev": true, + "requires": {} + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -26853,15 +22942,6 @@ "@types/node": "*" } }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, "@types/eslint": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", @@ -26976,15 +23056,6 @@ "@types/node": "*" } }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -26997,21 +23068,6 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/nlcst": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.0.tgz", - "integrity": "sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, "@types/node": { "version": "18.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", @@ -27030,12 +23086,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -27054,12 +23104,6 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -27089,9 +23133,9 @@ "dev": true }, "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", "dev": true }, "@types/ws": { @@ -27119,14 +23163,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -27163,53 +23207,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" } }, "@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -27244,16 +23288,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -27286,12 +23330,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.52.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -27330,59 +23374,6 @@ "dev": true, "requires": {} }, - "@vercel/analytics": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-0.1.8.tgz", - "integrity": "sha512-PQrOI8BJ9qUiVJuQfnKiJd15eDjDJH9TBKsNeMrtelT4NAk7d9mBVz1CoZkvoFnHQ0OW7Xnqmr1F2nScfAnznQ==", - "dev": true, - "requires": {} - }, - "@vercel/nft": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.6.tgz", - "integrity": "sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - } - }, - "@vscode/emmet-helper": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.8.6.tgz", - "integrity": "sha512-IIB8jbiKy37zN8bAIHx59YmnIelY78CGHtThnibD/d3tQOKRY83bYVi9blwmZVUZh6l9nfkYH3tvReaiNxY9EQ==", - "dev": true, - "requires": { - "emmet": "^2.3.0", - "jsonc-parser": "^2.3.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^2.1.2" - }, - "dependencies": { - "vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", - "dev": true - } - } - }, - "@vscode/l10n": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", - "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", - "dev": true - }, "@whatwg-node/events": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz", @@ -27413,12 +23404,6 @@ "tslib": "^2.3.1" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -27469,55 +23454,6 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -27566,22 +23502,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -27616,12 +23536,6 @@ "is-string": "^1.0.7" } }, - "array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "dev": true - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -27686,210 +23600,12 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "astro": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/astro/-/astro-2.0.10.tgz", - "integrity": "sha512-Jg2JYPA6Nlip27So1+O0p9VFL98H+LiDLEt+F65e6536LkWE5oiV0fDSbK8aI8hKeCvOQzLiEZiD21eXbug0XQ==", - "dev": true, - "requires": { - "@astrojs/compiler": "^1.1.0", - "@astrojs/language-server": "^0.28.3", - "@astrojs/markdown-remark": "^2.0.1", - "@astrojs/telemetry": "^2.0.0", - "@astrojs/webapi": "^2.0.0", - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", - "@babel/parser": "^7.18.4", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.4", - "@types/babel__core": "^7.1.19", - "@types/yargs-parser": "^21.0.0", - "acorn": "^8.8.1", - "boxen": "^6.2.1", - "ci-info": "^3.3.1", - "common-ancestor-path": "^1.0.1", - "cookie": "^0.5.0", - "debug": "^4.3.4", - "deepmerge-ts": "^4.2.2", - "devalue": "^4.2.0", - "diff": "^5.1.0", - "es-module-lexer": "^1.1.0", - "estree-walker": "^3.0.1", - "execa": "^6.1.0", - "fast-glob": "^3.2.11", - "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "html-escaper": "^3.0.3", - "kleur": "^4.1.4", - "magic-string": "^0.27.0", - "mime": "^3.0.0", - "ora": "^6.1.0", - "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.0.3", - "prompts": "^2.4.2", - "rehype": "^12.0.1", - "semver": "^7.3.8", - "server-destroy": "^1.0.1", - "shiki": "^0.11.1", - "slash": "^4.0.0", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "supports-esm": "^1.0.0", - "tsconfig-resolver": "^3.0.1", - "typescript": "*", - "unist-util-visit": "^4.1.0", - "vfile": "^5.3.2", - "vite": "^4.0.3", - "vitefu": "^0.2.4", - "yargs-parser": "^21.0.1", - "zod": "^3.17.3" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" - } - }, - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "rollup": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", - "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "vite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", - "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", - "dev": true, - "requires": { - "esbuild": "^0.16.14", - "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.10.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "astro-eslint-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/astro-eslint-parser/-/astro-eslint-parser-0.11.0.tgz", - "integrity": "sha512-vcz8KBQ20WNOot6qK6w7DQtz2hwg+aLLqlUa6nAnitJLqbR12GxJN/+96U3O+VI4da5Up+FMWqNoL9mywSENtA==", - "dev": true, - "requires": { - "@astrojs/compiler": "^1.0.0", - "@typescript-eslint/scope-manager": "^5.48.2", - "@typescript-eslint/types": "^5.25.0", - "astrojs-compiler-sync": "^0.3.0", - "debug": "^4.3.4", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0" - } - }, - "astro-seo-meta": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astro-seo-meta/-/astro-seo-meta-2.0.0.tgz", - "integrity": "sha512-T/c1nQQvmYz0Ub04UooYo6JLZux7OaVwYeolWDf9L7RhpaqyWX80lOczSIt19/9mNKZq1hNYRcJBXWOArI36ug==", - "dev": true, - "requires": {} - }, - "astrojs-compiler-sync": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/astrojs-compiler-sync/-/astrojs-compiler-sync-0.3.1.tgz", - "integrity": "sha512-IzPuzkwdiRIZoBhCTuFhuBMWVESXgthTdwQ24QS8LvLargcWAA4E21KmZo4wimsmOG5vj4KKs9QFpy9zhXuo9Q==", - "dev": true, - "requires": { - "synckit": "^0.8.0" - } - }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -28133,12 +23849,6 @@ "babel-plugin-jsx-dom-expressions": "^0.35.15" } }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -28173,38 +23883,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -28223,73 +23901,6 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dev": true, - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -28366,6 +23977,12 @@ "streamsearch": "^1.1.0" } }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -28397,6 +24014,12 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -28433,12 +24056,6 @@ "upper-case-first": "^2.0.2" } }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -28494,24 +24111,6 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true - }, - "character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true - }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -28534,12 +24133,6 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, "ci-info": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", @@ -28567,12 +24160,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -28729,12 +24316,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -28773,12 +24354,6 @@ "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", "dev": true }, - "common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, "common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -28791,12 +24366,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -28919,6 +24488,16 @@ "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", "dev": true }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -28938,9 +24517,9 @@ "dev": true }, "dataloader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.1.tgz", - "integrity": "sha512-Zn+tVZo1RKu120rgoe0JsRk56UiKdefPSH47QROJsMHrX8/S9UJvi5A/A6+Sbuk6rE88z5JoM/wIJ09Z7BTfYA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", + "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==", "dev": true }, "debounce": { @@ -28982,15 +24561,6 @@ } } }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -29034,12 +24604,6 @@ "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", "dev": true }, - "deepmerge-ts": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz", - "integrity": "sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==", - "dev": true - }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -29076,48 +24640,24 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, "detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "devalue": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", - "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", - "dev": true - }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -29127,12 +24667,6 @@ "wrappy": "1" } }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, "diff-sequences": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.2.tgz", @@ -29286,16 +24820,6 @@ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, - "emmet": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.3.6.tgz", - "integrity": "sha512-pLS4PBPDdxuUAmw7Me7+TcHbykTsBKN/S9XJbUOMFQrNv9MoshzyMFK/R57JBm94/6HSL4vHnDeEmxlC82NQ4A==", - "dev": true, - "requires": { - "@emmetio/abbreviation": "^2.2.3", - "@emmetio/css-abbreviation": "^2.1.4" - } - }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -29400,12 +24924,6 @@ "stop-iteration-iterator": "^1.0.0" } }, - "es-module-lexer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.1.tgz", - "integrity": "sha512-n3ruqU8Te7I5prBd6d0darM8ajFuVNhLWvgo04hN7goWSaSrxe7ENOZitac7akN0A2o+8fMomBDsNPvW/eE3CQ==", - "dev": true - }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -29438,175 +24956,35 @@ } }, "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", "dev": true, "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" } }, - "esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "dev": true, - "optional": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -29620,9 +24998,9 @@ "dev": true }, "eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.4.1", @@ -29786,15 +25164,14 @@ "requires": {} }, "eslint-config-stylelint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-17.1.0.tgz", - "integrity": "sha512-W4wVdtIUdgjNpIAdWtFtsxuxCu7uSe+2WuTerH923UW800+B0FbO+9uk0ZFFvu9+MYdLyQ+RYU8GLjl9ZnCm8g==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-stylelint/-/eslint-config-stylelint-18.0.0.tgz", + "integrity": "sha512-oWiHn/Ep7lfsixeuI82eQbZpPNd6Pv0JvZQTNbH4nVVcYPRxnm3uVz5uBPThK1n8b2iDgU7FsiPUvNWbw1Qc7w==", "dev": true, "requires": { - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest": "^27.1.6", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-regexp": "^1.11.0" + "eslint-plugin-regexp": "^1.12.0" } }, "eslint-import-resolver-node": { @@ -29869,20 +25246,6 @@ } } }, - "eslint-plugin-astro": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-astro/-/eslint-plugin-astro-0.23.0.tgz", - "integrity": "sha512-KsIL1sOrz40qf/d9RP4E3sH6+p6nrIBBXB6rPuE9EWb5de+m9BWfvURuoECXfiXCmQh8UlHJUxgSWxn1bLsD8g==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "@typescript-eslint/types": "^5.25.0", - "astro-eslint-parser": "^0.11.0", - "eslint-utils": "^3.0.0", - "postcss": "^8.4.14", - "postcss-selector-parser": "^6.0.10" - } - }, "eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -29958,6 +25321,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@typescript-eslint/utils": "^5.10.0" } @@ -30207,12 +25572,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -30260,21 +25619,6 @@ "jest-util": "^29.4.2" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -30292,6 +25636,12 @@ "integrity": "sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==", "dev": true }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -30323,6 +25673,32 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", + "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "dev": true, + "requires": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "requires": { + "punycode": "^1.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } + }, "fast-xml-parser": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", @@ -30394,12 +25770,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -30448,16 +25818,6 @@ "path-exists": "^4.0.0" } }, - "find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dev": true, - "requires": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -30551,45 +25911,12 @@ "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -30613,72 +25940,6 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -30741,12 +26002,6 @@ "integrity": "sha512-XDfdemBGJIMAsHHOONHQxEH5dX2kCpE6MGZ1IsNvBuDPBZM3p4EAwAC7ygMjn/1/x+BJX0TK1ara1Zrh7JCFdQ==", "dev": true }, - "github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "dev": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -30960,39 +26215,6 @@ "dev": true, "requires": {} }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -31036,15 +26258,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "has-package-exports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/has-package-exports/-/has-package-exports-1.3.0.tgz", - "integrity": "sha512-e9OeXPQnmPhYoJ63lXC4wWe34TxEGZDZ3OQX9XRqp2VwsfLl3bQBy7VehLnd34g3ef8CmYlBLGqEMKXuz8YazQ==", - "dev": true, - "requires": { - "@ljharb/has-package-exports-patterns": "^0.0.2" - } - }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -31074,61 +26287,12 @@ "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "hast-util-from-parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.1.tgz", - "integrity": "sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - } - }, "hast-util-has-property": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", "dev": true }, - "hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0" - } - }, - "hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - } - }, "hast-util-select": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-5.0.5.tgz", @@ -31152,39 +26316,6 @@ "zwitch": "^2.0.0" } }, - "hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - } - }, - "hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - } - }, "hast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", @@ -31200,19 +26331,6 @@ "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", "dev": true }, - "hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - } - }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -31240,24 +26358,12 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, - "html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true - }, "html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, - "html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "dev": true - }, "htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -31689,6 +26795,23 @@ } } }, + "i18next": { + "version": "22.4.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.9.tgz", + "integrity": "sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw==", + "requires": { + "@babel/runtime": "^7.20.6" + } + }, + "i18next-http-backend": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.1.1.tgz", + "integrity": "sha512-jByfUCDVgQ8+/Wens7queQhYYvMcGTW/lR4IJJNEDDXnmqjLrwi8ubXKpmp76/JIWEZHffNdWqnxFJcTVGeaOw==", + "dev": true, + "requires": { + "cross-fetch": "3.1.5" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -31698,19 +26821,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, "idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -31783,12 +26893,6 @@ "resolve-cwd": "^3.0.0" } }, - "import-meta-resolve": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", - "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -32076,12 +27180,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, "is-builtin-module": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", @@ -32115,18 +27213,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -32163,12 +27249,6 @@ "html-tags": "^3.0.0" } }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true - }, "is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", @@ -32343,6 +27423,12 @@ "get-intrinsic": "^1.1.1" } }, + "is-what": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.8.tgz", + "integrity": "sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -33829,6 +28915,12 @@ } } }, + "js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "dev": true + }, "js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -33905,12 +28997,6 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", - "dev": true - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -34008,12 +29094,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, "known-css-properties": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz", @@ -34082,9 +29162,9 @@ } }, "lint-staged": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.1.tgz", - "integrity": "sha512-LLJLO0Kdbcv2a+CvSF4p1M7jBZOajKSMpBUvyR8+bXccsqPER0/NxTFQSpNHjqwV9kM3tkHczYerTB5wI+bksQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.2.tgz", + "integrity": "sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -34334,51 +29414,6 @@ } } }, - "load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -34394,12 +29429,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -34635,12 +29664,6 @@ "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -34677,15 +29700,6 @@ "yallist": "^3.0.2" } }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, "mailgun.js": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-8.0.6.tgz", @@ -34752,9 +29766,9 @@ "dev": true }, "markdown-it-implicit-figures": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.10.0.tgz", - "integrity": "sha512-1TWr6+apyoJvRa4Z7eIolZdeajZCRBcc1ckVXon7XwdL8MfydIWsHnZOS5zRrpUNX5b0/O9giWcmuItSkleK5A==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.11.0.tgz", + "integrity": "sha512-ed32u3O8pTEM3TKgeBTMKw8ce86L8u5L41CuLvGee3yevYOq+1BoxjI84m/f7RcUaATcKgXTgZwieadvOH4afg==", "dev": true }, "markdown-it-mark": { @@ -34773,189 +29787,17 @@ "htmlparser2": "^8.0.1" } }, - "markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "dev": true - }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, - "mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } - } - }, - "mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "dev": true, - "requires": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - } - }, - "mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - } - }, - "mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - } - }, - "mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - } - }, - "mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - } - }, - "mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - } - }, - "mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - } - }, - "mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz", - "integrity": "sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0" - } + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true }, "mdurl": { "version": "1.0.1", @@ -35042,6 +29884,15 @@ } } }, + "merge-anything": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.4.tgz", + "integrity": "sha512-7PWKwGOs5WWcpw+/OvbiFiAvEP6bv/QHiicigpqMGKIqPPAtGhBLR8LFJW+Zu6m9TXiR/a8+AiPlGG0ko1ruoQ==", + "dev": true, + "requires": { + "is-what": "^4.1.8" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -35061,333 +29912,6 @@ "dev": true, "requires": {} }, - "micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-extension-gfm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz", - "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==", - "dev": true, - "requires": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-extension-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-extension-gfm-footnote": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz", - "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==", - "dev": true, - "requires": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-extension-gfm-strikethrough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", - "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-extension-gfm-table": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", - "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-extension-gfm-tagfilter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", - "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-extension-gfm-task-list-item": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", - "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "dev": true - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "dev": true - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -35398,12 +29922,6 @@ "picomatch": "^2.3.1" } }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -35463,49 +29981,10 @@ } } }, - "minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true }, "ms": { @@ -35544,15 +30023,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", - "dev": true, - "requires": { - "@types/nlcst": "^1.0.0" - } - }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -35572,12 +30042,6 @@ "whatwg-url": "^5.0.0" } }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -35590,15 +30054,6 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -35648,18 +30103,6 @@ } } }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -35797,81 +30240,6 @@ "word-wrap": "^1.2.3" } }, - "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "requires": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - } - } - }, "orderedmap": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", @@ -35959,23 +30327,6 @@ "lines-and-columns": "^1.1.6" } }, - "parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", - "dev": true, - "requires": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -36035,12 +30386,6 @@ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, - "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -36065,12 +30410,6 @@ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -36142,64 +30481,21 @@ "source-map-js": "^1.0.2" } }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, "postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true }, - "postcss-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-5.0.0.tgz", - "integrity": "sha512-rGvpTDOM3//3Ysn3Xtvhzaj8ab984wKCpP02TEF559tLbUjNay3RQDpPxb7BREmfBtJm3/1WbQOZ7fSXwYLZ/w==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, "postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", @@ -36243,18 +30539,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -36307,26 +30591,6 @@ } } }, - "prettier-plugin-astro": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.2.tgz", - "integrity": "sha512-mmifnkG160BtC727gqoimoxnZT/dwr8ASxpoGGl6EHevhfblSOeu+pwH1LAm5Qu1MynizktztFujHHaijLCkww==", - "dev": true, - "requires": { - "@astrojs/compiler": "^0.31.3", - "prettier": "^2.7.1", - "sass-formatter": "^0.7.5", - "synckit": "^0.8.4" - }, - "dependencies": { - "@astrojs/compiler": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.31.4.tgz", - "integrity": "sha512-6bBFeDTtPOn4jZaiD3p0f05MEGQL9pw2Zbfj546oFETNmjJFWO3nzHz6/m+P53calknCvyVzZ5YhoBLIvzn5iw==", - "dev": true - } - } - }, "pretty-format": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.2.tgz", @@ -36346,12 +30610,6 @@ } } }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true - }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -36458,9 +30716,9 @@ } }, "prosemirror-keymap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz", + "integrity": "sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==", "dev": true, "requires": { "prosemirror-state": "^1.0.0", @@ -36590,16 +30848,6 @@ "safe-buffer": "^5.1.0" } }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "peer": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -36723,8 +30971,7 @@ "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regexp-ast-analysis": { "version": "0.5.1", @@ -36776,52 +31023,6 @@ } } }, - "rehype": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", - "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "rehype-parse": "^8.0.0", - "rehype-stringify": "^9.0.0", - "unified": "^10.0.0" - } - }, - "rehype-parse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", - "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^6.0.0", - "unified": "^10.0.0" - } - }, - "rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" - } - }, - "rehype-stringify": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", - "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "hast-util-to-html": "^8.0.0", - "unified": "^10.0.0" - } - }, "relay-runtime": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", @@ -36833,52 +31034,6 @@ "invariant": "^2.2.4" } }, - "remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - } - }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - } - }, - "remark-smartypants": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", - "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", - "dev": true, - "requires": { - "retext": "^8.1.0", - "retext-smartypants": "^5.1.0", - "unist-util-visit": "^4.1.0" - } - }, "remedial": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", @@ -36980,53 +31135,6 @@ } } }, - "retext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", - "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", - "dev": true, - "requires": { - "@types/nlcst": "^1.0.0", - "retext-latin": "^3.0.0", - "retext-stringify": "^3.0.0", - "unified": "^10.0.0" - } - }, - "retext-latin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", - "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", - "dev": true, - "requires": { - "@types/nlcst": "^1.0.0", - "parse-latin": "^5.0.0", - "unherit": "^3.0.0", - "unified": "^10.0.0" - } - }, - "retext-smartypants": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", - "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", - "dev": true, - "requires": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "retext-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", - "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", - "dev": true, - "requires": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0" - } - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -37049,9 +31157,9 @@ } }, "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", + "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -37099,21 +31207,6 @@ "tslib": "^2.1.0" } }, - "s.color": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", - "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", - "dev": true - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -37146,21 +31239,22 @@ "dev": true }, "sass": { - "version": "1.32.13", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", - "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0" - } - }, - "sass-formatter": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz", - "integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==", - "dev": true, - "requires": { - "suf-log": "^2.5.3" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "dependencies": { + "immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + } } }, "scslre": { @@ -37192,16 +31286,6 @@ "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", "dev": true }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -37219,24 +31303,12 @@ "upper-case-first": "^2.0.2" } }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", - "dev": true - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -37264,25 +31336,6 @@ "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", "dev": true }, - "shiki": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", - "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "^6.0.0" - }, - "dependencies": { - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - } - } - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -37332,6 +31385,17 @@ } } }, + "sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -37373,14 +31437,25 @@ } }, "solid-js": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.10.tgz", - "integrity": "sha512-Sf0e6PQCEFkFtbPq0L+93Ua81YQOefBEbvDJ0YXT92b6Lzw0k7UvzSd2l1BbYM+yzE3UmepU1tyMDc/3nIByjA==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.11.tgz", + "integrity": "sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==", "dev": true, "requires": { "csstype": "^3.1.0" } }, + "solid-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.4.3.tgz", + "integrity": "sha512-7+4/gYsVi0BlM4PzT1PU1TB5nW3Hv8FWuB+Kw/ofWui7KQkWBf+dVZOrReQYHEmLCzytHUa2JysUXgzVALJmSw==", + "dev": true, + "requires": { + "@babel/generator": "^7.18.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/types": "^7.18.4" + } + }, "solid-transition-group": { "version": "0.0.13", "resolved": "https://registry.npmjs.org/solid-transition-group/-/solid-transition-group-0.0.13.tgz", @@ -37585,12 +31660,6 @@ "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", "dev": true }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -37651,16 +31720,6 @@ "es-abstract": "^1.20.4" } }, - "stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "dev": true, - "requires": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - } - }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -37676,12 +31735,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true - }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -37724,16 +31777,20 @@ } }, "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.1.0.tgz", + "integrity": "sha512-Tw8OyIiYhxnIHUzgoLlCyWgCUKsPYiP3TDgs7M1VbayS+q5qZly2yxABg+YPe/hFRWiu0cOtptCtpyrn1CrnYw==", "dev": true, "requires": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.0.1", + "@csstools/css-tokenizer": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", + "cosmiconfig": "^8.0.0", "css-functions-list": "^3.1.0", + "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "fastest-levenshtein": "^1.0.16", @@ -37742,7 +31799,7 @@ "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.2.0", - "ignore": "^5.2.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", @@ -37752,7 +31809,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -37766,7 +31823,7 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.0" }, "dependencies": { "ansi-regex": { @@ -37781,6 +31838,18 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -37818,6 +31887,16 @@ "requires": { "ansi-regex": "^5.0.1" } + }, + "write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } } } }, @@ -37847,40 +31926,40 @@ } }, "stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-10.0.1.tgz", + "integrity": "sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==", "dev": true, "requires": {} }, "stylelint-config-recommended-scss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz", - "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-9.0.0.tgz", + "integrity": "sha512-5e9pn3Ztfncd8s9OqvvCW7tZpYe+vGmPi7VEXX7XEp+Kj38PnKCrvFCBL+hQ7rkD4d5QzjB3BxlFEyo/30UWUw==", "dev": true, "requires": { "postcss-scss": "^4.0.2", - "stylelint-config-recommended": "^9.0.0", - "stylelint-scss": "^4.0.0" + "stylelint-config-recommended": "^10.0.1", + "stylelint-scss": "^4.4.0" } }, "stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-30.0.1.tgz", + "integrity": "sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==", "dev": true, "requires": { - "stylelint-config-recommended": "^9.0.0" + "stylelint-config-recommended": "^10.0.1" } }, "stylelint-config-standard-scss": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz", - "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-7.0.1.tgz", + "integrity": "sha512-m5sRdtsB1F5fnC1Ozla7ryftU47wVpO+HWd+JQTqeoG0g/oPh5EfbWfcVHbNCEtuoHfALIySiUWS20pz2hX6jA==", "dev": true, "requires": { - "stylelint-config-recommended-scss": "^8.0.0", - "stylelint-config-standard": "^29.0.0" + "stylelint-config-recommended-scss": "^9.0.0", + "stylelint-config-standard": "^30.0.1" } }, "stylelint-order": { @@ -37894,9 +31973,9 @@ } }, "stylelint-scss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.3.0.tgz", - "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", + "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", "dev": true, "requires": { "lodash": "^4.17.21", @@ -37906,15 +31985,6 @@ "postcss-value-parser": "^4.1.0" } }, - "suf-log": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", - "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", - "dev": true, - "requires": { - "s.color": "0.0.15" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -37924,15 +31994,6 @@ "has-flag": "^3.0.0" } }, - "supports-esm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-esm/-/supports-esm-1.0.0.tgz", - "integrity": "sha512-96Am8CDqUaC0I2+C/swJ0yEvM8ZnGn4unoers/LSdE4umhX7mELzqyLzx3HnZAluq5PXIsGMKqa7NkqaeHMPcg==", - "dev": true, - "requires": { - "has-package-exports": "^1.1.0" - } - }, "supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", @@ -38113,28 +32174,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -38207,30 +32246,24 @@ "is-number": "^7.0.0" } }, + "totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true - }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, - "trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "dev": true - }, "ts-log": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.5.tgz", @@ -38295,34 +32328,6 @@ } } }, - "tsconfig-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", - "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.30", - "@types/resolve": "^1.17.0", - "json5": "^2.1.3", - "resolve": "^1.17.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.13.1" - }, - "dependencies": { - "@types/json5": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", - "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==", - "dev": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - } - } - }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -38360,12 +32365,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -38414,81 +32413,26 @@ "dev": true }, "undici": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", - "integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", + "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", "dev": true, "requires": { "busboy": "^1.6.0" } }, - "unherit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", - "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", - "dev": true - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, "unique-names-generator": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", "dev": true }, - "unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "dev": true - }, "unist-util-is": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", "integrity": "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==", "dev": true }, - "unist-util-modify-children": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", - "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "array-iterate": "^2.0.0" - } - }, - "unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, "unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -38500,15 +32444,6 @@ "unist-util-visit-parents": "^5.1.1" } }, - "unist-util-visit-children": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", - "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, "unist-util-visit-parents": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", @@ -38607,18 +32542,6 @@ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - } - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -38664,49 +32587,64 @@ "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", "dev": true }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, "vite": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", - "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", + "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", "dev": true, "requires": { - "esbuild": "^0.15.9", + "esbuild": "^0.16.14", "fsevents": "~2.3.2", - "postcss": "^8.4.18", + "postcss": "^8.4.21", "resolve": "^1.22.1", - "rollup": "^2.79.1" + "rollup": "^3.10.0" + } + }, + "vite-plugin-sass-dts": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/vite-plugin-sass-dts/-/vite-plugin-sass-dts-1.2.15.tgz", + "integrity": "sha512-XUbSD1fHi62VOYroWnqjff8GEhv1cYD0rm53YxiFFDx2IbsA2DSrCdPdVwy5wdpngzqMgZ7XzUlKnAEMMsB7Xg==", + "dev": true, + "requires": { + "postcss-js": "^4.0.1" + } + }, + "vite-plugin-solid": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.5.0.tgz", + "integrity": "sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==", + "dev": true, + "requires": { + "@babel/core": "^7.20.5", + "@babel/preset-typescript": "^7.18.6", + "babel-preset-solid": "^1.6.3", + "merge-anything": "^5.1.4", + "solid-refresh": "^0.4.1", + "vitefu": "^0.2.3" + } + }, + "vite-plugin-ssr": { + "version": "0.4.82", + "resolved": "https://registry.npmjs.org/vite-plugin-ssr/-/vite-plugin-ssr-0.4.82.tgz", + "integrity": "sha512-STvYzi4zl24WvCdrwRdKE56xGxiLIU+iSwhU9fY3a93VRHgGbeRJCxi7SImkjjHSUiJTsg6vIQ/bpVPL+Fn0QQ==", + "dev": true, + "requires": { + "@brillout/import": "^0.2.1", + "@brillout/json-serializer": "^0.5.3", + "@brillout/vite-plugin-import-build": "^0.2.4", + "cac": "^6.7.12", + "es-module-lexer": "^0.10.5", + "fast-glob": "^3.2.11", + "picocolors": "^1.0.0", + "sirv": "^2.0.2" + }, + "dependencies": { + "es-module-lexer": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", + "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", + "dev": true + } } }, "vitefu": { @@ -38716,85 +32654,6 @@ "dev": true, "requires": {} }, - "vscode-css-languageservice": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.2.3.tgz", - "integrity": "sha512-EAyhyIVHpEaf+GjtI+tVe7SekdoANfG0aubnspsQwak3Qkimn/97FpAufNyXk636ngW05pjNKAR9zyTCzo6avQ==", - "dev": true, - "requires": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, - "vscode-html-languageservice": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", - "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", - "dev": true, - "requires": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, - "vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", - "dev": true - }, - "vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", - "dev": true, - "requires": { - "vscode-languageserver-protocol": "3.17.2" - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", - "dev": true, - "requires": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", - "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, "vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", @@ -38876,24 +32735,12 @@ "defaults": "^1.0.3" } }, - "web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "dev": true - }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "dev": true }, - "web-vitals": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.1.1.tgz", - "integrity": "sha512-qvllU+ZeQChqzBhZ1oyXmWsjJ8a2jHYpH8AMaVuf29yscOPZfTQTjQFRX6+eADTdsDE8IanOZ0cetweHMs8/2A==", - "dev": true - }, "webcrypto-core": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", @@ -38969,22 +32816,6 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, - "which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "dev": true, - "requires": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - } - }, - "which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true - }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -38999,68 +32830,10 @@ "is-typed-array": "^1.1.10" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "requires": { - "string-width": "^5.0.1" - } - }, "wonka": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.1.tgz", - "integrity": "sha512-6et7xfxG/HtMwenqNsphz59PbYT1joKL11q9sY2en3JvzJZtR1alOROIl/1ibgBFdHJqKarF82Uqo1tr1ijzfQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.3.tgz", + "integrity": "sha512-EFOYiqDeYLXSzGYt2X3aVe9Hq1XJG+Hz/HjTRRT4dZE9q95khHl5+7pzUSXI19dbMO1/2UMrTf7JT7/7JrSQSQ==", "dev": true }, "word-wrap": { @@ -39069,25 +32842,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -39104,9 +32858,9 @@ } }, "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "dev": true, "requires": {} }, @@ -39257,12 +33011,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, - "zod": { - "version": "3.20.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.6.tgz", - "integrity": "sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==", - "dev": true - }, "zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index b71d19c8..d3720daf 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "discoursio-webapp", - "version": "0.7.1", + "version": "0.8.0", "private": true, "license": "MIT", "scripts": { - "build": "astro build", + "build": "vite build", "check": "npm run lint && npm run typecheck", "codegen": "graphql-codegen", - "deploy": "graphql-codegen && npm run typecheck && astro build && vercel", - "dev": "astro dev", + "deploy": "graphql-codegen && npm run typecheck && vite build && vercel", + "dev": "vite", "ffix": "npm run fix && npm run format", "fix": "npm run lint:code:fix && npm run lint:styles:fix", "format": "npx prettier \"{,!(node_modules)/**/}*.{js,ts,tsx,json,scss,css}\" --write --ignore-path .gitignore", @@ -22,35 +22,30 @@ "pre-push": "", "pre-push-old": "npm run typecheck", "prepare": "husky install", - "preview": "astro preview", - "start": "astro dev", - "start:dev": "cross-env PUBLIC_API_URL=http://127.0.0.1:8080 vercel dev", - "start:local": "cross-env PUBLIC_API_URL=http://127.0.0.1:8080 astro dev", - "start:production": "cross-env PUBLIC_API_URL=https://v2.discours.io astro dev", - "start:staging": "cross-env PUBLIC_API_URL=https://testapi.discours.io astro dev", - "typecheck": "astro check && tsc --noEmit", + "preview": "vite preview", + "start": "vite", + "start:local": "cross-env PUBLIC_API_URL=http://127.0.0.1:8080 vite", + "start:production": "cross-env PUBLIC_API_URL=https://v2.discours.io vite", + "start:staging": "cross-env PUBLIC_API_URL=https://testapi.discours.io vite", + "typecheck": "tsc --noEmit", "typecheck:watch": "tsc --noEmit --watch" }, "dependencies": { "@aws-sdk/abort-controller": "^3.266.0", "@aws-sdk/client-s3": "^3.216.0", "@aws-sdk/lib-storage": "^3.266.0", - "@connorskees/grass": "^0.12.0", - "@solid-primitives/share": "^2.0.1", - "astro-seo-meta": "^2.0.0", "formidable": "^2.1.1", + "i18next": "^22.4.9", "mailgun.js": "^8.0.6" }, "devDependencies": { - "@astrojs/solid-js": "^2.0.0", - "@astrojs/vercel": "^3.0.0", "@babel/core": "^7.20.12", - "@graphql-codegen/cli": "^2.16.4", - "@graphql-codegen/typescript": "^2.8.7", - "@graphql-codegen/typescript-operations": "^2.5.12", + "@graphql-codegen/cli": "^3.0.0", + "@graphql-codegen/typescript": "^3.0.0", + "@graphql-codegen/typescript-operations": "^3.0.0", "@graphql-codegen/typescript-urql": "^3.7.3", "@graphql-codegen/urql-introspection": "^2.2.1", - "@graphql-tools/url-loader": "^7.17.3", + "@graphql-tools/url-loader": "^7.17.13", "@graphql-typed-document-node/core": "^3.1.1", "@nanostores/router": "^0.8.1", "@nanostores/solid": "^0.3.2", @@ -58,18 +53,17 @@ "@solid-primitives/memo": "^1.1.3", "@solid-primitives/share": "^2.0.1", "@solid-primitives/storage": "^1.3.4", - "@solid-primitives/upload": "^0.0.105", + "@solid-primitives/upload": "^0.0.107", + "@solidjs/meta": "^0.28.2", "@types/express": "^4.17.15", "@types/node": "^18.11.18", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.48.2", - "@typescript-eslint/parser": "^5.48.2", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", "@urql/core": "^3.1.1", "@urql/devtools": "^2.0.3", "@urql/exchange-graphcache": "^5.0.8", - "astro": "^2.0.2", - "astro-eslint-parser": "^0.11.0", - "astro-seo-meta": "^2.0.0", + "babel-preset-solid": "^1.5.6", "bcryptjs": "^2.4.3", "bootstrap": "^5.2.3", "clsx": "^1.2.1", @@ -77,10 +71,9 @@ "cookie-signature": "^1.2.0", "cosmiconfig-toml-loader": "^1.0.0", "cross-env": "^7.0.3", - "eslint": "^8.32.0", - "eslint-config-stylelint": "^17.1.0", + "eslint": "^8.34.0", + "eslint-config-stylelint": "^18.0.0", "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-astro": "^0.23.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-promise": "^6.1.1", @@ -93,21 +86,21 @@ "hast-util-select": "^5.0.4", "husky": "^8.0.3", "hygen": "^6.2.11", + "i18next-http-backend": "^2.1.1", "idb": "^7.1.1", "jest": "^29.3.1", - "lint-staged": "^13.1.0", + "js-cookie": "^3.0.1", + "lint-staged": "^13.1.2", "loglevel": "^1.8.1", "loglevel-plugin-prefix": "^0.8.4", "markdown-it": "^13.0.1", "markdown-it-container": "^3.0.0", - "markdown-it-implicit-figures": "^0.10.0", + "markdown-it-implicit-figures": "^0.11.0", "markdown-it-mark": "^3.0.1", "markdown-it-replace-link": "^1.1.0", "nanostores": "^0.7.1", "orderedmap": "^2.1.0", - "postcss": "^8.4.21", - "postcss-modules": "5.0.0", - "prettier": "^2.8.3", + "prettier": "^2.7.1", "prettier-eslint": "^15.0.1", "prosemirror-commands": "^1.5.0", "prosemirror-dropcursor": "^1.6.1", @@ -115,33 +108,37 @@ "prosemirror-gapcursor": "^1.3.1", "prosemirror-history": "^1.3.0", "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", + "prosemirror-keymap": "^1.2.1", "prosemirror-markdown": "^1.10.1", "prosemirror-menu": "^1.2.1", "prosemirror-model": "^1.19.0", "prosemirror-schema-list": "^1.2.2", "prosemirror-state": "^1.4.2", "prosemirror-view": "^1.30.0", - "rollup": "^2.79.1", + "rollup": "^3.15.0", "rollup-plugin-visualizer": "^5.9.0", - "sass": "1.32.13", - "solid-js": "^1.6.9", + "sass": "^1.58.1", + "solid-js": "^1.6.11", "solid-transition-group": "^0.0.13", "sort-package-json": "^2.3.0", - "stylelint": "^14.16.1", + "stylelint": "^15.1.0", "stylelint-config-css-modules": "^4.1.0", "stylelint-config-prettier-scss": "^0.0.1", - "stylelint-config-standard-scss": "^6.1.0", + "stylelint-config-standard-scss": "^7.0.1", "stylelint-order": "^6.0.1", - "stylelint-scss": "^4.3.0", + "stylelint-scss": "^4.4.0", "swiper": "^8.4.7", "ts-node": "^10.9.1", "typescript": "^4.9.4", - "undici": "^5.15.1", + "undici": "^5.19.1", "unique-names-generator": "^4.7.1", "uuid": "^9.0.0", - "vite": "^3.2.5", - "ws": "^8.12.0", + "vite": "^4.1.1", + "vite-plugin-sass-dts": "^1.2.15", + "vite-plugin-solid": "^2.3.8", + "vite-plugin-ssr": "^0.4.38", + "wonka": "^6.2.3", + "ws": "^8.12.1", "y-prosemirror": "^1.2.0", "y-protocols": "^1.0.5", "y-webrtc": "^10.2.4", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json new file mode 100644 index 00000000..6c3d3aac --- /dev/null +++ b/public/locales/en/translation.json @@ -0,0 +1,233 @@ +{ + "...subscribing": "...subscribing", + "About myself": "About myself", + "About the project": "About the project", + "actions": "actions", + "Add comment": "Comment", + "Address on Discourse": "Address on Discourse", + "All": "All", + "All authors": "All authors", + "All posts": "All posts", + "all topics": "all topics", + "All topics": "All topics", + "Almost done! Check your email.": "Almost done! Just checking your email.", + "Artworks": "Artworks", + "Audio": "Audio", + "author": "author", + "Author": "Author", + "authors": "authors", + "Authors": "Authors", + "Back to main page": "Back to main page", + "Become an author": "Become an author", + "Bookmarked": "Saved", + "By alphabet": "By alphabet", + "By authors": "By authors", + "By name": "By name", + "By popularity": "By popularity", + "By rating": "By popularity", + "By relevance": "By relevance", + "By shouts": "By publications", + "By signing up you agree with our": "By signing up you agree with our", + "By title": "By title", + "By updates": "By updates", + "By views": "By views", + "cancel": "Cancel", + "Chat Title": "Chat Title", + "Choose who you want to write to": "Choose who you want to write to", + "Collaborate": "Help Edit", + "collections": "collections", + "Comments": "Comments", + "Communities": "Communities", + "community": "community", + "Cooperate": "Cooperate", + "Copy": "Copy", + "Copy link": "Copy link", + "Create account": "Create an account", + "Create Chat": "Create Chat", + "Create Group": "Create a group", + "Create post": "Create post", + "Date of Birth": "Date of Birth", + "Delete": "Delete", + "Discours": "Discours", + "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects", + "Discours is created with our common effort": "Discours exists because of our common effort", + "Discussing": "Discussing", + "discussion": "discourse", + "Discussion rules": "Discussion rules", + "Dogma": "Dogma", + "Drafts": "Drafts", + "Edit": "Edit", + "Email": "Mail", + "email not confirmed": "email not confirmed", + "enter": "enter", + "Enter": "Enter", + "Enter text": "Enter text", + "Enter the code or click the link from email to confirm": "Enter the code from the email or follow the link in the email to confirm registration", + "Enter the Discours": "Enter the Discours", + "Enter your new password": "Enter your new password", + "Error": "Error", + "Everything is ok, please give us your email address": "It's okay, just enter your email address to receive a password reset link.", + "Favorite": "Favorites", + "Favorite topics": "Favorite topics", + "feed": "feed", + "Feed settings": "Feed settings", + "Feedback": "Feedback", + "Fill email": "Fill email", + "Follow": "Follow", + "Follow the topic": "Follow the topic", + "follower": "follower", + "Followers": "Followers", + "Forgot password?": "Forgot your password?", + "Forward": "Forward", + "Full name": "First and last name", + "Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine": "Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine", + "Go to main page": "Go to main page", + "Group Chat": "Group Chat", + "Groups": "Groups", + "Help to edit": "Help to edit", + "Here you can customize your profile the way you want.": "Here you can customize your profile the way you want.", + "Hooray! Welcome!": "Hooray! Welcome!", + "Horizontal collaborative journalistic platform": "Horizontal collaborative journalism platform", + "How can I help/skills": "How can I help/skills", + "How it works": "How it works", + "How to write an article": "How to write an article", + "I have an account": "I have an account!", + "I have no account yet": "I don't have an account yet", + "I know the password": "I know the password", + "Independant magazine with an open horizontal cooperation about culture, science and society": "Independant magazine with an open horizontal cooperation about culture, science and society", + "Introduce": "Introduction", + "Invalid email": "Check if your email is correct", + "invalid password": "invalid password", + "Invite to collab": "Invite to Collab", + "It does not look like url": "It doesn't look like a link", + "Join": "Join", + "Join our maillist": "To receive the best postings, just enter your email", + "Join the community": "Join the community", + "Join the global community of authors!": "Join the global community of authors from all over the world!", + "Just start typing...": "Just start typing...", + "Knowledge base": "Knowledge base", + "Link sent, check your email": "Link sent, check your email", + "Literature": "Literature", + "Load more": "Show more", + "Loading": "Loading", + "Manifest": "Manifest", + "More": "More", + "Most commented": "Commented", + "Most read": "Readable", + "My feed": "My feed", + "My subscriptions": "Subscriptions", + "Name": "Name", + "New password": "New password", + "New stories every day and even more!": "New stories and more are waiting for you every day!", + "No such account, please try to register": "No such account found, please try to register", + "Nothing here yet": "There's nothing here yet", + "Nothing is here": "There is nothing here", + "Or continue with social network": "Or continue with social network", + "Our regular contributor": "Our regular contributor", + "Participating": "Participating", + "Partners": "Partners", + "Password": "Password", + "Password again": "Password again", + "Passwords are not equal": "Passwords are not equal", + "Personal": "Personal", + "personal data usage and email notifications": "to process personal data and receive email notifications", + "Pin": "Pin", + "Please check your email address": "Please check your email address", + "Please confirm your email to finish": "Confirm your email and the action will complete", + "Please enter a name to sign your comments and publication": "Please enter a name to sign your comments and publication", + "Please enter email": "Please enter your email", + "Please enter password": "Please enter a password", + "Please enter password again": "Please enter password again", + "Please, confirm email": "Please confirm email", + "Popular": "Popular", + "Popular authors": "Popular authors", + "post": "post", + "Principles": "Community principles", + "Profile": "Profile", + "Profile settings": "Profile settings", + "Publications": "Publications", + "Quit": "Quit", + "Reason uknown": "Reason unknown", + "Recent": "Fresh", + "register": "register", + "Reply": "Reply", + "Report": "Complain", + "Resend code": "Send confirmation", + "Restore password": "Restore password", + "Save settings": "Save settings", + "Search": "Search", + "Search author": "Search author", + "Search topic": "Search topic", + "Sections": "Sections", + "Security": "Security", + "Select": "Select", + "Send": "Send", + "Send link again": "Send link again", + "Settings": "Settings", + "Share": "Share", + "shout": "post", + "Show": "Show", + "sign up or sign in": "sign up or sign in", + "slug is used by another user": "Slug is already taken by another user", + "Social networks": "Social networks", + "Something went wrong, check email and password": "Something went wrong. Check your email and password", + "Something went wrong, please try again": "Something went wrong, please try again", + "Sorry, this address is already taken, please choose another one.": "Sorry, this address is already taken, please choose another one", + "Special projects": "Special projects", + "Start conversation": "Start a conversation", + "Subsccriptions": "Subscriptions", + "Subscribe": "Subscribe", + "Subscribe what you like to tune your personal feed": "Subscribe to topics that interest you to customize your personal feed and get instant updates on new posts and discussions", + "Subscribe who you like to tune your personal feed": "Subscribe to authors you're interested in to customize your personal feed and get instant updates on new posts and discussions", + "Subscription": "Subscription", + "Subscriptions": "Subscriptions", + "Successfully authorized": "Authorization successful", + "Suggest an idea": "Suggest an idea", + "Support us": "Help the magazine", + "terms of use": "terms of use", + "Terms of use": "Site rules", + "Thank you": "Thank you", + "This email is already taken. If it's you": "This email is already taken. If it's you", + "To leave a comment please": "To leave a comment please", + "To write a comment, you must": "To write a comment, you must", + "Top authors": "Authors rating", + "Top commented": "Most commented", + "Top discussed": "Top discussed", + "Top month articles": "Top of the month", + "Top rated": "Popular", + "Top recent": "Most recent", + "Top topics": "Interesting topics", + "Top viewed": "Most viewed", + "Topic is supported by": "Topic is supported by", + "topics": "topics", + "Topics": "Topics", + "Topics which supported by author": "Topics which supported by author", + "Try to find another way": "Try to find another way", + "Unfollow": "Unfollow", + "Unfollow the topic": "Unfollow the topic", + "user already exist": "user already exists", + "Username": "Username", + "Userpic": "Userpic", + "Video": "Video", + "view": "view", + "Views": "Views", + "We are convinced that one voice is good, but many is better": "We are convinced that one voice is good, but many is better", + "We can't find you, check email or": "We can't find you, check email or", + "We create the most amazing stories together": "We create the most amazing stories together", + "We know you, please try to login": "This email address is already registered, please try to login", + "We've sent you a message with a link to enter our website.": "We've sent you an email with a link to your email. Follow the link in the email to enter our website.", + "Where": "From", + "Work with us": "Cooperate with Discourse", + "Write": "Write", + "Write a comment...": "Write a comment...", + "Write about the topic": "Write about the topic", + "Write comment": "Write comment", + "Write message": "Write a message", + "Write to us": "Write to us", + "You are subscribed": "You are subscribed", + "You were successfully authorized": "You were successfully authorized", + "You've confirmed email": "You've confirmed email", + "You've reached a non-existed page": "You've reached a non-existed page", + "Your name will appear on your profile page and as your signature in publications, comments and responses.": "Your name will appear on your profile page and as your signature in publications, comments and responses", + "zine": "zine" +} diff --git a/src/locales/ru.json b/public/locales/ru/translation.json similarity index 95% rename from src/locales/ru.json rename to public/locales/ru/translation.json index 8f90af4c..519400c6 100644 --- a/src/locales/ru.json +++ b/public/locales/ru/translation.json @@ -1,6 +1,11 @@ { "...subscribing": "...подписываем", + "A short introduction to keep the reader interested": "Небольшое вступление, чтобы заинтересовать читателя", + "About myself": "О себе", "About the project": "О проекте", + "Add comment": "Комментировать", + "Add to bookmarks": "Добавить в закладки", + "Address on Discourse": "Адрес на Дискурсе", "All": "Все", "All authors": "Все авторы", "All posts": "Все публикации", @@ -8,6 +13,7 @@ "Almost done! Check your email.": "Почти готово! Осталось подтвердить вашу почту.", "Artworks": "Артворки", "Audio": "Аудио", + "Author": "Автор", "Authors": "Авторы", "Back to main page": "Вернуться на главную", "Become an author": "Стать автором", @@ -16,21 +22,26 @@ "By authors": "По авторам", "By name": "По имени", "By popularity": "По популярности", - "By rating": "По популярности", - "By time": "По времени", + "By rating": "По рейтингу", "By relevance": "По релевантности", "By shouts": "По публикациям", "By signing up you agree with our": "Регистрируясь, вы соглашаетесь с", "By title": "По названию", "By updates": "По обновлениям", "By views": "По просмотрам", + "Chat Title": "Тема дискурса", + "Choose who you want to write to": "Выберите кому хотите написать", "Collaborate": "Помочь редактировать", "Comments": "Комментарии", "Communities": "Сообщества", "Cooperate": "Соучаствовать", + "Copy": "Скопировать", "Copy link": "Скопировать ссылку", + "Create Chat": "Создать чат", + "Create Group": "Создать группу", "Create account": "Создать аккаунт", "Create post": "Создать публикацию", + "Date of Birth": "Дата рождения", "Delete": "Удалить", "Discours": "Дискурс", "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов", @@ -38,7 +49,9 @@ "Discussing": "Обсуждаемое", "Discussion rules": "Правила сообществ самиздата в соцсетях", "Dogma": "Догма", + "Drafts": "Черновики", "Edit": "Редактировать", + "Edited": "Отредактирован", "Email": "Почта", "Enter": "Войти", "Enter text": "Введите текст", @@ -56,24 +69,36 @@ "Follow the topic": "Подписаться на тему", "Followers": "Подписчики", "Forgot password?": "Забыли пароль?", + "Forward": "Переслать", "Full name": "Имя и фамилия", + "Get notifications": "Получать уведомления", "Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine": "Познакомитесь с выдающимися людьми нашего времени, участвуйте в редактировании и обсуждении статей, выступайте экспертом, оценивайте материалы других авторов со всего мира и определяйте, какие статьи будут опубликованы в журнале", "Go to main page": "Перейти на главную", + "Group Chat": "Общий чат", + "Groups": "Группы", + "Header": "Заголовок", "Help to edit": "Помочь редактировать", + "Here you can customize your profile the way you want.": "Здесь можно настроить свой профиль так, как вы хотите.", "Hooray! Welcome!": "Ура! Добро пожаловать!", "Horizontal collaborative journalistic platform": "Горизонтальная платформа для коллаборативной журналистики", + "How can I help/skills": "Чем могу помочь/навыки", "How it works": "Как это работает", "How to write an article": "Как написать статью", "I have an account": "У меня есть аккаунт!", "I have no account yet": "У меня еще нет аккаунта", "I know the password": "Я знаю пароль", - "Invite to collab": "Пригласить к участию", + "Independant magazine with an open horizontal cooperation about culture, science and society": "Независимый журнал с открытой горизонтальной редакцией о культуре, науке и обществе", + "Introduce": "Представление", "Invalid email": "Проверьте правильность ввода почты", + "Invite experts": "Пригласить экспертов", + "Invite to collab": "Пригласить к участию", + "It does not look like url": "Это не похоже на ссылку", "Join": "Присоединиться", "Join our maillist": "Чтобы получать рассылку лучших публикаций, просто укажите свою почту", "Join the community": "Присоединиться к сообществу", "Join the global community of authors!": "Присоединятесь к глобальному сообществу авторов со всего мира!", "Just start typing...": "Просто начните печатать...", + "Karma": "Карма", "Knowledge base": "База знаний", "Link sent, check your email": "Ссылка отправлена, проверьте почту", "Literature": "Литература", @@ -84,9 +109,12 @@ "Most commented": "Комментируемое", "Most read": "Читаемое", "My feed": "Моя лента", + "My subscriptions": "Подписки", + "Name": "Имя", "New password": "Новый пароль", "New stories every day and even more!": "Каждый день вас ждут новые истории и ещё много всего интересного!", "No such account, please try to register": "Такой адрес не найден, попробуйте зарегистрироваться", + "Nothing here yet": "Здесь пока ничего нет", "Nothing is here": "Здесь ничего нет", "Or continue with social network": "Или продолжите через соцсеть", "Our regular contributor": "Наш постоянный автор", @@ -95,6 +123,8 @@ "Password": "Пароль", "Password again": "Пароль ещё раз", "Passwords are not equal": "Пароли не совпадают", + "Personal": "Личные", + "Pin": "Закрепить", "Please check your email address": "Пожалуйста, проверьте введенный адрес почты", "Please confirm your email to finish": "Подтвердите почту и действие совершится", "Please enter a name to sign your comments and publication": "Пожалуйста, введите имя, которое будет отображаться на сайте", @@ -105,7 +135,11 @@ "Popular": "Популярное", "Popular authors": "Популярные авторы", "Principles": "Принципы сообщества", + "Profile": "Профиль", + "Profile settings": "Настройки профиля", + "Profile successfully saved": "Профиль успешно сохранён", "Publications": "Публикации", + "Publish": "Опубликовать", "Quit": "Выйти", "Reason uknown": "Причина неизвестна", "Recent": "Свежее", @@ -113,19 +147,31 @@ "Report": "Пожаловаться", "Resend code": "Выслать подтверждение", "Restore password": "Восстановить пароль", + "Save settings": "Сохранить настройки", "Search": "Поиск", "Search author": "Поиск автора", "Search topic": "Поиск темы", "Sections": "Разделы", + "Security": "Безопасность", + "Select": "Выбрать", + "Send": "Отправить", "Send link again": "Прислать ссылку ещё раз", + "Settings": "Настройки", "Share": "Поделиться", "Show": "Показать", + "Social networks": "Социальные сети", "Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль", + "Something went wrong, please try again": "Что-то пошло не так, попробуйте еще раз", + "Sorry, this address is already taken, please choose another one.": "Увы, этот адрес уже занят, выберите другой", "Special projects": "Спецпроекты", + "Start conversation": "Начать беседу", + "Subheader": "Подзаголовок", "Subscribe": "Подписаться", + "Subscribe to comments": "Подписаться на комментарии", "Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях", "Subscribe who you like to tune your personal feed": "Подпишитесь на интересующих вас авторов, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях", "Subscription": "Подписка", + "Subscriptions": "Подписки", "Successfully authorized": "Авторизация успешна", "Suggest an idea": "Предложить идею", "Support us": "Помочь журналу", @@ -133,6 +179,7 @@ "Thank you": "Благодарности", "This email is already taken. If it's you": "Такой email уже зарегистрирован. Если это вы", "To leave a comment please": "Чтобы оставить комментарий, необходимо", + "To write a comment, you must": "Чтобы написать комментарий, необходимо", "Top authors": "Рейтинг авторов", "Top commented": "Самое комментируемое", "Top discussed": "Обсуждаемое", @@ -148,6 +195,7 @@ "Unfollow": "Отписаться", "Unfollow the topic": "Отписаться от темы", "Username": "Имя пользователя", + "Userpic": "Аватар", "Video": "Видео", "Views": "Просмотры", "We are convinced that one voice is good, but many is better": "Мы убеждены, один голос хорошо, а много — лучше", @@ -155,88 +203,49 @@ "We create the most amazing stories together": "Самые потрясающиe истории мы создаём вместе", "We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться", "We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.", + "Welcome!": "Добро пожаловать!", + "Where": "Откуда", "Work with us": "Сотрудничать с Дискурсом", "Write": "Написать", + "Write a comment...": "Написать комментарий...", "Write about the topic": "Написать в тему", "Write comment": "Написать комментарий", + "Write message": "Написать сообщение", "Write to us": "Напишите нам", "You are subscribed": "Вы подписаны", "You was successfully authorized": "Вы были успешно авторизованы", "You've confirmed email": "Вы подтвердили почту", "You've reached a non-existed page": "Вы попали на несуществующую страницу", + "You've successfully logged out": "Вы успешно вышли из аккаунта", + "Your name will appear on your profile page and as your signature in publications, comments and responses.": "Ваше имя появится на странице вашего профиля и как ваша подпись в публикациях, комментариях и откликах", "actions": "действия", "all topics": "все темы", "author": "автор", - "Author": "Автор", "authors": "авторы", + "cancel": "Отмена", "collections": "коллекции", "community": "сообщество", + "create_chat": "Создать чат", + "create_group": "Создать группу", + "discourse_theme": "Тема дискурса", + "discussion": "дискурс", "email not confirmed": "email не подтвержден", "enter": "войдите", "feed": "лента", "follower": "подписчик", "invalid password": "некорректный пароль", + "or": "или", "personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений", "post": "пост", "register": "зарегистрируйтесь", - "sign up": "зарегистрироваться", - "or": "или", + "shout": "пост", "sign in": "войти", + "sign up": "зарегистрироваться", + "sign up or sign in": "зарегистрироваться или войти", + "slug is used by another user": "Имя уже занято другим пользователем", "terms of use": "правилами пользования сайтом", "topics": "темы", "user already exist": "пользователь уже существует", "view": "просмотр", - "zine": "журнал", - "shout": "пост", - "discussion": "дискурс", - "Personal": "Личные", - "Groups": "Группы", - "create_chat": "Создать чат", - "create_group": "Создать группу", - "discourse_theme": "Тема дискурса", - "cancel": "Отмена", - "Send": "Отправить", - "Group Chat": "Общий чат", - "Choose who you want to write to": "Выберите кому хотите написать", - "Start conversation": "Начать беседу", - "Profile settings": "Настройки профиля", - "Here you can customize your profile the way you want.": "Здесь можно настроить свой профиль так, как вы хотите.", - "Userpic": "Аватар", - "Name": "Имя", - "Your name will appear on your profile page and as your signature in publications, comments and responses.": "Ваше имя появится на странице вашего профиля и как ваша подпись в публикациях, комментариях и откликах", - "Address on Discourse": "Адрес на Дискурсе", - "Sorry, this address is already taken, please choose another one.": "Увы, этот адрес уже занят, выберите другой", - "Introduce": "Представление", - "About myself": "О себе", - "How can I help/skills": "Чем могу помочь/навыки", - "Where": "Откуда", - "Date of Birth": "Дата рождения", - "Social networks": "Социальные сети", - "Save settings": "Сохранить настройки", - "Write message": "Написать сообщение", - "Copy": "Скопировать", - "Pin": "Закрепить", - "Forward": "Переслать", - "Select": "Выбрать", - "slug is used by another user": "Имя уже занято другим пользователем", - "It does not look like url": "Это не похоже на ссылку", - "Something went wrong, please try again": "Что-то пошло не так, попробуйте еще раз", - "To write a comment, you must": "Чтобы написать комментарий, необходимо", - "Write a comment...": "Написать комментарий...", - "Add comment": "Комментировать", - "My subscriptions": "Подписки", - "Nothing here yet": "Здесь пока ничего нет", - "Edited": "Отредактирован", - "Invite experts": "Пригласить экспертов", - "Subscribe to comments": "Подписаться на комментарии", - "Add to bookmarks": "Добавить в закладки", - "Get notifications": "Получать уведомления", - "Profile successfully saved": "Профиль успешно сохранён", - "Welcome!": "Добро пожаловать!", - "You've successfully logged out": "Вы успешно вышли из аккаунта", - "Header": "Заголовок", - "Subheader": "Подзаголовок", - "A short introduction to keep the reader interested": "Небольшое вступление, чтобы заинтересовать читателя", - "Publish": "Опубликовать", - "Karma": "Карма" + "zine": "журнал" } diff --git a/src/components/App.tsx b/src/components/App.tsx new file mode 100644 index 00000000..64726330 --- /dev/null +++ b/src/components/App.tsx @@ -0,0 +1,102 @@ +// FIXME: breaks on vercel, research +// import 'solid-devtools' + +import { MODALS, showModal } from '../stores/ui' +import { Component, createEffect, createMemo, Suspense } from 'solid-js' +import { ROUTES, useRouter } from '../stores/router' +import { Dynamic } from 'solid-js/web' + +import type { PageProps, RootSearchParams } from '../pages/types' +import { HomePage } from '../pages/index.page' +import { AllTopicsPage } from '../pages/allTopics.page' +import { TopicPage } from '../pages/topic.page' +import { AllAuthorsPage } from '../pages/allAuthors.page' +import { AuthorPage } from '../pages/author.page' +import { FeedPage } from '../pages/feed.page' +import { ArticlePage } from '../pages/article.page' +import { SearchPage } from '../pages/search.page' +import { FourOuFourPage } from '../pages/fourOuFour.page' +import { DiscussionRulesPage } from '../pages/about/discussionRules.page' +import { DogmaPage } from '../pages/about/dogma.page' +import { GuidePage } from '../pages/about/guide.page' +import { HelpPage } from '../pages/about/help.page' +import { ManifestPage } from '../pages/about/manifest.page' +import { PartnersPage } from '../pages/about/partners.page' +import { PrinciplesPage } from '../pages/about/principles.page' +import { ProjectsPage } from '../pages/about/projects.page' +import { TermsOfUsePage } from '../pages/about/termsOfUse.page' +import { ThanksPage } from '../pages/about/thanks.page' +import { CreatePage } from '../pages/create.page' +import { ConnectPage } from '../pages/connect.page' +import { InboxPage } from '../pages/inbox.page' +import { LayoutShoutsPage } from '../pages/layoutShouts.page' +import { SessionProvider } from '../context/session' +import { ProfileSettingsPage } from '../pages/profile/profileSettings.page' +import { ProfileSecurityPage } from '../pages/profile/profileSecurity.page' +import { ProfileSubscriptionsPage } from '../pages/profile/profileSubscriptions.page' +import { CreateSettingsPage } from '../pages/createSettings.page' +import { SnackbarProvider } from '../context/snackbar' +import { LocalizeProvider } from '../context/localize' + +// TODO: lazy load +// const SomePage = lazy(() => import('./Pages/SomePage')) + +const pagesMap: Record> = { + inbox: InboxPage, + expo: LayoutShoutsPage, + connect: ConnectPage, + create: CreatePage, + createSettings: CreateSettingsPage, + home: HomePage, + topics: AllTopicsPage, + topic: TopicPage, + authors: AllAuthorsPage, + author: AuthorPage, + feed: FeedPage, + article: ArticlePage, + search: SearchPage, + discussionRules: DiscussionRulesPage, + dogma: DogmaPage, + guide: GuidePage, + help: HelpPage, + manifest: ManifestPage, + projects: ProjectsPage, + partners: PartnersPage, + principles: PrinciplesPage, + termsOfUse: TermsOfUsePage, + thanks: ThanksPage, + profileSettings: ProfileSettingsPage, + profileSecurity: ProfileSecurityPage, + profileSubscriptions: ProfileSubscriptionsPage +} + +export const App = (props: PageProps) => { + const { page, searchParams } = useRouter() + // console.debug(page()) + createEffect(() => { + const modal = MODALS[searchParams().modal] + if (modal) { + showModal(modal) + } + }) + // console.debug(pagesMap) + const pageComponent = createMemo(() => { + const result = pagesMap[page()?.route || 'home'] + + if (!result || page()?.path === '/404') { + return FourOuFourPage + } + + return result + }) + + return ( + + + + + + + + ) +} diff --git a/src/components/Article/Comment.module.scss b/src/components/Article/Comment.module.scss index 6275854c..96cdf800 100644 --- a/src/components/Article/Comment.module.scss +++ b/src/components/Article/Comment.module.scss @@ -3,6 +3,7 @@ padding: 0.8rem 2.4rem; transition: background-color 0.3s; position: relative; + list-style: none; @include media-breakpoint-down(sm) { margin-right: -1.2rem; @@ -230,3 +231,11 @@ .commentRatingControlDown { border-top: 8px solid rgb(0 0 0 / 40%); } + +.compactUserpic { + height: 28px; + width: 28px; + min-width: 28px; + display: inline-block; + vertical-align: bottom; +} diff --git a/src/components/Article/Comment.tsx b/src/components/Article/Comment.tsx index d6ae318c..63ef6f9e 100644 --- a/src/components/Article/Comment.tsx +++ b/src/components/Article/Comment.tsx @@ -4,28 +4,39 @@ import { AuthorCard } from '../Author/Card' import { Show, createMemo, createSignal, For, lazy, Suspense } from 'solid-js' import { clsx } from 'clsx' import type { Author, Reaction } from '../../graphql/types.gen' -import { t } from '../../utils/intl' -import { createReaction, deleteReaction, updateReaction } from '../../stores/zine/reactions' import MD from './MD' import { formatDate } from '../../utils' import Userpic from '../Author/Userpic' import { useSession } from '../../context/session' import { ReactionKind } from '../../graphql/types.gen' +import { useReactions } from '../../context/reactions' +import { useSnackbar } from '../../context/snackbar' +import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated' +import { useLocalize } from '../../context/localize' const CommentEditor = lazy(() => import('../_shared/CommentEditor')) type Props = { comment: Reaction compact?: boolean - reactions?: Reaction[] isArticleAuthor?: boolean + sortedComments?: Reaction[] } export const Comment = (props: Props) => { + const { t } = useLocalize() const [isReplyVisible, setIsReplyVisible] = createSignal(false) const [loading, setLoading] = createSignal(false) const [editMode, setEditMode] = createSignal(false) const { session } = useSession() + const { + actions: { createReaction, deleteReaction, updateReaction } + } = useReactions() + + const { + actions: { showSnackbar } + } = useSnackbar() + const canEdit = createMemo(() => props.comment.createdBy?.slug === session()?.user?.slug) const comment = createMemo(() => props.comment) @@ -34,6 +45,7 @@ export const Comment = (props: Props) => { if (comment()?.id) { try { await deleteReaction(comment().id) + showSnackbar({ body: t('Comment successfully deleted') }) } catch (error) { console.error('[deleteReaction]', error) } @@ -43,19 +55,12 @@ export const Comment = (props: Props) => { const handleCreate = async (value) => { try { setLoading(true) - await createReaction( - { - kind: ReactionKind.Comment, - replyTo: props.comment.id, - body: value, - shout: props.comment.shout.id - }, - { - name: session().user.name, - userpic: session().user.userpic, - slug: session().user.slug - } - ) + await createReaction({ + kind: ReactionKind.Comment, + replyTo: props.comment.id, + body: value, + shout: props.comment.shout.id + }) setIsReplyVisible(false) setLoading(false) } catch (error) { @@ -93,8 +98,15 @@ export const Comment = (props: Props) => { when={!props.compact} fallback={ @@ -127,12 +139,12 @@ export const Comment = (props: Props) => {
0, - [styles.commentRatingNegative]: comment().stat?.rating < 0 + [styles.commentRatingPositive]: comment().stat.rating > 0, + [styles.commentRatingNegative]: comment().stat.rating < 0 }} >
@@ -147,15 +159,16 @@ export const Comment = (props: Props) => {
- - + + +
- +
    - r.replyTo === props.comment.id)}> - {(reaction) => ( + r.replyTo === props.comment.id)}> + {(c) => ( )} @@ -217,5 +230,3 @@ export const Comment = (props: Props) => { ) } - -export default Comment diff --git a/src/components/Article/CommentsTree.tsx b/src/components/Article/CommentsTree.tsx index 669bda3c..4d05f3d9 100644 --- a/src/components/Article/CommentsTree.tsx +++ b/src/components/Article/CommentsTree.tsx @@ -1,20 +1,20 @@ import { Show, createMemo, createSignal, onMount, For } from 'solid-js' -import Comment from './Comment' -import { t } from '../../utils/intl' +import { Comment } from './Comment' import styles from '../../styles/Article.module.scss' -import { createReaction, useReactionsStore } from '../../stores/zine/reactions' -import type { Reaction } from '../../graphql/types.gen' import { clsx } from 'clsx' -import { byCreated, byStat } from '../../utils/sortby' -import { Loading } from '../Loading' +import { Loading } from '../_shared/Loading' import { Author, ReactionKind } from '../../graphql/types.gen' import { useSession } from '../../context/session' import CommentEditor from '../_shared/CommentEditor' import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' -import Button from '../_shared/Button' +import { Button } from '../_shared/Button' import { createStorage } from '@solid-primitives/storage' +import { useReactions } from '../../context/reactions' +import { byCreated } from '../../utils/sortby' +import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated' +import { useLocalize } from '../../context/localize' -const ARTICLE_COMMENTS_PAGE_SIZE = 50 +type CommentsOrder = 'createdAt' | 'rating' type Props = { commentAuthors: Author[] @@ -23,63 +23,85 @@ type Props = { } export const CommentsTree = (props: Props) => { - const [getCommentsPage, setCommentsPage] = createSignal(0) - const [commentsOrder, setCommentsOrder] = createSignal<'rating' | 'createdAt'>('createdAt') const [isCommentsLoading, setIsCommentsLoading] = createSignal(false) - const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) - const { sortedReactions, loadReactionsBy } = useReactionsStore() - const [store, setStore] = createStorage({ api: localStorage }) - const [newReactions, setNewReactions] = createSignal() + const [commentsOrder, setCommentsOrder] = createSignal('createdAt') + const { + reactionEntities, + actions: { loadReactionsBy, createReaction } + } = useReactions() - const getNewReactions = () => { + const { t } = useLocalize() + + // TODO: server side? + const [store, setStore] = createStorage({ api: typeof localStorage === 'undefined' ? {} : localStorage }) + const [newReactionsCount, setNewReactionsCount] = createSignal(0) + + const comments = createMemo(() => + Object.values(reactionEntities).filter((reaction) => reaction.kind === 'COMMENT') + ) + + const sortedComments = createMemo(() => { + let newSortedComments = [...comments()] + newSortedComments = newSortedComments.sort(byCreated) + + if (commentsOrder() === 'rating') { + newSortedComments = newSortedComments.sort((a, b) => { + if (a.replyTo && b.replyTo) { + return 0 + } + + const x = (a?.stat && a.stat.rating) || 0 + const y = (b?.stat && b.stat.rating) || 0 + + if (x > y) { + return 1 + } + if (x < y) { + return -1 + } + + return 0 + }) + } + + newSortedComments.reverse() + + return newSortedComments + }) + + const updateNewReactionsCount = () => { const storeValue = Number(store[`${props.shoutSlug}`]) - const setVal = () => setStore(`${props.shoutSlug}`, `${sortedReactions().length}`) + const setVal = () => setStore(`${props.shoutSlug}`, `${comments().length}`) if (!store[`${props.shoutSlug}`]) { setVal() - } else if (storeValue < sortedReactions().length) { - setNewReactions(sortedReactions().length - storeValue) + } else if (storeValue < comments().length) { + setNewReactionsCount(comments().length - storeValue) setVal() } } - const reactions = createMemo(() => - sortedReactions().sort(commentsOrder() === 'rating' ? byStat('rating') : byCreated) - ) - const { session } = useSession() - const loadMore = async () => { + + onMount(async () => { try { - const page = getCommentsPage() setIsCommentsLoading(true) - const { hasMore } = await loadReactionsBy({ - by: { shout: props.shoutSlug, comment: true }, - limit: ARTICLE_COMMENTS_PAGE_SIZE, - offset: page * ARTICLE_COMMENTS_PAGE_SIZE + await loadReactionsBy({ + by: { shout: props.shoutSlug } }) - getNewReactions() - setIsLoadMoreButtonVisible(hasMore) + updateNewReactionsCount() } finally { setIsCommentsLoading(false) } - } - - onMount(async () => await loadMore()) + }) const [submitted, setSubmitted] = createSignal(false) const handleSubmitComment = async (value) => { try { - await createReaction( - { - kind: ReactionKind.Comment, - body: value, - shout: props.shoutId - }, - { - name: session().user.name, - userpic: session().user.userpic, - slug: session().user.slug - } - ) + await createReaction({ + kind: ReactionKind.Comment, + body: value, + shout: props.shoutId + }) setSubmitted(true) } catch (error) { console.error('[handleCreate reaction]:', error) @@ -91,14 +113,14 @@ export const CommentsTree = (props: Props) => { }>

    - {t('Comments')} {reactions().length.toString() || ''} - -  +{newReactions()} + {t('Comments')} {comments().length.toString() || ''} + 0}> +  +{newReactionsCount()}

      -
    • +
      - !r.replyTo)} - > + !r.replyTo)}> {(reaction) => ( a.slug === session()?.user.slug))} - reactions={reactions()} comment={reaction} /> )}
    - - - - + + {t('To write a comment, you must')}  + + {t('sign up')} + +  {t('or')}  + + {t('sign in')} + + + } + > handleSubmitComment(value)} /> - +
    ) diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 0ed67602..0eab341c 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -4,7 +4,8 @@ import { Icon } from '../_shared/Icon' import { AuthorCard } from '../Author/Card' import { createMemo, For, Match, onMount, Show, Switch } from 'solid-js' import type { Author, Shout } from '../../graphql/types.gen' -import { t } from '../../utils/intl' +import { ReactionKind } from '../../graphql/types.gen' + import MD from './MD' import { SharePopup } from './SharePopup' import { getDescription } from '../../utils/meta' @@ -18,6 +19,10 @@ import VideoPlayer from './VideoPlayer' import Slider from '../_shared/Slider' import { getPagePath } from '@nanostores/router' import { router } from '../../stores/router' +import { useReactions } from '../../context/reactions' +import { loadShout } from '../../stores/zine/articles' +import { Title } from '@solidjs/meta' +import { useLocalize } from '../../context/localize' interface ArticleProps { article: Shout @@ -31,6 +36,7 @@ interface MediaItem { } const MediaView = (props: { media: MediaItem; kind: Shout['layout'] }) => { + const { t } = useLocalize() return ( <> {t('Cannot show this media type')}}> @@ -52,6 +58,7 @@ const MediaView = (props: { media: MediaItem; kind: Shout['layout'] }) => { } export const FullArticle = (props: ArticleProps) => { + const { t } = useLocalize() const { session } = useSession() const formattedDate = createMemo(() => formatDate(new Date(props.article.createdAt))) @@ -88,8 +95,31 @@ export const FullArticle = (props: ArticleProps) => { return mi }) + const { + actions: { createReaction } + } = useReactions() + + const handleUpvote = async () => { + await createReaction({ + kind: ReactionKind.Like, + shout: props.article.id + }) + + await loadShout(props.article.slug) + } + + const handleDownvote = async () => { + await createReaction({ + kind: ReactionKind.Dislike, + shout: props.article.id + }) + + await loadShout(props.article.slug) + } + return ( <> + {props.article.title}
    @@ -167,7 +197,12 @@ export const FullArticle = (props: ArticleProps) => {
    - +
    diff --git a/src/components/Article/RatingControl.tsx b/src/components/Article/RatingControl.tsx index 6e560222..e10dad7f 100644 --- a/src/components/Article/RatingControl.tsx +++ b/src/components/Article/RatingControl.tsx @@ -4,14 +4,22 @@ import { clsx } from 'clsx' interface RatingControlProps { rating?: number class?: string + onUpvote: () => Promise | void + onDownvote: () => Promise | void + isUpvoted: boolean + isDownvoted: boolean } export const RatingControl = (props: RatingControlProps) => { return (
    - + {props?.rating || ''} - +
    ) } diff --git a/src/components/Article/SharePopup.tsx b/src/components/Article/SharePopup.tsx index ac5b0910..437dcd89 100644 --- a/src/components/Article/SharePopup.tsx +++ b/src/components/Article/SharePopup.tsx @@ -1,9 +1,10 @@ import { Icon } from '../_shared/Icon' -import { t } from '../../utils/intl' + import { createSocialShare, TWITTER, VK, FACEBOOK, TELEGRAM } from '@solid-primitives/share' import styles from '../_shared/Popup/Popup.module.scss' import type { PopupProps } from '../_shared/Popup' import { Popup } from '../_shared/Popup' +import { useLocalize } from '../../context/localize' type SharePopupProps = { title: string @@ -19,6 +20,7 @@ export const getShareUrl = (params: { pathname?: string } = {}) => { } export const SharePopup = (props: SharePopupProps) => { + const { t } = useLocalize() const [share] = createSocialShare(() => ({ title: props.title, url: props.shareUrl, diff --git a/src/components/Author/Card.module.scss b/src/components/Author/Card.module.scss index 9cd05095..441889bd 100644 --- a/src/components/Author/Card.module.scss +++ b/src/components/Author/Card.module.scss @@ -1,8 +1,7 @@ .author { align-items: flex-start; display: flex; - flex-direction: row; - flex-wrap: nowrap; + flex-flow: row nowrap; margin-bottom: 2.4rem; &:last-child { diff --git a/src/components/Author/Card.tsx b/src/components/Author/Card.tsx index 68ad8dbb..929942f6 100644 --- a/src/components/Author/Card.tsx +++ b/src/components/Author/Card.tsx @@ -4,8 +4,6 @@ import { Icon } from '../_shared/Icon' import styles from './Card.module.scss' import { createMemo, createSignal, For, Show } from 'solid-js' import { translit } from '../../utils/ru2en' -import { t } from '../../utils/intl' -import { locale } from '../../stores/ui' import { follow, unfollow } from '../../stores/zine/common' import { clsx } from 'clsx' import { useSession } from '../../context/session' @@ -14,6 +12,7 @@ import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' import { FollowingEntity } from '../../graphql/types.gen' import { router, useRouter } from '../../stores/router' import { openPage } from '@nanostores/router' +import { useLocalize } from '../../context/localize' interface AuthorCardProps { caption?: string @@ -34,6 +33,8 @@ interface AuthorCardProps { } export const AuthorCard = (props: AuthorCardProps) => { + const { t, lang } = useLocalize() + const { session, isSessionLoaded, @@ -60,7 +61,7 @@ export const AuthorCard = (props: AuthorCardProps) => { const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug) const name = createMemo(() => { - if (locale() !== 'ru') { + if (lang() !== 'ru') { if (props.author.name === 'Дискурс') { return 'Discours' } diff --git a/src/components/Discours/Banner.tsx b/src/components/Discours/Banner.tsx index ed9bd925..a0f939ef 100644 --- a/src/components/Discours/Banner.tsx +++ b/src/components/Discours/Banner.tsx @@ -1,9 +1,11 @@ import styles from './Banner.module.scss' -import { t } from '../../utils/intl' + import { showModal } from '../../stores/ui' import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' export default () => { + const { t } = useLocalize() return (
    diff --git a/src/components/Discours/Donate.tsx b/src/components/Discours/Donate.tsx index e072785e..597be698 100644 --- a/src/components/Discours/Donate.tsx +++ b/src/components/Discours/Donate.tsx @@ -1,9 +1,10 @@ import '../../styles/help.scss' import { createSignal, onMount } from 'solid-js' import { showModal, warn } from '../../stores/ui' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export const Donate = () => { + const { t } = useLocalize() const once = '' const monthly = 'Monthly' const cpOptions = { diff --git a/src/components/Discours/Feedback.tsx b/src/components/Discours/Feedback.tsx index f4622118..c7f04564 100644 --- a/src/components/Discours/Feedback.tsx +++ b/src/components/Discours/Feedback.tsx @@ -1,7 +1,9 @@ import { hideModal } from '../../stores/ui' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export const Feedback = () => { + const { t } = useLocalize() + const action = '/user/feedback' const method = 'post' let msgElement: HTMLTextAreaElement | undefined diff --git a/src/components/Discours/Footer.tsx b/src/components/Discours/Footer.tsx index f22423d3..59ce00a1 100644 --- a/src/components/Discours/Footer.tsx +++ b/src/components/Discours/Footer.tsx @@ -1,14 +1,16 @@ -import { createMemo, For } from 'solid-js' +import { createEffect, createMemo, For } from 'solid-js' import styles from './Footer.module.scss' import { Icon } from '../_shared/Icon' import Subscribe from './Subscribe' -import { t } from '../../utils/intl' -import { locale } from '../../stores/ui' + import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' export const Footer = () => { - const locale_title = createMemo(() => (locale() === 'ru' ? 'English' : 'Русский')) - const locale_link = createMemo(() => '?lang=' + (locale() === 'ru' ? 'en' : 'ru')) + const { t, lang } = useLocalize() + + const changeLangTitle = createMemo(() => (lang() === 'ru' ? 'English' : 'Русский')) + const changeLangLink = createMemo(() => '?lng=' + (lang() === 'ru' ? 'en' : 'ru')) const links = createMemo(() => [ { header: 'About the project', @@ -82,8 +84,9 @@ export const Footer = () => { slug: '/about/projects' }, { - title: locale_title(), - slug: locale_link() + title: changeLangTitle(), + slug: changeLangLink(), + rel: 'external' } ] } @@ -117,10 +120,12 @@ export const Footer = () => {
    {t(header)}
      - {({ slug, title }) => ( + {({ slug, title, ...rest }) => (
    • {' '} - {slug.startsWith('?') ? title : t(title)}{' '} + + {slug.startsWith('?') ? title : t(title)} + {' '}
    • )}
      @@ -137,12 +142,14 @@ export const Footer = () => {
      - Независимый журнал с открытой горизонтальной редакцией о культуре, науке - и обществе. Дискурс © 2015–2022{' '} + {t( + 'Independant magazine with an open horizontal cooperation about culture, science and society' + )} + . {t('Discours')} © 2015–{new Date().getFullYear()}{' '} {t('Terms of use')}
      - + {(social) => (
      diff --git a/src/components/Discours/Hero.tsx b/src/components/Discours/Hero.tsx index 7135418b..554b499a 100644 --- a/src/components/Discours/Hero.tsx +++ b/src/components/Discours/Hero.tsx @@ -1,8 +1,10 @@ import './Hero.scss' -import { t } from '../../utils/intl' + import { showModal } from '../../stores/ui' +import { useLocalize } from '../../context/localize' export default () => { + const { t } = useLocalize() return (
      diff --git a/src/components/Discours/ProfileSettingsNavigation.tsx b/src/components/Discours/ProfileSettingsNavigation.tsx index 05336ceb..4f0efb0e 100644 --- a/src/components/Discours/ProfileSettingsNavigation.tsx +++ b/src/components/Discours/ProfileSettingsNavigation.tsx @@ -1,19 +1,21 @@ import styles from './ProfileSettingsNavigation.module.scss' import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' export default () => { + const { t } = useLocalize() return ( <> -

      Настройки

      +

      {t('Settings')}

      diff --git a/src/components/Discours/Subscribe.tsx b/src/components/Discours/Subscribe.tsx index a7f3837b..cc8a817e 100644 --- a/src/components/Discours/Subscribe.tsx +++ b/src/components/Discours/Subscribe.tsx @@ -1,9 +1,11 @@ import { createSignal } from 'solid-js' import styles from './Subscribe.module.scss' -import { t } from '../../utils/intl' + import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' export default () => { + const { t } = useLocalize() let emailElement: HTMLInputElement | undefined const [title, setTitle] = createSignal('') const subscribe = async () => { diff --git a/src/components/EditorExample/components/Editor.module.scss b/src/components/EditorExample/components/Editor.module.scss deleted file mode 100644 index cb285d23..00000000 --- a/src/components/EditorExample/components/Editor.module.scss +++ /dev/null @@ -1,73 +0,0 @@ -.editor { - flex: 1; - padding-top: 1em; - - a { - color: rgb(0 100 200); - text-decoration: none; - } - - a:hover { - text-decoration: underline; - } - - a:visited { - color: rgb(0 80 160); - } - - label { - display: block; - } - - input, - button, - select, - textarea { - font-family: inherit; - font-size: inherit; - -webkit-padding: 0.4em 0; - padding: 0.4em; - margin: 0 0 0.5em; - box-sizing: border-box; - border: 1px solid #ccc; - border-radius: 2px; - } - - input:disabled { - color: #ccc; - } - - button { - color: #333; - background-color: #f4f4f4; - outline: none; - } - - button:disabled { - color: #999; - } - - button:not(:disabled):active { - background-color: #ddd; - } - - button:focus { - border-color: #666; - } -} - -.error { - display: none; -} - -.markdown { - white-space: pre-wrap; -} - -.tooltip { - background: #fff; - box-shadow: 0 4px 10px rgb(0 0 0 / 25%); - color: #000; - display: flex; - position: absolute; -} diff --git a/src/components/EditorExample/components/Editor.tsx b/src/components/EditorExample/components/Editor.tsx deleted file mode 100644 index 0aa84b66..00000000 --- a/src/components/EditorExample/components/Editor.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { EditorView } from 'prosemirror-view' -import type { EditorState } from 'prosemirror-state' -import { useState } from '../store/context' -import { ProseMirror } from './ProseMirror' -import styles from './Editor.module.scss' -import { clsx } from 'clsx' - -export const Editor = () => { - const [store, ctrl] = useState() - const onInit = (text: EditorState, editorView: EditorView) => ctrl.setState({ editorView, text }) - const onReconfigure = (text: EditorState) => ctrl.setState({ text }) - const onChange = (text: EditorState) => ctrl.setState({ text, lastModified: new Date() }) - - return ( - - ) -} diff --git a/src/components/EditorExample/components/Error.module.scss b/src/components/EditorExample/components/Error.module.scss deleted file mode 100644 index b6ce7c60..00000000 --- a/src/components/EditorExample/components/Error.module.scss +++ /dev/null @@ -1,52 +0,0 @@ -.error { - width: 100%; - overflow: auto; - padding: 50px; - display: flex; - justify-content: center; - - ::-webkit-scrollbar { - display: none; - } - - button { - height: 50px; - padding: 0 20px; - font-size: 18px; - cursor: pointer; - display: inline-flex; - justify-content: center; - align-items: center; - outline: none; - text-decoration: none; - background: none; - font-family: inherit; - color: var(--foreground); - border: 1px solid var(--foreground); - - &.primary { - color: var(--primary-foreground); - border: 0; - background: var(--primary-background); - } - - &:hover { - opacity: 0.8; - } - } - - .container { - max-width: 800px; - width: 100%; - height: fit-content; - } - - pre { - background: var(--foreground); - border: 1px solid var(--foreground); - white-space: pre-wrap; - word-wrap: break-word; - border-radius: 2px; - padding: 10px; - } -} diff --git a/src/components/EditorExample/components/Error.tsx b/src/components/EditorExample/components/Error.tsx deleted file mode 100644 index e4e05d24..00000000 --- a/src/components/EditorExample/components/Error.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Switch, Match } from 'solid-js' -import { useState } from '../store/context' -import styles from './Error.module.scss' - -export default () => { - const [store] = useState() - return ( - }> - - - - - - - - - - - ) -} - -const InvalidState = (props: { title: string }) => { - const [store, ctrl] = useState() - const onClick = () => ctrl.clean() - - return ( -
      -
      -

      {props.title}

      -

      - There is an error with the editor state. This is probably due to an old version in which the data - structure has changed. Automatic data migrations may be supported in the future. To fix this now, - you can copy important notes from below, clean the state and paste it again. -

      -
      -          {JSON.stringify(store.error.props)}
      -        
      - -
      -
      - ) -} - -const Other = () => { - const [store, ctrl] = useState() - const onClick = () => ctrl.discard() - - const getMessage = () => { - const err = (store.error.props as any).error - return typeof err === 'string' ? err : err.message - } - - return ( -
      -
      -

      An error occurred.

      -
      -          {getMessage()}
      -        
      - -
      -
      - ) -} diff --git a/src/components/EditorExample/components/Layout.module.scss b/src/components/EditorExample/components/Layout.module.scss deleted file mode 100644 index 35935670..00000000 --- a/src/components/EditorExample/components/Layout.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -.layout { - display: flex; - font-size: 18px; - background: var(--background); - color: var(--foreground); - border-color: var(--background); - min-height: 100vh; - - .dark & { - background: var(--foreground); - color: var(--background); - border-color: var(--foreground); - } - - .drop-cursor { - height: 2px !important; - opacity: 0.5; - } -} diff --git a/src/components/EditorExample/components/Layout.tsx b/src/components/EditorExample/components/Layout.tsx deleted file mode 100644 index 5bb1bcb8..00000000 --- a/src/components/EditorExample/components/Layout.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import type { JSX } from 'solid-js/jsx-runtime' -import type { Config } from '../store/context' -import { clsx } from 'clsx' -import styles from './Layout.module.scss' - -export type Styled = { - children: JSX.Element - config?: Config - 'data-testid'?: string - onClick?: () => void - onMouseEnter?: (e: MouseEvent) => void -} - -export const Layout = (props: Styled) => { - return ( -
      - {props.children} -
      - ) -} diff --git a/src/components/EditorExample/components/ProseMirror.tsx b/src/components/EditorExample/components/ProseMirror.tsx deleted file mode 100644 index 231036b7..00000000 --- a/src/components/EditorExample/components/ProseMirror.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { createEffect, untrack } from 'solid-js' -import { Store, unwrap } from 'solid-js/store' -import { EditorState, EditorStateConfig, Transaction } from 'prosemirror-state' -import { EditorView } from 'prosemirror-view' -import { Schema } from 'prosemirror-model' -import type { NodeViewFn, ProseMirrorExtension, ProseMirrorState } from '../prosemirror/helpers' -import '../styles/ProseMirror.scss' - -interface ProseMirrorProps { - cssClass?: string - text?: Store - editorView?: Store - extensions?: Store - onInit: (s: EditorState, v: EditorView) => void - onReconfigure: (s: EditorState) => void - onChange: (s: EditorState) => void -} - -export const ProseMirror = (props: ProseMirrorProps) => { - let editorRef: HTMLDivElement - const editorView = () => untrack(() => unwrap(props.editorView)) - - const dispatchTransaction = (tr: Transaction) => { - if (!editorView()) return - const newState = editorView().state.apply(tr) - editorView().updateState(newState) - if (!tr.docChanged) return - props.onChange(newState) - } - - createEffect( - (payload: [EditorState, ProseMirrorExtension[]]) => { - const [prevText, prevExtensions] = payload - const text = unwrap(props.text) - const extensions: ProseMirrorExtension[] = unwrap(props.extensions) - if (!text || !extensions?.length) { - return [text, extensions] - } - - if (!props.editorView) { - const { editorState, nodeViews } = createEditorState(text, extensions) - const view = new EditorView(editorRef, { state: editorState, nodeViews, dispatchTransaction }) - view.focus() - props.onInit(editorState, view) - return [editorState, extensions] - } - - if (extensions !== prevExtensions || (!(text instanceof EditorState) && text !== prevText)) { - const { editorState, nodeViews } = createEditorState(text, extensions, prevText) - if (!editorState) return - editorView().updateState(editorState) - editorView().setProps({ nodeViews, dispatchTransaction }) - props.onReconfigure(editorState) - editorView().focus() - return [editorState, extensions] - } - - return [text, extensions] - }, - [props.text, props.extensions] - ) - - return
      -} - -const createEditorState = ( - text: ProseMirrorState, - extensions: ProseMirrorExtension[], - prevText?: EditorState -): { - editorState: EditorState - nodeViews: { [key: string]: NodeViewFn } -} => { - const reconfigure = text instanceof EditorState && prevText?.schema - let schemaSpec = { nodes: {} } - let nodeViews = {} - let plugins = [] - - for (const extension of extensions) { - if (extension.schema) { - schemaSpec = extension.schema(schemaSpec) - } - - if (extension.nodeViews) { - nodeViews = { ...nodeViews, ...extension.nodeViews } - } - } - - const schema = reconfigure ? prevText.schema : new Schema(schemaSpec) - for (const extension of extensions) { - if (extension.plugins) { - plugins = extension.plugins(plugins, schema) - } - } - - let editorState: EditorState - if (reconfigure) { - editorState = text.reconfigure({ schema, plugins } as EditorStateConfig) - } else if (text instanceof EditorState) { - editorState = EditorState.fromJSON({ schema, plugins }, text.toJSON()) - } else if (text) { - console.debug(text) - editorState = EditorState.fromJSON({ schema, plugins }, text) - } - - return { editorState, nodeViews } -} diff --git a/src/components/EditorExample/components/Sidebar.module.scss b/src/components/EditorExample/components/Sidebar.module.scss deleted file mode 100644 index 187cd08b..00000000 --- a/src/components/EditorExample/components/Sidebar.module.scss +++ /dev/null @@ -1,221 +0,0 @@ -.sidebarContainer { - color: rgb(255 255 255 / 50%); - @include font-size(1.6rem); - - overflow: hidden; - position: relative; - top: 0; - - p { - color: var(--foreground); - } - - h4 { - @include font-size(120%); - - margin-left: 1rem; - } - - button { - height: auto; - min-height: 50px; - padding: 0 1rem; - width: 100%; - } -} - -.sidebarOff { - background: #1f1f1f; - height: 100%; - min-height: 100vh; - padding: 40px 20px 20px; - top: 0; - transform: translateX(0); - transition: transform 0.3s; - overflow-y: auto; - scrollbar-width: none; - width: 350px; - - .sidebarContainerHidden & { - transform: translateX(100%); - } - - ::-webkit-scrollbar { - display: none; - } -} - -.sidebarOpener { - color: #000; - cursor: pointer; - opacity: 1; - position: absolute; - top: 1em; - transition: opacity 0.3s; - - &:hover { - opacity: 0.5; - } - - &::after { - background-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cmask id='mask0_1090_23825' style='mask-type:alpha' maskUnits='userSpaceOnUse' x='0' y='14' width='4' height='4'%3E%3Crect y='14.8237' width='3.17647' height='3.17647' fill='%23fff'/%3E%3C/mask%3E%3Cg mask='url(%23mask0_1090_23825)'%3E%3Cpath d='M16.0941 1.05908H0.847027C0.379194 1.05908 0 1.43828 0 1.90611V18.0003L3.38824 14.612H16.0942C16.562 14.612 16.9412 14.2328 16.9412 13.765V1.90614C16.9412 1.43831 16.562 1.05912 16.0942 1.05912L16.0941 1.05908ZM15.2471 12.9179H1.69412V2.7532H15.2471V12.9179Z' fill='black'/%3E%3C/g%3E%3Crect x='1' y='1' width='16' height='12.8235' stroke='black' stroke-width='2'/%3E%3Crect x='4.23535' y='3.17627' width='9.52941' height='2.11765' fill='black'/%3E%3Crect x='4.23535' y='9.5293' width='7.41176' height='2.11765' fill='black'/%3E%3Crect x='4.23535' y='6.35303' width='5.29412' height='2.11765' fill='black'/%3E%3C/svg%3E"); - content: ''; - height: 18px; - left: 100%; - margin-left: 0.3em; - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 18px; - } -} - -.sidebarCloser { - background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.1517 0.423857L0.42375 13.1518L2.84812 15.5761L15.576 2.84822L13.1517 0.423857Z M15.576 13.1518L2.84812 0.423855L0.423751 2.84822L13.1517 15.5761L15.576 13.1518Z' fill='white'/%3E%3C/svg%3E%0A"); - cursor: pointer; - height: 16px; - opacity: 1; - position: absolute; - transition: opacity 0.3s; - top: 20px; - width: 16px; - - &:hover { - opacity: 0.5; - } -} - -.sidebarLabel { - color: var(--foreground); - - > i { - text-transform: none; - } -} - -.sidebarContainer button, -.sidebarContainer a, -.sidebarItem { - margin: 0; - outline: none; - display: flex; - align-items: center; - line-height: 24px; - text-align: left; -} - -.sidebarContainer a, -.sidebarItem { - font-size: 18px; - padding: 2px 0; - width: 100%; -} - -.sidebarLink { - background: none; - border: 0; - color: inherit; - cursor: pointer; - font-size: inherit; - justify-content: flex-start; - - &:hover { - color: #fff !important; - } - - &:active { - > span i { - position: relative; - box-shadow: none; - top: 1px; - } - } - - &[disabled] { - color: var(--foreground); - cursor: not-allowed; - } - - &.draft { - color: rgb(255 255 255 / 50%); - line-height: 1.4; - margin: 0 0 1em 1.5em; - width: calc(100% - 2rem); - - &:hover { - background: none; - } - } - - > span { - justify-self: flex-end; - margin-left: auto; - - > i { - border: 1px solid; - border-bottom-width: 2px; - border-radius: 0.2rem; - display: inline-block; - color: inherit; - font-size: 13px; - line-height: 1.4; - margin: 0 0.5em 0 0; - padding: 1px 4px; - - &:last-child { - text-transform: uppercase; - } - } - } -} - -.themeSwitcher { - border-bottom: 1px solid rgb(255 255 255 / 30%); - border-top: 1px solid rgb(255 255 255 / 30%); - display: flex; - justify-content: space-between; - margin: 1rem; - padding: 1em 0; - - input[type='checkbox'] { - opacity: 0; - position: absolute; - - + label { - background: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.20869 7.73227C5.22953 7.36499 4.38795 6.70402 3.79906 5.83976C3.2103 4.97565 2.90318 3.95064 2.91979 2.90512C2.93639 1.8597 3.27597 0.844915 3.8919 0C2.82862 0.254038 1.87585 0.844877 1.17594 1.68438C0.475894 2.52388 0.0660276 3.5671 0.00731938 4.6585C-0.0513888 5.74989 0.244296 6.83095 0.850296 7.74073C1.45631 8.65037 2.34006 9.33992 3.36994 9.70637C4.39987 10.073 5.52063 10.0969 6.56523 9.77466C7.60985 9.45247 8.52223 8.80134 9.16667 7.91837C8.1842 8.15404 7.15363 8.08912 6.20869 7.73205V7.73227Z' fill='white'/%3E%3C/svg%3E%0A") - no-repeat 30px 9px, - url("data:image/svg+xml,%3Csvg width='12' height='12' viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.41196 0H5.58811V2.43024H6.41196V0ZM5.99988 8.96576C4.36601 8.96576 3.03419 7.63397 3.03419 6.00007C3.04792 4.3662 4.36598 3.04818 5.99988 3.03439C7.63375 3.03439 8.96557 4.3662 8.96557 6.00007C8.96557 7.63395 7.63375 8.96576 5.99988 8.96576ZM5.58811 9.56977H6.41196V12H5.58811V9.56977ZM12.0002 5.58811H9.56996V6.41196H12.0002V5.58811ZM0 5.58811H2.43024V6.41196H0V5.58811ZM8.81339 3.76727L10.5318 2.04891L9.94925 1.46641L8.23089 3.18477L8.81339 3.76727ZM3.7745 8.8129L2.05614 10.5313L1.47364 9.94877L3.192 8.2304L3.7745 8.8129ZM9.95043 10.5269L10.5329 9.94437L8.81456 8.22601L8.23207 8.80851L9.95043 10.5269ZM3.76864 3.18731L3.18614 3.76981L1.46778 2.05145L2.05028 1.46895L3.76864 3.18731Z' fill='%231F1F1F'/%3E%3C/svg%3E%0A") - #000 no-repeat 8px 8px; - border-radius: 14px; - cursor: pointer; - display: block; - height: 28px; - line-height: 10em; - overflow: hidden; - position: relative; - transition: background-color 0.3s; - width: 46px; - - &::before { - background-color: #fff; - border-radius: 100%; - content: ''; - height: 16px; - left: 6px; - position: absolute; - top: 6px; - transition: left 0.3s, color 0.3s; - width: 16px; - } - } - - &:checked + label { - background-color: #fff; - - &::before { - background-color: #1f1f1f; - left: 24px; - } - } - } -} diff --git a/src/components/EditorExample/components/Sidebar.tsx b/src/components/EditorExample/components/Sidebar.tsx deleted file mode 100644 index 97104ad5..00000000 --- a/src/components/EditorExample/components/Sidebar.tsx +++ /dev/null @@ -1,225 +0,0 @@ -import { For, Show, createEffect, createSignal, onCleanup, onMount } from 'solid-js' -import { unwrap } from 'solid-js/store' -import { undo, redo } from 'prosemirror-history' -import { Draft, useState } from '../store/context' -import * as remote from '../remote' -import { isEmpty } from '../prosemirror/helpers' -import type { Styled } from './Layout' -import { clsx } from 'clsx' -import styles from './Sidebar.module.scss' -import { useOutsideClickHandler } from '../../../utils/useOutsideClickHandler' -import { useEscKeyDownHandler } from '../../../utils/useEscKeyDownHandler' - -const Off = (props) =>
      {props.children}
      - -const Label = (props: Styled) =>

      {props.children}

      - -const Link = ( - props: Styled & { withMargin?: boolean; disabled?: boolean; title?: string; className?: string } -) => ( - -) - -export const Sidebar = () => { - const [store, ctrl] = useState() - const [lastAction, setLastAction] = createSignal() - - const toggleTheme = () => { - document.body.classList.toggle('dark') - ctrl.updateConfig({ theme: document.body.className }) - } - - const collabText = () => { - if (store.collab?.started) { - return 'Stop' - } - - if (store.collab?.error) { - return 'Restart 🚨' - } - - return 'Start' - } - - const discardText = () => { - if (store.path) { - return 'Close' - } - - if (store.drafts.length > 0 && isEmpty(store.text)) { - return 'Delete ⚠️' - } - - return 'Clear' - } - - const editorView = () => unwrap(store.editorView) - const onToggleMarkdown = () => ctrl.toggleMarkdown() - const onOpenDraft = (draft: Draft) => ctrl.openDraft(unwrap(draft)) - const collabUsers = () => store.collab?.y?.provider.awareness.meta.size ?? 0 - const onUndo = () => undo(editorView().state, editorView().dispatch) - const onRedo = () => redo(editorView().state, editorView().dispatch) - const onCopyAllAsMd = () => - remote.copyAllAsMarkdown(editorView().state).then(() => setLastAction('copy-md')) - const onDiscard = () => ctrl.discard() - const [isHidden, setIsHidden] = createSignal(true) - - const toggleSidebar = () => { - setIsHidden((oldIsHidden) => !oldIsHidden) - } - - const onCollab = () => { - const state = unwrap(store) - store.collab?.started ? ctrl.stopCollab(state) : ctrl.startCollab(state) - } - - // eslint-disable-next-line sonarjs/cognitive-complexity - const DraftLink = (p: { draft: Draft }) => { - const length = 100 - let content = '' - const getContent = (node: any) => { - if (node.text) { - content += node.text - } - - if (content.length > length) { - content = content.slice(0, Math.max(0, length)) + '...' - return content - } - - if (node.content) { - for (const child of node.content) { - if (content.length >= length) { - break - } - - content = getContent(child) - } - } - - return content - } - - const text = () => - p.draft.path - ? p.draft.path.slice(Math.max(0, p.draft.path.length - length)) - : getContent(p.draft.text?.doc) - - return ( - // eslint-disable-next-line solid/no-react-specific-props - onOpenDraft(p.draft)} data-testid="open"> - {text()} {p.draft.path && '📎'} - - ) - } - - const Keys = (props) => ( - - {(k: Element) => {k}} - - ) - - createEffect(() => { - setLastAction() - }) - - createEffect(() => { - if (!lastAction()) return - const id = setTimeout(() => { - setLastAction() - }, 1000) - onCleanup(() => clearTimeout(id)) - }) - - const [mod, setMod] = createSignal<'Ctrl' | 'Cmd'>('Ctrl') - - onMount(() => { - setMod(navigator.platform.includes('Mac') ? 'Cmd' : 'Ctrl') - }) - - const containerRef: { current: HTMLElement } = { - current: null - } - - useEscKeyDownHandler(() => setIsHidden(true)) - useOutsideClickHandler({ - containerRef, - predicate: () => !isHidden(), - handler: () => setIsHidden(true) - }) - - return ( -
      (containerRef.current = el)} - > - - Советы и предложения - - - editorView().focus()}> -
      - -
      - {store.path && ( - - )} - Пригласить соавторов - Настройки публикации - История правок - -
      - Ночная тема - - -
      - - {discardText()} - - - Undo - - - Redo - - - Markdown mode {store.markdown && '✅'} - - Copy all as MD {lastAction() === 'copy-md' && '📋'} - 0}> -

      Drafts:

      -

      - {(draft) => } -

      -
      - - Collab {collabText()} - - 0}> - - {collabUsers()} {collabUsers() === 1 ? 'user' : 'users'} connected - - -
      - -
      - ) -} diff --git a/src/components/EditorExample/db.ts b/src/components/EditorExample/db.ts deleted file mode 100644 index 2cdb318d..00000000 --- a/src/components/EditorExample/db.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { openDB } from 'idb' - -const dbPromise = () => { - return openDB('discours.io', 2, { - upgrade(db) { - db.createObjectStore('keyval') - } - }) -} - -export default { - async get(key: string) { - const result = await dbPromise() - return result.get('keyval', key) - }, - async set(key: string, val: string) { - const result = await dbPromise() - return result.put('keyval', val, key) - }, - async delete(key: string) { - const result = await dbPromise() - return result.delete('keyval', key) - }, - async clear() { - const result = await dbPromise() - return result.clear('keyval') - }, - async keys() { - const result = await dbPromise() - return result.getAllKeys('keyval') - } -} diff --git a/src/components/EditorExample/env.ts b/src/components/EditorExample/env.ts deleted file mode 100644 index f4d95615..00000000 --- a/src/components/EditorExample/env.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const isDark = () => - typeof window !== undefined && window.matchMedia('(prefers-color-scheme: dark)').matches diff --git a/src/components/EditorExample/markdown.ts b/src/components/EditorExample/markdown.ts deleted file mode 100644 index d44434ed..00000000 --- a/src/components/EditorExample/markdown.ts +++ /dev/null @@ -1,207 +0,0 @@ -import markdownit from 'markdown-it' -import { - MarkdownSerializer, - MarkdownParser, - defaultMarkdownSerializer, - MarkdownSerializerState -} from 'prosemirror-markdown' -import type { Node, Schema } from 'prosemirror-model' -import type { EditorState } from 'prosemirror-state' - -export const serialize = (state: EditorState) => { - let text = markdownSerializer.serialize(state.doc) - if (text.charAt(text.length - 1) !== '\n') { - text += '\n' - } - - return text -} - -function findAlignment(cell: Node): string | null { - const alignment = cell.attrs.style as string - if (!alignment) { - return null - } - - const match = alignment.match(/text-align: ?(left|right|center)/) - if (match && match[1]) { - return match[1] - } - - return null -} - -export const markdownSerializer = new MarkdownSerializer( - { - ...defaultMarkdownSerializer.nodes, - image(state: MarkdownSerializerState, node: Node) { - const alt = state.esc(node.attrs.alt || '') - const src = node.attrs.path ?? node.attrs.src - const title = node.attrs.title ? `"${node.attrs.title}"` : undefined - state.write(`![${alt}](${src}${title ? ' ' + title : ''})\n`) - /* ![]( "") */ - }, - code_block(state, node) { - const src = node.attrs.params.src - if (src) { - const title = state.esc(node.attrs.params.title || '') - state.write(`![${title}](${src})\n`) - return - } - - state.write('```' + (node.attrs.params.lang || '') + '\n') - state.text(node.textContent, false) - state.ensureNewLine() - state.write('```') - state.closeBlock(node) - }, - todo_item(state, node) { - state.write((node.attrs.done ? '[x]' : '[ ]') + ' ') - state.renderContent(node) - }, - table(state, node) { - function serializeTableHead(head: Node) { - let columnAlignments: string[] = [] - head.forEach((headRow) => { - if (headRow.type.name === 'table_row') { - columnAlignments = serializeTableRow(headRow) - } - }) - - // write table header separator - for (const alignment of columnAlignments) { - state.write('|') - state.write(alignment === 'left' || alignment === 'center' ? ':' : ' ') - state.write('---') - state.write(alignment === 'right' || alignment === 'center' ? ':' : ' ') - } - state.write('|') - state.ensureNewLine() - } - - function serializeTableBody(body: Node) { - body.forEach((bodyRow) => { - if (bodyRow.type.name === 'table_row') { - serializeTableRow(bodyRow) - } - }) - state.ensureNewLine() - } - - function serializeTableRow(row: Node): string[] { - const columnAlignment: string[] = [] - row.forEach((cell) => { - if (cell.type.name === 'table_header' || cell.type.name === 'table_cell') { - const alignment = serializeTableCell(cell) - columnAlignment.push(alignment) - } - }) - state.write('|') - state.ensureNewLine() - return columnAlignment - } - - function serializeTableCell(cell: Node): string | null { - state.write('| ') - state.renderInline(cell) - state.write(' ') - return findAlignment(cell) - } - - node.forEach((table_child) => { - if (table_child.type.name === 'table_head') serializeTableHead(table_child) - if (table_child.type.name === 'table_body') serializeTableBody(table_child) - }) - - state.ensureNewLine() - state.write('\n') - } - }, - { - ...defaultMarkdownSerializer.marks, - strikethrough: { - open: '~~', - close: '~~', - mixable: true, - expelEnclosingWhitespace: true - } - } -) - -function listIsTight(tokens: any, idx: number) { - let i = idx - while (++i < tokens.length) { - if (tokens[i].type !== 'list_item_open') return tokens[i].hidden - } - return false -} - -const md = markdownit({ html: false }) - -export const createMarkdownParser = (schema: Schema) => - new MarkdownParser(schema, md, { - table: { block: 'table' }, - thead: { block: 'table_head' }, - tbody: { block: 'table_body' }, - th: { - block: 'table_header', - getAttrs: (tok) => ({ - style: tok.attrGet('style') - }) - }, - tr: { block: 'table_row' }, - td: { - block: 'table_cell', - getAttrs: (tok) => ({ - style: tok.attrGet('style') - }) - }, - blockquote: { block: 'blockquote' }, - paragraph: { block: 'paragraph' }, - list_item: { block: 'list_item' }, - bullet_list: { - block: 'bullet_list', - getAttrs: (_, tokens, i) => ({ tight: listIsTight(tokens, i) }) - }, - ordered_list: { - block: 'ordered_list', - getAttrs: (tok, tokens, i) => ({ - order: +tok.attrGet('start') || 1, - tight: listIsTight(tokens, i) - }) - }, - heading: { - block: 'heading', - getAttrs: (tok) => ({ level: +tok.tag.slice(1) }) - }, - code_block: { - block: 'code_block', - noCloseToken: true - }, - fence: { - block: 'code_block', - getAttrs: (tok) => ({ params: { lang: tok.info } }), - noCloseToken: true - }, - hr: { node: 'horizontal_rule' }, - image: { - node: 'image', - getAttrs: (tok) => ({ - src: tok.attrGet('src'), - title: tok.attrGet('title') || null, - alt: (tok.children[0] && tok.children[0].content) || null - }) - }, - hardbreak: { node: 'hard_break' }, - em: { mark: 'em' }, - strong: { mark: 'strong' }, - s: { mark: 'strikethrough' }, - link: { - mark: 'link', - getAttrs: (tok) => ({ - href: tok.attrGet('href'), - title: tok.attrGet('title') || null - }) - }, - code_inline: { mark: 'code', noCloseToken: true } - }) diff --git a/src/components/EditorExample/prosemirror/extension/base.ts b/src/components/EditorExample/prosemirror/extension/base.ts deleted file mode 100644 index 87f1bce7..00000000 --- a/src/components/EditorExample/prosemirror/extension/base.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { schema as markdownSchema } from 'prosemirror-markdown' -import { NodeSpec, Schema } from 'prosemirror-model' -import { baseKeymap } from 'prosemirror-commands' -import { sinkListItem, liftListItem } from 'prosemirror-schema-list' -import { history } from 'prosemirror-history' -import { dropCursor } from 'prosemirror-dropcursor' -import { buildKeymap } from 'prosemirror-example-setup' -import { keymap } from 'prosemirror-keymap' -import type { ProseMirrorExtension } from '../helpers' -import type OrderedMap from 'orderedmap' - -import layoutStyles from '../../components/Layout.module.scss' - -const plainSchema = new Schema({ - nodes: { - doc: { - content: 'block+' - }, - paragraph: { - content: 'inline*', - group: 'block', - parseDOM: [{ tag: 'p' }], - toDOM: () => ['p', 0] - }, - text: { - group: 'inline' - } - } -}) - -const blockquoteSchema = { - content: 'block+', - group: 'block', - toDOM: () => ['div', ['blockquote', 0]] -} as NodeSpec - -export default (plain = false): ProseMirrorExtension => ({ - schema: () => - plain - ? { - nodes: plainSchema.spec.nodes, - marks: plainSchema.spec.marks - } - : { - nodes: (markdownSchema.spec.nodes as OrderedMap<NodeSpec>).update('blockquote', blockquoteSchema), - marks: markdownSchema.spec.marks - }, - plugins: (prev, schema) => [ - ...prev, - keymap({ - Tab: sinkListItem(schema.nodes.list_item), - 'Shift-Tab': liftListItem(schema.nodes.list_item) - }), - keymap({ Tab: () => true }), - keymap(buildKeymap(schema)), - keymap(baseKeymap), - history(), - dropCursor({ class: layoutStyles.dropCursor }) - ] -}) diff --git a/src/components/EditorExample/prosemirror/extension/code.ts b/src/components/EditorExample/prosemirror/extension/code.ts deleted file mode 100644 index 541be509..00000000 --- a/src/components/EditorExample/prosemirror/extension/code.ts +++ /dev/null @@ -1,49 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import { inputRules } from 'prosemirror-inputrules' -import type { Mark, MarkType } from 'prosemirror-model' -import type { EditorState, Transaction } from 'prosemirror-state' -import type { EditorView } from 'prosemirror-view' -import { keymap } from 'prosemirror-keymap' -import { markInputRule } from './mark-input-rule' -import type { ProseMirrorExtension } from '../helpers' - -const blank = '\u00A0' - -const onArrow = - (dir: 'left' | 'right') => - (state: EditorState, dispatch: (tr: Transaction) => void, editorView: EditorView) => { - if (!state.selection.empty) return false - const $pos = state.selection.$head - const isCode = $pos.marks().find((m: Mark) => m.type.name === 'code') - const tr = state.tr - - if (dir === 'left') { - const up = editorView.endOfTextblock('up') - if (!$pos.nodeBefore && up && isCode) { - tr.insertText(blank, $pos.pos - 1, $pos.pos) - dispatch(tr) - } - } else { - const down = editorView.endOfTextblock('down') - if (!$pos.nodeAfter && down && isCode) { - tr.insertText(blank, $pos.pos, $pos.pos + 1) - dispatch(tr) - } - } - } - -const codeKeymap = { - ArrowLeft: onArrow('left'), - ArrowRight: onArrow('right') -} - -const codeRule = (nodeType: MarkType) => markInputRule(/`([^`]+)`$/, nodeType) - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [ - ...prev, - inputRules({ rules: [codeRule(schema.marks.code)] }), - keymap(codeKeymap) - ] -}) diff --git a/src/components/EditorExample/prosemirror/extension/collab.ts b/src/components/EditorExample/prosemirror/extension/collab.ts deleted file mode 100644 index 4407ab18..00000000 --- a/src/components/EditorExample/prosemirror/extension/collab.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ySyncPlugin, yCursorPlugin, yUndoPlugin } from 'y-prosemirror' -import type { ProseMirrorExtension } from '../helpers' -import type { YOptions } from '../../store/context' - -interface YUser { - background: string - foreground: string - name: string -} - -export const cursorBuilder = (user: YUser): HTMLElement => { - const cursor = document.createElement('span') - cursor.classList.add('ProseMirror-yjs-cursor') - cursor.setAttribute('style', `border-color: ${user.background}`) - const userDiv = document.createElement('span') - userDiv.setAttribute('style', `background-color: ${user.background}; color: ${user.foreground}`) - userDiv.textContent = user.name - cursor.append(userDiv) - return cursor -} - -export default (y: YOptions): ProseMirrorExtension => ({ - plugins: (prev) => - y - ? [ - ...prev, - ySyncPlugin(y.type), - yCursorPlugin(y.provider.awareness, { cursorBuilder }), - yUndoPlugin() - ] - : prev -}) diff --git a/src/components/EditorExample/prosemirror/extension/drag-handle.ts b/src/components/EditorExample/prosemirror/extension/drag-handle.ts deleted file mode 100644 index 1bdf6ce1..00000000 --- a/src/components/EditorExample/prosemirror/extension/drag-handle.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Plugin, NodeSelection } from 'prosemirror-state' -import { DecorationSet, Decoration } from 'prosemirror-view' -import type { ProseMirrorExtension } from '../helpers' - -const handleIcon = ` - <svg viewBox="0 0 10 10" height="14" width="14"> - <path d="M3 2a1 1 0 110-2 1 1 0 010 2zm0 4a1 1 0 110-2 1 1 0 010 2zm0 4a1 1 0 110-2 1 1 0 010 2zm4-8a1 1 0 110-2 1 1 0 010 2zm0 4a1 1 0 110-2 1 1 0 010 2zm0 4a1 1 0 110-2 1 1 0 010 2z"/> - </svg>` - -const createDragHandle = () => { - const handle = document.createElement('span') - handle.setAttribute('contenteditable', 'false') - const icon = document.createElement('span') - icon.innerHTML = handleIcon - handle.appendChild(icon) - handle.classList.add('handle') - return handle -} - -const handlePlugin = new Plugin({ - props: { - decorations(state) { - const decos = [] - state.doc.forEach((node, pos) => { - decos.push( - Decoration.widget(pos + 1, createDragHandle), - Decoration.node(pos, pos + node.nodeSize, { class: 'draggable' }) - ) - }) - - return DecorationSet.create(state.doc, decos) - }, - handleDOMEvents: { - mousedown: (editorView, event) => { - const target = event.target as Element - if (target.classList.contains('handle')) { - const pos = editorView.posAtCoords({ left: event.x, top: event.y }) - const resolved = editorView.state.doc.resolve(pos.pos) - const tr = editorView.state.tr - tr.setSelection(NodeSelection.create(editorView.state.doc, resolved.before())) - editorView.dispatch(tr) - return false - } - } - } - } -}) - -export default (): ProseMirrorExtension => ({ - plugins: (prev) => [...prev, handlePlugin] -}) diff --git a/src/components/EditorExample/prosemirror/extension/image.ts b/src/components/EditorExample/prosemirror/extension/image.ts deleted file mode 100644 index c1e9ed61..00000000 --- a/src/components/EditorExample/prosemirror/extension/image.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { Plugin } from 'prosemirror-state' -import type { Node, Schema } from 'prosemirror-model' -import type { EditorView } from 'prosemirror-view' -import type { NodeViewFn, ProseMirrorExtension } from '../helpers' -import type OrderedMap from 'orderedmap' - -const REGEX = /^!\[([^[\]]*?)]\((.+?)\)\s+/ -const MAX_MATCH = 500 - -const isUrl = (str: string) => { - try { - const url = new URL(str) - return url.protocol === 'http:' || url.protocol === 'https:' - } catch { - return false - } -} - -const isBlank = (text: string) => text === ' ' || text === '\u00A0' - -const imageInput = (schema: Schema, path?: string) => - new Plugin({ - props: { - handleTextInput(view, from, to, text) { - if (view.composing || !isBlank(text)) return false - const $from = view.state.doc.resolve(from) - if ($from.parent.type.spec.code) return false - const textBefore = - $from.parent.textBetween( - Math.max(0, $from.parentOffset - MAX_MATCH), - $from.parentOffset, - null, - '\uFFFC' - ) + text - - const match = REGEX.exec(textBefore) - if (match) { - const [, title, src] = match - if (isUrl(src)) { - const node = schema.node('image', { src, title }) - const start = from - (match[0].length - text.length) - const tr = view.state.tr - tr.delete(start, to) - tr.insert(start, node) - view.dispatch(tr) - return true - } - - return false - } - } - } - }) - -const imageSchema = { - inline: true, - attrs: { - src: {}, - alt: { default: null }, - title: { default: null }, - path: { default: null }, - width: { default: null } - }, - group: 'inline', - draggable: true, - parseDOM: [ - { - tag: 'img[src]', - getAttrs: (dom: HTMLElement) => ({ - src: dom.getAttribute('src'), - title: dom.getAttribute('title'), - alt: dom.getAttribute('alt'), - path: dom.dataset.path - }) - } - ], - toDOM: (node: Node) => [ - 'img', - { - src: node.attrs.src, - title: node.attrs.title, - alt: node.attrs.alt, - 'data-path': node.attrs.path - } - ] -} - -export const insertImage = (view: EditorView, src: string, left: number, top: number) => { - const state = view.state - const tr = state.tr - const node = state.schema.nodes.image.create({ src }) - const pos = view.posAtCoords({ left, top }).pos - tr.insert(pos, node) - view.dispatch(tr) -} - -class ImageView { - node: Node - view: EditorView - getPos: () => number - schema: Schema - dom: Element - contentDOM: Element - container: HTMLElement - handle: HTMLElement - onResizeFn: any - onResizeEndFn: any - width: number - updating: number - - constructor(node: Node, view: EditorView, getPos: () => number, schema: Schema, path: string) { - this.node = node - this.view = view - this.getPos = getPos - this.schema = schema - this.onResizeFn = this.onResize.bind(this) - this.onResizeEndFn = this.onResizeEnd.bind(this) - - this.container = document.createElement('span') - this.container.className = 'image-container' - if (node.attrs.width) this.setWidth(node.attrs.width) - - const image = document.createElement('img') - image.setAttribute('title', node.attrs.title ?? '') - image.setAttribute('src', node.attrs.src) - - this.handle = document.createElement('span') - this.handle.className = 'resize-handle' - this.handle.addEventListener('mousedown', (e) => { - e.preventDefault() - window.addEventListener('mousemove', this.onResizeFn) - window.addEventListener('mouseup', this.onResizeEndFn) - }) - - this.container.appendChild(image) - this.container.appendChild(this.handle) - this.dom = this.container - } - - onResize(e: MouseEvent) { - this.width = e.pageX - this.container.getBoundingClientRect().left - this.setWidth(this.width) - } - - onResizeEnd() { - window.removeEventListener('mousemove', this.onResizeFn) - if (this.updating === this.width) return - this.updating = this.width - const tr = this.view.state.tr - tr.setNodeMarkup(this.getPos(), undefined, { - ...this.node.attrs, - width: this.width - }) - - this.view.dispatch(tr) - } - - setWidth(width: number) { - this.container.style.width = width + 'px' - } -} - -export default (path?: string): ProseMirrorExtension => ({ - schema: (prev) => ({ - ...prev, - nodes: (prev.nodes as OrderedMap<any>).update('image', imageSchema) - }), - plugins: (prev, schema) => [...prev, imageInput(schema, path)], - nodeViews: { - image: (node, view, getPos) => { - return new ImageView(node, view, getPos, view.state.schema, path) - } - } as unknown as { [key: string]: NodeViewFn } -}) diff --git a/src/components/EditorExample/prosemirror/extension/link.ts b/src/components/EditorExample/prosemirror/extension/link.ts deleted file mode 100644 index b6ffd593..00000000 --- a/src/components/EditorExample/prosemirror/extension/link.ts +++ /dev/null @@ -1,165 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import { Plugin, PluginKey, TextSelection, Transaction } from 'prosemirror-state' -import type { EditorView } from 'prosemirror-view' -import type { Mark, Node, Schema } from 'prosemirror-model' -import type { ProseMirrorExtension } from '../helpers' - -const REGEX = /(^|\s)\[(.+)]\(([^ ]+)(?: "(.+)")?\)/ - -const findMarkPosition = (mark: Mark, doc: Node, from: number, to: number) => { - let markPos = { from: -1, to: -1 } - doc.nodesBetween(from, to, (node, pos) => { - if (markPos.from > -1) return false - if (markPos.from === -1 && mark.isInSet(node.marks)) { - markPos = { from: pos, to: pos + Math.max(node.textContent.length, 1) } - } - }) - - return markPos -} - -const pluginKey = new PluginKey('markdown-links') - -const markdownLinks = (schema: Schema) => - new Plugin({ - key: pluginKey, - state: { - init() { - return { schema } - }, - apply(tr, state: any) { - const action = tr.getMeta(this) - if (action?.pos) { - state.pos = action.pos - } - - return state - } - }, - props: { - handleDOMEvents: { - keyup: (view) => { - return handleMove(view) - }, - click: (view, e) => { - if (handleMove(view)) { - e.preventDefault() - } - - return true - } - } - } - }) - -const resolvePos = (view: EditorView, pos: number) => { - try { - return view.state.doc.resolve(pos) - } catch { - // ignore - } -} - -// eslint-disable-next-line sonarjs/cognitive-complexity -const toLink = (view: EditorView, tr: Transaction) => { - const sel = view.state.selection - const state = pluginKey.getState(view.state) - const lastPos = state.pos - - if (lastPos !== undefined) { - const $from = resolvePos(view, lastPos) - if (!$from || $from.depth === 0 || $from.parent.type.spec.code) { - return false - } - - const lineFrom = $from.before() - const lineTo = $from.after() - - const line = view.state.doc.textBetween(lineFrom, lineTo, '\0', '\0') - const match = REGEX.exec(line) - - if (match) { - const [full, , text, href] = match - const spaceLeft = full.indexOf(text) - 1 - const spaceRight = full.length - text.length - href.length - spaceLeft - 4 - const start = match.index + $from.start() + spaceLeft - const end = start + full.length - spaceLeft - spaceRight - - if (sel.$from.pos >= start && sel.$from.pos <= end) { - return false - } - - // Do not convert md links if content has marks - const $startPos = resolvePos(view, start) - if ($startPos.marks().length > 0) { - return false - } - - const textStart = start + 1 - const textEnd = textStart + text.length - - if (textEnd < end) tr.delete(textEnd, end) - if (textStart > start) tr.delete(start, textStart) - - const to = start + text.length - tr.addMark(start, to, state.schema.marks.link.create({ href })) - - const sub = end - textEnd + textStart - start - tr.setMeta(pluginKey, { pos: sel.$head.pos - sub }) - - return true - } - } - - return false -} - -const toMarkdown = (view: EditorView, tr: Transaction) => { - const { schema } = pluginKey.getState(view.state) - const sel = view.state.selection - if (sel.$head.depth === 0 || sel.$head.parent.type.spec.code) { - return false - } - - const mark = schema.marks.link.isInSet(sel.$head.marks()) - const textFrom = sel.$head.pos - sel.$head.textOffset - const textTo = sel.$head.after() - - if (mark) { - const { href } = mark.attrs - const range = findMarkPosition(mark, view.state.doc, textFrom, textTo) - const text = view.state.doc.textBetween(range.from, range.to, '\0', '\0') - tr.replaceRangeWith(range.from, range.to, view.state.schema.text(`[${text}](${href})`)) - tr.setSelection(new TextSelection(tr.doc.resolve(sel.$head.pos + 1))) - tr.setMeta(pluginKey, { pos: sel.$head.pos }) - return true - } - - return false -} - -const handleMove = (view: EditorView) => { - const sel = view.state.selection - if (!sel.empty || !sel.$head) return false - const pos = sel.$head.pos - const tr = view.state.tr - - if (toLink(view, tr)) { - view.dispatch(tr) - return true - } - - if (toMarkdown(view, tr)) { - view.dispatch(tr) - return true - } - - tr.setMeta(pluginKey, { pos }) - view.dispatch(tr) - return false -} - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [...prev, markdownLinks(schema)] -}) diff --git a/src/components/EditorExample/prosemirror/extension/mark-input-rule.ts b/src/components/EditorExample/prosemirror/extension/mark-input-rule.ts deleted file mode 100644 index 02c279ff..00000000 --- a/src/components/EditorExample/prosemirror/extension/mark-input-rule.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { InputRule } from 'prosemirror-inputrules' -import type { EditorState } from 'prosemirror-state' -import type { MarkType } from 'prosemirror-model' - -export const markInputRule = (regexp: RegExp, nodeType: MarkType, getAttrs = null) => - new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => { - let markEnd = end - const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs - const tr = state.tr - if (match[1]) { - const textStart = start + match[0].indexOf(match[1]) - const textEnd = textStart + match[1].length - let hasMarks = false - state.doc.nodesBetween(textStart, textEnd, (node) => { - hasMarks = node.marks.length > 0 - }) - - if (hasMarks) return - if (textEnd < end) tr.delete(textEnd, end) - if (textStart > start) tr.delete(start, textStart) - markEnd = start + match[1].length - } - - tr.addMark(start, markEnd, nodeType.create(attrs)) - tr.removeStoredMark(nodeType) - return tr - }) diff --git a/src/components/EditorExample/prosemirror/extension/markdown.ts b/src/components/EditorExample/prosemirror/extension/markdown.ts deleted file mode 100644 index d90320b2..00000000 --- a/src/components/EditorExample/prosemirror/extension/markdown.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - inputRules, - textblockTypeInputRule, - wrappingInputRule, - smartQuotes, - emDash, - ellipsis -} from 'prosemirror-inputrules' -import type { NodeType, Schema } from 'prosemirror-model' -import type { ProseMirrorExtension } from '../helpers' - -const blockQuoteRule = (nodeType: NodeType) => wrappingInputRule(/^\s*>\s$/, nodeType) - -const orderedListRule = (nodeType: NodeType) => - wrappingInputRule( - /^(\d+)\.\s$/, - nodeType, - (match) => ({ order: +match[1] }), - (match, node) => node.childCount + node.attrs.order === +match[1] - ) - -const bulletListRule = (nodeType: NodeType) => wrappingInputRule(/^\s*([*+-])\s$/, nodeType) - -const headingRule = (nodeType: NodeType, maxLevel: number) => - textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\s$'), nodeType, (match) => ({ - level: match[1].length - })) - -const markdownRules = (schema: Schema) => { - const rules = [...smartQuotes, ellipsis, emDash] - if (schema.nodes.blockquote) rules.push(blockQuoteRule(schema.nodes.blockquote)) - if (schema.nodes.ordered_list) rules.push(orderedListRule(schema.nodes.ordered_list)) - if (schema.nodes.bullet_list) rules.push(bulletListRule(schema.nodes.bullet_list)) - if (schema.nodes.heading) rules.push(headingRule(schema.nodes.heading, 6)) - return rules -} - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [...prev, inputRules({ rules: markdownRules(schema) })] -}) diff --git a/src/components/EditorExample/prosemirror/extension/menu.ts b/src/components/EditorExample/prosemirror/extension/menu.ts deleted file mode 100644 index f568cb2d..00000000 --- a/src/components/EditorExample/prosemirror/extension/menu.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { toggleMark } from 'prosemirror-commands' -import { - blockTypeItem, - // joinUpItem, - // liftItem, - // selectParentNodeItem, - // undoItem, - // redoItem, - menuBar, - icons, - MenuItem, - wrapItem, - Dropdown -} from 'prosemirror-menu' - -import { wrapInList } from 'prosemirror-schema-list' -import type { NodeSelection } from 'prosemirror-state' - -import { TextField, openPrompt } from './prompt' -import type { ProseMirrorExtension } from '../helpers' -import type { Schema } from 'prosemirror-model' - -// Helpers to create specific types of items - -const cut = (something) => something.filter(Boolean) - -function canInsert(state, nodeType) { - const $from = state.selection.$from - - for (let d = $from.depth; d >= 0; d--) { - const index = $from.index(d) - - if ($from.node(d).canReplaceWith(index, index, nodeType)) return true - } - - return false -} - -function insertImageItem(nodeType) { - return new MenuItem({ - icon: icons.image, - label: 'image', - enable(state) { - return canInsert(state, nodeType) - }, - run(state, _, view) { - const { - from, - to, - node: { attrs } - } = state.selection as NodeSelection - - openPrompt({ - title: 'Insert image', - fields: { - src: new TextField({ - label: 'Location', - required: true, - value: attrs && attrs.src - }), - title: new TextField({ label: 'Title', value: attrs && attrs.title }), - alt: new TextField({ - label: 'Description', - value: attrs ? attrs.alt : state.doc.textBetween(from, to, ' ') - }) - }, - callback(newAttrs) { - view.dispatch(view.state.tr.replaceSelectionWith(nodeType.createAndFill(newAttrs))) - view.focus() - } - }) - } - }) -} - -function cmdItem(cmd, options) { - const passedOptions = { - label: options.title, - run: cmd - } - - for (const prop in options) passedOptions[prop] = options[prop] - - if ((!options.enable || options.enable === true) && !options.select) { - passedOptions[options.enable ? 'enable' : 'select'] = (state) => cmd(state) - } - - return new MenuItem(passedOptions) -} - -function markActive(state, type) { - const { from, $from, to, empty } = state.selection - - if (empty) return type.isInSet(state.storedMarks || $from.marks()) - - return state.doc.rangeHasMark(from, to, type) -} - -function markItem(markType, options) { - const passedOptions = { - active(state) { - return markActive(state, markType) - }, - enable: true - } - - for (const prop in options) passedOptions[prop] = options[prop] - - return cmdItem(toggleMark(markType), passedOptions) -} - -function linkItem(markType) { - return new MenuItem({ - title: 'Add or remove link', - icon: { - width: 18, - height: 18, - path: 'M3.27177 14.7277C2.06258 13.5186 2.06258 11.5527 3.27177 10.3435L6.10029 7.51502L4.75675 6.17148L1.92823 9C-0.0234511 10.9517 -0.0234511 14.1196 1.92823 16.0713C3.87991 18.023 7.04785 18.023 8.99952 16.0713L11.828 13.2428L10.4845 11.8992L7.65598 14.7277C6.44679 15.9369 4.48097 15.9369 3.27177 14.7277ZM6.87756 12.536L12.5346 6.87895L11.1203 5.46469L5.4633 11.1217L6.87756 12.536ZM6.17055 4.75768L8.99907 1.92916C10.9507 -0.0225206 14.1187 -0.0225201 16.0704 1.92916C18.022 3.88084 18.022 7.04878 16.0704 9.00046L13.2418 11.829L11.8983 10.4854L14.7268 7.65691C15.936 6.44772 15.936 4.4819 14.7268 3.27271C13.5176 2.06351 11.5518 2.06351 10.3426 3.2727L7.51409 6.10122L6.17055 4.75768Z' - }, - active(state) { - return markActive(state, markType) - }, - enable(state) { - return !state.selection.empty - }, - run(state, dispatch, view) { - if (markActive(state, markType)) { - toggleMark(markType)(state, dispatch) - - return true - } - - openPrompt({ - fields: { - href: new TextField({ - label: 'Link target', - required: true - }) - }, - callback(attrs) { - toggleMark(markType, attrs)(view.state, view.dispatch) - view.focus() - } - }) - } - }) -} - -function wrapListItem(nodeType, options) { - return cmdItem(wrapInList(nodeType, options.attrs), options) -} - -// :: (Schema) → Object -// Given a schema, look for default mark and node types in it and -// return an object with relevant menu items relating to those marks: -// -// **`toggleStrong`**`: MenuItem` -// : A menu item to toggle the [strong mark](#schema-basic.StrongMark). -// -// **`toggleEm`**`: MenuItem` -// : A menu item to toggle the [emphasis mark](#schema-basic.EmMark). -// -// **`toggleCode`**`: MenuItem` -// : A menu item to toggle the [code font mark](#schema-basic.CodeMark). -// -// **`toggleLink`**`: MenuItem` -// : A menu item to toggle the [link mark](#schema-basic.LinkMark). -// -// **`insertImage`**`: MenuItem` -// : A menu item to insert an [image](#schema-basic.Image). -// -// **`wrapBulletList`**`: MenuItem` -// : A menu item to wrap the selection in a [bullet list](#schema-list.BulletList). -// -// **`wrapOrderedList`**`: MenuItem` -// : A menu item to wrap the selection in an [ordered list](#schema-list.OrderedList). -// -// **`wrapBlockQuote`**`: MenuItem` -// : A menu item to wrap the selection in a [block quote](#schema-basic.BlockQuote). -// -// **`makeParagraph`**`: MenuItem` -// : A menu item to set the current textblock to be a normal -// [paragraph](#schema-basic.Paragraph). -// -// **`makeCodeBlock`**`: MenuItem` -// : A menu item to set the current textblock to be a -// [code block](#schema-basic.CodeBlock). -// -// **`makeHead[N]`**`: MenuItem` -// : Where _N_ is 1 to 6. Menu items to set the current textblock to -// be a [heading](#schema-basic.Heading) of level _N_. -// -// **`insertHorizontalRule`**`: MenuItem` -// : A menu item to insert a horizontal rule. -// -// The return value also contains some prefabricated menu elements and -// menus, that you can use instead of composing your own menu from -// scratch: -// -// **`insertMenu`**`: Dropdown` -// : A dropdown containing the `insertImage` and -// `insertHorizontalRule` items. -// -// **`typeMenu`**`: Dropdown` -// : A dropdown containing the items for making the current -// textblock a paragraph, code block, or heading. -// -// **`fullMenu`**`: [[MenuElement]]` -// : An array of arrays of menu elements for use as the full menu -// for, for example the [menu bar](https://github.com/prosemirror/prosemirror-menu#user-content-menubar). -// eslint-disable-next-line sonarjs/cognitive-complexity -export function buildMenuItems(schema: Schema<any, any>) { - const r: { [key: string]: MenuItem | MenuItem[] } = {} - let type - - if ((type = schema.marks.strong)) { - r.toggleStrong = markItem(type, { - title: 'Toggle strong style', - icon: { - width: 13, - height: 16, - path: 'M9.82857 7.76C10.9371 6.99429 11.7143 5.73714 11.7143 4.57143C11.7143 1.98857 9.71428 0 7.14286 0H0V16H8.04571C10.4343 16 12.2857 14.0571 12.2857 11.6686C12.2857 9.93143 11.3029 8.44571 9.82857 7.76ZM3.42799 2.85708H6.85656C7.80513 2.85708 8.57085 3.6228 8.57085 4.57137C8.57085 5.51994 7.80513 6.28565 6.85656 6.28565H3.42799V2.85708ZM3.42799 13.1429H7.42799C8.37656 13.1429 9.14228 12.3772 9.14228 11.4286C9.14228 10.4801 8.37656 9.71434 7.42799 9.71434H3.42799V13.1429Z' - } - }) - } - - if ((type = schema.marks.em)) { - r.toggleEm = markItem(type, { - title: 'Toggle emphasis', - icon: { - width: 14, - height: 16, - path: 'M4.39216 0V3.42857H6.81882L3.06353 12.5714H0V16H8.78431V12.5714H6.35765L10.1129 3.42857H13.1765V0H4.39216Z' - } - }) - } - - if ((type = schema.marks.code)) { - r.toggleCode = markItem(type, { - title: 'Toggle code font', - icon: icons.code - }) - } - - if ((type = schema.marks.link)) r.toggleLink = linkItem(type) - - if ((type = schema.marks.blockquote) && (type = schema.nodes.image)) r.insertImage = insertImageItem(type) - - if ((type = schema.nodes.bullet_list)) { - r.wrapBulletList = wrapListItem(type, { - title: 'Wrap in bullet list', - icon: { - width: 20, - height: 16, - path: 'M0.000114441 1.6C0.000114441 0.714665 0.71478 0 1.60011 0C2.48544 0 3.20011 0.714665 3.20011 1.6C3.20011 2.48533 2.48544 3.19999 1.60011 3.19999C0.71478 3.19999 0.000114441 2.48533 0.000114441 1.6ZM0 8.00013C0 7.1148 0.714665 6.40014 1.6 6.40014C2.48533 6.40014 3.19999 7.1148 3.19999 8.00013C3.19999 8.88547 2.48533 9.60013 1.6 9.60013C0.714665 9.60013 0 8.88547 0 8.00013ZM1.6 12.8C0.714665 12.8 0 13.5254 0 14.4C0 15.2747 0.725332 16 1.6 16C2.47466 16 3.19999 15.2747 3.19999 14.4C3.19999 13.5254 2.48533 12.8 1.6 12.8ZM19.7333 15.4662H4.79999V13.3329H19.7333V15.4662ZM4.79999 9.06677H19.7333V6.93344H4.79999V9.06677ZM4.79999 2.66664V0.533307H19.7333V2.66664H4.79999Z' - } - }) - } - - if ((type = schema.nodes.ordered_list)) { - r.wrapOrderedList = wrapListItem(type, { - title: 'Wrap in ordered list', - icon: { - width: 19, - height: 16, - path: 'M2.00002 4.00003H1.00001V1.00001H0V0H2.00002V4.00003ZM2.00002 13.5V13H0V12H3.00003V16H0V15H2.00002V14.5H1.00001V13.5H2.00002ZM0 6.99998H1.80002L0 9.1V10H3.00003V9H1.20001L3.00003 6.89998V5.99998H0V6.99998ZM4.9987 2.99967V0.999648H18.9988V2.99967H4.9987ZM4.9987 15.0001H18.9988V13.0001H4.9987V15.0001ZM18.9988 8.99987H4.9987V6.99986H18.9988V8.99987Z' - } - }) - } - - if ((type = schema.nodes.blockquote)) { - r.wrapBlockQuote = wrapItem(type, { - title: 'Wrap in block quote', - icon: icons.blockquote - }) - } - - if ((type = schema.nodes.paragraph)) { - r.makeParagraph = blockTypeItem(type, { - title: 'Change to paragraph', - label: 'P', - icon: icons.paragraph - }) - } - - if ((type = schema.nodes.code_block)) { - r.makeCodeBlock = blockTypeItem(type, { - title: 'Change to code block', - label: '<>' - }) - } - - const headingIcons = [ - 'M0 12H2.57143V7.16571H7.95429V12H10.5257V0H7.95429V4.83429H2.57143V0H0V12Z M12.6801 12H19.3315V9.78857H17.3944V0.342858H15.5087L12.6801 1.42286V3.75429L14.8744 2.93143V9.78857H12.6801V12Z', - 'M0 12H2.57143V7.16571H7.95429V12H10.5257V0H7.95429V4.83429H2.57143V0H0V12Z M12.4915 12H21.2515V9.78857H15.4229C15.4229 9.05143 16.6229 8.43429 17.9944 7.59429C19.5372 6.68571 21.1658 5.52 21.1658 3.54857C21.1658 1.16571 19.2458 0.102858 16.8972 0.102858C15.4744 0.102858 14.0858 0.48 12.8858 1.33714V3.73714C14.1201 2.79429 15.4915 2.36571 16.6744 2.36571C17.8229 2.36571 18.5772 2.79429 18.5772 3.65143C18.5772 4.76571 17.5487 5.22857 16.3315 5.93143C14.6172 6.94286 12.4915 8.02286 12.4915 10.8514V12Z', - 'M0 11.7647H2.52101V7.02521H7.79832V11.7647H10.3193V0H7.79832V4.7395H2.52101V0H0V11.7647Z M16.3474 12C18.7004 12 20.9189 11.042 20.9189 8.63866C20.9189 6.95798 19.8936 6.06723 18.7172 5.71429C19.7928 5.34454 20.4483 4.43697 20.4483 3.2605C20.4483 1.17647 18.6836 0.100841 16.3138 0.100841C14.9189 0.100841 13.6079 0.436975 12.5827 0.991597V3.34454C13.7088 2.63865 14.9357 2.31933 15.9609 2.31933C17.339 2.31933 18.0617 2.78992 18.0617 3.61345C18.0617 4.40336 17.3558 4.82353 16.2466 4.80672L14.6668 4.78992L14.6499 6.97479H16.5323C17.6752 6.97479 18.5155 7.31092 18.5155 8.28571C18.5155 9.36134 17.4399 9.7647 16.1457 9.78151C14.8348 9.79832 13.692 9.59664 12.381 8.87395V11.2269C13.692 11.7647 14.8852 12 16.3474 12Z' - ] - - if ((type = schema.nodes.heading)) { - for (let i = 1; i <= 10; i++) { - r[`makeHead${i}`] = blockTypeItem(type, { - label: `H${i}`, - attrs: { level: i }, - icon: { - width: 22, - height: 12, - path: headingIcons[i - 1] - } - }) - } - } - - if ((type = schema.nodes.horizontal_rule)) { - const hr = type - - r.insertHorizontalRule = new MenuItem({ - label: '---', - icon: icons.horizontal_rule, - enable(state) { - return canInsert(state, hr) - }, - run(state, dispatch) { - dispatch(state.tr.replaceSelectionWith(hr.create())) - } - }) - } - - r.typeMenu = new Dropdown(cut([r.makeHead1, r.makeHead2, r.makeHead3, r.typeMenu, r.wrapBlockQuote]), { - label: 'Тт', - class: 'editor-dropdown' // TODO: use this class - // FIXME: icon svg code shouldn't be here - // icon: { - // width: 12, - // height: 12, - // path: "M6.39999 3.19998V0H20.2666V3.19998H14.9333V15.9999H11.7333V3.19998H6.39999ZM3.19998 8.5334H0V5.33342H9.59994V8.5334H6.39996V16H3.19998V8.5334Z" - // } - }) as MenuItem - r.blockMenu = [] - r.listMenu = [cut([r.wrapBulletList, r.wrapOrderedList])] - r.inlineMenu = [cut([r.toggleStrong, r.toggleEm, r.toggleMark])] - r.fullMenu = r.inlineMenu.concat([cut([r.typeMenu])], r.listMenu) - - return r -} - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [ - ...prev, - menuBar({ - floating: false, - content: buildMenuItems(schema).fullMenu as any - }) - ] -}) diff --git a/src/components/EditorExample/prosemirror/extension/paste-markdown.ts b/src/components/EditorExample/prosemirror/extension/paste-markdown.ts deleted file mode 100644 index 64244071..00000000 --- a/src/components/EditorExample/prosemirror/extension/paste-markdown.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Plugin, Transaction } from 'prosemirror-state' -import { Fragment, Node, Schema, Slice } from 'prosemirror-model' -import type { ProseMirrorExtension } from '../helpers' -import { createMarkdownParser } from '../../markdown' -// import { openPrompt } from './prompt' - -const URL_REGEX = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:\d+)?(\/|\/([\w!#%&+./:=?@-]))?/g - -const transform = (schema: Schema, fragment: Fragment) => { - const nodes = [] - fragment.forEach((child: Node) => { - if (child.isText) { - let pos = 0 - let match: RegExpExecArray - - while ((match = URL_REGEX.exec(child.text)) !== null) { - const start = match.index - const end = start + match[0].length - const attrs = { href: match[0] } - - if (start > 0) { - nodes.push(child.cut(pos, start)) - } - - const node = child.cut(start, end).mark(schema.marks.link.create(attrs).addToSet(child.marks)) - nodes.push(node) - pos = end - } - - if (pos < child.text.length) { - nodes.push(child.cut(pos)) - } - } else { - nodes.push(child.copy(transform(schema, child.content))) - } - }) - - return Fragment.fromArray(nodes) -} - -let shiftKey = false - -const pasteMarkdown = (schema: Schema) => { - const parser = createMarkdownParser(schema) - return new Plugin({ - props: { - handleDOMEvents: { - keydown: (_, event) => { - shiftKey = event.shiftKey - return false - }, - keyup: () => { - shiftKey = false - return false - } - }, - handlePaste: (view, event) => { - if (!event.clipboardData) return false - const text = event.clipboardData.getData('text/plain') - const html = event.clipboardData.getData('text/html') - // otherwise, if we have html then fallback to the default HTML - // parser behavior that comes with Prosemirror. - if (text.length === 0 || html) return false - event.preventDefault() - const node: Node = parser.parse(text) - const fragment = shiftKey ? node.content : transform(schema, node.content) - const openStart = 0 // FIXME - const openEnd = text.length // FIXME: detect real start and end cursor position - const tr: Transaction = view.state.tr.replaceSelection(new Slice(fragment, openStart, openEnd)) - - view.dispatch(tr) - return true - } - } - }) -} - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [...prev, pasteMarkdown(schema)] -}) diff --git a/src/components/EditorExample/prosemirror/extension/placeholder.ts b/src/components/EditorExample/prosemirror/extension/placeholder.ts deleted file mode 100644 index f1b5d526..00000000 --- a/src/components/EditorExample/prosemirror/extension/placeholder.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Plugin } from 'prosemirror-state' -import { DecorationSet, Decoration } from 'prosemirror-view' -import { ProseMirrorExtension, isEmpty } from '../helpers' - -const placeholder = (text: string) => - new Plugin({ - props: { - decorations(state) { - if (isEmpty(state)) { - const div = document.createElement('div') - div.setAttribute('contenteditable', 'false') - div.classList.add('placeholder') - div.textContent = text - - return DecorationSet.create(state.doc, [Decoration.widget(1, div)]) - } - } - } - }) - -export default (text: string): ProseMirrorExtension => ({ - plugins: (prev) => [...prev, placeholder(text)] -}) diff --git a/src/components/EditorExample/prosemirror/extension/prompt.ts b/src/components/EditorExample/prosemirror/extension/prompt.ts deleted file mode 100644 index 43fa2e69..00000000 --- a/src/components/EditorExample/prosemirror/extension/prompt.ts +++ /dev/null @@ -1,155 +0,0 @@ -const prefix = 'ProseMirror-prompt' - -// eslint-disable-next-line sonarjs/cognitive-complexity -export function openPrompt(options) { - const wrapper = document.body.appendChild(document.createElement('div')) - wrapper.className = prefix - - const mouseOutside = (ev: MouseEvent) => { - if (!wrapper.contains(ev.target as Node)) close() - } - setTimeout(() => window.addEventListener('mousedown', mouseOutside), 50) - const close = () => { - window.removeEventListener('mousedown', mouseOutside) - if (wrapper.parentNode) wrapper.remove() - } - - const domFields: HTMLElement[] = [] - options.fields.forEach((name) => { - domFields.push(options.fields[name].render()) - }) - - const submitButton = document.createElement('button') - submitButton.type = 'submit' - submitButton.className = prefix + '-submit' - submitButton.textContent = 'OK' - const cancelButton = document.createElement('button') - cancelButton.type = 'button' - cancelButton.className = prefix + '-cancel' - cancelButton.textContent = 'Cancel' - cancelButton.addEventListener('click', close) - - const form = wrapper.appendChild(document.createElement('form')) - if (options.title) { - form.appendChild(document.createElement('h5')).textContent = options.title - } - domFields.forEach((field: HTMLElement) => { - form.appendChild(document.createElement('div')).appendChild(field) - }) - const buttons = form.appendChild(document.createElement('div')) - buttons.className = prefix + '-buttons' - buttons.appendChild(submitButton) - buttons.appendChild(document.createTextNode(' ')) - buttons.appendChild(cancelButton) - - const box = wrapper.getBoundingClientRect() - wrapper.style.top = (window.innerHeight - box.height) / 2 + 'px' - wrapper.style.left = (window.innerWidth - box.width) / 2 + 'px' - - const submit = () => { - const params = getValues(options.fields, domFields) - if (params) { - close() - options.callback(params) - } - } - - form.addEventListener('submit', (e) => { - e.preventDefault() - submit() - }) - - form.addEventListener('keydown', (e) => { - if (e.key === 'Escape') { - e.preventDefault() - close() - } else if (e.key === 'Enter' && !(e.ctrlKey || e.metaKey || e.shiftKey)) { - e.preventDefault() - submit() - } else if (e.key === 'Tab') { - window.setTimeout(() => { - if (!wrapper.contains(document.activeElement)) close() - }, 500) - } - }) - - const input = form.elements[0] as HTMLInputElement - if (input) input.focus() -} - -function getValues(fields: any, domFields: HTMLElement[]) { - const result = Object.create(null) - let i = 0 - fields.forEarch((name) => { - const field = fields[name] - const dom = domFields[i++] - const value = field.read(dom) - const bad = field.validate(value) - if (bad) { - reportInvalid(dom, bad) - return null - } - result[name] = field.clean(value) - }) - return result -} - -function reportInvalid(dom: HTMLElement, message: string) { - const msg: HTMLElement = dom.parentNode.appendChild(document.createElement('div')) - msg.style.left = dom.offsetLeft + dom.offsetWidth + 2 + 'px' - msg.style.top = dom.offsetTop - 5 + 'px' - msg.className = 'ProseMirror-invalid' - msg.textContent = message - setTimeout(msg.remove, 1500) -} - -export class Field { - options: any - constructor(options: any) { - this.options = options - } - - read(dom: any) { - return dom.value - } - // :: (any) → ?string - // A field-type-specific validation function. - validateType(_value) { - return typeof _value === typeof '' - } - - validate(value: any) { - if (!value && this.options.required) return 'Required field' - - return this.validateType(value) || (this.options.validate && this.options.validate(value)) - } - - clean(value: any) { - return this.options.clean ? this.options.clean(value) : value - } -} - -export class TextField extends Field { - render() { - const input: HTMLInputElement = document.createElement('input') - - input.type = 'text' - input.placeholder = this.options.label - input.value = this.options.value || '' - input.autocomplete = 'off' - return input - } -} - -export class SelectField extends Field { - render() { - const select = document.createElement('select') - this.options.options.forEach((o: { value: string; label: string }) => { - const opt = select.appendChild(document.createElement('option')) - opt.value = o.value - opt.selected = o.value === this.options.value - opt.label = o.label - }) - return select - } -} diff --git a/src/components/EditorExample/prosemirror/extension/scroll.ts b/src/components/EditorExample/prosemirror/extension/scroll.ts deleted file mode 100644 index 6346e7e4..00000000 --- a/src/components/EditorExample/prosemirror/extension/scroll.ts +++ /dev/null @@ -1,39 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import { Plugin } from 'prosemirror-state' -import type { EditorView } from 'prosemirror-view' -import type { ProseMirrorExtension } from '../helpers' - -const scroll = (view: EditorView) => { - if (!view.state.selection.empty) return false - const pos = view.state.selection.$head.start() - const resolved = view.state.doc.resolve(pos) - if (resolved.parent.type.spec.code) return false - - const dom = view.domAtPos(pos) - if (dom.node !== view.dom) { - scrollToElem(dom.node as Element) - } -} - -const scrollToElem = (node: Element) => { - node.scrollIntoView({ - block: 'center', - behavior: 'smooth' - }) -} - -const scrollIntoView = new Plugin({ - props: { - handleDOMEvents: { - keyup: (view: EditorView) => { - scroll(view) - return false - } - } - } -}) - -export default (enabled: boolean): ProseMirrorExtension => ({ - plugins: (prev) => (enabled ? [...prev, scrollIntoView] : prev) -}) diff --git a/src/components/EditorExample/prosemirror/extension/selection.ts b/src/components/EditorExample/prosemirror/extension/selection.ts deleted file mode 100644 index 54117496..00000000 --- a/src/components/EditorExample/prosemirror/extension/selection.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { renderGrouped } from 'prosemirror-menu' -import { Plugin } from 'prosemirror-state' -import type { ProseMirrorExtension } from '../helpers' -import { buildMenuItems } from './menu' -import editorStyles from '../../components/Editor.module.scss' - -export class SelectionTooltip { - tooltip: any - - constructor(view: any, schema: any) { - this.tooltip = document.createElement('div') - this.tooltip.className = editorStyles.tooltip - view.dom.parentNode.appendChild(this.tooltip) - const { dom } = renderGrouped(view, buildMenuItems(schema).fullMenu as any) - this.tooltip.appendChild(dom) - this.update(view, null) - } - - update(view: any, lastState: any) { - const state = view.state - if (lastState && lastState.doc.eq(state.doc) && lastState.selection.eq(state.selection)) { - return - } - - if (state.selection.empty) { - this.tooltip.style.display = 'none' - return - } - - this.tooltip.style.display = '' - const { from, to } = state.selection - const start = view.coordsAtPos(from), - end = view.coordsAtPos(to) - const box = this.tooltip.offsetParent.getBoundingClientRect() - const left = Math.max((start.left + end.left) / 2, start.left + 3) - this.tooltip.style.left = left - box.left + 'px' - this.tooltip.style.bottom = box.bottom - (start.top + 15) + 'px' - } - - destroy() { - this.tooltip.remove() - } -} - -export function toolTip(schema: any) { - return new Plugin({ - view(editorView: any) { - return new SelectionTooltip(editorView, schema) - } - }) -} - -export default (): ProseMirrorExtension => ({ - plugins: (prev, schema) => [...prev, toolTip(schema)] -}) diff --git a/src/components/EditorExample/prosemirror/extension/strikethrough.ts b/src/components/EditorExample/prosemirror/extension/strikethrough.ts deleted file mode 100644 index 4c95aa76..00000000 --- a/src/components/EditorExample/prosemirror/extension/strikethrough.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { inputRules } from 'prosemirror-inputrules' -import type { MarkSpec, MarkType } from 'prosemirror-model' -import { markInputRule } from './mark-input-rule' -import type { ProseMirrorExtension } from '../helpers' -import type OrderedMap from 'orderedmap' - -const strikethroughRule = (nodeType: MarkType) => markInputRule(/~{2}(.+)~{2}$/, nodeType) - -const strikethroughSchema = { - strikethrough: { - parseDOM: [{ tag: 'del' }], - toDOM: () => ['del'] - } -} as MarkSpec - -export default (): ProseMirrorExtension => ({ - schema: (prev) => ({ - ...prev, - marks: (prev.marks as OrderedMap<MarkSpec>).append(strikethroughSchema) - }), - plugins: (prev, schema) => [ - ...prev, - inputRules({ rules: [strikethroughRule(schema.marks.strikethrough)] }) - ] -}) diff --git a/src/components/EditorExample/prosemirror/extension/table.ts b/src/components/EditorExample/prosemirror/extension/table.ts deleted file mode 100644 index 54601917..00000000 --- a/src/components/EditorExample/prosemirror/extension/table.ts +++ /dev/null @@ -1,313 +0,0 @@ -import { EditorState, Selection } from 'prosemirror-state' -import type { Node, Schema, ResolvedPos, NodeSpec } from 'prosemirror-model' -import { InputRule, inputRules } from 'prosemirror-inputrules' -import { keymap } from 'prosemirror-keymap' -import type { ProseMirrorExtension } from '../helpers' -import type OrderedMap from 'orderedmap' - -export const tableInputRule = (schema: Schema) => - new InputRule( - new RegExp('^\\|{2,}\\s$'), - (state: EditorState, match: string[], start: number, end: number) => { - const tr = state.tr - const columns = Array.from({ length: match[0].trim().length - 1 }) - const headers = columns.map(() => schema.node(schema.nodes.table_header, {})) - const cells = columns.map(() => schema.node(schema.nodes.table_cell, {})) - const table = schema.node(schema.nodes.table, {}, [ - schema.node(schema.nodes.table_head, {}, schema.node(schema.nodes.table_row, {}, headers)), - schema.node(schema.nodes.table_body, {}, schema.node(schema.nodes.table_row, {}, cells)) - ]) - - tr.delete(start - 1, end) - tr.insert(start - 1, table) - tr.setSelection(Selection.near(tr.doc.resolve(start + 3))) - return tr - } - ) - -const tableSchema = { - table: { - content: '(table_head | table_body)*', - isolating: true, - selectable: false, - group: 'block', - parseDOM: [{ tag: 'div[data-type="table"]' }], - toDOM: () => [ - 'div', - { - class: 'table-container', - 'data-type': 'table' - }, - ['table', 0] - ] - }, - table_head: { - content: 'table_row', - isolating: true, - group: 'table_block', - selectable: false, - parseDOM: [{ tag: 'thead' }], - toDOM: () => ['thead', 0] - }, - table_body: { - content: 'table_row+', - isolating: true, - group: 'table_block', - selectable: false, - parseDOM: [{ tag: 'tbody' }], - toDOM: () => ['tbody', 0] - }, - table_row: { - content: '(table_cell | table_header)*', - parseDOM: [{ tag: 'tr' }], - toDOM: () => ['tr', 0] - }, - table_cell: { - content: 'inline*', - isolating: true, - group: 'table_block', - selectable: false, - attrs: { style: { default: null } }, - parseDOM: [ - { - tag: 'td', - getAttrs: (dom: HTMLElement) => { - const textAlign = dom.style.textAlign - return textAlign ? { style: `text-align: ${textAlign}` } : null - } - } - ], - toDOM: (node: Node) => ['td', node.attrs, 0] - }, - table_header: { - content: 'inline*', - isolating: true, - group: 'table_block', - selectable: false, - attrs: { style: { default: null } }, - parseDOM: [ - { - tag: 'th', - getAttrs: (dom: HTMLElement) => { - const textAlign = dom.style.textAlign - return textAlign ? { style: `text-align: ${textAlign}` } : null - } - } - ], - toDOM: (node: Node) => ['th', node.attrs, 0] - } -} as NodeSpec - -const findParentPos = ($pos: ResolvedPos, fn: (n: Node) => boolean) => { - for (let d = $pos.depth; d > 0; d--) { - if (fn($pos.node(d))) return $pos.doc.resolve($pos.before(d + 1)) - } - return null -} - -const findTableCellPos = ($pos: ResolvedPos, header = true) => - findParentPos($pos, (n) => n.type.name === 'table_cell' || (header && n.type.name === 'table_header')) - -const findTableRowPos = ($pos: ResolvedPos) => findParentPos($pos, (n) => n.type.name === 'table_row') - -const findTableHeadPos = ($pos: ResolvedPos) => findParentPos($pos, (n) => n.type.name === 'table_head') - -const findTablePos = ($pos: ResolvedPos) => findParentPos($pos, (n) => n.type.name === 'table') - -const findNodePosition = (node: Node, fn: (n: Node, p: Node) => boolean) => { - let result = -1 - node.descendants((n, pos, p) => { - if (result !== -1) { - return false - } else if (fn(n, p)) { - result = pos - return false - } - }) - - return result -} - -const findVertTableCellPos = ($pos: ResolvedPos, dir = 'up') => { - const cellPos = findTableCellPos($pos) - const rowPos = findTableRowPos($pos) - const offset = cellPos.pos - ($pos.before() + 1) - - const add = dir === 'up' ? -1 : rowPos.node().nodeSize + 1 - const nodeBeforePos = $pos.doc.resolve(rowPos.before() + add) - let rowBeforePos = findTableRowPos(nodeBeforePos) - - if (!rowBeforePos) { - const table = $pos.node(0) - const tablePos = findTablePos($pos) - const inTableHead = !!findTableHeadPos($pos) - - if (dir === 'up' && inTableHead) { - return $pos.doc.resolve(Math.max(0, tablePos.before() - 1)) - } else if (dir === 'down' && !inTableHead) { - return $pos.doc.resolve(tablePos.after()) - } - - const pos = findNodePosition(table, (n, p) => { - return inTableHead - ? p.type.name === 'table_body' && n.type.name === 'table_row' - : p.type.name === 'table_head' && n.type.name === 'table_row' - }) - - rowBeforePos = $pos.doc.resolve(pos + 1) - } - - const targetCell = $pos.doc.resolve(rowBeforePos.posAtIndex(rowPos.index()) + 1) - const targetCellTextSize = getTextSize(targetCell.node()) - const cellOffset = offset > targetCellTextSize ? targetCellTextSize : offset - return $pos.doc.resolve(targetCell.pos + cellOffset) -} - -const getTextSize = (n: Node) => { - let size = 0 - n.descendants((d: Node) => { - size += d.text?.length ?? 0 - }) - - return size -} - -export default (): ProseMirrorExtension => ({ - schema: (prev) => ({ - ...prev, - nodes: (prev.nodes as OrderedMap<NodeSpec>).append(tableSchema) - }), - // eslint-disable-next-line sonarjs/cognitive-complexity - plugins: (prev, schema) => [ - keymap({ - 'Ctrl-Enter': (state, dispatch) => { - const tablePos = findTablePos(state.selection.$head) - if (!tablePos) return false - const targetPos = tablePos.after() - const tr = state.tr - tr.insert(targetPos, state.schema.node('paragraph')) - tr.setSelection(Selection.near(tr.doc.resolve(targetPos))) - dispatch(tr) - return true - }, - Backspace: (state, dispatch) => { - const sel = state.selection - if (!sel.empty) return false - const cellPos = findTableCellPos(sel.$head) - if (!cellPos) return false - - if (getTextSize(cellPos.node()) === 0) { - const rowPos = findTableRowPos(sel.$head) - const tablePos = findTablePos(sel.$head) - const before = state.doc.resolve(cellPos.before() - 1) - - const cellBeforePos = findTableCellPos(before) - const inTableHead = !!findTableHeadPos(sel.$head) - - if (cellBeforePos) { - const tr = state.tr - tr.setSelection(Selection.near(before)) - dispatch(tr) - return true - } else if (!inTableHead && getTextSize(rowPos.node()) === 0) { - const tr = state.tr - tr.delete(before.pos - 1, before.pos + rowPos.node().nodeSize) - tr.setSelection(Selection.near(tr.doc.resolve(before.pos - 4))) - dispatch(tr) - return true - } else if (getTextSize(tablePos.node()) === 0) { - const tr = state.tr - tr.delete(tablePos.before(), tablePos.before() + tablePos.node().nodeSize) - dispatch(tr) - return true - } - } - - return false - }, - Enter: (state, dispatch) => { - const sel = state.selection - if (!sel.empty) return false - const cellPos = findTableCellPos(sel.$head) - if (!cellPos) return false - - const rowPos = findTableRowPos(sel.$head) - const cells = [] - rowPos.node().forEach((cell) => { - cells.push(schema.nodes.table_cell.create(cell.attrs)) - }) - const newRow = schema.nodes.table_row.create(null, cells) - - const theadPos = findTableHeadPos(sel.$head) - if (theadPos) { - const tablePos = findTablePos(sel.$head) - let tbodyPos: number - tablePos.node().descendants((node, pos) => { - if (node.type.name === 'table_body') { - tbodyPos = tablePos.pos + pos - } - }) - - if (tbodyPos) { - const tbody = state.doc.resolve(tbodyPos + 1) - const tr = state.tr.insert(tbody.pos, newRow) - tr.setSelection(Selection.near(tr.doc.resolve(tbody.pos))) - dispatch(tr) - } else { - const tbody = schema.nodes.table_body.create(null, [newRow]) - const targetPos = theadPos.after() - const tr = state.tr.insert(targetPos, tbody) - tr.setSelection(Selection.near(tr.doc.resolve(targetPos))) - dispatch(tr) - } - - return true - } - - const targetPos = sel.$head.after(-1) - const tr = state.tr.insert(targetPos, newRow) - tr.setSelection(Selection.near(tr.doc.resolve(targetPos))) - - dispatch(tr) - return true - }, - ArrowUp: (state, dispatch) => { - const sel = state.selection - if (!sel.empty) return false - const cellPos = findTableCellPos(sel.$head) - if (!cellPos) return false - const abovePos = findVertTableCellPos(sel.$head) - if (abovePos) { - const tr = state.tr - let selection = Selection.near(abovePos) - if (abovePos.pos === 0 && cellPos.parentOffset === 0) { - tr.insert(0, state.schema.node('paragraph')) - selection = Selection.near(tr.doc.resolve(0)) - } - tr.setSelection(selection) - dispatch(tr) - return true - } - - return false - }, - ArrowDown: (state, dispatch) => { - const sel = state.selection - if (!sel.empty) return false - const cellPos = findTableCellPos(sel.$head) - if (!cellPos) return false - const belowPos = findVertTableCellPos(sel.$head, 'down') - if (belowPos) { - const tr = state.tr - tr.setSelection(Selection.near(belowPos)) - dispatch(tr) - return true - } - - return false - } - }), - ...prev, - inputRules({ rules: [tableInputRule(schema)] }) - ] -}) diff --git a/src/components/EditorExample/prosemirror/extension/todo-list.ts b/src/components/EditorExample/prosemirror/extension/todo-list.ts deleted file mode 100644 index 72d7f14c..00000000 --- a/src/components/EditorExample/prosemirror/extension/todo-list.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - DOMOutputSpec, - DOMSerializer, - Node as ProsemirrorNode, - NodeSpec, - NodeType, - Schema -} from 'prosemirror-model' -import type { EditorView } from 'prosemirror-view' -import { wrappingInputRule, inputRules } from 'prosemirror-inputrules' -import { splitListItem } from 'prosemirror-schema-list' -import { keymap } from 'prosemirror-keymap' -import type { NodeViewFn, ProseMirrorExtension } from '../helpers' -import type OrderedMap from 'orderedmap' - -const todoListRule = (nodeType: NodeType) => - wrappingInputRule(new RegExp('^\\[( |x)]\\s$'), nodeType, (match) => ({ - done: match[1] === 'x' - })) - -const todoListSchema = { - todo_item: { - content: 'paragraph+', - defining: true, - group: 'block', - attrs: { done: { default: false } }, - parseDOM: [ - { - tag: 'div[data-type="todo-item"]', - getAttrs: (dom: Element) => ({ - done: dom.querySelector('input')?.checked - }) - } - ], - toDOM: (node: ProsemirrorNode) => [ - 'div', - { - class: `todo-item ${node.attrs.done ? 'done' : ''}`, - 'data-type': 'todo-item' - }, - [ - 'label', - { contenteditable: false }, - [ - 'input', - { - type: 'checkbox', - ...(node.attrs.done ? { checked: 'checked' } : {}) - } - ] - ], - ['div', 0] - ] - } -} as NodeSpec - -class TodoItemView { - contentDOM: Node - dom: Node - view: EditorView - getPos: () => number - - constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) { - const dom: DOMOutputSpec = node.type.spec.toDOM(node) - const res = DOMSerializer.renderSpec(document, dom) - this.dom = res.dom - this.contentDOM = res.contentDOM - this.view = view - this.getPos = getPos - ;(this.dom as HTMLElement).querySelector('input').addEventListener('click', this.handleClick.bind(this)) - } - - handleClick(e: MouseEvent) { - const tr = this.view.state.tr - const elem = e.target as HTMLInputElement - tr.setNodeMarkup(this.getPos(), null, { done: elem.checked }) - this.view.dispatch(tr) - this.view.focus() - } -} - -const todoListKeymap = (schema: Schema) => ({ - Enter: splitListItem(schema.nodes.todo_item) -}) - -export default (): ProseMirrorExtension => ({ - schema: (prev) => ({ - ...prev, - nodes: (prev.nodes as OrderedMap<NodeSpec>).append(todoListSchema) - }), - plugins: (prev, schema) => [ - keymap(todoListKeymap(schema)), - ...prev, - inputRules({ rules: [todoListRule(schema.nodes.todo_item)] }) - ], - nodeViews: { - todo_item: (node: ProsemirrorNode, view: EditorView, getPos: () => number) => { - return new TodoItemView(node, view, getPos) - } - } as unknown as { [key: string]: NodeViewFn } -}) diff --git a/src/components/EditorExample/prosemirror/helpers.ts b/src/components/EditorExample/prosemirror/helpers.ts deleted file mode 100644 index 7a854b2b..00000000 --- a/src/components/EditorExample/prosemirror/helpers.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Plugin, EditorState } from 'prosemirror-state' -import type { Node, Schema, SchemaSpec } from 'prosemirror-model' -import type { Decoration, EditorView, NodeView } from 'prosemirror-view' - -export interface ProseMirrorExtension { - schema?: (prev: SchemaSpec) => SchemaSpec - plugins?: (prev: Plugin[], schema: Schema) => Plugin[] - nodeViews?: { [key: string]: NodeViewFn } -} - -export type ProseMirrorState = EditorState | unknown - -export type NodeViewFn = ( - node: Node, - view: EditorView, - getPos: () => number, - decorations: Decoration[] -) => NodeView - -export const isInitialized = (state) => state !== undefined && state instanceof EditorState - -export const isEmpty = (state) => - !isInitialized(state) || - (state.doc.childCount === 1 && - !state.doc.firstChild.type.spec.code && - state.doc.firstChild.isTextblock && - state.doc.firstChild.content.size === 0) diff --git a/src/components/EditorExample/prosemirror/p2p.ts b/src/components/EditorExample/prosemirror/p2p.ts deleted file mode 100644 index 01e0dc6c..00000000 --- a/src/components/EditorExample/prosemirror/p2p.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { uniqueNamesGenerator, adjectives, animals } from 'unique-names-generator' -import { Awareness } from 'y-protocols/awareness' -import { WebrtcProvider } from 'y-webrtc' -import { Doc, XmlFragment } from 'yjs' -// import type { Reaction } from '../../../graphql/types.gen' -// import { setReactions } from '../../../stores/editor' - -export const roomConnect = ( - room: string, - username = '', - keyname = 'collab' -): [XmlFragment, WebrtcProvider] => { - const ydoc = new Doc() - // const yarr = ydoc.getArray(keyname + '-reactions') - // TODO: use reactions - // yarr.observeDeep(() => { - // console.debug('[p2p] yarray updated', yarr.toArray()) - // setReactions(yarr.toArray() as Reaction[]) - // }) - const yXmlFragment = ydoc.getXmlFragment(keyname) - const webrtcOptions = { - awareness: new Awareness(ydoc), - filterBcConns: true, - maxConns: 33, - signaling: [ - // 'wss://signaling.discours.io', - // 'wss://stun.l.google.com:19302', - 'wss://y-webrtc-signaling-eu.herokuapp.com', - 'wss://signaling.yjs.dev' - ], - peerOpts: {}, - password: '' - } - // connect with provider - const provider = new WebrtcProvider(room, ydoc, webrtcOptions) - console.debug('[p2p] provider', provider) - // setting username - provider.awareness.setLocalStateField('user', { - name: - username ?? - uniqueNamesGenerator({ - dictionaries: [adjectives, animals], - style: 'capital', - separator: ' ', - length: 2 - }) - }) - - return [yXmlFragment, provider] -} diff --git a/src/components/EditorExample/prosemirror/setup.ts b/src/components/EditorExample/prosemirror/setup.ts deleted file mode 100644 index 9c5d6395..00000000 --- a/src/components/EditorExample/prosemirror/setup.ts +++ /dev/null @@ -1,95 +0,0 @@ -// import menu from './extension/menu' -// import scroll from './prosemirror/extension/scroll' -import { keymap } from 'prosemirror-keymap' -import type { ProseMirrorExtension } from './helpers' -import { Schema } from 'prosemirror-model' -import { t } from '../../../utils/intl' -import base from './extension/base' -import code from './extension/code' -import dragHandle from './extension/drag-handle' -import image from './extension/image' -import link from './extension/link' -import markdown from './extension/markdown' -import pasteMarkdown from './extension/paste-markdown' -import table from './extension/table' -import collab from './extension/collab' -import type { Collab, Config, ExtensionsProps, YOptions } from '../store/context' -import selectionMenu from './extension/selection' -import placeholder from './extension/placeholder' -import todoList from './extension/todo-list' -import strikethrough from './extension/strikethrough' -import scrollPlugin from './extension/scroll' - -const customKeymap = (props: ExtensionsProps): ProseMirrorExtension => ({ - plugins: (prev) => (props.keymap ? [...prev, keymap(props.keymap)] : prev) -}) - -export const createExtensions = (props: ExtensionsProps): ProseMirrorExtension[] => { - const extensions = [ - placeholder(t('Just start typing...')), - customKeymap(props), - base(props.markdown), - selectionMenu(), - scrollPlugin(props.config?.typewriterMode) - ] - - if (props.markdown) { - extensions.push( - markdown(), - todoList(), - dragHandle(), - code(), - strikethrough(), - link(), - table(), - image(props.path), - pasteMarkdown() - /* - codeBlock({ - theme: codeTheme(props.config), - typewriterMode: props.config.typewriterMode, - fontSize: props.config.fontSize, - prettier: props.config.prettier, - extensions: () => [codeMirrorKeymap(props)], - }), - */ - ) - } - - if (props.collab?.room) { - extensions.push(collab(props.y)) - } - - return extensions -} - -export const createEmptyText = () => ({ - doc: { - type: 'doc', - content: [{ type: 'paragraph' }] - }, - selection: { - type: 'text', - anchor: 1, - head: 1 - } -}) - -export const createSchema = (props: ExtensionsProps) => { - const extensions = createExtensions({ - config: props.config, - markdown: props.markdown, - path: props.path, - keymap: props.keymap, - y: props.y - }) - - let schemaSpec = { nodes: {} } - for (const extension of extensions) { - if (extension.schema) { - schemaSpec = extension.schema(schemaSpec) - } - } - - return new Schema(schemaSpec) -} diff --git a/src/components/EditorExample/remote.ts b/src/components/EditorExample/remote.ts deleted file mode 100644 index 491349ea..00000000 --- a/src/components/EditorExample/remote.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { EditorState } from 'prosemirror-state' -import { serialize } from './markdown' - -export const copy = async (text: string): Promise<void> => { - navigator.clipboard.writeText(text) -} - -export const copyAllAsMarkdown = async (state: EditorState): Promise<void> => { - const text = serialize(state) - navigator.clipboard.writeText(text) -} diff --git a/src/components/EditorExample/store/actions.ts b/src/components/EditorExample/store/actions.ts deleted file mode 100644 index cbcb1578..00000000 --- a/src/components/EditorExample/store/actions.ts +++ /dev/null @@ -1,406 +0,0 @@ -import { Store, createStore, unwrap } from 'solid-js/store' -import { v4 as uuidv4 } from 'uuid' -import type { EditorState } from 'prosemirror-state' -import { undo, redo } from 'prosemirror-history' -import { selectAll, deleteSelection } from 'prosemirror-commands' -import { undo as yUndo, redo as yRedo } from 'y-prosemirror' -import debounce from 'lodash/debounce' -import { createSchema, createExtensions, createEmptyText } from '../prosemirror/setup' -import { State, Draft, Config, ServiceError, newState, ExtensionsProps, EditorActions } from './context' -import { serialize, createMarkdownParser } from '../markdown' -import db from '../db' -import { isEmpty, isInitialized } from '../prosemirror/helpers' -import { useRouter } from '../../../stores/router' - -const isText = (x) => x && x.doc && x.selection -const isState = (x) => typeof x.lastModified !== 'string' && Array.isArray(x.drafts || []) -const isDraft = (x): boolean => x && (x.text || x.path) - -export const createCtrl = (initial: State): [Store<State>, EditorActions] => { - const [store, setState] = createStore(initial) - - const onUndo = () => { - if (!isInitialized(store.text)) return false - const text = store.text as EditorState - if (store.collab?.started) { - yUndo(text) - } else { - undo(text, store.editorView.dispatch) - } - return true - } - - const onRedo = () => { - if (!isInitialized(store.text)) return false - const text = store.text as EditorState - if (store.collab?.started) { - yRedo(text) - } else { - redo(text, store.editorView.dispatch) - } - return true - } - - const discard = () => { - if (store.path) { - discardText() - } else if (store.drafts.length > 0 && isEmpty(store.text)) { - discardText() - } else { - selectAll(store.editorView.state, store.editorView.dispatch) - deleteSelection(store.editorView.state, store.editorView.dispatch) - } - return true - } - - const toggleMarkdown = () => { - const state = unwrap(store) - const editorState = store.text as EditorState - const markdown = !state.markdown - const selection = { type: 'text', anchor: 1, head: 1 } - let doc - - if (markdown) { - const lines = serialize(editorState).split('\n') - const nodes = lines.map((text) => - text ? { type: 'paragraph', content: [{ type: 'text', text }] } : { type: 'paragraph' } - ) - - doc = { type: 'doc', content: nodes } - } else { - const schema = createSchema({ - config: state.config, - path: state.path, - y: state.collab?.y, - markdown, - keymap - }) - - const parser = createMarkdownParser(schema) - let textContent = '' - editorState.doc.forEach((node) => { - textContent += `${node.textContent}\n` - }) - const text = parser.parse(textContent) - doc = text.toJSON() - } - - const extensions = createExtensions({ - config: state.config, - markdown, - path: state.path, - keymap, - y: state.collab?.y - }) - - setState({ - text: { selection, doc }, - extensions, - markdown - }) - return true - } - - const keymap: ExtensionsProps['keymap'] = { - [`Mod-w`]: discard, - [`Mod-z`]: onUndo, - [`Shift-Mod-z`]: onRedo, - [`Mod-y`]: onRedo, - [`Mod-m`]: toggleMarkdown - } - - const createTextFromDraft = async (draft: Draft) => { - const state = unwrap(store) - - const extensions = createExtensions({ - config: state.config, - markdown: draft.markdown, - path: draft.path, - keymap - }) - - return { - text: draft.text, - extensions, - lastModified: draft.lastModified ? new Date(draft.lastModified) : undefined, - path: draft.path, - markdown: draft.markdown - } - } - - const addToDrafts = (drafts: Draft[], prev: State) => { - const text = prev.path ? undefined : (prev.text as EditorState).toJSON() - return [ - ...drafts, - { - text, - lastModified: prev.lastModified, - path: prev.path, - markdown: prev.markdown - } - ] - } - - const discardText = async () => { - const state = unwrap(store) - const index = state.drafts.length - 1 - const draft = index !== -1 ? state.drafts[index] : undefined - - let next: Partial<State> - if (draft) { - next = await createTextFromDraft(draft) - } else { - const extensions = createExtensions({ - config: state.config ?? store.config, - markdown: state.markdown ?? store.markdown, - keymap - }) - - next = { - text: createEmptyText(), - extensions, - lastModified: undefined, - path: undefined, - markdown: state.markdown - } - } - - const drafts = state.drafts.filter((f: Draft) => f !== draft) - - setState({ - drafts, - ...next, - collab: draft ? undefined : state.collab, - error: undefined - }) - } - - const fetchData = async (): Promise<State> => { - const state: State = unwrap(store) - const { searchParams } = useRouter<{ room: string }>() - const room = searchParams().room - const args = { room: room ?? undefined } - const data = await db.get('state') - let parsed: State - if (data !== undefined) { - try { - parsed = JSON.parse(data) - } catch (error) { - console.error(error) - throw new ServiceError('invalid_state', data) - } - } - - if (!parsed) { - return { ...state, args } - } - - let text = state.text - if (parsed.text) { - if (!isText(parsed.text)) { - throw new ServiceError('invalid_state', parsed.text) - } - - text = parsed.text - } - - const extensions = createExtensions({ - path: parsed.path, - markdown: parsed.markdown, - keymap, - config: undefined - }) - - const newst = { - ...parsed, - text, - extensions, - // config, - args - } - - if (newst.lastModified) { - newst.lastModified = new Date(newst.lastModified) - } - - for (const draft of parsed.drafts || []) { - if (!isDraft(draft)) { - throw new ServiceError('invalid_draft', draft) - } - } - - if (!isState(newst)) { - throw new ServiceError('invalid_state', newst) - } - - return newst - } - - const getTheme = (state: State) => ({ theme: state.config.theme }) - - const clean = () => { - setState({ - ...newState(), - loading: 'initialized', - drafts: [], - fullscreen: store.fullscreen, - lastModified: new Date(), - error: undefined, - text: undefined - }) - } - - const init = async () => { - let data = await fetchData() - try { - if (data.args.room) { - data = await doStartCollab(data) - } else if (!data.text) { - const text = createEmptyText() - const extensions = createExtensions({ - config: data.config ?? store.config, - markdown: data.markdown ?? store.markdown, - keymap - }) - data = { ...data, text, extensions } - } - } catch (error) { - data = { ...data, error: error.errorObject } - } - - setState({ - ...data, - config: { ...data.config, ...getTheme(data) }, - loading: 'initialized' - }) - } - - const saveState = () => - debounce(async (state: State) => { - const data: State = { - lastModified: state.lastModified, - drafts: state.drafts, - config: state.config, - path: state.path, - markdown: state.markdown, - collab: { - room: state.collab?.room - } - } - - if (isInitialized(state.text)) { - data.text = store.editorView.state.toJSON() - } else if (state.text) { - data.text = state.text - } - - db.set('state', JSON.stringify(data)) - }, 200) - - const setFullscreen = (fullscreen: boolean) => { - setState({ fullscreen }) - } - - const startCollab = async () => { - const state: State = unwrap(store) - const update = await doStartCollab(state) - setState(update) - } - - const doStartCollab = async (state: State): Promise<State> => { - const backup = state.args?.room && state.collab?.room !== state.args.room - const room = state.args?.room ?? uuidv4() - const { changeSearchParam } = useRouter<{ room: string }>() - changeSearchParam('room', room, true) - - const { roomConnect } = await import('../prosemirror/p2p') - const [type, provider] = roomConnect(room) - - const extensions = createExtensions({ - config: state.config, - markdown: state.markdown, - path: state.path, - keymap, - y: { type, provider } - }) - - let newst = state - if ((backup && !isEmpty(state.text)) || state.path) { - let drafts = state.drafts - if (!state.error) { - drafts = addToDrafts(drafts, state) - } - - newst = { - ...state, - drafts, - lastModified: undefined, - path: undefined, - error: undefined - } - } - - return { - ...newst, - extensions, - collab: { started: true, room, y: { type, provider } } - } - } - - const stopCollab = (state: State) => { - state.collab.y?.provider.destroy() - const extensions = createExtensions({ - config: state.config, - markdown: state.markdown, - path: state.path, - keymap - }) - - setState({ collab: undefined, extensions }) - window.history.replaceState(null, '', '/') - } - - const updateConfig = (config: Partial<Config>) => { - const state = unwrap(store) - const extensions = createExtensions({ - config: { ...state.config, ...config }, - markdown: state.markdown, - path: state.path, - keymap, - y: state.collab?.y - }) - - setState({ - config: { ...state.config, ...config }, - extensions, - lastModified: new Date() - }) - } - - const updatePath = (path: string) => { - setState({ path, lastModified: new Date() }) - } - - const updateTheme = () => { - const { theme } = getTheme(unwrap(store)) - setState('config', { theme }) - } - - const ctrl = { - clean, - discard, - getTheme, - init, - saveState, - setFullscreen, - setState, - startCollab, - stopCollab, - toggleMarkdown, - updateConfig, - updatePath, - updateTheme - } - - return [store, ctrl] -} diff --git a/src/components/EditorExample/store/context.ts b/src/components/EditorExample/store/context.ts deleted file mode 100644 index 5b55b1d4..00000000 --- a/src/components/EditorExample/store/context.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { createContext, useContext } from 'solid-js' -import type { Store } from 'solid-js/store' -import type { XmlFragment } from 'yjs' -import type { WebrtcProvider } from 'y-webrtc' -import type { ProseMirrorExtension, ProseMirrorState } from '../prosemirror/helpers' -import type { Command, EditorState } from 'prosemirror-state' -import type { EditorView } from 'prosemirror-view' -import type { Schema } from 'prosemirror-model' - -export interface ExtensionsProps { - data?: unknown - keymap?: { [key: string]: Command } - config: Config - markdown: boolean - path?: string - y?: YOptions - schema?: Schema - collab?: Collab - typewriterMode?: boolean -} -export interface Args { - cwd?: string - draft?: string - room?: string - text?: any -} - -export interface PrettierConfig { - printWidth: number - tabWidth: number - useTabs: boolean - semi: boolean - singleQuote: boolean -} - -export interface Config { - theme: string - // codeTheme: string; - font: string - fontSize: number - contentWidth: number - typewriterMode: boolean - prettier: PrettierConfig -} - -export interface ErrorObject { - id: string - props?: unknown -} - -export interface YOptions { - type: XmlFragment - provider: WebrtcProvider -} - -export interface Collab { - started?: boolean - error?: boolean - room?: string - y?: YOptions -} - -export type LoadingType = 'loading' | 'initialized' - -export interface State { - text?: ProseMirrorState - editorView?: EditorView - extensions?: ProseMirrorExtension[] - markdown?: boolean - lastModified?: Date - drafts: Draft[] - config: Config - error?: ErrorObject - loading?: LoadingType - fullscreen?: boolean - collab?: Collab - path?: string - args?: Args - keymap?: { [key: string]: Command } -} - -export interface Draft { - body?: string - lastModified?: Date - text?: { doc: EditorState['doc']; selection: { type: string; anchor: number; head: number } } - path?: string - markdown?: boolean - extensions?: ProseMirrorExtension[] -} - -export interface EditorActions { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any -} - -export class ServiceError extends Error { - public errorObject: ErrorObject - constructor(id: string, props: unknown) { - super(id) - this.errorObject = { id, props } - } -} - -export const StateContext = createContext<[Store<State>, EditorActions]>([undefined, undefined]) - -export const useState = () => useContext(StateContext) - -export const newState = (props: Partial<State> = {}): State => ({ - extensions: [], - drafts: [], - loading: 'loading', - fullscreen: false, - markdown: false, - config: { - theme: undefined, - // codeTheme: 'material-light', - font: 'muller', - fontSize: 24, - contentWidth: 800, - typewriterMode: true, - prettier: { - printWidth: 80, - tabWidth: 2, - useTabs: false, - semi: false, - singleQuote: true - } - }, - ...props -}) diff --git a/src/components/EditorExample/styles/ArticlesList.scss.bak b/src/components/EditorExample/styles/ArticlesList.scss.bak deleted file mode 100644 index 1060015f..00000000 --- a/src/components/EditorExample/styles/ArticlesList.scss.bak +++ /dev/null @@ -1,49 +0,0 @@ -.articles-list { - padding-right: 2em; -} - -.articles-list__item { - border-bottom: 1px solid #e8e8e8; - margin-bottom: 1.5em; - padding-bottom: 1.5em; -} - -.article__title { - @include font-size(2.4rem); - - line-height: 1.25; -} - -.article__status { - @include font-size(1.4rem); -} - -.article__status--draft { - color: #2638d9; -} - -.article__status--published { - color: #2bb452; -} - -.article__date { - color: #696969; - @include font-size(1.2rem); -} - -.article__controls { - @include font-size(1.4rem); - - align-content: baseline; - display: flex; - flex-wrap: wrap; - padding-top: 2em; -} - -.article-control { - margin-right: 2em; -} - -.article-control--remove { - color: #d00820; -} diff --git a/src/components/EditorExample/styles/ProseMirror.scss b/src/components/EditorExample/styles/ProseMirror.scss deleted file mode 100644 index 07f1982e..00000000 --- a/src/components/EditorExample/styles/ProseMirror.scss +++ /dev/null @@ -1,329 +0,0 @@ -.ProseMirror { - color: var(--foreground); - background-color: var(--background); - position: relative; - word-wrap: break-word; - white-space: pre-wrap; - font-variant-ligatures: none; - outline: none; - margin: 1em 1em 1em 0; - - .dark & { - color: var(--background); - background-color: var(--foreground); - } - - .draggable { - position: relative; - margin-left: -30px; - padding-left: 30px; - } - - .handle { - position: absolute; - left: 0; - top: 0; - height: calc(var(--font-fize) * 1.6px); - opacity: 0; - cursor: move; - transition: opacity 0.3s; - display: inline-flex; - align-items: center; - justify-content: center; - - > span { - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 3px; - padding: 6px; - fill: var(--foreground); - pointer-events: none; - user-select: none; - } - - &:hover > span { - background: var(--foreground); - } - } - - h1 .handle { - height: calc(var(--font-size) * 2.3px); - } - - .draggable:hover .handle { - opacity: 1; - } - - blockquote { - border-left: 2px solid; - @include font-size(1.6rem); - - margin: 1.5em 0; - padding-left: 1.6em; - } -} - -.ProseMirror-menuitem { - display: flex; - font-size: small; - - &:hover { - > * { - background: #eee; - } - - .ProseMirror-menu-disabled { - background: inherit; - } - } - - > * { - cursor: pointer; - align-items: center; - display: flex; - padding: 0.8rem 1em; - } -} - -.ProseMirror-textblock-dropdown { - min-width: 3em; -} - -.ProseMirror-menu { - margin: 0 -4px; - line-height: 1; -} - -.ProseMirror-tooltip .ProseMirror-menu { - width: fit-content; - white-space: pre; -} - -.ProseMirror-menuseparator { - border-right: 1px solid #ddd; -} - -.ProseMirror-menu-dropdown, -.ProseMirror-menu-dropdown-menu { - padding: 4px; - white-space: nowrap; -} - -.ProseMirror-menu-dropdown { - vertical-align: 1px; - cursor: pointer; - position: relative; - padding-right: 15px; -} - -.ProseMirror-menu-dropdown-wrap { - padding: 1px 0 1px 4px; - display: inline-block; - position: relative; -} - -.ProseMirror-menu-dropdown::after { - content: ''; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid currentcolor; - opacity: 0.6; - position: absolute; - right: 4px; - top: calc(50% - 2px); -} - -.ProseMirror-menu-dropdown-menu, -.ProseMirror-menu-submenu { - position: absolute; - background: white; - color: #666; - border: 1px solid #aaa; - padding: 2px; -} - -.ProseMirror-menu-dropdown-menu { - z-index: 15; - - /* min-width: 6em; */ -} - -.ProseMirror-menu-dropdown-item { - cursor: pointer; - padding: 2px 8px 2px 4px; -} - -.ProseMirror-menu-dropdown-item:hover { - background: #f2f2f2; -} - -.ProseMirror-menu-submenu-wrap { - position: relative; - margin-right: -4px; -} - -.ProseMirror-menu-submenu-label::after { - content: ''; - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; - border-left: 4px solid currentcolor; - opacity: 0.6; - position: absolute; - right: 4px; - top: calc(50% - 4px); -} - -.ProseMirror-menu-submenu { - display: none; - left: 100%; - top: -3px; -} - -.ProseMirror-menu-active { - background: #eee; -} - -.ProseMirror-menu-disabled { - cursor: default; - opacity: 0.3; -} - -.ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu, -.ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu { - display: block; -} - -.ProseMirror-menubar { - border-top-left-radius: inherit; - border-top-right-radius: inherit; - display: flex; - position: relative; - min-height: 1em; - color: #666; - padding: 0 1.5em; - top: 0; - left: 0; - right: 0; - border-bottom: 1px solid silver; - background: white; - z-index: 10; - box-sizing: border-box; - overflow: visible; -} - -.ProseMirror-icon { - cursor: pointer; - line-height: 0.8; -} - -.ProseMirror-menu-disabled.ProseMirror-icon { - cursor: default; -} - -.ProseMirror-icon svg { - fill: currentcolor; - height: 1em; -} - -.ProseMirror-icon span { - vertical-align: text-top; -} - -.ProseMirror pre { - white-space: pre-wrap; -} - -.ProseMirror li { - position: relative; -} - -.ProseMirror-hideselection *::selection { - background: transparent; -} - -.ProseMirror-hideselection { - caret-color: transparent; -} - -.ProseMirror-selectednode { - outline: 2px solid #8cf; -} - -/* Make sure li selections wrap around markers */ -li.ProseMirror-selectednode { - outline: none; -} - -li.ProseMirror-selectednode::after { - content: ''; - position: absolute; - left: -32px; - right: -2px; - top: -2px; - bottom: -2px; - border: 2px solid #8cf; - pointer-events: none; -} - -.ProseMirror .empty-node::before { - position: absolute; - color: #aaa; - cursor: text; -} - -.ProseMirror .empty-node:hover::before { - color: #777; -} - -.ProseMirror.editor_empty::before { - position: absolute; - content: attr(data-placeholder); - pointer-events: none; - color: var(--ui-color-placeholder); -} - -.ProseMirror-prompt { - background: #fff; - box-shadow: 0 4px 10px rgb(0 0 0 / 25%); - font-size: 0.7em; - position: absolute; -} - -.ProseMirror-prompt input[type='text'] { - border: none; - font-size: 100%; - margin-bottom: 0; - padding: 0.5em 7.5em 0.5em 0.5em; -} - -.ProseMirror-prompt-buttons { - position: absolute; - right: 0; - top: 50%; - transform: translateY(-50%); - height: 100%; -} - -.ProseMirror-prompt-buttons button { - border: none; - cursor: pointer; - display: inline-block; - font-size: 90%; - height: 100%; - line-height: 10em; - margin-bottom: 0; - overflow: hidden; - vertical-align: top; - width: 2.5em; -} - -.ProseMirror-prompt-submit { - background: url("data:image/svg+xml,%3Csvg width='19' height='15' viewBox='0 0 19 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19 2.73787L16.2621 0L6.78964 9.47248L2.73787 5.42071L0 8.15858L6.78964 14.9482L19 2.73787Z' fill='%23393840'/%3E%3C/svg%3E") - center no-repeat; -} - -.ProseMirror-prompt-cancel { - background: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.1512 0.423856L0.423263 13.1518L2.84763 15.5761L15.5756 2.84822L13.1512 0.423856Z M15.5755 13.1518L2.84763 0.423855L0.423263 2.84822L13.1512 15.5761L15.5755 13.1518Z' fill='%23393840'/%3E%3C/svg%3E%0A") - center no-repeat; -} diff --git a/src/components/EditorNew/Editor.tsx b/src/components/EditorNew/Editor.tsx index eb0bfcff..9e93f942 100644 --- a/src/components/EditorNew/Editor.tsx +++ b/src/components/EditorNew/Editor.tsx @@ -12,8 +12,8 @@ import { createArticle } from '../../stores/zine/articles' import type { ShoutInput } from '../../graphql/types.gen' import { Sidebar } from './Sidebar' import styles from './Sidebar.module.scss' -import Button from '../_shared/Button' -import { t } from '../../utils/intl' +import { Button } from '../_shared/Button' +import { useLocalize } from '../../context/localize' type Props = { initialContent?: string @@ -28,6 +28,7 @@ const getHtml = (state: EditorState) => { } export const Editor = (props: Props) => { + const { t } = useLocalize() const editorElRef: { current: HTMLDivElement } = { diff --git a/src/components/EditorNew/Sidebar.tsx b/src/components/EditorNew/Sidebar.tsx index a014b5d6..8ec62bc8 100644 --- a/src/components/EditorNew/Sidebar.tsx +++ b/src/components/EditorNew/Sidebar.tsx @@ -10,7 +10,6 @@ import type { EditorView } from 'prosemirror-view' const Off = (props) => <div class={styles.sidebarOff}>{props.children}</div> const Link = (props: { - withMargin?: boolean disabled?: boolean title?: string className?: string @@ -18,9 +17,7 @@ const Link = (props: { onClick?: () => void }) => ( <button - class={clsx(styles.sidebarLink, props.className, { - [styles.withMargin]: props.withMargin - })} + class={clsx(styles.sidebarLink, props.className)} onClick={props.onClick} disabled={props.disabled} title={props.title} diff --git a/src/components/EditorNew/prosemirror/plugins/index.ts b/src/components/EditorNew/prosemirror/plugins/index.ts index c9c412f9..a38045b1 100644 --- a/src/components/EditorNew/prosemirror/plugins/index.ts +++ b/src/components/EditorNew/prosemirror/plugins/index.ts @@ -1,15 +1,16 @@ import { history } from 'prosemirror-history' import { dropCursor } from 'prosemirror-dropcursor' import { placeholder } from './placeholder' -import { t } from '../../../../utils/intl' import styles from '../styles/ProseMirror.module.scss' import type { DiscoursSchema } from '../schema' import { dragHandle } from './dragHandle' import { selectionMenu } from './selectionMenu' import { imageInput } from './image' import { customKeymap } from './customKeymap' +import { useLocalize } from '../../../../context/localize' export const createPlugins = ({ schema }: { schema: DiscoursSchema }) => { + const { t } = useLocalize() return [ placeholder(t('Just start typing...')), customKeymap(), diff --git a/src/components/EditorNew/prosemirror/styles/ProseMirror.scss b/src/components/EditorNew/prosemirror/styles/ProseMirror.scss index 1212ebb3..4b97bb8e 100644 --- a/src/components/EditorNew/prosemirror/styles/ProseMirror.scss +++ b/src/components/EditorNew/prosemirror/styles/ProseMirror.scss @@ -7,35 +7,36 @@ font-variant-ligatures: none; outline: none; - //font styles + // font styles h1 { - margin: 0 0 16px 0; + margin: 0 0 16px; font-weight: 700; font-size: 44px; line-height: 50px; } h2 { - margin: 0 0 16px 0; + margin: 0 0 16px; font-weight: 400; font-size: 44px; line-height: 50px; } h3 { - margin: 0 0 16px 0; + margin: 0 0 16px; font-weight: 400; font-size: 34px; line-height: 40px; } p { - margin: 0 0 16px 0; + margin: 0 0 16px; font-weight: 400; font-size: 18px; line-height: 28px; } + .dark & { color: var(--background); background-color: var(--foreground); diff --git a/src/components/Feed/Beside.tsx b/src/components/Feed/Beside.tsx index a8514e25..d12a4f84 100644 --- a/src/components/Feed/Beside.tsx +++ b/src/components/Feed/Beside.tsx @@ -7,8 +7,9 @@ import { TopicCard } from '../Topic/Card' import styles from './Beside.module.scss' import type { Author, Shout, Topic, User } from '../../graphql/types.gen' import { Icon } from '../_shared/Icon' -import { t } from '../../utils/intl' + import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' interface BesideProps { title?: string @@ -24,6 +25,7 @@ interface BesideProps { } export const Beside = (props: BesideProps) => { + const { t } = useLocalize() return ( <Show when={!!props.beside?.slug && props.values?.length > 0}> <div class="floor floor--9"> diff --git a/src/components/Feed/Card.tsx b/src/components/Feed/Card.tsx index ccc8de07..a8096349 100644 --- a/src/components/Feed/Card.tsx +++ b/src/components/Feed/Card.tsx @@ -1,11 +1,9 @@ -import { t } from '../../utils/intl' import { createMemo, For, Show } from 'solid-js' import type { Shout } from '../../graphql/types.gen' import { capitalize } from '../../utils' import { translit } from '../../utils/ru2en' import { Icon } from '../_shared/Icon' import styles from './Card.module.scss' -import { locale } from '../../stores/ui' import { clsx } from 'clsx' import { CardTopic } from './CardTopic' import { RatingControl } from '../Article/RatingControl' @@ -13,6 +11,7 @@ import { getShareUrl, SharePopup } from '../Article/SharePopup' import stylesHeader from '../Nav/Header.module.scss' import { getDescription } from '../../utils/meta' import { FeedArticlePopup } from './FeedArticlePopup' +import { useLocalize } from '../../context/localize' interface ArticleCardProps { settings?: { @@ -60,13 +59,15 @@ const getTitleAndSubtitle = (article: Shout): { title: string; subtitle: string } export const ArticleCard = (props: ArticleCardProps) => { + const { t, lang } = useLocalize() + const mainTopic = props.article.topics.find((articleTopic) => articleTopic.slug === props.article.mainTopic) || props.article.topics[0] const formattedDate = createMemo<string>(() => { return new Date(props.article.createdAt) - .toLocaleDateString(locale(), { month: 'long', day: 'numeric', year: 'numeric' }) + .toLocaleDateString(lang(), { month: 'long', day: 'numeric', year: 'numeric' }) .replace(' г.', '') }) @@ -111,7 +112,7 @@ export const ArticleCard = (props: ArticleCardProps) => { <Show when={!props.settings?.isGroup}> <CardTopic title={ - locale() === 'ru' && mainTopic.title ? mainTopic.title : mainTopic?.slug?.replace('-', ' ') + lang() === 'ru' && mainTopic.title ? mainTopic.title : mainTopic?.slug?.replace('-', ' ') } slug={mainTopic.slug} isFloorImportant={props.settings?.isFloorImportant} @@ -140,7 +141,7 @@ export const ArticleCard = (props: ArticleCardProps) => { {(author, index) => { let name = author.name - if (locale() !== 'ru') { + if (lang() !== 'ru') { name = name === 'Дискурс' ? 'Discours' : translit(name) } diff --git a/src/components/Feed/FeedArticlePopup.tsx b/src/components/Feed/FeedArticlePopup.tsx index c3525a43..3d4872ed 100644 --- a/src/components/Feed/FeedArticlePopup.tsx +++ b/src/components/Feed/FeedArticlePopup.tsx @@ -1,7 +1,7 @@ import styles from './FeedArticlePopup.module.scss' import type { PopupProps } from '../_shared/Popup' import { Popup } from '../_shared/Popup' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' type FeedArticlePopupProps = { title: string @@ -17,6 +17,7 @@ export const getShareUrl = (params: { pathname?: string } = {}) => { } export const FeedArticlePopup = (props: FeedArticlePopupProps) => { + const { t } = useLocalize() return ( <Popup {...props} variant="tiny" popupCssClass={styles.feedArticlePopup}> <ul class="nodash"> diff --git a/src/components/Feed/List.tsx b/src/components/Feed/List.tsx index b895d652..070e7a47 100644 --- a/src/components/Feed/List.tsx +++ b/src/components/Feed/List.tsx @@ -6,7 +6,7 @@ import { createMemo, createSignal, For, Suspense } from 'solid-js' import type { JSX } from 'solid-js' import type { Shout } from '../../graphql/types.gen' import './List.scss' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export const Block6 = (props: { articles: Shout[] }) => { const dice = createMemo(() => shuffle([Row1, Row2, Row3])) @@ -25,6 +25,7 @@ interface ArticleListProps { } export default (props: ArticleListProps) => { + const { t } = useLocalize() const [articles, setArticles] = createSignal( props.articles.slice(props.page * props.size, props.size * (props.page + 1)) || [] ) diff --git a/src/components/Feed/Sidebar.tsx b/src/components/Feed/Sidebar.tsx index 8d50df10..72a9c2be 100644 --- a/src/components/Feed/Sidebar.tsx +++ b/src/components/Feed/Sidebar.tsx @@ -1,19 +1,21 @@ import { For } from 'solid-js' import type { Author } from '../../graphql/types.gen' import { useAuthorsStore } from '../../stores/zine/authors' -import { t } from '../../utils/intl' + import { Icon } from '../_shared/Icon' import { useTopicsStore } from '../../stores/zine/topics' import { useArticlesStore } from '../../stores/zine/articles' import { useSeenStore } from '../../stores/zine/seen' import { useSession } from '../../context/session' import styles from './Sidebar.module.scss' +import { useLocalize } from '../../context/localize' type FeedSidebarProps = { authors: Author[] } export const FeedSidebar = (props: FeedSidebarProps) => { + const { t } = useLocalize() const { seen } = useSeenStore() const { session } = useSession() const { authorEntities } = useAuthorsStore({ authors: props.authors }) diff --git a/src/components/Inbox/CreateModalContent.tsx b/src/components/Inbox/CreateModalContent.tsx index 38a19465..6047c51a 100644 --- a/src/components/Inbox/CreateModalContent.tsx +++ b/src/components/Inbox/CreateModalContent.tsx @@ -1,10 +1,11 @@ import { createSignal, For, createEffect } from 'solid-js' import styles from './CreateModalContent.module.scss' -import { t } from '../../utils/intl' + import InviteUser from './InviteUser' import type { Author } from '../../graphql/types.gen' import { hideModal } from '../../stores/ui' import { useInbox } from '../../context/inbox' +import { useLocalize } from '../../context/localize' type inviteUser = Author & { selected: boolean } type Props = { @@ -12,6 +13,7 @@ type Props = { } const CreateModalContent = (props: Props) => { + const { t } = useLocalize() const inviteUsers: inviteUser[] = props.users.map((user) => ({ ...user, selected: false })) const [theme, setTheme] = createSignal<string>(' ') const [usersId, setUsersId] = createSignal<number[]>([]) @@ -66,7 +68,7 @@ const CreateModalContent = (props: Props) => { return ( <div class={styles.CreateModalContent}> - <h4>{t('create_chat')}</h4> + <h4>{t('Create Chat')}</h4> {usersId().length > 1 && ( <input ref={textInput} @@ -74,7 +76,7 @@ const CreateModalContent = (props: Props) => { type="text" required={true} class="form-control form-control-lg fs-3" - placeholder={t('discourse_theme')} + placeholder={t('Chat Title')} /> )} @@ -96,7 +98,7 @@ const CreateModalContent = (props: Props) => { onClick={handleCreate} disabled={usersId().length === 0} > - {usersId().length > 1 ? t('create_group') : t('create_chat')} + {usersId().length > 1 ? t('Create Group') : t('Create Chat')} </button> </div> </div> diff --git a/src/components/Inbox/DialogAvatar.tsx b/src/components/Inbox/DialogAvatar.tsx index 38368ce1..365bef36 100644 --- a/src/components/Inbox/DialogAvatar.tsx +++ b/src/components/Inbox/DialogAvatar.tsx @@ -9,7 +9,7 @@ type Props = { online?: boolean size?: 'small' bordered?: boolean - className?: string + class?: string } const colors = [ @@ -38,7 +38,7 @@ const DialogAvatar = (props: Props) => { return ( <div - class={clsx(styles.DialogAvatar, props.className, { + class={clsx(styles.DialogAvatar, props.class, { [styles.online]: props.online, [styles.bordered]: props.bordered, [styles.small]: props.size === 'small' diff --git a/src/components/Inbox/DialogCard.tsx b/src/components/Inbox/DialogCard.tsx index cf90d5d4..c9bc6879 100644 --- a/src/components/Inbox/DialogCard.tsx +++ b/src/components/Inbox/DialogCard.tsx @@ -5,7 +5,7 @@ import GroupDialogAvatar from './GroupDialogAvatar' import formattedTime from '../../utils/formatDateTime' import { clsx } from 'clsx' import styles from './DialogCard.module.scss' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' type DialogProps = { online?: boolean @@ -20,6 +20,7 @@ type DialogProps = { } const DialogCard = (props: DialogProps) => { + const { t } = useLocalize() const companions = createMemo( () => props.members && props.members.filter((member) => member.id !== props.ownId) ) @@ -34,7 +35,6 @@ const DialogCard = (props: DialogProps) => { <Show when={props.members}> <div class={clsx(styles.DialogCard, { - [styles.header]: props.isChatHeader, [styles.opened]: props.isOpened, [styles.hovered]: !props.isChatHeader })} diff --git a/src/components/Inbox/GroupDialogAvatar.tsx b/src/components/Inbox/GroupDialogAvatar.tsx index f68a4b17..49df5ffe 100644 --- a/src/components/Inbox/GroupDialogAvatar.tsx +++ b/src/components/Inbox/GroupDialogAvatar.tsx @@ -21,7 +21,7 @@ const GroupDialogAvatar = (props: Props) => { <For each={slicedUsers()}> {(user) => ( <DialogAvatar - className={styles.grouped} + class={styles.grouped} bordered={true} size="small" name={user.name} diff --git a/src/components/Inbox/Message.module.scss b/src/components/Inbox/Message.module.scss index c0e5c0f2..e448af74 100644 --- a/src/components/Inbox/Message.module.scss +++ b/src/components/Inbox/Message.module.scss @@ -1,5 +1,3 @@ -$actionsWidth: 32px * 2; - .Message { display: flex; flex-direction: column; @@ -41,13 +39,13 @@ $actionsWidth: 32px * 2; position: absolute; display: flex; flex-direction: row; - width: $actionsWidth; + width: 64px; height: 32px; cursor: pointer; top: 50%; transform: translateY(-50%); opacity: 0; - right: -$actionsWidth/2; + right: -32px; z-index: -1; transition: 0.3s ease-in-out; } @@ -62,7 +60,7 @@ $actionsWidth: 32px * 2; .actions { z-index: 10000; opacity: 1; - right: -$actionsWidth; + right: -64px; } } } @@ -101,7 +99,7 @@ $actionsWidth: 32px * 2; .actions { right: unset; - left: -$actionsWidth/2; + left: -32px; flex-direction: row-reverse; .reply { @@ -112,7 +110,7 @@ $actionsWidth: 32px * 2; &.popupVisible, &:hover { .actions { - left: -$actionsWidth; + left: -64px; } } } diff --git a/src/components/Inbox/Message.tsx b/src/components/Inbox/Message.tsx index 03d30047..2057b8f6 100644 --- a/src/components/Inbox/Message.tsx +++ b/src/components/Inbox/Message.tsx @@ -23,7 +23,7 @@ const md = new MarkdownIt({ breaks: true }) -const Message = (props: Props) => { +export const Message = (props: Props) => { const isOwn = props.ownId === Number(props.content.author) const user = props.members?.find((m) => m.id === Number(props.content.author)) const [isPopupVisible, setIsPopupVisible] = createSignal<boolean>(false) @@ -57,5 +57,3 @@ const Message = (props: Props) => { </div> ) } - -export default Message diff --git a/src/components/Inbox/MessageActionsPopup.tsx b/src/components/Inbox/MessageActionsPopup.tsx index add82b53..67c68019 100644 --- a/src/components/Inbox/MessageActionsPopup.tsx +++ b/src/components/Inbox/MessageActionsPopup.tsx @@ -1,7 +1,7 @@ import { createEffect, createSignal, For } from 'solid-js' import type { PopupProps } from '../_shared/Popup' import { Popup } from '../_shared/Popup' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export type MessageActionType = 'reply' | 'copy' | 'pin' | 'forward' | 'select' | 'delete' @@ -9,18 +9,17 @@ type MessageActionsPopup = { actionSelect?: (selectedAction) => void } & Omit<PopupProps, 'children'> -const actions: { name: string; action: MessageActionType }[] = [ - { name: t('Reply'), action: 'reply' }, - { name: t('Copy'), action: 'copy' }, - { name: t('Pin'), action: 'pin' }, - { name: t('Forward'), action: 'forward' }, - { name: t('Select'), action: 'select' }, - { name: t('Delete'), action: 'delete' } -] - export const MessageActionsPopup = (props: MessageActionsPopup) => { const [selectedAction, setSelectedAction] = createSignal<MessageActionType | null>(null) - + const { t } = useLocalize() + const actions: { name: string; action: MessageActionType }[] = [ + { name: t('Reply'), action: 'reply' }, + { name: t('Copy'), action: 'copy' }, + { name: t('Pin'), action: 'pin' }, + { name: t('Forward'), action: 'forward' }, + { name: t('Select'), action: 'select' }, + { name: t('Delete'), action: 'delete' } + ] createEffect(() => { if (props.actionSelect) props.actionSelect(selectedAction()) }) diff --git a/src/components/Nav/AuthModal/EmailConfirm.tsx b/src/components/Nav/AuthModal/EmailConfirm.tsx index e371abd3..d9bf9828 100644 --- a/src/components/Nav/AuthModal/EmailConfirm.tsx +++ b/src/components/Nav/AuthModal/EmailConfirm.tsx @@ -1,14 +1,15 @@ import styles from './AuthModal.module.scss' import { clsx } from 'clsx' -import { t } from '../../../utils/intl' import { hideModal } from '../../../stores/ui' import { createMemo, createSignal, onMount, Show } from 'solid-js' import { useRouter } from '../../../stores/router' import type { ConfirmEmailSearchParams } from './types' import { ApiError } from '../../../utils/apiClient' import { useSession } from '../../../context/session' +import { useLocalize } from '../../../context/localize' export const EmailConfirm = () => { + const { t } = useLocalize() const { session, actions: { confirmEmail } @@ -48,7 +49,7 @@ export const EmailConfirm = () => { <Show when={isTokenExpired()}> <div class={styles.title}>Ссылка больше не действительна</div> <div class={styles.text}> - <a href="/?modal=auth&mode=login" class={styles.sendLink}> + <a href="/?modal=auth&mode=login"> {/*TODO: temp solution, should be send link again, but we don't have email here*/} Вход </a> @@ -57,7 +58,7 @@ export const EmailConfirm = () => { <Show when={isTokenInvalid()}> <div class={styles.title}>Неправильная ссылка</div> <div class={styles.text}> - <a href="/?modal=auth&mode=login" class={styles.sendLink}> + <a href="/?modal=auth&mode=login"> {/*TODO: temp solution, should be send link again, but we don't have email here*/} Вход </a> diff --git a/src/components/Nav/AuthModal/ForgotPasswordForm.tsx b/src/components/Nav/AuthModal/ForgotPasswordForm.tsx index a20eeac3..91badbc7 100644 --- a/src/components/Nav/AuthModal/ForgotPasswordForm.tsx +++ b/src/components/Nav/AuthModal/ForgotPasswordForm.tsx @@ -1,4 +1,3 @@ -import { t } from '../../../utils/intl' import styles from './AuthModal.module.scss' import { clsx } from 'clsx' import { createSignal, JSX, Show } from 'solid-js' @@ -6,9 +5,9 @@ import { useRouter } from '../../../stores/router' import { email, setEmail } from './sharedLogic' import type { AuthModalSearchParams } from './types' import { isValidEmail } from './validators' -import { locale } from '../../../stores/ui' import { ApiError } from '../../../utils/apiClient' import { signSendLink } from '../../../stores/auth' +import { useLocalize } from '../../../context/localize' type FormFields = { email: string @@ -18,7 +17,7 @@ type ValidationErrors = Partial<Record<keyof FormFields, string | JSX.Element>> export const ForgotPasswordForm = () => { const { changeSearchParam } = useRouter<AuthModalSearchParams>() - + const { t, lang } = useLocalize() const handleEmailInput = (newEmail: string) => { setValidationErrors(({ email: _notNeeded, ...rest }) => rest) setEmail(newEmail) @@ -54,7 +53,7 @@ export const ForgotPasswordForm = () => { setIsSubmitting(true) try { - await signSendLink({ email: email(), lang: locale(), template: 'forgot_password' }) + await signSendLink({ email: email(), lang: lang(), template: 'forgot_password' }) } catch (error) { if (error instanceof ApiError && error.code === 'user_not_found') { setIsUserNotFound(true) diff --git a/src/components/Nav/AuthModal/LoginForm.tsx b/src/components/Nav/AuthModal/LoginForm.tsx index feec9b87..fef6cb4c 100644 --- a/src/components/Nav/AuthModal/LoginForm.tsx +++ b/src/components/Nav/AuthModal/LoginForm.tsx @@ -1,4 +1,3 @@ -import { t } from '../../../utils/intl' import styles from './AuthModal.module.scss' import { clsx } from 'clsx' import { SocialProviders } from './SocialProviders' @@ -8,10 +7,12 @@ import { isValidEmail } from './validators' import { email, setEmail } from './sharedLogic' import { useRouter } from '../../../stores/router' import type { AuthModalSearchParams } from './types' -import { hideModal, locale } from '../../../stores/ui' +import { hideModal } from '../../../stores/ui' import { useSession } from '../../../context/session' import { signSendLink } from '../../../stores/auth' + import { useSnackbar } from '../../../context/snackbar' +import { useLocalize } from '../../../context/localize' type FormFields = { email: string @@ -21,6 +22,8 @@ type FormFields = { type ValidationErrors = Partial<Record<keyof FormFields, string>> export const LoginForm = () => { + const { t, lang } = useLocalize() + const [submitError, setSubmitError] = createSignal('') const [isSubmitting, setIsSubmitting] = createSignal(false) const [validationErrors, setValidationErrors] = createSignal<ValidationErrors>({}) @@ -55,7 +58,7 @@ export const LoginForm = () => { setIsEmailNotConfirmed(false) setSubmitError('') setIsLinkSent(true) - const result = await signSendLink({ email: email(), lang: locale(), template: 'email_confirmation' }) + const result = await signSendLink({ email: email(), lang: lang(), template: 'email_confirmation' }) if (result.error) setSubmitError(result.error) } @@ -116,7 +119,7 @@ export const LoginForm = () => { <div class={styles.authInfo}> <div class={styles.warn}>{submitError()}</div> <Show when={isEmailNotConfirmed()}> - <a href="#" class={styles.sendLink} onClick={handleSendLinkAgainClick}> + <a href="#" onClick={handleSendLinkAgainClick}> {t('Send link again')} </a> </Show> diff --git a/src/components/Nav/AuthModal/RegisterForm.tsx b/src/components/Nav/AuthModal/RegisterForm.tsx index d6feb5a7..76fc4425 100644 --- a/src/components/Nav/AuthModal/RegisterForm.tsx +++ b/src/components/Nav/AuthModal/RegisterForm.tsx @@ -1,6 +1,5 @@ import { Show, createSignal } from 'solid-js' import type { JSX } from 'solid-js' -import { t } from '../../../utils/intl' import styles from './AuthModal.module.scss' import { clsx } from 'clsx' import { SocialProviders } from './SocialProviders' @@ -12,6 +11,7 @@ import type { AuthModalSearchParams } from './types' import { hideModal } from '../../../stores/ui' import { checkEmail, useEmailChecks } from '../../../stores/emailChecks' import { register } from '../../../stores/auth' +import { useLocalize } from '../../../context/localize' type FormFields = { name: string @@ -23,7 +23,7 @@ type ValidationErrors = Partial<Record<keyof FormFields, string | JSX.Element>> export const RegisterForm = () => { const { changeSearchParam } = useRouter<AuthModalSearchParams>() - + const { t } = useLocalize() const { emailChecks } = useEmailChecks() const [submitError, setSubmitError] = createSignal('') diff --git a/src/components/Nav/AuthModal/SocialProviders.tsx b/src/components/Nav/AuthModal/SocialProviders.tsx index fcbe1309..b0577ed2 100644 --- a/src/components/Nav/AuthModal/SocialProviders.tsx +++ b/src/components/Nav/AuthModal/SocialProviders.tsx @@ -1,9 +1,9 @@ -import { t } from '../../../utils/intl' import { Icon } from '../../_shared/Icon' import { hideModal } from '../../../stores/ui' import styles from './SocialProviders.module.scss' import { apiBaseUrl } from '../../../utils/config' +import { useLocalize } from '../../../context/localize' type Provider = 'facebook' | 'google' | 'vk' | 'github' @@ -16,6 +16,7 @@ const handleSocialAuthLinkClick = (event: MouseEvent, provider: Provider): void } export const SocialProviders = () => { + const { t } = useLocalize() return ( <div class={styles.container}> <div class={styles.text}>{t('Or continue with social network')}</div> diff --git a/src/components/Nav/AuthModal/index.tsx b/src/components/Nav/AuthModal/index.tsx index 8334f771..783a88ed 100644 --- a/src/components/Nav/AuthModal/index.tsx +++ b/src/components/Nav/AuthModal/index.tsx @@ -1,6 +1,5 @@ import { Dynamic } from 'solid-js/web' import { Component, createEffect, createMemo } from 'solid-js' -import { t } from '../../../utils/intl' import { hideModal } from '../../../stores/ui' import { useRouter } from '../../../stores/router' import { clsx } from 'clsx' @@ -10,6 +9,7 @@ import { RegisterForm } from './RegisterForm' import { ForgotPasswordForm } from './ForgotPasswordForm' import { EmailConfirm } from './EmailConfirm' import type { AuthModalMode, AuthModalSearchParams } from './types' +import { useLocalize } from '../../../context/localize' const AUTH_MODAL_MODES: Record<AuthModalMode, Component> = { login: LoginForm, @@ -20,7 +20,7 @@ const AUTH_MODAL_MODES: Record<AuthModalMode, Component> = { export const AuthModal = () => { let rootRef: HTMLDivElement - + const { t } = useLocalize() const { searchParams } = useRouter<AuthModalSearchParams>() const mode = createMemo<AuthModalMode>(() => { diff --git a/src/components/Nav/Confirmed.tsx b/src/components/Nav/Confirmed.tsx index f870c83d..09adf3c2 100644 --- a/src/components/Nav/Confirmed.tsx +++ b/src/components/Nav/Confirmed.tsx @@ -1,8 +1,9 @@ import './Confirmed.scss' import { onMount } from 'solid-js' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export const Confirmed = (props: { token?: string }) => { + const { t } = useLocalize() onMount(() => { const token = props.token ?? document.cookie.split(';').at(0).replace('token=', '') window.addEventListener('mousemove', () => window.close()) diff --git a/src/components/Nav/Header.module.scss b/src/components/Nav/Header.module.scss index 04e5ea63..7927684c 100644 --- a/src/components/Nav/Header.module.scss +++ b/src/components/Nav/Header.module.scss @@ -110,8 +110,10 @@ } } - a { - border: none; + a, + a:link, + a:visited { + border-bottom: none; color: #000; &:hover { @@ -127,9 +129,11 @@ .usernav { display: inline-flex; font-weight: 500; - padding-right: 0; position: relative; - width: auto; + + // replace row > * selector to remove !important + padding-right: 0 !important; + width: auto !important; @include media-breakpoint-down(md) { flex: 1; @@ -195,7 +199,8 @@ margin-right: 2.4rem; } - a { + a, + a:link { border: none; } @@ -443,7 +448,8 @@ } .button, - a { + a, + a:link { border: none; height: auto; margin: 0; diff --git a/src/components/Nav/Header.tsx b/src/components/Nav/Header.tsx index 93aba250..f16e8dcc 100644 --- a/src/components/Nav/Header.tsx +++ b/src/components/Nav/Header.tsx @@ -2,9 +2,8 @@ import { For, Show, createSignal, createEffect, onMount, onCleanup } from 'solid import { Icon } from '../_shared/Icon' import { Modal } from './Modal' import { AuthModal } from './AuthModal' -import { t } from '../../utils/intl' import { useModalStore } from '../../stores/ui' -import { router, useRouter } from '../../stores/router' +import { router, ROUTES, useRouter } from '../../stores/router' import styles from './Header.module.scss' import { getPagePath } from '@nanostores/router' import { clsx } from 'clsx' @@ -12,12 +11,7 @@ import { HeaderAuth } from './HeaderAuth' import { getShareUrl, SharePopup } from '../Article/SharePopup' import { getDescription } from '../../utils/meta' import { Snackbar } from './Snackbar' - -const resources: { name: string; route: 'home' | 'feed' | 'topics' }[] = [ - { name: t('zine'), route: 'home' }, - { name: t('feed'), route: 'feed' }, - { name: t('topics'), route: 'topics' } -] +import { useLocalize } from '../../context/localize' type Props = { title?: string @@ -27,6 +21,13 @@ type Props = { } export const Header = (props: Props) => { + const { t } = useLocalize() + + const resources: { name: string; route: keyof typeof ROUTES }[] = [ + { name: t('zine'), route: 'home' }, + { name: t('feed'), route: 'feed' }, + { name: t('topics'), route: 'topics' } + ] // signals const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false) const [getIsScrolled, setIsScrolled] = createSignal(false) @@ -117,7 +118,7 @@ export const Header = (props: Props) => { </For> <li class={styles.headerSearch}> <a href="#"> - <Icon name="search" class={styles.icon} iconClassName={styles.searchIcon} /> + <Icon name="search" class={styles.icon} /> {t('Search')} </a> </li> diff --git a/src/components/Nav/HeaderAuth.tsx b/src/components/Nav/HeaderAuth.tsx index 86e46b8b..f906f443 100644 --- a/src/components/Nav/HeaderAuth.tsx +++ b/src/components/Nav/HeaderAuth.tsx @@ -1,7 +1,7 @@ import styles from './Header.module.scss' import { clsx } from 'clsx' import { useRouter } from '../../stores/router' -import { t } from '../../utils/intl' + import { Icon } from '../_shared/Icon' import { createSignal, Show } from 'solid-js' import Notifications from './Notifications' @@ -11,12 +11,14 @@ import type { Author } from '../../graphql/types.gen' import { showModal, useWarningsStore } from '../../stores/ui' import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' import { useSession } from '../../context/session' +import { useLocalize } from '../../context/localize' type HeaderAuthProps = { setIsProfilePopupVisible: (value: boolean) => void } export const HeaderAuth = (props: HeaderAuthProps) => { + const { t } = useLocalize() const { page } = useRouter() const [visibleWarnings, setVisibleWarnings] = createSignal(false) const { warnings } = useWarningsStore() @@ -38,7 +40,7 @@ export const HeaderAuth = (props: HeaderAuthProps) => { return ( <ShowOnlyOnClient> - <Show when={isSessionLoaded()}> + <Show when={isSessionLoaded()} keyed={true}> <div class={styles.usernav}> <div class={clsx(styles.userControl, styles.userControl, 'col')}> <div class={clsx(styles.userControlItem, styles.userControlItemVerbose)}> diff --git a/src/components/Nav/Modal.tsx b/src/components/Nav/Modal.tsx index 2bc41fb3..9e28aed6 100644 --- a/src/components/Nav/Modal.tsx +++ b/src/components/Nav/Modal.tsx @@ -1,13 +1,10 @@ import { createEffect, createSignal, Show } from 'solid-js' import type { JSX } from 'solid-js' -import { getLogger } from '../../utils/logger' import { hideModal, useModalStore } from '../../stores/ui' import { useEscKeyDownHandler } from '../../utils/useEscKeyDownHandler' import { clsx } from 'clsx' import styles from './Modal.module.scss' -const log = getLogger('modal') - interface ModalProps { name: string variant: 'narrow' | 'wide' @@ -27,7 +24,6 @@ export const Modal = (props: ModalProps) => { createEffect(() => { setVisible(modal() === props.name) - log.debug(`${props.name} is ${modal() === props.name ? 'visible' : 'hidden'}`) }) return ( @@ -35,7 +31,6 @@ export const Modal = (props: ModalProps) => { <div class={styles.backdrop} onClick={backdropClick}> <div class={clsx(styles.modal, { - [styles.wide]: props.variant === 'wide', [styles.narrow]: props.variant === 'narrow' })} onClick={(event) => event.stopPropagation()} diff --git a/src/components/Nav/ProfileModal.tsx b/src/components/Nav/ProfileModal.tsx index ddfabe87..52dc7ea4 100644 --- a/src/components/Nav/ProfileModal.tsx +++ b/src/components/Nav/ProfileModal.tsx @@ -1,9 +1,11 @@ import { AuthorCard } from '../Author/Card' import type { Author } from '../../graphql/types.gen' -import { t } from '../../utils/intl' + +import { translit } from '../../utils/ru2en' import { hideModal } from '../../stores/ui' import { createMemo, For } from 'solid-js' import { useSession } from '../../context/session' +import { useLocalize } from '../../context/localize' export const ProfileModal = () => { const { @@ -15,6 +17,7 @@ export const ProfileModal = () => { signOut() hideModal() } + const { t, lang } = useLocalize() const author = createMemo<Author>(() => { const a: Author = { @@ -26,7 +29,7 @@ export const ProfileModal = () => { if (session()?.user?.slug) { const u = session().user - a.name = u.name + a.name = lang() === 'ru' ? u.name : translit(u.name) a.slug = u.slug a.userpic = u.userpic } diff --git a/src/components/Nav/ProfilePopup.tsx b/src/components/Nav/ProfilePopup.tsx index 9a875aa4..8aced53b 100644 --- a/src/components/Nav/ProfilePopup.tsx +++ b/src/components/Nav/ProfilePopup.tsx @@ -4,6 +4,7 @@ import { Popup } from '../_shared/Popup' import styles from '../_shared/Popup/Popup.module.scss' import { getPagePath } from '@nanostores/router' import { router } from '../../stores/router' +import { useLocalize } from '../../context/localize' type ProfilePopupProps = Omit<PopupProps, 'children'> @@ -13,27 +14,30 @@ export const ProfilePopup = (props: ProfilePopupProps) => { actions: { signOut } } = useSession() + const { t, lang } = useLocalize() + return ( <Popup {...props} horizontalAnchor="right" variant="bordered"> - {/*TODO: l10n*/} <ul class="nodash"> <li> - <a href={getPagePath(router, 'author', { slug: userSlug() })}>Профиль</a> + <a href={getPagePath(router, 'author', { slug: userSlug(), lang: lang() } as never)}> + {t('Profile')} + </a> </li> <li> - <a href="#">Черновики</a> + <a href="#">{t('Drafts')}</a> </li> <li> - <a href="#">Подписки</a> + <a href="#">{t('Subscriptions')}</a> </li> <li> - <a href="#">Комментарии</a> + <a href="#">{t('Comments')}</a> </li> <li> - <a href="#">Закладки</a> + <a href="#">{t('Bookmarks')}</a> </li> <li> - <a href={getPagePath(router, 'profileSettings')}>Настройки</a> + <a href={getPagePath(router, 'profileSettings')}>{t('Settings')}</a> </li> <li class={styles.topBorderItem}> <a @@ -43,7 +47,7 @@ export const ProfilePopup = (props: ProfilePopupProps) => { signOut() }} > - Выйти из аккаунта + {t('Logout')} </a> </li> </ul> diff --git a/src/components/Nav/Topics.tsx b/src/components/Nav/Topics.tsx index 83b18bb4..8c037b17 100644 --- a/src/components/Nav/Topics.tsx +++ b/src/components/Nav/Topics.tsx @@ -1,14 +1,14 @@ -import { For, Show } from 'solid-js' +import { createMemo, For, Show } from 'solid-js' import type { Topic } from '../../graphql/types.gen' import { Icon } from '../_shared/Icon' import './Topics.scss' -import { t } from '../../utils/intl' -import { locale } from '../../stores/ui' + +import { useLocalize } from '../../context/localize' export const NavTopics = (props: { topics: Topic[] }) => { + const { t, lang } = useLocalize() const tag = (topic: Topic) => - /[ЁА-яё]/.test(topic.title || '') && locale() !== 'ru' ? topic.slug : topic.title - + /[ЁА-яё]/.test(topic.title || '') && lang() !== 'ru' ? topic.slug : topic.title // TODO: something about subtopics return ( <nav class="subnavigation wide-container text-2xl"> diff --git a/src/components/Pages/ArticlePage.tsx b/src/components/Pages/ArticlePage.tsx deleted file mode 100644 index 031846a6..00000000 --- a/src/components/Pages/ArticlePage.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { PageWrap } from '../_shared/PageWrap' -import { ArticleView } from '../Views/Article' -import type { PageProps } from '../types' -import { loadShout, useArticlesStore } from '../../stores/zine/articles' -import { createMemo, onMount, Show } from 'solid-js' -import type { Shout } from '../../graphql/types.gen' -import { useRouter } from '../../stores/router' -import { Loading } from '../Loading' - -export const ArticlePage = (props: PageProps) => { - const shouts = props.article ? [props.article] : [] - - const slug = createMemo(() => { - const { page: getPage } = useRouter() - - const page = getPage() - - if (page.route !== 'article') { - throw new Error('ts guard') - } - - return page.params.slug - }) - - const { articleEntities } = useArticlesStore({ - shouts - }) - - const article = createMemo<Shout>(() => articleEntities()[slug()]) - - onMount(async () => { - const articleValue = articleEntities()[slug()] - - if (!articleValue || !articleValue.body) { - await loadShout(slug()) - } - }) - - return ( - <PageWrap headerTitle={article()?.title || ''} articleBody={article()?.body} cover={article()?.cover}> - <Show when={Boolean(article())} fallback={<Loading />}> - <ArticleView article={article()} /> - </Show> - </PageWrap> - ) -} - -// for lazy loading -export default ArticlePage diff --git a/src/components/Pages/AuthorPage.tsx b/src/components/Pages/AuthorPage.tsx deleted file mode 100644 index f84e8314..00000000 --- a/src/components/Pages/AuthorPage.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { PageWrap } from '../_shared/PageWrap' -import { AuthorView, PRERENDERED_ARTICLES_COUNT } from '../Views/Author' -import type { PageProps } from '../types' -import { createMemo, createSignal, onCleanup, onMount, Show } from 'solid-js' -import { loadShouts, resetSortedArticles } from '../../stores/zine/articles' -import { useRouter } from '../../stores/router' -import { loadAuthor } from '../../stores/zine/authors' -import { Loading } from '../Loading' - -export const AuthorPage = (props: PageProps) => { - const [isLoaded, setIsLoaded] = createSignal(Boolean(props.authorShouts) && Boolean(props.author)) - - const slug = createMemo(() => { - const { page: getPage } = useRouter() - - const page = getPage() - - if (page.route !== 'author') { - throw new Error('ts guard') - } - - return page.params.slug - }) - - onMount(async () => { - if (isLoaded()) { - return - } - - await loadShouts({ filters: { author: slug() }, limit: PRERENDERED_ARTICLES_COUNT }) - await loadAuthor({ slug: slug() }) - - setIsLoaded(true) - }) - - onCleanup(() => resetSortedArticles()) - - return ( - <PageWrap> - <Show when={isLoaded()} fallback={<Loading />}> - <AuthorView author={props.author} shouts={props.authorShouts} authorSlug={slug()} /> - </Show> - </PageWrap> - ) -} - -// for lazy loading -export default AuthorPage diff --git a/src/components/Pages/CreatePage.tsx b/src/components/Pages/CreatePage.tsx deleted file mode 100644 index f800769e..00000000 --- a/src/components/Pages/CreatePage.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { lazy, Suspense } from 'solid-js' -import { PageWrap } from '../_shared/PageWrap' -import { Loading } from '../Loading' - -const CreateView = lazy(() => import('../Views/Create')) - -export const CreatePage = () => { - return ( - <PageWrap> - <Suspense fallback={<Loading />}> - <CreateView /> - </Suspense> - </PageWrap> - ) -} - -// for lazy loading -export default CreatePage diff --git a/src/components/Pages/CreateSettingsPage.tsx b/src/components/Pages/CreateSettingsPage.tsx deleted file mode 100644 index 69478fb5..00000000 --- a/src/components/Pages/CreateSettingsPage.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { PageWrap } from '../_shared/PageWrap' - -export const CreateSettingsPage = () => { - return <PageWrap>Настройки публикации</PageWrap> -} - -// for lazy loading -export default CreateSettingsPage diff --git a/src/components/Pages/FeedPage.tsx b/src/components/Pages/FeedPage.tsx deleted file mode 100644 index dc7dc3ac..00000000 --- a/src/components/Pages/FeedPage.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { PageWrap } from '../_shared/PageWrap' -import { FeedView } from '../Views/Feed' -import { onCleanup } from 'solid-js' -import { resetSortedArticles } from '../../stores/zine/articles' - -export const FeedPage = () => { - onCleanup(() => resetSortedArticles()) - - return ( - <PageWrap> - <FeedView /> - </PageWrap> - ) -} - -// for lazy loading -export default FeedPage diff --git a/src/components/Pages/FourOuFourPage.tsx b/src/components/Pages/FourOuFourPage.tsx deleted file mode 100644 index 86bd076a..00000000 --- a/src/components/Pages/FourOuFourPage.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { FourOuFourView } from '../Views/FourOuFour' -import { PageWrap } from '../_shared/PageWrap' - -export const FourOuFourPage = () => { - return ( - <PageWrap isHeaderFixed={false} hideFooter={true}> - <FourOuFourView /> - </PageWrap> - ) -} - -// for lazy loading -export default FourOuFourPage diff --git a/src/components/Pages/InboxPage.tsx b/src/components/Pages/InboxPage.tsx deleted file mode 100644 index 403b9097..00000000 --- a/src/components/Pages/InboxPage.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { PageWrap } from '../_shared/PageWrap' -import { InboxView } from '../Views/Inbox' -import { InboxProvider } from '../../context/inbox' -import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' - -export const InboxPage = () => { - return ( - <PageWrap hideFooter={true}> - <ShowOnlyOnClient> - <InboxProvider> - <InboxView /> - </InboxProvider> - </ShowOnlyOnClient> - </PageWrap> - ) -} - -// for lazy loading -export default InboxPage diff --git a/src/components/Root.tsx b/src/components/Root.tsx deleted file mode 100644 index ec78aa91..00000000 --- a/src/components/Root.tsx +++ /dev/null @@ -1,108 +0,0 @@ -// FIXME: breaks on vercel, research -// import 'solid-devtools' - -import { MODALS, setLocale, showModal } from '../stores/ui' -import { Component, createEffect, createMemo } from 'solid-js' -import { ROUTES, useRouter } from '../stores/router' -import { Dynamic, isServer } from 'solid-js/web' - -import type { PageProps, RootSearchParams } from './types' - -import { HomePage } from './Pages/HomePage' -import { AllTopicsPage } from './Pages/AllTopicsPage' -import { TopicPage } from './Pages/TopicPage' -import { AllAuthorsPage } from './Pages/AllAuthorsPage' -import { AuthorPage } from './Pages/AuthorPage' -import { FeedPage } from './Pages/FeedPage' -import { ArticlePage } from './Pages/ArticlePage' -import { SearchPage } from './Pages/SearchPage' -import { FourOuFourPage } from './Pages/FourOuFourPage' -import { DiscussionRulesPage } from './Pages/about/DiscussionRulesPage' -import { DogmaPage } from './Pages/about/DogmaPage' -import { GuidePage } from './Pages/about/GuidePage' -import { HelpPage } from './Pages/about/HelpPage' -import { ManifestPage } from './Pages/about/ManifestPage' -import { PartnersPage } from './Pages/about/PartnersPage' -import { PrinciplesPage } from './Pages/about/PrinciplesPage' -import { ProjectsPage } from './Pages/about/ProjectsPage' -import { TermsOfUsePage } from './Pages/about/TermsOfUsePage' -import { ThanksPage } from './Pages/about/ThanksPage' -import { CreatePage } from './Pages/CreatePage' -import { ConnectPage } from './Pages/ConnectPage' -import { InboxPage } from './Pages/InboxPage' -import { LayoutShoutsPage } from './Pages/LayoutShoutsPage' -import { SessionProvider } from '../context/session' -import { ProfileSettingsPage } from './Pages/profile/ProfileSettingsPage' -import { ProfileSecurityPage } from './Pages/profile/ProfileSecurityPage' -import { ProfileSubscriptionsPage } from './Pages/profile/ProfileSubscriptionsPage' -import { CreateSettingsPage } from './Pages/CreateSettingsPage' -import { SnackbarProvider } from '../context/snackbar' - -// TODO: lazy load -// const SomePage = lazy(() => import('./Pages/SomePage')) - -const pagesMap: Record<keyof typeof ROUTES, Component<PageProps>> = { - inbox: InboxPage, - expo: LayoutShoutsPage, - connect: ConnectPage, - create: CreatePage, - createSettings: CreateSettingsPage, - home: HomePage, - topics: AllTopicsPage, - topic: TopicPage, - authors: AllAuthorsPage, - author: AuthorPage, - feed: FeedPage, - article: ArticlePage, - search: SearchPage, - discussionRules: DiscussionRulesPage, - dogma: DogmaPage, - guide: GuidePage, - help: HelpPage, - manifest: ManifestPage, - projects: ProjectsPage, - partners: PartnersPage, - principles: PrinciplesPage, - termsOfUse: TermsOfUsePage, - thanks: ThanksPage, - profileSettings: ProfileSettingsPage, - profileSecurity: ProfileSecurityPage, - profileSubscriptions: ProfileSubscriptionsPage -} - -export const Root = (props: PageProps) => { - const { page, searchParams } = useRouter<RootSearchParams>() - - createEffect(() => { - const modal = MODALS[searchParams().modal] - if (modal) { - showModal(modal) - } - }) - - const pageComponent = createMemo(() => { - const result = pagesMap[page().route] - - if (!result || page().path === '/404') { - return FourOuFourPage - } - - return result - }) - - if (!isServer) { - createEffect(() => { - const lang = searchParams().lang || 'ru' - console.log('[root] client locale is', lang) - setLocale(lang) - }) - } - - return ( - <SnackbarProvider> - <SessionProvider> - <Dynamic component={pageComponent()} {...props} /> - </SessionProvider> - </SnackbarProvider> - ) -} diff --git a/src/components/Topic/Card.tsx b/src/components/Topic/Card.tsx index 554090a7..409d487c 100644 --- a/src/components/Topic/Card.tsx +++ b/src/components/Topic/Card.tsx @@ -3,12 +3,13 @@ import styles from './Card.module.scss' import { createMemo, createSignal, Show } from 'solid-js' import type { Topic } from '../../graphql/types.gen' import { FollowingEntity } from '../../graphql/types.gen' -import { t } from '../../utils/intl' + import { follow, unfollow } from '../../stores/zine/common' import { clsx } from 'clsx' import { useSession } from '../../context/session' import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' import { Icon } from '../_shared/Icon' +import { useLocalize } from '../../context/localize' interface TopicProps { topic: Topic @@ -23,6 +24,7 @@ interface TopicProps { } export const TopicCard = (props: TopicProps) => { + const { t } = useLocalize() const { session, isSessionLoaded, diff --git a/src/components/Topic/FloorHeader.tsx b/src/components/Topic/FloorHeader.tsx index 398197c8..596f7a80 100644 --- a/src/components/Topic/FloorHeader.tsx +++ b/src/components/Topic/FloorHeader.tsx @@ -1,9 +1,10 @@ import type { Topic } from '../../graphql/types.gen' import { Icon } from '../_shared/Icon' import './FloorHeader.scss' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' export default (props: { topic: Topic; color: string }) => { + const { t } = useLocalize() return ( <> <h3 class="col-sm-6">{props.topic.title}</h3> diff --git a/src/components/Topic/Full.tsx b/src/components/Topic/Full.tsx index 21385da3..893731d9 100644 --- a/src/components/Topic/Full.tsx +++ b/src/components/Topic/Full.tsx @@ -3,9 +3,10 @@ import type { Topic } from '../../graphql/types.gen' import { FollowingEntity } from '../../graphql/types.gen' import styles from './Full.module.scss' import { follow, unfollow } from '../../stores/zine/common' -import { t } from '../../utils/intl' + import { clsx } from 'clsx' import { useSession } from '../../context/session' +import { useLocalize } from '../../context/localize' type Props = { topic: Topic @@ -13,37 +14,33 @@ type Props = { export const FullTopic = (props: Props) => { const { session } = useSession() - + const { t } = useLocalize() const subscribed = createMemo(() => session()?.news?.topics?.includes(props.topic?.slug)) return ( - <div class={styles.topicFull}> - <Show when={!!props.topic?.slug}> - <div class={clsx(styles.topicHeader, 'col-md-8 col-lg-6 offset-md-2 offset-lg-3')}> - <h1>#{props.topic.title}</h1> - <p>{props.topic.body}</p> - <div class={clsx(styles.topicActions)}> - <Show when={!subscribed()}> - <button - onClick={() => follow({ what: FollowingEntity.Topic, slug: props.topic.slug })} - class="button" - > - {t('Follow the topic')} - </button> - </Show> - <Show when={subscribed()}> - <button - onClick={() => unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug })} - class="button" - > - {t('Unfollow the topic')} - </button> - </Show> - <a href={`/create/${props.topic.slug}`}>{t('Write about the topic')}</a> - </div> - <Show when={props.topic.pic}> - <img src={props.topic.pic} alt={props.topic.title} /> - </Show> - </div> + <div class={clsx(styles.topicHeader, 'col-md-8 col-lg-6 offset-md-2 offset-lg-3')}> + <h1>#{props.topic.title}</h1> + <p>{props.topic.body}</p> + <div class={clsx(styles.topicActions)}> + <Show when={!subscribed()}> + <button + onClick={() => follow({ what: FollowingEntity.Topic, slug: props.topic.slug })} + class="button" + > + {t('Follow the topic')} + </button> + </Show> + <Show when={subscribed()}> + <button + onClick={() => unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug })} + class="button" + > + {t('Unfollow the topic')} + </button> + </Show> + <a href={`/create/${props.topic.slug}`}>{t('Write about the topic')}</a> + </div> + <Show when={props.topic.pic}> + <img src={props.topic.pic} alt={props.topic.title} /> </Show> </div> ) diff --git a/src/components/Views/AllAuthors.tsx b/src/components/Views/AllAuthors.tsx index d4e49671..3ca9d269 100644 --- a/src/components/Views/AllAuthors.tsx +++ b/src/components/Views/AllAuthors.tsx @@ -1,16 +1,16 @@ import { createEffect, createMemo, createSignal, For, onMount, Show } from 'solid-js' import type { Author } from '../../graphql/types.gen' -import { t } from '../../utils/intl' + import { setAuthorsSort, useAuthorsStore } from '../../stores/zine/authors' import { useRouter } from '../../stores/router' import { AuthorCard } from '../Author/Card' import { clsx } from 'clsx' import { useSession } from '../../context/session' -import { locale } from '../../stores/ui' import { translit } from '../../utils/ru2en' import styles from '../../styles/AllTopics.module.scss' import { SearchField } from '../_shared/SearchField' import { scrollHandler } from '../../utils/scroll' +import { useLocalize } from '../../context/localize' type AllAuthorsPageSearchParams = { by: '' | 'name' | 'shouts' | 'followers' @@ -24,6 +24,7 @@ const PAGE_SIZE = 20 const ALPHABET = [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ@'] export const AllAuthorsView = (props: AllAuthorsViewProps) => { + const { t, lang } = useLocalize() const [limit, setLimit] = createSignal(PAGE_SIZE) const { searchParams, changeSearchParam } = useRouter<AllAuthorsPageSearchParams>() const { sortedAuthors } = useAuthorsStore({ @@ -49,7 +50,7 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => { return sortedAuthors().reduce((acc, author) => { let letter = author.name.trim().split(' ').pop().at(0).toUpperCase() - if (/[^ËА-яё]/.test(letter) && locale() === 'ru') letter = '@' + if (/[^ËА-яё]/.test(letter) && lang() === 'ru') letter = '@' if (!acc[letter]) acc[letter] = [] @@ -74,7 +75,7 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => { return sortedAuthors() } - if (locale() === 'ru') q = translit(q) + if (lang() === 'ru') q = translit(q) return sortedAuthors().filter((author) => { if (author.slug.split('-').some((w) => w.startsWith(q))) { @@ -82,7 +83,7 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => { } let name = author.name.toLowerCase() - if (locale() === 'ru') { + if (lang() === 'ru') { name = translit(name) } @@ -93,7 +94,7 @@ export const AllAuthorsView = (props: AllAuthorsViewProps) => { const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE) const AllAuthorsHead = () => ( <div class="row"> - <div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}> + <div class={clsx('col-lg-10', 'col-xl-9')}> <h1>{t('Authors')}</h1> <p>{t('Subscribe who you like to tune your personal feed')}</p> diff --git a/src/components/Views/AllTopics.tsx b/src/components/Views/AllTopics.tsx index 4d9b49e4..60de144d 100644 --- a/src/components/Views/AllTopics.tsx +++ b/src/components/Views/AllTopics.tsx @@ -1,17 +1,17 @@ import { createEffect, createMemo, createSignal, For, onMount, Show } from 'solid-js' import type { Topic } from '../../graphql/types.gen' -import { t } from '../../utils/intl' + import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics' import { useRouter } from '../../stores/router' import { TopicCard } from '../Topic/Card' import { clsx } from 'clsx' import { useSession } from '../../context/session' -import { locale } from '../../stores/ui' import { translit } from '../../utils/ru2en' import styles from '../../styles/AllTopics.module.scss' import { SearchField } from '../_shared/SearchField' import { scrollHandler } from '../../utils/scroll' import { StatMetrics } from '../_shared/StatMetrics' +import { useLocalize } from '../../context/localize' type AllTopicsPageSearchParams = { by: 'shouts' | 'authors' | 'title' | '' @@ -25,6 +25,7 @@ const PAGE_SIZE = 20 const ALPHABET = [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ#'] export const AllTopicsView = (props: AllTopicsViewProps) => { + const { t, lang } = useLocalize() const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>() const [limit, setLimit] = createSignal(PAGE_SIZE) @@ -48,7 +49,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => { const byLetter = createMemo<{ [letter: string]: Topic[] }>(() => { return sortedTopics().reduce((acc, topic) => { let letter = topic.title[0].toUpperCase() - if (/[^ËА-яё]/.test(letter) && locale() === 'ru') letter = '#' + if (/[^ËА-яё]/.test(letter) && lang() === 'ru') letter = '#' if (!acc[letter]) acc[letter] = [] acc[letter].push(topic) return acc @@ -75,7 +76,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => { return sortedTopics() } - if (locale() === 'ru') { + if (lang() === 'ru') { q = translit(q) } @@ -85,7 +86,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => { } let title = topic.title.toLowerCase() - if (locale() === 'ru') { + if (lang() === 'ru') { title = translit(title) } @@ -95,7 +96,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => { const AllTopicsHead = () => ( <div class="row"> - <div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}> + <div class={clsx('col-lg-10 col-xl-9')}> <h1>{t('Topics')}</h1> <p>{t('Subscribe what you like to tune your personal feed')}</p> diff --git a/src/components/Views/Article.tsx b/src/components/Views/Article.tsx index 7e982677..996fc513 100644 --- a/src/components/Views/Article.tsx +++ b/src/components/Views/Article.tsx @@ -1,28 +1,10 @@ -import { onMount, Show, Suspense } from 'solid-js' import { FullArticle } from '../Article/FullArticle' -import { t } from '../../utils/intl' -import type { Shout, Reaction } from '../../graphql/types.gen' +import type { Shout } from '../../graphql/types.gen' interface ArticlePageProps { article: Shout - reactions?: Reaction[] } export const ArticleView = (props: ArticlePageProps) => { - onMount(() => { - const script = document.createElement('script') - script.async = true - script.src = 'https://ackee.discours.io/increment.js' - script.dataset.ackeeServer = 'https://ackee.discours.io' - script.dataset.ackeeDomainId = '1004abeb-89b2-4e85-ad97-74f8d2c8ed2d' - document.body.appendChild(script) - }) - - return ( - <Show fallback={<div class="center">{t('Loading')}</div>} when={props.article}> - <Suspense> - <FullArticle article={props.article} /> - </Suspense> - </Show> - ) + return <FullArticle article={props.article} /> } diff --git a/src/components/Views/Author.tsx b/src/components/Views/Author.tsx index 4e048b5d..b9f14f3a 100644 --- a/src/components/Views/Author.tsx +++ b/src/components/Views/Author.tsx @@ -3,7 +3,7 @@ import type { Author, Shout } from '../../graphql/types.gen' import { Row1 } from '../Feed/Row1' import { Row2 } from '../Feed/Row2' import { AuthorFull } from '../Author/Full' -import { t } from '../../utils/intl' + import { useAuthorsStore } from '../../stores/zine/authors' import { loadShouts, useArticlesStore } from '../../stores/zine/articles' import { useRouter } from '../../stores/router' @@ -18,15 +18,12 @@ import { Popup } from '../_shared/Popup' import { AuthorCard } from '../Author/Card' import { apiClient } from '../../utils/apiClient' import { Comment } from '../Article/Comment' -import DialogAvatar from '../Inbox/DialogAvatar' +import { useLocalize } from '../../context/localize' -// TODO: load reactions on client type AuthorProps = { shouts: Shout[] author: Author authorSlug: string - // FIXME author topics from server - // topics: Topic[] } type AuthorPageSearchParams = { @@ -34,9 +31,10 @@ type AuthorPageSearchParams = { } export const PRERENDERED_ARTICLES_COUNT = 12 -const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3 +const LOAD_MORE_PAGE_SIZE = 9 export const AuthorView = (props: AuthorProps) => { + const { t } = useLocalize() const { sortedArticles } = useArticlesStore({ shouts: props.shouts }) @@ -75,27 +73,25 @@ export const AuthorView = (props: AuthorProps) => { } }) - const title = createMemo(() => { - const m = searchParams().by - if (m === 'viewed') return t('Top viewed') - if (m === 'rating') return t('Top rated') - if (m === 'commented') return t('Top discussed') - return t('Top recent') - }) + // TODO: use title + // const title = createMemo(() => { + // const m = searchParams().by + // if (m === 'viewed') return t('Top viewed') + // if (m === 'rating') return t('Top rated') + // if (m === 'commented') return t('Top discussed') + // return t('Top recent') + // }) const pages = createMemo<Shout[][]>(() => splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE) ) - console.log('!!! authorEntities():', author()) const [commented, setCommented] = createSignal([]) createEffect(async () => { if (searchParams().by === 'commented') { try { const data = await apiClient.getReactionsBy({ - by: { comment: true, createdBy: props.authorSlug }, - limit: 100, - offset: 0 + by: { comment: true, createdBy: props.authorSlug } }) setCommented(data) } catch (error) { @@ -106,142 +102,140 @@ export const AuthorView = (props: AuthorProps) => { return ( <div class="author-page"> - <Show when={author()} fallback={<div class="center">{t('Loading')}</div>}> - <div class="wide-container"> - <AuthorFull author={author()} /> - <div class="row group__controls"> - <div class="col-md-8"> - <ul class="view-switcher"> - <li classList={{ selected: searchParams().by === 'rating' }}> - <button type="button" onClick={() => changeSearchParam('by', 'rating')}> - {t('Publications')} - </button> - </li> - <li classList={{ selected: searchParams().by === 'followed' }}> - <button type="button" onClick={() => changeSearchParam('by', 'followed')}> - {t('Followers')} - </button> - </li> - <li classList={{ selected: searchParams().by === 'commented' }}> - <button type="button" onClick={() => changeSearchParam('by', 'commented')}> - {t('Comments')} - </button> - </li> - {/* + <div class="wide-container"> + <AuthorFull author={author()} /> + <div class="row group__controls"> + <div class="col-md-8"> + <ul class="view-switcher"> + <li classList={{ selected: searchParams().by === 'rating' }}> + <button type="button" onClick={() => changeSearchParam('by', 'rating')}> + {t('Publications')} + </button> + </li> + <li classList={{ selected: searchParams().by === 'followed' }}> + <button type="button" onClick={() => changeSearchParam('by', 'followed')}> + {t('Followers')} + </button> + </li> + <li classList={{ selected: searchParams().by === 'commented' }}> + <button type="button" onClick={() => changeSearchParam('by', 'commented')}> + {t('Comments')} + </button> + </li> + {/* <li classList={{ selected: searchParams().by === 'popular' }}> <button type="button" onClick={() => changeSearchParam('by', 'popular')}> Популярное </button> </li> */} - <li classList={{ selected: searchParams().by === 'about' }}> - <button type="button" onClick={() => changeSearchParam('by', 'about')}> - О себе - </button> - </li> + <li classList={{ selected: searchParams().by === 'about' }}> + <button type="button" onClick={() => changeSearchParam('by', 'about')}> + О себе + </button> + </li> + </ul> + </div> + <div class={clsx('col-md-4', styles.additionalControls)}> + <Popup + {...props} + trigger={ + <div class={styles.subscribers}> + <Switch> + <Match when={followers().length <= 3}> + <For each={followers().slice(0, 3)}> + {(f) => <Userpic user={f} class={styles.userpic} />} + </For> + </Match> + <Match when={followers().length > 3}> + <For each={followers().slice(0, 2)}> + {(f) => <Userpic user={f} class={styles.userpic} />} + </For> + <div class={clsx(styles.userpic, styles.subscribersCounter)}> + {followers().length} + </div> + </Match> + </Switch> + </div> + } + variant="tiny" + > + <ul class={clsx('nodash', styles.subscribersList)}> + <For each={followers()}> + {(item: Author) => ( + <li class={styles.subscriber}> + <AuthorCard + author={item} + isNowrap={true} + hideDescription={true} + hideFollow={true} + hasLink={true} + /> + </li> + )} + </For> </ul> - </div> - <div class={clsx('col-md-4', styles.additionalControls)}> - <Popup - {...props} - trigger={ - <div class={styles.subscribers}> - <Switch> - <Match when={followers().length <= 3}> - <For each={followers().slice(0, 3)}> - {(f) => <Userpic user={f} class={styles.userpic} />} - </For> - </Match> - <Match when={followers().length > 3}> - <For each={followers().slice(0, 2)}> - {(f) => <Userpic user={f} class={styles.userpic} />} - </For> - <div class={clsx(styles.userpic, styles.subscribersCounter)}> - {followers().length} - </div> - </Match> - </Switch> - </div> - } - variant="tiny" - > - <ul class={clsx('nodash', styles.subscribersList)}> - <For each={followers()}> - {(item: Author) => ( - <li class={styles.subscriber}> - <AuthorCard - author={item} - isNowrap={true} - hideDescription={true} - hideFollow={true} - hasLink={true} - /> - </li> - )} - </For> - </ul> - </Popup> + </Popup> - <div class={styles.ratingContainer}> - {t('Karma')} - <RatingControl rating={19} class={styles.ratingControl} /> - </div> + <div class={styles.ratingContainer}> + {t('Karma')} + <RatingControl rating={19} class={styles.ratingControl} /> </div> </div> </div> + </div> - <Switch - fallback={ - <div class="wide-container"> - <p>{t('Nothing here yet')}</p> - </div> - } - > - <Match when={searchParams().by === 'about'}> - <div class="wide-container"> - <Show when={authorEntities()[author().slug].bio}> - <p>{authorEntities()[author().slug].bio}</p> - </Show> - </div> - </Match> - <Match when={searchParams().by === 'commented'}> - <div class="wide-container"> - <ul class={stylesArticle.comments}> - <For each={commented()}>{(comment) => <Comment comment={comment} />}</For> - </ul> - </div> - </Match> - <Match when={searchParams().by === 'rating'}> - <Row1 article={sortedArticles()[0]} /> - <Row2 articles={sortedArticles().slice(1, 3)} isEqual={true} /> - <Row1 article={sortedArticles()[3]} /> - <Row2 articles={sortedArticles().slice(4, 6)} isEqual={true} /> - <Row1 article={sortedArticles()[6]} /> - <Row2 articles={sortedArticles().slice(7, 9)} isEqual={true} /> - - <For each={pages()}> - {(page) => ( - <> - <Row1 article={page[0]} /> - <Row2 articles={page.slice(1, 3)} isEqual={true} /> - <Row1 article={page[3]} /> - <Row2 articles={page.slice(4, 6)} isEqual={true} /> - <Row1 article={page[6]} /> - <Row2 articles={page.slice(7, 9)} isEqual={true} /> - </> - )} - </For> - - <Show when={isLoadMoreButtonVisible()}> - <p class="load-more-container"> - <button class="button" onClick={loadMore}> - {t('Load more')} - </button> - </p> + <Switch + fallback={ + <div class="wide-container"> + <p>{t('Nothing here yet')}</p> + </div> + } + > + <Match when={searchParams().by === 'about'}> + <div class="wide-container"> + <Show when={author().bio}> + <p>{author().bio}</p> </Show> - </Match> - </Switch> - </Show> + </div> + </Match> + <Match when={searchParams().by === 'commented'}> + <div class="wide-container"> + <ul class={stylesArticle.comments}> + <For each={commented()}>{(comment) => <Comment comment={comment} />}</For> + </ul> + </div> + </Match> + <Match when={searchParams().by === 'rating'}> + <Row1 article={sortedArticles()[0]} /> + <Row2 articles={sortedArticles().slice(1, 3)} isEqual={true} /> + <Row1 article={sortedArticles()[3]} /> + <Row2 articles={sortedArticles().slice(4, 6)} isEqual={true} /> + <Row1 article={sortedArticles()[6]} /> + <Row2 articles={sortedArticles().slice(7, 9)} isEqual={true} /> + + <For each={pages()}> + {(page) => ( + <> + <Row1 article={page[0]} /> + <Row2 articles={page.slice(1, 3)} isEqual={true} /> + <Row1 article={page[3]} /> + <Row2 articles={page.slice(4, 6)} isEqual={true} /> + <Row1 article={page[6]} /> + <Row2 articles={page.slice(7, 9)} isEqual={true} /> + </> + )} + </For> + + <Show when={isLoadMoreButtonVisible()}> + <p class="load-more-container"> + <button class="button" onClick={loadMore}> + {t('Load more')} + </button> + </p> + </Show> + </Match> + </Switch> </div> ) } diff --git a/src/components/Views/Create.tsx b/src/components/Views/Create.tsx index 98bd9848..bf375797 100644 --- a/src/components/Views/Create.tsx +++ b/src/components/Views/Create.tsx @@ -1,14 +1,16 @@ import { lazy, Suspense } from 'solid-js' -import { t } from '../../utils/intl' -import { Loading } from '../Loading' +import { Loading } from '../_shared/Loading' +import { useLocalize } from '../../context/localize' const Editor = lazy(() => import('../EditorNew/Editor')) -const newArticleIpsum = `<h1>${t('Header')}</h1> - <h2>${t('Subheader')}</h2> - <p>${t('A short introduction to keep the reader interested')}</p>` - export const CreateView = () => { + const { t } = useLocalize() + + const newArticleIpsum = `<h1>${t('Header')}</h1> + <h2>${t('Subheader')}</h2> + <p>${t('A short introduction to keep the reader interested')}</p>` + return ( <Suspense fallback={<Loading />}> <Editor initialContent={newArticleIpsum} /> diff --git a/src/components/Views/Feed.tsx b/src/components/Views/Feed.tsx index 85240624..b5ae5444 100644 --- a/src/components/Views/Feed.tsx +++ b/src/components/Views/Feed.tsx @@ -4,11 +4,10 @@ import stylesBeside from '../../components/Feed/Beside.module.scss' import { Icon } from '../_shared/Icon' import { ArticleCard } from '../Feed/Card' import { AuthorCard } from '../Author/Card' -import { t } from '../../utils/intl' + import { FeedSidebar } from '../Feed/Sidebar' import { Comment as CommentCard } from '../Article/Comment' import { loadShouts, useArticlesStore } from '../../stores/zine/articles' -import { useReactionsStore } from '../../stores/zine/reactions' import { useAuthorsStore } from '../../stores/zine/authors' import { useTopicsStore } from '../../stores/zine/topics' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' @@ -16,41 +15,46 @@ import { useSession } from '../../context/session' import stylesTopic from '../Feed/CardTopic.module.scss' import styles from './Feed.module.scss' import { clsx } from 'clsx' - -// const AUTHORSHIP_REACTIONS = [ -// ReactionKind.Accept, -// ReactionKind.Reject, -// ReactionKind.Propose, -// ReactionKind.Ask -// ] +import { useReactions } from '../../context/reactions' +import type { Reaction } from '../../graphql/types.gen' +import { getPagePath } from '@nanostores/router' +import { router } from '../../stores/router' +import { useLocalize } from '../../context/localize' export const FEED_PAGE_SIZE = 20 export const FeedView = () => { + const { t } = useLocalize() + // state const { sortedArticles } = useArticlesStore() - const { sortedReactions: topComments, loadReactionsBy } = useReactionsStore() const { sortedAuthors } = useAuthorsStore() const { topTopics } = useTopicsStore() const { topAuthors } = useTopAuthorsStore() const { session } = useSession() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) + const [topComments, setTopComments] = createSignal<Reaction[]>([]) - const collaborativeShouts = createMemo(() => - sortedArticles().filter((shout) => shout.visibility === 'authors') - ) - createEffect(async () => { - if (collaborativeShouts()) { - // load reactions on collaborativeShouts - await loadReactionsBy({ by: { shouts: [...collaborativeShouts()] }, limit: 5 }) - } - }) + const { + actions: { loadReactionsBy } + } = useReactions() - const userslug = createMemo(() => session()?.user?.slug) + // TODO: + // const collaborativeShouts = createMemo(() => + // sortedArticles().filter((shout) => shout.visibility === 'authors') + // ) + + // createEffect(async () => { + // if (collaborativeShouts()) { + // await loadReactionsBy({ by: { shouts: collaborativeShouts().map((shout) => shout.slug) }, limit: 5 }) + // } + // }) + + const userSlug = createMemo(() => session()?.user?.slug) createEffect(async () => { - if (userslug()) { + if (userSlug()) { // load recent editing shouts ( visibility = authors ) - await loadShouts({ filters: { author: userslug(), visibility: 'authors' }, limit: 15 }) + await loadShouts({ filters: { author: userSlug(), visibility: 'authors' }, limit: 15 }) } }) @@ -64,11 +68,11 @@ export const FeedView = () => { } onMount(async () => { - // load 5 recent comments overall - await loadReactionsBy({ by: { comment: true }, limit: 5, offset: 0 }) - // load recent shouts not only published ( visibility = community ) - await loadMore() + loadMore() + // load 5 recent comments overall + const comments = await loadReactionsBy({ by: { comment: true }, limit: 5 }) + setTopComments(comments) }) return ( @@ -131,8 +135,7 @@ export const FeedView = () => { <section class={styles.asideSection}> <h4>{t('Comments')}</h4> <For each={topComments()}> - {/*FIXME: different components/better comment props*/} - {(comment) => <CommentCard comment={comment} reactions={[]} compact={true} />} + {(comment) => <CommentCard comment={comment} compact={true} />} </For> </section> @@ -153,7 +156,7 @@ export const FeedView = () => { <Icon name="pin" class={styles.icon} /> <ul class="nodash"> <li> - <a href="/about/guide">Как устроен Дискурс</a> + <a href={getPagePath(router, 'guide')}>Как устроен Дискурс</a> </li> <li> <a href="/how-to-write-a-good-article">Как создать хороший текст</a> @@ -162,7 +165,7 @@ export const FeedView = () => { <a href="#">Правила конструктивных дискуссий</a> </li> <li> - <a href="/about/principles">Принципы сообщества</a> + <a href={getPagePath(router, 'principles')}>Принципы сообщества</a> </li> </ul> </section> diff --git a/src/components/Views/FeedSettings.tsx b/src/components/Views/FeedSettings.tsx index 3175933f..5c60c1b8 100644 --- a/src/components/Views/FeedSettings.tsx +++ b/src/components/Views/FeedSettings.tsx @@ -1,11 +1,12 @@ import styles from '../../styles/FeedSettings.module.scss' -import { t } from '../../utils/intl' +import { useLocalize } from '../../context/localize' // type FeedSettingsSearchParams = { // by: '' | 'topics' | 'authors' | 'reacted' // } export const FeedSettingsView = (_props) => { + const { t } = useLocalize() return ( <div class="container"> <h1>{t('Feed settings')}</h1> diff --git a/src/components/Views/FourOuFour.tsx b/src/components/Views/FourOuFour.tsx index ef6e43e6..6e29f7ec 100644 --- a/src/components/Views/FourOuFour.tsx +++ b/src/components/Views/FourOuFour.tsx @@ -1,9 +1,10 @@ -import { t } from '../../utils/intl' import { Icon } from '../_shared/Icon' import styles from '../../styles/FourOuFour.module.scss' import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' export const FourOuFourView = (_props) => { + const { t } = useLocalize() return ( <div class={styles.errorPageWrapper}> <div class={styles.errorPage}> diff --git a/src/components/Views/Home.tsx b/src/components/Views/Home.tsx index 297de3bf..b19a966b 100644 --- a/src/components/Views/Home.tsx +++ b/src/components/Views/Home.tsx @@ -11,7 +11,7 @@ import RowShort from '../Feed/RowShort' import Slider from '../_shared/Slider' import Group from '../Feed/Group' import type { Shout, Topic } from '../../graphql/types.gen' -import { t } from '../../utils/intl' + import { useTopicsStore } from '../../stores/zine/topics' import { loadShouts, @@ -20,10 +20,10 @@ import { useArticlesStore } from '../../stores/zine/articles' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' -import { locale } from '../../stores/ui' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { splitToPages } from '../../utils/splitToPages' import { ArticleCard } from '../Feed/Card' +import { useLocalize } from '../../context/localize' type HomeProps = { randomTopics: Topic[] @@ -51,6 +51,7 @@ export const HomeView = (props: HomeProps) => { }) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const { topAuthors } = useTopAuthorsStore() + const { t } = useLocalize() onMount(async () => { loadTopArticles() @@ -104,7 +105,7 @@ export const HomeView = (props: HomeProps) => { ) return ( - <Show when={locale() && sortedArticles().length > 0}> + <Show when={sortedArticles().length > 0}> <NavTopics topics={randomTopics()} /> <Row5 articles={sortedArticles().slice(0, 5)} nodate={true} /> diff --git a/src/components/Views/Inbox.tsx b/src/components/Views/Inbox.tsx index eefeee63..46d908e3 100644 --- a/src/components/Views/Inbox.tsx +++ b/src/components/Views/Inbox.tsx @@ -2,7 +2,7 @@ import { For, createSignal, Show, onMount, createEffect, createMemo } from 'soli import type { Author, Chat, Message as MessageType } from '../../graphql/types.gen' import DialogCard from '../Inbox/DialogCard' import Search from '../Inbox/Search' -import Message from '../Inbox/Message' +import { Message } from '../Inbox/Message' import CreateModalContent from '../Inbox/CreateModalContent' import DialogHeader from '../Inbox/DialogHeader' import MessagesFallback from '../Inbox/MessagesFallback' @@ -10,13 +10,14 @@ import QuotedMessage from '../Inbox/QuotedMessage' import { Icon } from '../_shared/Icon' import { useSession } from '../../context/session' import { loadRecipients } from '../../stores/inbox' -import { t } from '../../utils/intl' + import { Modal } from '../Nav/Modal' import { showModal } from '../../stores/ui' import { useInbox } from '../../context/inbox' import { useRouter } from '../../stores/router' import { clsx } from 'clsx' import styles from '../../styles/Inbox.module.scss' +import { useLocalize } from '../../context/localize' type InboxSearchParams = { initChat: string @@ -30,6 +31,7 @@ type InboxSearchParams = { // } export const InboxView = () => { + const { t } = useLocalize() const { chats, messages, @@ -37,7 +39,7 @@ export const InboxView = () => { } = useInbox() const [recipients, setRecipients] = createSignal<Author[]>([]) - const [postMessageText, setPostMessageText] = createSignal('') + const [postMessageText, setPostMessageText] = createSignal<string>('') const [sortByGroup, setSortByGroup] = createSignal<boolean>(false) const [sortByPerToPer, setSortByPerToPer] = createSignal<boolean>(false) const [currentDialog, setCurrentDialog] = createSignal<Chat>() @@ -143,9 +145,9 @@ export const InboxView = () => { return b.updatedAt - a.updatedAt }) if (sortByPerToPer()) { - return sorted.filter((chat) => Boolean(chat.title?.trim())) + return sorted.filter((chat) => (chat.title || '').trim().length === 0) } else if (sortByGroup()) { - return sorted.filter((chat) => chat.title?.trim().length > 0) + return sorted.filter((chat) => (chat.title || '').trim().length > 0) } else { return sorted } diff --git a/src/components/Views/Search.tsx b/src/components/Views/Search.tsx index 804f300f..313766e8 100644 --- a/src/components/Views/Search.tsx +++ b/src/components/Views/Search.tsx @@ -2,10 +2,11 @@ import { Show, For, createSignal } from 'solid-js' import '../../styles/Search.scss' import type { Shout } from '../../graphql/types.gen' import { ArticleCard } from '../Feed/Card' -import { t } from '../../utils/intl' + import { loadShouts, useArticlesStore } from '../../stores/zine/articles' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { useRouter } from '../../stores/router' +import { useLocalize } from '../../context/localize' type SearchPageSearchParams = { by: '' | 'relevance' | 'rating' @@ -19,6 +20,7 @@ type Props = { const LOAD_MORE_PAGE_SIZE = 50 export const SearchView = (props: Props) => { + const { t } = useLocalize() const { sortedArticles } = useArticlesStore({ shouts: props.results }) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const [query, setQuery] = createSignal(props.query) diff --git a/src/components/Views/Topic.tsx b/src/components/Views/Topic.tsx index 8869a424..7c741b58 100644 --- a/src/components/Views/Topic.tsx +++ b/src/components/Views/Topic.tsx @@ -5,7 +5,7 @@ import { Row2 } from '../Feed/Row2' import { Beside } from '../Feed/Beside' import styles from '../../styles/Topic.module.scss' import { FullTopic } from '../Topic/Full' -import { t } from '../../utils/intl' + import { useRouter } from '../../stores/router' import { useTopicsStore } from '../../stores/zine/topics' import { loadShouts, useArticlesStore } from '../../stores/zine/articles' @@ -16,6 +16,7 @@ import { clsx } from 'clsx' import Slider from '../_shared/Slider' import { Row1 } from '../Feed/Row1' import { ArticleCard } from '../Feed/Card' +import { useLocalize } from '../../context/localize' type TopicsPageSearchParams = { by: 'comments' | '' | 'recent' | 'viewed' | 'rating' | 'commented' @@ -31,6 +32,7 @@ export const PRERENDERED_ARTICLES_COUNT = 28 const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3 export const TopicView = (props: TopicProps) => { + const { t } = useLocalize() const { searchParams, changeSearchParam } = useRouter<TopicsPageSearchParams>() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) diff --git a/src/components/_shared/Button/Button.tsx b/src/components/_shared/Button/Button.tsx index 5a3fb3fa..eee81efe 100644 --- a/src/components/_shared/Button/Button.tsx +++ b/src/components/_shared/Button/Button.tsx @@ -12,7 +12,7 @@ type Props = { onClick?: () => void } -const Button = (props: Props) => { +export const Button = (props: Props) => { return ( <button onClick={props.onClick} @@ -26,5 +26,3 @@ const Button = (props: Props) => { </button> ) } - -export default Button diff --git a/src/components/_shared/Button/index.ts b/src/components/_shared/Button/index.ts index 3389ecb8..4d0a670f 100644 --- a/src/components/_shared/Button/index.ts +++ b/src/components/_shared/Button/index.ts @@ -1 +1 @@ -export { default } from './Button' +export { Button } from './Button' diff --git a/src/components/_shared/CommentEditor/CommentEditor.tsx b/src/components/_shared/CommentEditor/CommentEditor.tsx index ea07ece9..819627cf 100644 --- a/src/components/_shared/CommentEditor/CommentEditor.tsx +++ b/src/components/_shared/CommentEditor/CommentEditor.tsx @@ -1,10 +1,9 @@ import styles from './styles/CommentEditor.module.scss' import './styles/ProseMirrorOverrides.scss' import { clsx } from 'clsx' -import Button from '../Button' -import { createEffect, onMount, Show } from 'solid-js' -import { t } from '../../../utils/intl' -//ProseMirror deps +import { Button } from '../Button' +import { createEffect, onMount } from 'solid-js' +// ProseMirror deps import { schema } from './schema' import { EditorState } from 'prosemirror-state' import { EditorView } from 'prosemirror-view' @@ -16,7 +15,7 @@ import { baseKeymap } from 'prosemirror-commands' import { customKeymap } from '../../EditorNew/prosemirror/plugins/customKeymap' import { placeholder } from '../../EditorNew/prosemirror/plugins/placeholder' import { undo, redo, history } from 'prosemirror-history' -import { useSession } from '../../../context/session' +import { useLocalize } from '../../../context/localize' type Props = { placeholder?: string @@ -33,7 +32,7 @@ const getHtml = (state: EditorState) => { } const CommentEditor = (props: Props) => { - const { session } = useSession() + const { t } = useLocalize() const editorElRef: { current: HTMLDivElement } = { current: null } const menuElRef: { current: HTMLDivElement } = { current: null } const editorViewRef: { current: EditorView } = { current: null } @@ -50,7 +49,7 @@ const CommentEditor = (props: Props) => { history(), customKeymap(), placeholder(props.placeholder), - keymap({ 'Mod-z': undo, 'Mod-Shift-z': undo, 'Mod-Shift-y': redo, 'Mod-y': redo }), + keymap({ 'Mod-z': undo, 'Mod-Shift-z': redo, 'Mod-y': redo }), keymap(baseKeymap) ] }) @@ -79,35 +78,16 @@ const CommentEditor = (props: Props) => { }) return ( - <> - <Show - when={session()?.user?.slug} - fallback={ - <div class={styles.signInMessage} id="comments"> - {t('To write a comment, you must')}  - <a href="?modal=auth&mode=register">{t('sign up')}</a> -  {t('or')}  - <a href="?modal=auth&mode=login">{t('sign in')}</a> - </div> - } - > - <div class={styles.commentEditor}> - <div - class={clsx('ProseMirrorOverrides', styles.textarea)} - ref={(el) => (editorElRef.current = el)} - /> - <div class={styles.actions}> - <div class={styles.menu} ref={(el) => (menuElRef.current = el)} /> - <div class={styles.buttons}> - <Show when={session()?.user?.slug}> - <Button value={t('Send')} variant="primary" onClick={handleSubmitButtonClick} /> - </Show> - <Button value={t('cancel')} variant="secondary" onClick={clearEditor} /> - </div> - </div> + <div class={styles.commentEditor}> + <div class={clsx('ProseMirrorOverrides', styles.textarea)} ref={(el) => (editorElRef.current = el)} /> + <div class={styles.actions}> + <div class={styles.menu} ref={(el) => (menuElRef.current = el)} /> + <div class={styles.buttons}> + <Button value={t('Send')} variant="primary" onClick={handleSubmitButtonClick} /> + <Button value={t('cancel')} variant="secondary" onClick={clearEditor} /> </div> - </Show> - </> + </div> + </div> ) } diff --git a/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss b/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss index 040c0eed..4b5172cf 100644 --- a/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss +++ b/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss @@ -24,21 +24,3 @@ } } } - -.signInMessage { - background: #f1f2f3; - border-radius: 8px; - padding: 16px; - text-align: center; - font-size: 20px; - - .link { - color: #2638d9; - cursor: pointer; - transition: 0.3s ease-in-out; - - &:hover { - text-decoration: unset; - } - } -} diff --git a/src/components/Loading.module.scss b/src/components/_shared/Loading.module.scss similarity index 100% rename from src/components/Loading.module.scss rename to src/components/_shared/Loading.module.scss diff --git a/src/components/Loading.tsx b/src/components/_shared/Loading.tsx similarity index 100% rename from src/components/Loading.tsx rename to src/components/_shared/Loading.tsx diff --git a/src/components/Pages/HomePage.module.scss b/src/components/_shared/PageLayout.module.scss similarity index 61% rename from src/components/Pages/HomePage.module.scss rename to src/components/_shared/PageLayout.module.scss index bdf8a768..e391d0be 100644 --- a/src/components/Pages/HomePage.module.scss +++ b/src/components/_shared/PageLayout.module.scss @@ -1,3 +1,3 @@ -.mainContent { +.withPadding { padding-top: 100px; } diff --git a/src/components/_shared/PageWrap.tsx b/src/components/_shared/PageLayout.tsx similarity index 77% rename from src/components/_shared/PageWrap.tsx rename to src/components/_shared/PageLayout.tsx index 1352c1ab..10e7d688 100644 --- a/src/components/_shared/PageWrap.tsx +++ b/src/components/_shared/PageLayout.tsx @@ -2,11 +2,12 @@ import type { JSX } from 'solid-js' import { Header } from '../Nav/Header' import { Footer } from '../Discours/Footer' -import '../../styles/app.scss' import { Show } from 'solid-js' import { clsx } from 'clsx' +import '../../styles/app.scss' +import styles from './PageLayout.module.scss' -type PageWrapProps = { +type PageLayoutProps = { headerTitle?: string articleBody?: string cover?: string @@ -14,9 +15,10 @@ type PageWrapProps = { isHeaderFixed?: boolean hideFooter?: boolean class?: string + withPadding?: boolean } -export const PageWrap = (props: PageWrapProps) => { +export const PageLayout = (props: PageLayoutProps) => { const isHeaderFixed = props.isHeaderFixed === undefined ? true : props.isHeaderFixed return ( @@ -28,7 +30,9 @@ export const PageWrap = (props: PageWrapProps) => { isHeaderFixed={isHeaderFixed} /> <main - class={clsx('main-content', props.class)} + class={clsx('main-content', { + [styles.withPadding]: props.withPadding + })} classList={{ 'main-content--no-padding': !isHeaderFixed }} > {props.children} diff --git a/src/components/_shared/SearchField.tsx b/src/components/_shared/SearchField.tsx index e70b424e..8b1d91fe 100644 --- a/src/components/_shared/SearchField.tsx +++ b/src/components/_shared/SearchField.tsx @@ -1,7 +1,8 @@ import styles from './SearchField.module.scss' import { Icon } from './Icon' -import { t } from '../../utils/intl' + import { clsx } from 'clsx' +import { useLocalize } from '../../context/localize' type SearchFieldProps = { onChange: (value: string) => void @@ -10,7 +11,7 @@ type SearchFieldProps = { export const SearchField = (props: SearchFieldProps) => { const handleInputChange = (event) => props.onChange(event.target.value.trim()) - + const { t } = useLocalize() return ( <div class={clsx(styles.searchField, props.class)}> <label for="search-field"> diff --git a/src/components/_shared/ShowIfAuthenticated.tsx b/src/components/_shared/ShowIfAuthenticated.tsx new file mode 100644 index 00000000..62d49a81 --- /dev/null +++ b/src/components/_shared/ShowIfAuthenticated.tsx @@ -0,0 +1,18 @@ +import type { JSX } from 'solid-js' +import { Show } from 'solid-js' +import { useSession } from '../../context/session' + +type ShowIfAuthenticatedProps = { + children: JSX.Element + fallback?: JSX.Element +} + +export const ShowIfAuthenticated = (props: ShowIfAuthenticatedProps) => { + const { isAuthenticated } = useSession() + + return ( + <Show when={isAuthenticated()} fallback={props.fallback}> + {props.children} + </Show> + ) +} diff --git a/src/components/_shared/Slider.scss b/src/components/_shared/Slider.scss index 6d11f0f6..7438b45e 100644 --- a/src/components/_shared/Slider.scss +++ b/src/components/_shared/Slider.scss @@ -128,7 +128,7 @@ .slider-arrow-prev, .slider-arrow-next { - background: rgb(0 0 0 / 0.2); + background: rgb(0 0 0 / 20%); width: 5rem; } diff --git a/src/components/_shared/StatMetrics.tsx b/src/components/_shared/StatMetrics.tsx index b4a08ef6..ccd90388 100644 --- a/src/components/_shared/StatMetrics.tsx +++ b/src/components/_shared/StatMetrics.tsx @@ -1,9 +1,8 @@ -import { For } from 'solid-js' +import { createMemo, For } from 'solid-js' import type { Stat, TopicStat } from '../../graphql/types.gen' -import { locale } from '../../stores/ui' import { plural } from '../../utils' -import { t } from '../../utils/intl' import styles from './Stat.module.scss' +import { useLocalize } from '../../context/localize' interface StatMetricsProps { fields?: string[] @@ -27,6 +26,8 @@ const pseudonames = { } export const StatMetrics = (props: StatMetricsProps) => { + const { t, lang } = useLocalize() + return ( <div class={styles.statMetrics}> <For each={props.fields}> @@ -35,7 +36,7 @@ export const StatMetrics = (props: StatMetricsProps) => { {props.stat[entity] + ' ' + t(pseudonames[entity] || entity.slice(-1)) + - plural(props.stat[entity] || 0, locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's'])} + plural(props.stat[entity] || 0, lang() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's'])} </span> )} </For> diff --git a/src/context/localize.tsx b/src/context/localize.tsx new file mode 100644 index 00000000..e7202bfb --- /dev/null +++ b/src/context/localize.tsx @@ -0,0 +1,48 @@ +import type { i18n } from 'i18next' +import type { Accessor, JSX } from 'solid-js' +import { createContext, createEffect, createSignal, Show, useContext } from 'solid-js' +import { useRouter } from '../stores/router' +import i18next from 'i18next' +import Cookie from 'js-cookie' + +type LocalizeContextType = { + t: i18n['t'] + lang: Accessor<Language> + setLang: (lang: Language) => void +} + +export type Language = 'ru' | 'en' + +const LocalizeContext = createContext<LocalizeContextType>() + +export function useLocalize() { + return useContext(LocalizeContext) +} + +export const LocalizeProvider = (props: { children: JSX.Element }) => { + const [lang, setLang] = createSignal<Language>(i18next.language === 'en' ? 'en' : 'ru') + const { searchParams, changeSearchParam } = useRouter<{ lng: string }>() + + createEffect(() => { + if (!searchParams().lng) { + return + } + + const lng: Language = searchParams().lng === 'en' ? 'en' : 'ru' + + i18next.changeLanguage(lng) + setLang(lng) + Cookie.set('lng', lng) + changeSearchParam('lng', null) + }) + + const value: LocalizeContextType = { t: i18next.t, lang, setLang } + + return ( + <LocalizeContext.Provider value={value}> + <Show when={lang()} keyed={true}> + {props.children} + </Show> + </LocalizeContext.Provider> + ) +} diff --git a/src/context/reactions.tsx b/src/context/reactions.tsx new file mode 100644 index 00000000..bd3c7ba9 --- /dev/null +++ b/src/context/reactions.tsx @@ -0,0 +1,70 @@ +import type { JSX } from 'solid-js' +import { createContext, onCleanup, useContext } from 'solid-js' +import type { Reaction, ReactionBy, ReactionInput } from '../graphql/types.gen' +import { apiClient } from '../utils/apiClient' +import { createStore } from 'solid-js/store' + +type ReactionsContextType = { + reactionEntities: Record<number, Reaction> + actions: { + loadReactionsBy: ({ by, limit }: { by: ReactionBy; limit?: number }) => Promise<Reaction[]> + createReaction: (reaction: ReactionInput) => Promise<void> + updateReaction: (id: number, reaction: ReactionInput) => Promise<void> + deleteReaction: (id: number) => Promise<void> + } +} + +const ReactionsContext = createContext<ReactionsContextType>() + +export function useReactions() { + return useContext(ReactionsContext) +} + +export const ReactionsProvider = (props: { children: JSX.Element }) => { + const [reactionEntities, setReactionEntities] = createStore<Record<number, Reaction>>({}) + + const loadReactionsBy = async ({ + by, + limit + }: { + by: ReactionBy + limit?: number + }): Promise<Reaction[]> => { + const reactions = await apiClient.getReactionsBy({ by, limit }) + const newReactionEntities = reactions.reduce((acc, reaction) => { + acc[reaction.id] = reaction + return acc + }, {}) + setReactionEntities(newReactionEntities) + return reactions + } + + const createReaction = async (input: ReactionInput): Promise<void> => { + const reaction = await apiClient.createReaction(input) + setReactionEntities(reaction.id, reaction) + } + + const deleteReaction = async (id: number): Promise<void> => { + const reaction = await apiClient.destroyReaction(id) + console.debug('[deleteReaction]:', reaction.id) + setReactionEntities(({ [reaction.id]: _deletedReaction, ...rest }) => rest) + } + + const updateReaction = async (id: number, input: ReactionInput): Promise<void> => { + const reaction = await apiClient.updateReaction(id, input) + setReactionEntities(reaction.id, reaction) + } + + onCleanup(() => setReactionEntities({})) + + const actions = { + loadReactionsBy, + createReaction, + updateReaction, + deleteReaction + } + + const value: ReactionsContextType = { reactionEntities, actions } + + return <ReactionsContext.Provider value={value}>{props.children}</ReactionsContext.Provider> +} diff --git a/src/context/session.tsx b/src/context/session.tsx index 5c1ae4e7..1269e16d 100644 --- a/src/context/session.tsx +++ b/src/context/session.tsx @@ -3,8 +3,8 @@ import { createContext, createMemo, createResource, createSignal, onMount, useCo import type { AuthResult } from '../graphql/types.gen' import { apiClient } from '../utils/apiClient' import { resetToken, setToken } from '../graphql/privateGraphQLClient' -import { t } from '../utils/intl' import { useSnackbar } from './snackbar' +import { useLocalize } from './localize' type SessionContextType = { session: Resource<AuthResult> @@ -27,7 +27,7 @@ export function useSession() { export const SessionProvider = (props: { children: JSX.Element }) => { const [isSessionLoaded, setIsSessionLoaded] = createSignal(false) - + const { t } = useLocalize() const { actions: { showSnackbar } } = useSnackbar() diff --git a/src/env.d.ts b/src/env.d.ts index f964fe0c..11f02fe2 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1 @@ -/// <reference types="astro/client" /> +/// <reference types="vite/client" /> diff --git a/src/graphql/mutation/reaction-create.ts b/src/graphql/mutation/reaction-create.ts index 38194e76..c3150673 100644 --- a/src/graphql/mutation/reaction-create.ts +++ b/src/graphql/mutation/reaction-create.ts @@ -11,6 +11,15 @@ export default gql` range createdAt replyTo + stat { + rating + } + shout + createBy { + name + slug + userpic + } } } } diff --git a/src/graphql/privateGraphQLClient.ts b/src/graphql/privateGraphQLClient.ts index 98d4647b..5b414a22 100644 --- a/src/graphql/privateGraphQLClient.ts +++ b/src/graphql/privateGraphQLClient.ts @@ -37,7 +37,7 @@ export const resetToken = () => { } const options: ClientOptions = { - url: apiBaseUrl + '/graphql', + url: apiBaseUrl, maskTypename: true, requestPolicy: 'cache-and-network', fetchOptions: () => { @@ -57,7 +57,7 @@ export const privateGraphQLClient = createClient(options) export const createChatClient = () => { const subClient = createSubClient({ - url: (apiBaseUrl + '/messages').replace('http', 'ws') + url: apiBaseUrl.replace('http', 'ws') // + '/messages' }) const subExchange = subscriptionExchange({ diff --git a/src/graphql/publicGraphQLClient.ts b/src/graphql/publicGraphQLClient.ts index 43c7c959..50dec0c7 100644 --- a/src/graphql/publicGraphQLClient.ts +++ b/src/graphql/publicGraphQLClient.ts @@ -10,7 +10,7 @@ if (isDev) { } const options: ClientOptions = { - url: apiBaseUrl + '/graphql', + url: apiBaseUrl, maskTypename: true, requestPolicy: 'cache-and-network', exchanges diff --git a/src/graphql/query/author-reactions.ts b/src/graphql/query/author-reactions.ts deleted file mode 100644 index 0c1cfb37..00000000 --- a/src/graphql/query/author-reactions.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { gql } from '@urql/core' - -export default gql` - query ReactionsByAuthorQuery($author: String!, $limit: Int!, $offset: Int!) { - reactionsByAuthor(slug: $author, limit: $limit, offset: $offset) { - id - body - createdAt - updatedAt - replyTo { - id - createdBy { - slug - userpic - name - } - body - kind - } - kind - range - stat { - _id: viewed - viewed - reacted - rating - } - } - } -` diff --git a/src/graphql/query/reactions-load-by.ts b/src/graphql/query/reactions-load-by.ts index e404283d..421c651c 100644 --- a/src/graphql/query/reactions-load-by.ts +++ b/src/graphql/query/reactions-load-by.ts @@ -4,6 +4,7 @@ export default gql` query LoadReactions($by: ReactionBy!, $limit: Int, $offset: Int) { loadReactionsBy(by: $by, limit: $limit, offset: $offset) { id + kind body range replyTo @@ -19,6 +20,9 @@ export default gql` } createdAt updatedAt + stat { + rating + } } } ` diff --git a/src/graphql/types.gen.ts b/src/graphql/types.gen.ts index 94cb09eb..6d918c90 100644 --- a/src/graphql/types.gen.ts +++ b/src/graphql/types.gen.ts @@ -661,6 +661,7 @@ export type Subscription = { newMessage?: Maybe<Message> newReaction?: Maybe<Reaction> newShout?: Maybe<Shout> + newInvite?: Maybe<DraftCollab> } export type Token = { diff --git a/src/main.astro b/src/main.astro index f6b646b2..05fc5dc3 100644 --- a/src/main.astro +++ b/src/main.astro @@ -1,20 +1,14 @@ --- -import { setLocale } from './stores/ui' import './styles/app.scss' -import { t } from './utils/intl' import { Seo } from "astro-seo-meta" -// Setting locale for prerendered content here - -const lang = Astro.url.searchParams.get('lang') || 'ru' -console.log('[main.astro] astro runtime locale is', lang) -setLocale(lang) -const { protocol, host} = Astro.url -const title = Astro.props.title ?? t('Discours'); +const ln = Astro.url.searchParams.get('lng') || 'ru' +const { protocol, host } = Astro.url +const title = ln === 'ru' ? 'Дискурс' : 'Discours' const imageUrl = Astro.props.imageUrl ?? `${protocol}${host}/public/bonfire.png` -const description = Astro.props.description ?? t('Horizontal collaborative journalistic platform') +const description = ln === 'ru' ? 'Горизонтальная платформа коллаборативной журналистики' : 'Horizontal collaborative journalistic platform' --- -<html lang={lang || 'ru'}> +<html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> diff --git a/src/pages/404.astro b/src/pages/404.astro deleted file mode 100644 index 3fcad65b..00000000 --- a/src/pages/404.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../main.astro' -import { Root } from '../components/Root' -import { initRouter } from '../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - -<Prerendered> - <Root client:load /> -</Prerendered> diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro deleted file mode 100644 index c3f4a5a7..00000000 --- a/src/pages/[...slug].astro +++ /dev/null @@ -1,35 +0,0 @@ ---- -import { Root } from '../components/Root' -import Prerendered from '../main.astro' -import { apiClient } from '../utils/apiClient' -import { initRouter } from '../stores/router' -import {getDescription} from '../utils/meta' - - -const slug = Astro.params.slug?.toString() -if (slug.includes('.')) { - return Astro.redirect('/404') -} - -const article = await apiClient.getShout(slug) -if (!article) { - return Astro.redirect('/404') -} - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') - -const title = article.title -const imageUrl = article.cover ?? '' -const description = article.body ? getDescription(article.body) : '' ---- - -<Prerendered - title={title} - imageUrl={imageUrl} - description={description} -> - <Root article={article} client:load /> -</Prerendered> diff --git a/src/pages/about/discussion-rules.astro b/src/pages/about/discussion-rules.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/discussion-rules.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - -<Prerendered> - <Root client:load /> -</Prerendered> diff --git a/src/pages/about/discussionRules.page.route.ts b/src/pages/about/discussionRules.page.route.ts new file mode 100644 index 00000000..f8907219 --- /dev/null +++ b/src/pages/about/discussionRules.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.discussionRules) diff --git a/src/components/Pages/about/DiscussionRulesPage.tsx b/src/pages/about/discussionRules.page.tsx similarity index 96% rename from src/components/Pages/about/DiscussionRulesPage.tsx rename to src/pages/about/discussionRules.page.tsx index 51c1d38c..e3bc8cfe 100644 --- a/src/components/Pages/about/DiscussionRulesPage.tsx +++ b/src/pages/about/discussionRules.page.tsx @@ -1,10 +1,13 @@ -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' +import { PageLayout } from '../../components/_shared/PageLayout' +import { useLocalize } from '../../context/localize' +import { Title } from '@solidjs/meta' export const DiscussionRulesPage = () => { + const { t } = useLocalize() const title = t('Discussion rules') return ( - <PageWrap> + <PageLayout> + <Title>{title}
      @@ -114,9 +117,8 @@ export const DiscussionRulesPage = () => {
      - + ) } -// for lazy loading -export default DiscussionRulesPage +export const Page = DiscussionRulesPage diff --git a/src/pages/about/dogma.astro b/src/pages/about/dogma.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/dogma.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/dogma.page.route.ts b/src/pages/about/dogma.page.route.ts new file mode 100644 index 00000000..2c63adf0 --- /dev/null +++ b/src/pages/about/dogma.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.dogma) diff --git a/src/components/Pages/about/DogmaPage.tsx b/src/pages/about/dogma.page.tsx similarity index 96% rename from src/components/Pages/about/DogmaPage.tsx rename to src/pages/about/dogma.page.tsx index aec59c8b..76edcd14 100644 --- a/src/components/Pages/about/DogmaPage.tsx +++ b/src/pages/about/dogma.page.tsx @@ -1,10 +1,10 @@ -import { PageWrap } from '../../_shared/PageWrap' +import { PageLayout } from '../../components/_shared/PageLayout' // const title = t('Dogma') export const DogmaPage = () => { return ( - +
      @@ -50,9 +50,8 @@ export const DogmaPage = () => {
      -
      + ) } -// for lazy loading -export default DogmaPage +export const Page = DogmaPage diff --git a/src/pages/about/guide.astro b/src/pages/about/guide.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/guide.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/components/Pages/about/GuidePage.tsx b/src/pages/about/guide.page.tsx similarity index 96% rename from src/components/Pages/about/GuidePage.tsx rename to src/pages/about/guide.page.tsx index 8d74df65..4479a8f0 100644 --- a/src/components/Pages/about/GuidePage.tsx +++ b/src/pages/about/guide.page.tsx @@ -1,9 +1,11 @@ import { createSignal, Show } from 'solid-js' -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' -import { Icon } from '../../_shared/Icon' +import { PageLayout } from '../../components/_shared/PageLayout' +import { Icon } from '../../components/_shared/Icon' +import { useLocalize } from '../../context/localize' +import { Meta } from '@solidjs/meta' export const GuidePage = () => { + const { t } = useLocalize() const title = t('How it works') const [indexExpanded, setIndexExpanded] = createSignal(true) @@ -11,15 +13,14 @@ export const GuidePage = () => { const toggleIndexExpanded = () => setIndexExpanded((oldExpanded) => !oldExpanded) return ( - - {/**/} - {/**/} - {/**/} - {/**/} - {/**/} - {/**/} - {/**/} - + + + + + + + +
      @@ -285,9 +286,8 @@ export const GuidePage = () => {
      -
      + ) } -// for lazy loading -export default GuidePage +export const Page = GuidePage diff --git a/src/pages/about/guilde.page.route.ts b/src/pages/about/guilde.page.route.ts new file mode 100644 index 00000000..2d86c1b5 --- /dev/null +++ b/src/pages/about/guilde.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.guide) diff --git a/src/pages/about/help.page.route.ts b/src/pages/about/help.page.route.ts new file mode 100644 index 00000000..48288617 --- /dev/null +++ b/src/pages/about/help.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.help) diff --git a/src/components/Pages/about/HelpPage.tsx b/src/pages/about/help.page.tsx similarity index 95% rename from src/components/Pages/about/HelpPage.tsx rename to src/pages/about/help.page.tsx index f034ca43..50d9ffc7 100644 --- a/src/components/Pages/about/HelpPage.tsx +++ b/src/pages/about/help.page.tsx @@ -1,7 +1,7 @@ import { createSignal, Show } from 'solid-js' -import { PageWrap } from '../../_shared/PageWrap' -import { Donate } from '../../Discours/Donate' -import { Icon } from '../../_shared/Icon' +import { PageLayout } from '../../components/_shared/PageLayout' +import { Donate } from '../../components/Discours/Donate' +import { Icon } from '../../components/_shared/Icon' // const title = t('Support us') @@ -11,9 +11,9 @@ export const HelpPage = () => { const toggleIndexExpanded = () => setIndexExpanded((oldExpanded) => !oldExpanded) return ( - - {/*Здесь можно поддержать Дискурс материально.*/} - {/*Discours.io, помощь, благотворительность*/} + + Здесь можно поддержать Дискурс материально. + Discours.io, помощь, благотворительность {/*Благодарим!*/} @@ -161,9 +161,8 @@ export const HelpPage = () => {
    - + ) } -// for lazy loading -export default HelpPage +export const Page = HelpPage diff --git a/src/pages/about/manifest.astro b/src/pages/about/manifest.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/manifest.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/manifest.page.route.ts b/src/pages/about/manifest.page.route.ts new file mode 100644 index 00000000..70a30fba --- /dev/null +++ b/src/pages/about/manifest.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.manifest) diff --git a/src/components/Pages/about/ManifestPage.tsx b/src/pages/about/manifest.page.tsx similarity index 96% rename from src/components/Pages/about/ManifestPage.tsx rename to src/pages/about/manifest.page.tsx index 8c0436d4..0a2c2863 100644 --- a/src/components/Pages/about/ManifestPage.tsx +++ b/src/pages/about/manifest.page.tsx @@ -1,10 +1,10 @@ import { createSignal, Show } from 'solid-js' -import { PageWrap } from '../../_shared/PageWrap' -import { Modal } from '../../Nav/Modal' -import { Feedback } from '../../Discours/Feedback' -import Subscribe from '../../Discours/Subscribe' -import Opener from '../../Nav/Opener' -import { Icon } from '../../_shared/Icon' +import { PageLayout } from '../../components/_shared/PageLayout' +import { Modal } from '../../components/Nav/Modal' +import { Feedback } from '../../components/Discours/Feedback' +import Subscribe from '../../components/Discours/Subscribe' +import Opener from '../../components/Nav/Opener' +import { Icon } from '../../components/_shared/Icon' // title={t('Manifest')} @@ -14,7 +14,7 @@ export const ManifestPage = () => { const toggleIndexExpanded = () => setIndexExpanded((oldExpanded) => !oldExpanded) return ( - + @@ -192,9 +192,8 @@ export const ManifestPage = () => {
    - + ) } -// for lazy loading -export default ManifestPage +export const Page = ManifestPage diff --git a/src/pages/about/partners.astro b/src/pages/about/partners.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/partners.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/partners.page.route.ts b/src/pages/about/partners.page.route.ts new file mode 100644 index 00000000..5e588193 --- /dev/null +++ b/src/pages/about/partners.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.partners) diff --git a/src/components/Pages/about/PartnersPage.tsx b/src/pages/about/partners.page.tsx similarity index 50% rename from src/components/Pages/about/PartnersPage.tsx rename to src/pages/about/partners.page.tsx index 67e18cef..1dd97be0 100644 --- a/src/components/Pages/about/PartnersPage.tsx +++ b/src/pages/about/partners.page.tsx @@ -1,11 +1,12 @@ -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' - -// const title = t('Partners') +import { PageLayout } from '../../components/_shared/PageLayout' +import { useLocalize } from '../../context/localize' +import { Title } from '@solidjs/meta' export const PartnersPage = () => { + const { t } = useLocalize() return ( - + + {t('Partners')}
    @@ -13,9 +14,8 @@ export const PartnersPage = () => {
    -
    + ) } -// for lazy loading -export default PartnersPage +export const Page = PartnersPage diff --git a/src/pages/about/principles.astro b/src/pages/about/principles.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/principles.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/principles.page.route.ts b/src/pages/about/principles.page.route.ts new file mode 100644 index 00000000..4995eb09 --- /dev/null +++ b/src/pages/about/principles.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.principles) diff --git a/src/components/Pages/about/PrinciplesPage.tsx b/src/pages/about/principles.page.tsx similarity index 97% rename from src/components/Pages/about/PrinciplesPage.tsx rename to src/pages/about/principles.page.tsx index a77337e5..e3f15916 100644 --- a/src/components/Pages/about/PrinciplesPage.tsx +++ b/src/pages/about/principles.page.tsx @@ -1,15 +1,18 @@ -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' +import { Title } from '@solidjs/meta' +import { PageLayout } from '../../components/_shared/PageLayout' +import { useLocalize } from '../../context/localize' export const PrinciplesPage = () => { - const title = t('Principles') + const { t } = useLocalize() + return ( - + + {t('Principles')}

    - {title} + {t('Principles')}

      @@ -172,9 +175,8 @@ export const PrinciplesPage = () => {
    -
    + ) } -// for lazy loading -export default PrinciplesPage +export const Page = PrinciplesPage diff --git a/src/pages/about/projects.astro b/src/pages/about/projects.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/projects.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/projects.page.route.ts b/src/pages/about/projects.page.route.ts new file mode 100644 index 00000000..b8ab171a --- /dev/null +++ b/src/pages/about/projects.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.projects) diff --git a/src/components/Pages/about/ProjectsPage.tsx b/src/pages/about/projects.page.tsx similarity index 50% rename from src/components/Pages/about/ProjectsPage.tsx rename to src/pages/about/projects.page.tsx index 752dcfa3..d84c02ba 100644 --- a/src/components/Pages/about/ProjectsPage.tsx +++ b/src/pages/about/projects.page.tsx @@ -1,11 +1,12 @@ -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' - -// title={t('Projects')}> +import { Title } from '@solidjs/meta' +import { PageLayout } from '../../components/_shared/PageLayout' +import { useLocalize } from '../../context/localize' export const ProjectsPage = () => { + const { t } = useLocalize() return ( - + + {t('Projects')}
    @@ -13,9 +14,7 @@ export const ProjectsPage = () => {
    -
    + ) } - -// for lazy loading -export default ProjectsPage +export const Page = ProjectsPage diff --git a/src/pages/about/terms-of-use.astro b/src/pages/about/terms-of-use.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/terms-of-use.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/termsOfUse.page.route.ts b/src/pages/about/termsOfUse.page.route.ts new file mode 100644 index 00000000..301475fd --- /dev/null +++ b/src/pages/about/termsOfUse.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.termsOfUse) diff --git a/src/components/Pages/about/TermsOfUsePage.tsx b/src/pages/about/termsOfUse.page.tsx similarity index 96% rename from src/components/Pages/about/TermsOfUsePage.tsx rename to src/pages/about/termsOfUse.page.tsx index 15a5e9d4..64218598 100644 --- a/src/components/Pages/about/TermsOfUsePage.tsx +++ b/src/pages/about/termsOfUse.page.tsx @@ -1,20 +1,23 @@ import { createSignal, Show } from 'solid-js' -import { PageWrap } from '../../_shared/PageWrap' -import { Icon } from '../../_shared/Icon' - -// const title = t('Terms of use') +import { PageLayout } from '../../components/_shared/PageLayout' +import { Icon } from '../../components/_shared/Icon' +import { useLocalize } from '../../context/localize' +import { Meta, Title } from '@solidjs/meta' export const TermsOfUsePage = () => { + const { t } = useLocalize() const [indexExpanded, setIndexExpanded] = createSignal(true) const toggleIndexExpanded = () => setIndexExpanded((oldExpanded) => !oldExpanded) + const title = t('Terms of use') return ( - - {/**/} - {/**/} - {/**/} - {/**/} + + {title} + + + +
    @@ -274,9 +277,8 @@ export const TermsOfUsePage = () => {
    -
    + ) } -// for lazy loading -export default TermsOfUsePage +export const Page = TermsOfUsePage diff --git a/src/pages/about/thanks.astro b/src/pages/about/thanks.astro deleted file mode 100644 index c7354d08..00000000 --- a/src/pages/about/thanks.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../../main.astro' -import { Root } from '../../components/Root' -import { initRouter } from '../../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/about/thanks.page.route.ts b/src/pages/about/thanks.page.route.ts new file mode 100644 index 00000000..2db639c8 --- /dev/null +++ b/src/pages/about/thanks.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../../stores/router' +import { getServerRoute } from '../../utils/getServerRoute' + +export default getServerRoute(ROUTES.thanks) diff --git a/src/components/Pages/about/ThanksPage.tsx b/src/pages/about/thanks.page.tsx similarity index 91% rename from src/components/Pages/about/ThanksPage.tsx rename to src/pages/about/thanks.page.tsx index 21b64d8f..6f57cd10 100644 --- a/src/components/Pages/about/ThanksPage.tsx +++ b/src/pages/about/thanks.page.tsx @@ -1,15 +1,17 @@ -import { PageWrap } from '../../_shared/PageWrap' -import { t } from '../../../utils/intl' +import { Meta, Title } from '@solidjs/meta' +import { PageLayout } from '../../components/_shared/PageLayout' +import { useLocalize } from '../../context/localize' export const ThanksPage = () => { + const { t } = useLocalize() const title = t('Thank you') return ( - - {/**/} - {/**/} - {/**/} - {/**/} - + + {title} + + + +
    @@ -81,9 +83,8 @@ export const ThanksPage = () => {
    -
    + ) } -// for lazy loading -export default ThanksPage +export const Page = ThanksPage diff --git a/src/pages/allAuthors.page.route.ts b/src/pages/allAuthors.page.route.ts new file mode 100644 index 00000000..7edd2f2f --- /dev/null +++ b/src/pages/allAuthors.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../stores/router' +import { getServerRoute } from '../utils/getServerRoute' + +export default getServerRoute(ROUTES.authors) diff --git a/src/pages/allAuthors.page.server.ts b/src/pages/allAuthors.page.server.ts new file mode 100644 index 00000000..66d2c3a6 --- /dev/null +++ b/src/pages/allAuthors.page.server.ts @@ -0,0 +1,15 @@ +import type { PageContext } from '../renderer/types' +import { apiClient } from '../utils/apiClient' +import type { PageProps } from './types' + +export const onBeforeRender = async (_pageContext: PageContext) => { + const allAuthors = await apiClient.getAllAuthors() + + const pageProps: PageProps = { allAuthors } + + return { + pageContext: { + pageProps + } + } +} diff --git a/src/components/Pages/AllAuthorsPage.tsx b/src/pages/allAuthors.page.tsx similarity index 56% rename from src/components/Pages/AllAuthorsPage.tsx rename to src/pages/allAuthors.page.tsx index 959bc722..8a2fb1c3 100644 --- a/src/components/Pages/AllAuthorsPage.tsx +++ b/src/pages/allAuthors.page.tsx @@ -1,9 +1,9 @@ -import { PageWrap } from '../_shared/PageWrap' -import { AllAuthorsView } from '../Views/AllAuthors' -import type { PageProps } from '../types' +import { PageLayout } from '../components/_shared/PageLayout' +import { AllAuthorsView } from '../components/Views/AllAuthors' +import type { PageProps } from './types' import { createSignal, onMount, Show } from 'solid-js' -import { loadAllAuthors } from '../../stores/zine/authors' -import { Loading } from '../Loading' +import { loadAllAuthors } from '../stores/zine/authors' +import { Loading } from '../components/_shared/Loading' export const AllAuthorsPage = (props: PageProps) => { const [isLoaded, setIsLoaded] = createSignal(Boolean(props.allAuthors)) @@ -18,13 +18,12 @@ export const AllAuthorsPage = (props: PageProps) => { }) return ( - + }> - + ) } -// for lazy loading -export default AllAuthorsPage +export const Page = AllAuthorsPage diff --git a/src/pages/allTopics.page.route.ts b/src/pages/allTopics.page.route.ts new file mode 100644 index 00000000..e7019ef7 --- /dev/null +++ b/src/pages/allTopics.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../stores/router' +import { getServerRoute } from '../utils/getServerRoute' + +export default getServerRoute(ROUTES.topics) diff --git a/src/pages/allTopics.page.server.ts b/src/pages/allTopics.page.server.ts new file mode 100644 index 00000000..9a7d52e0 --- /dev/null +++ b/src/pages/allTopics.page.server.ts @@ -0,0 +1,15 @@ +import type { PageContext } from '../renderer/types' +import { apiClient } from '../utils/apiClient' +import type { PageProps } from './types' + +export const onBeforeRender = async (_pageContext: PageContext) => { + const allTopics = await apiClient.getAllTopics() + + const pageProps: PageProps = { allTopics } + + return { + pageContext: { + pageProps + } + } +} diff --git a/src/components/Pages/AllTopicsPage.tsx b/src/pages/allTopics.page.tsx similarity index 56% rename from src/components/Pages/AllTopicsPage.tsx rename to src/pages/allTopics.page.tsx index 6c2276b0..271c950c 100644 --- a/src/components/Pages/AllTopicsPage.tsx +++ b/src/pages/allTopics.page.tsx @@ -1,9 +1,9 @@ -import { PageWrap } from '../_shared/PageWrap' -import { AllTopicsView } from '../Views/AllTopics' -import type { PageProps } from '../types' +import { PageLayout } from '../components/_shared/PageLayout' +import { AllTopicsView } from '../components/Views/AllTopics' +import type { PageProps } from './types' import { createSignal, onMount, Show } from 'solid-js' -import { loadAllTopics } from '../../stores/zine/topics' -import { Loading } from '../Loading' +import { loadAllTopics } from '../stores/zine/topics' +import { Loading } from '../components/_shared/Loading' export const AllTopicsPage = (props: PageProps) => { const [isLoaded, setIsLoaded] = createSignal(Boolean(props.allTopics)) @@ -18,13 +18,12 @@ export const AllTopicsPage = (props: PageProps) => { }) return ( - + }> - + ) } -// for lazy loading -export default AllTopicsPage +export const Page = AllTopicsPage diff --git a/src/pages/article.page.route.ts b/src/pages/article.page.route.ts new file mode 100644 index 00000000..9b9f5ecb --- /dev/null +++ b/src/pages/article.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../stores/router' +import { getServerRoute } from '../utils/getServerRoute' + +export default getServerRoute(ROUTES.article) diff --git a/src/pages/article.page.server.ts b/src/pages/article.page.server.ts new file mode 100644 index 00000000..ffa5ef0f --- /dev/null +++ b/src/pages/article.page.server.ts @@ -0,0 +1,16 @@ +import type { PageContext } from '../renderer/types' +import type { PageProps } from './types' +import { apiClient } from '../utils/apiClient' + +export const onBeforeRender = async (pageContext: PageContext) => { + const { slug } = pageContext.routeParams + const article = await apiClient.getShout(slug) + + const pageProps: PageProps = { article } + + return { + pageContext: { + pageProps + } + } +} diff --git a/src/pages/article.page.tsx b/src/pages/article.page.tsx new file mode 100644 index 00000000..c5ffd429 --- /dev/null +++ b/src/pages/article.page.tsx @@ -0,0 +1,60 @@ +import { createMemo, onMount, Show } from 'solid-js' +import type { Shout } from '../graphql/types.gen' +import { PageLayout } from '../components/_shared/PageLayout' +import { ArticleView } from '../components/Views/Article' +import type { PageProps } from './types' +import { loadShout, useArticlesStore } from '../stores/zine/articles' +import { useRouter } from '../stores/router' +import { Loading } from '../components/_shared/Loading' +import { ReactionsProvider } from '../context/reactions' + +export const ArticlePage = (props: PageProps) => { + const shouts = props.article ? [props.article] : [] + + const slug = createMemo(() => { + const { page: getPage } = useRouter() + + const page = getPage() + + if (page.route !== 'article') { + throw new Error('ts guard') + } + + return page.params.slug + }) + + const { articleEntities } = useArticlesStore({ + shouts + }) + + const article = createMemo(() => articleEntities()[slug()]) + + onMount(async () => { + const articleValue = articleEntities()[slug()] + + if (!articleValue || !articleValue.body) { + await loadShout(slug()) + } + }) + + onMount(() => { + const script = document.createElement('script') + script.async = true + script.src = 'https://ackee.discours.io/increment.js' + script.dataset.ackeeServer = 'https://ackee.discours.io' + script.dataset.ackeeDomainId = '1004abeb-89b2-4e85-ad97-74f8d2c8ed2d' + document.body.appendChild(script) + }) + + return ( + + + }> + + + + + ) +} + +export const Page = ArticlePage diff --git a/src/pages/author.page.route.ts b/src/pages/author.page.route.ts new file mode 100644 index 00000000..a6b7653a --- /dev/null +++ b/src/pages/author.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../stores/router' +import { getServerRoute } from '../utils/getServerRoute' + +export default getServerRoute(ROUTES.author) diff --git a/src/pages/author.page.server.ts b/src/pages/author.page.server.ts new file mode 100644 index 00000000..479e7fc7 --- /dev/null +++ b/src/pages/author.page.server.ts @@ -0,0 +1,22 @@ +import type { PageContext } from '../renderer/types' +import { apiClient } from '../utils/apiClient' +import type { PageProps } from './types' +import { PRERENDERED_ARTICLES_COUNT } from '../components/Views/Author' + +export const onBeforeRender = async (pageContext: PageContext) => { + const { slug } = pageContext.routeParams + + const authorShouts = await apiClient.getShouts({ + filters: { author: slug }, + limit: PRERENDERED_ARTICLES_COUNT + }) + const author = await apiClient.getAuthor({ slug }) + + const pageProps: PageProps = { author, authorShouts } + + return { + pageContext: { + pageProps + } + } +} diff --git a/src/pages/author.page.tsx b/src/pages/author.page.tsx new file mode 100644 index 00000000..248cbb51 --- /dev/null +++ b/src/pages/author.page.tsx @@ -0,0 +1,50 @@ +import { PageLayout } from '../components/_shared/PageLayout' +import { AuthorView, PRERENDERED_ARTICLES_COUNT } from '../components/Views/Author' +import type { PageProps } from './types' +import { createMemo, createSignal, onCleanup, onMount, Show } from 'solid-js' +import { loadShouts, resetSortedArticles } from '../stores/zine/articles' +import { useRouter } from '../stores/router' +import { loadAuthor } from '../stores/zine/authors' +import { Loading } from '../components/_shared/Loading' +import { ReactionsProvider } from '../context/reactions' + +export const AuthorPage = (props: PageProps) => { + const [isLoaded, setIsLoaded] = createSignal(Boolean(props.authorShouts) && Boolean(props.author)) + + const slug = createMemo(() => { + const { page: getPage } = useRouter() + + const page = getPage() + + if (page.route !== 'author') { + throw new Error('ts guard') + } + + return page.params.slug + }) + + onMount(async () => { + if (isLoaded()) { + return + } + + await loadShouts({ filters: { author: slug() }, limit: PRERENDERED_ARTICLES_COUNT }) + await loadAuthor({ slug: slug() }) + + setIsLoaded(true) + }) + + onCleanup(() => resetSortedArticles()) + + return ( + + + }> + + + + + ) +} + +export const Page = AuthorPage diff --git a/src/pages/author/[slug]/index.astro b/src/pages/author/[slug]/index.astro deleted file mode 100644 index 67f9e159..00000000 --- a/src/pages/author/[slug]/index.astro +++ /dev/null @@ -1,20 +0,0 @@ ---- -import { Root } from '../../../components/Root' -import Prerendered from '../../../main.astro' -import { apiClient } from '../../../utils/apiClient' -import { initRouter } from '../../../stores/router' -import { PRERENDERED_ARTICLES_COUNT } from '../../../components/Views/Author' - -const slug = Astro.params.slug.toString() -const shouts = await apiClient.getShouts({ filters: { author: slug }, limit: PRERENDERED_ARTICLES_COUNT }) -const author = await apiClient.getAuthor({ slug }) - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/author/[slug]/reactions.astro.bak b/src/pages/author/[slug]/reactions.astro.bak deleted file mode 100644 index 1741406a..00000000 --- a/src/pages/author/[slug]/reactions.astro.bak +++ /dev/null @@ -1,4 +0,0 @@ ---- -// TODO: implement me -// trello card link? ---- diff --git a/src/pages/authors.astro b/src/pages/authors.astro deleted file mode 100644 index 7483a581..00000000 --- a/src/pages/authors.astro +++ /dev/null @@ -1,15 +0,0 @@ ---- -import { Root } from '../components/Root' -import Prerendered from '../main.astro' -import { apiClient } from '../utils/apiClient' -import { initRouter } from '../stores/router' - -const authors = await apiClient.getAllAuthors() - -const { pathname, search } = Astro.url -initRouter(pathname, search) ---- - - - - diff --git a/src/pages/confirm/[token].astro b/src/pages/confirm/[token].astro index 89528424..4b5fca0b 100644 --- a/src/pages/confirm/[token].astro +++ b/src/pages/confirm/[token].astro @@ -1,6 +1,6 @@ --- import { Confirmed } from '../../components/Nav/Confirmed' -import { t } from '../../utils/intl' +import { t } from 'i18next' const token = Astro.params.token?.toString() || '' --- diff --git a/src/pages/confirm/index.astro b/src/pages/confirm/index.astro index 1edb4589..2620df8f 100644 --- a/src/pages/confirm/index.astro +++ b/src/pages/confirm/index.astro @@ -1,5 +1,5 @@ --- -import { t } from '../../utils/intl' +import i18next, { t } from "i18next" import { Confirmed } from '../../components/Nav/Confirmed' --- diff --git a/src/pages/connect.astro b/src/pages/connect.astro deleted file mode 100644 index 3fcad65b..00000000 --- a/src/pages/connect.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import Prerendered from '../main.astro' -import { Root } from '../components/Root' -import { initRouter } from '../stores/router' - -const { pathname, search } = Astro.url -initRouter(pathname, search) - -Astro.response.headers.set('Cache-Control', 's-maxage=1, stale-while-revalidate') ---- - - - - diff --git a/src/pages/connect.page.route.ts b/src/pages/connect.page.route.ts new file mode 100644 index 00000000..264948b8 --- /dev/null +++ b/src/pages/connect.page.route.ts @@ -0,0 +1,4 @@ +import { ROUTES } from '../stores/router' +import { getServerRoute } from '../utils/getServerRoute' + +export default getServerRoute(ROUTES.connect) diff --git a/src/components/Pages/ConnectPage.tsx b/src/pages/connect.page.tsx similarity index 91% rename from src/components/Pages/ConnectPage.tsx rename to src/pages/connect.page.tsx index 5ae4359e..f9882458 100644 --- a/src/components/Pages/ConnectPage.tsx +++ b/src/pages/connect.page.tsx @@ -1,8 +1,8 @@ -import { PageWrap } from '../_shared/PageWrap' +import { PageLayout } from '../components/_shared/PageLayout' export const ConnectPage = () => { return ( - +
    @@ -15,7 +15,7 @@ export const ConnectPage = () => { скорее! Если укажете свою почту, мы обязательно ответим.

    -
    +
    -
    @@ -59,7 +59,7 @@ export const ProfileSubscriptionsPage = () => {
    -