diff --git a/.stylelintrc b/.stylelintrc index 8fccb840..72b7b9e9 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -12,12 +12,16 @@ "selector-class-pattern": null, "no-descending-specificity": null, "scss/function-no-unknown": null, + "scss/no-global-function-names": null, "function-url-quotes": null, "font-family-no-missing-generic-family-keyword": null, "order/order": [ "custom-properties", "declarations" - ] + ], + "scss/dollar-variable-pattern": ["^[a-z][a-zA-Z]+$", { + "ignore": "global" + }] }, "defaultSeverity": "warning" } diff --git a/README.md b/README.md index 5e3e66a1..33e9296d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,27 @@ -# How to start - -If you use yarn - +## How to start ``` -yarn -PUBLIC_API_URL=https://v2.discours.io yarn dev +yarn install +yarn start +``` +with different backends +``` +yarn run start:local +yarn run start:production +yarn run start:staging +``` + +## Useful commands +run checks +``` +yarn run check +``` +type checking with watch +``` +yarn run typecheck:watch +``` +## Code generation + +generate new SolidJS context: +``` +npx hygen context new NewContextName ``` diff --git a/_templates/context/new/hello.ejs.t b/_templates/context/new/hello.ejs.t new file mode 100644 index 00000000..e374020e --- /dev/null +++ b/_templates/context/new/hello.ejs.t @@ -0,0 +1,27 @@ +--- +to: src/context/<%= h.changeCase.camel(name) %>.tsx +--- +import type { Accessor, JSX } from 'solid-js' +import { createContext, createSignal, useContext } from 'solid-js' + +type <%= h.changeCase.pascal(name) %>ContextType = { + actions: { + } +} + +const <%= h.changeCase.pascal(name) %>Context = createContext<<%= h.changeCase.pascal(name) %>ContextType>() + +export function use<%= h.changeCase.pascal(name) %>() { + return useContext(<%= h.changeCase.pascal(name) %>Context) +} + +export const <%= h.changeCase.pascal(name) %>Provider = (props: { children: JSX.Element }) => { + const actions = { + } + + const value: <%= h.changeCase.pascal(name) %>ContextType = { actions } + + return <<%= h.changeCase.pascal(name) %>Context.Provider value={value}>{props.children}Context.Provider> +} + + diff --git a/_templates/generator/help/index.ejs.t b/_templates/generator/help/index.ejs.t new file mode 100644 index 00000000..90a29aff --- /dev/null +++ b/_templates/generator/help/index.ejs.t @@ -0,0 +1,5 @@ +--- +message: | + hygen {bold generator new} --name [NAME] --action [ACTION] + hygen {bold generator with-prompt} --name [NAME] --action [ACTION] +--- \ No newline at end of file diff --git a/_templates/generator/new/hello.ejs.t b/_templates/generator/new/hello.ejs.t new file mode 100644 index 00000000..5680d963 --- /dev/null +++ b/_templates/generator/new/hello.ejs.t @@ -0,0 +1,18 @@ +--- +to: _templates/<%= name %>/<%= action || 'new' %>/hello.ejs.t +--- +--- +to: app/hello.js +--- +const hello = ``` +Hello! +This is your first hygen template. + +Learn what it can do here: + +https://github.com/jondot/hygen +``` + +console.log(hello) + + diff --git a/_templates/generator/with-prompt/hello.ejs.t b/_templates/generator/with-prompt/hello.ejs.t new file mode 100644 index 00000000..ba6abc56 --- /dev/null +++ b/_templates/generator/with-prompt/hello.ejs.t @@ -0,0 +1,18 @@ +--- +to: _templates/<%= name %>/<%= action || 'new' %>/hello.ejs.t +--- +--- +to: app/hello.js +--- +const hello = ``` +Hello! +This is your first prompt based hygen template. + +Learn what it can do here: + +https://github.com/jondot/hygen +``` + +console.log(hello) + + diff --git a/_templates/generator/with-prompt/prompt.ejs.t b/_templates/generator/with-prompt/prompt.ejs.t new file mode 100644 index 00000000..76ea532a --- /dev/null +++ b/_templates/generator/with-prompt/prompt.ejs.t @@ -0,0 +1,14 @@ +--- +to: _templates/<%= name %>/<%= action || 'new' %>/prompt.js +--- + +// see types of prompts: +// https://github.com/enquirer/enquirer/tree/master/examples +// +module.exports = [ + { + type: 'input', + name: 'message', + message: "What's your message?" + } +] diff --git a/_templates/init/repo/new-repo.ejs.t b/_templates/init/repo/new-repo.ejs.t new file mode 100644 index 00000000..08e7cffd --- /dev/null +++ b/_templates/init/repo/new-repo.ejs.t @@ -0,0 +1,4 @@ +--- +setup: <%= name %> +force: true # this is because mostly, people init into existing folders is safe +--- diff --git a/api/newsletter.js b/api/newsletter.js index d9724e03..42485d9e 100644 --- a/api/newsletter.js +++ b/api/newsletter.js @@ -13,7 +13,7 @@ export default async (req, res) => { const client = mailgun.client(mgOptions) try { - const response = await client.lists.members.createMember(mgOptions.domain, { + await client.lists.members.createMember(mgOptions.domain, { address: email, subscribed: true, upsert: 'yes' diff --git a/astro.config.ts b/astro.config.ts index 46e5c4aa..e38676de 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,10 +1,9 @@ import { defineConfig, AstroUserConfig } from 'astro/config' import vercel from '@astrojs/vercel/serverless' import solidJs from '@astrojs/solid-js' -import type { CSSOptions } from 'vite' import defaultGenerateScopedName from 'postcss-modules/build/generateScopedName' import { isDev } from './src/utils/config' -import { visualizer } from 'rollup-plugin-visualizer' +// import { visualizer } from 'rollup-plugin-visualizer' const PATH_PREFIX = '/src/' @@ -18,18 +17,6 @@ const getDevCssClassPrefix = (filename: string): string => { const devGenerateScopedName = (name: string, filename: string, css: string) => getDevCssClassPrefix(filename) + '_' + defaultGenerateScopedName(name, filename, css) -const css: CSSOptions = { - preprocessorOptions: { - scss: { - additionalData: '@import "src/styles/imports";\n' - } - }, - modules: { - generateScopedName: isDev ? devGenerateScopedName : defaultGenerateScopedName, - localsConvention: null - } -} - const astroConfig: AstroUserConfig = { site: 'https://new.discours.io', integrations: [solidJs()], @@ -39,7 +26,7 @@ const astroConfig: AstroUserConfig = { build: { chunkSizeWarningLimit: 777, rollupOptions: { - plugins: [visualizer()], + // plugins: [visualizer()], output: { // eslint-disable-next-line sonarjs/cognitive-complexity /* @@ -71,7 +58,17 @@ const astroConfig: AstroUserConfig = { external: [] } }, - css + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "src/styles/imports";\n' + } + }, + modules: { + generateScopedName: isDev ? devGenerateScopedName : defaultGenerateScopedName, + localsConvention: null + } + } } } diff --git a/package.json b/package.json index 8c0a5f9b..1372167a 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "graphql-ws": "^5.11.2", "hast-util-select": "^5.0.4", "husky": "^8.0.3", + "hygen": "^6.2.11", "idb": "^7.1.1", "jest": "^29.3.1", "lint-staged": "^13.1.0", @@ -125,6 +126,7 @@ "rollup-plugin-visualizer": "^5.9.0", "sass": "1.32.13", "solid-js": "^1.6.9", + "solid-transition-group": "^0.0.13", "sort-package-json": "^2.3.0", "stylelint": "^14.16.1", "stylelint-config-css-modules": "^4.1.0", diff --git a/src/components/Article/Comment.module.scss b/src/components/Article/Comment.module.scss index 786fe41d..6275854c 100644 --- a/src/components/Article/Comment.module.scss +++ b/src/components/Article/Comment.module.scss @@ -13,13 +13,14 @@ } .comment { - &:before, - &:after { + &::before, + &::after { content: ''; left: 0; position: absolute; } - &:before { + + &::before { border-bottom: 2px solid #ccc; border-left: 2px solid #ccc; border-radius: 0 0 0 1.2rem; @@ -27,20 +28,24 @@ height: 2.4rem; width: 1.2rem; } - &:after { + + &::after { background: #ccc; height: 100%; top: 0; width: 2px; } - &:last-child:after { + + &:last-child::after { display: none; } } .shout-body { @include font-size(1.5rem); + margin-bottom: 1em; + *:last-child { margin-bottom: 0; } @@ -76,7 +81,7 @@ .commentControlEdit, .commentControlComplain { @include media-breakpoint-up(md) { - //opacity: 0; + // opacity: 0; transition: opacity 0.3s; } } @@ -105,6 +110,7 @@ &:hover { background: #000; color: #fff; + .icon { filter: invert(1); opacity: 1; @@ -116,6 +122,7 @@ margin-right: 0.3em; opacity: 0.6; transition: filter 0.3s, opacity 0.2s; + img { margin-bottom: -0.1em; } @@ -166,7 +173,6 @@ gap: 1rem; align-items: center; justify-content: flex-start; - color: rgba(0, 0, 0, 0.3); font-size: 1.2rem; margin-bottom: 4px; color: rgb(0 0 0 / 30%); diff --git a/src/components/Article/CommentsTree.tsx b/src/components/Article/CommentsTree.tsx index 5092b0b6..bc963d95 100644 --- a/src/components/Article/CommentsTree.tsx +++ b/src/components/Article/CommentsTree.tsx @@ -1,5 +1,5 @@ import { Show, createMemo, createSignal, onMount, For } from 'solid-js' -import Comment from './Comment' +import { Comment } from './Comment' import { t } from '../../utils/intl' import styles from '../../styles/Article.module.scss' import { createReaction, useReactionsStore } from '../../stores/zine/reactions' @@ -14,7 +14,6 @@ import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' import Button from '../_shared/Button' const ARTICLE_COMMENTS_PAGE_SIZE = 50 -const MAX_COMMENT_LEVEL = 6 type Props = { commentAuthors: Author[] @@ -48,13 +47,7 @@ export const CommentsTree = (props: Props) => { setIsCommentsLoading(false) } } - const getCommentById = (cid: number) => reactions().find((r: Reaction) => r.id === cid) - const getCommentLevel = (c: Reaction, level = 0) => { - if (c && c.replyTo && level < MAX_COMMENT_LEVEL) { - return getCommentLevel(getCommentById(c.replyTo), level + 1) - } - return level - } + onMount(async () => await loadMore()) const [submitted, setSubmitted] = createSignal(false) diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index 247248af..ad3cfdd0 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -6,7 +6,7 @@ import { createMemo, For, Match, onMount, Show, Switch } from 'solid-js' import type { Author, Shout } from '../../graphql/types.gen' import { t } from '../../utils/intl' import MD from './MD' -import { getShareUrl, SharePopup } from './SharePopup' +import { SharePopup } from './SharePopup' import { getDescription } from '../../utils/meta' import stylesHeader from '../Nav/Header.module.scss' import styles from '../../styles/Article.module.scss' diff --git a/src/components/Author/Card.module.scss b/src/components/Author/Card.module.scss index f4d974f7..267ee386 100644 --- a/src/components/Author/Card.module.scss +++ b/src/components/Author/Card.module.scss @@ -201,6 +201,7 @@ .authorName { @include font-size(3.4rem); + font-weight: 500; margin-bottom: 0.2em; } @@ -313,6 +314,7 @@ .authorName { @include font-size(1.2rem); + margin-bottom: 0; } diff --git a/src/components/Author/Card.tsx b/src/components/Author/Card.tsx index f8618bc8..265ca6d6 100644 --- a/src/components/Author/Card.tsx +++ b/src/components/Author/Card.tsx @@ -39,8 +39,6 @@ export const AuthorCard = (props: AuthorCardProps) => { actions: { loadSession } } = useSession() - if (!props.author) return false // FIXME: с сервера должен приходить автор реакции (ApiClient.CreateReaction) - const [isSubscribing, setIsSubscribing] = createSignal(false) const subscribed = createMemo(() => { diff --git a/src/components/Author/Full.scss b/src/components/Author/Full.scss index 801cd85c..64ed0e27 100644 --- a/src/components/Author/Full.scss +++ b/src/components/Author/Full.scss @@ -17,6 +17,7 @@ .author-page { .view-switcher { @include font-size(1.5rem); + margin-top: 0; button { diff --git a/src/components/EditorExample/prosemirror/extension/code.ts b/src/components/EditorExample/prosemirror/extension/code.ts index d70db0d8..541be509 100644 --- a/src/components/EditorExample/prosemirror/extension/code.ts +++ b/src/components/EditorExample/prosemirror/extension/code.ts @@ -1,3 +1,5 @@ +// 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' diff --git a/src/components/EditorExample/prosemirror/extension/link.ts b/src/components/EditorExample/prosemirror/extension/link.ts index ce61796b..b6ffd593 100644 --- a/src/components/EditorExample/prosemirror/extension/link.ts +++ b/src/components/EditorExample/prosemirror/extension/link.ts @@ -1,3 +1,5 @@ +// 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' diff --git a/src/components/EditorExample/prosemirror/extension/scroll.ts b/src/components/EditorExample/prosemirror/extension/scroll.ts index 7e5e7d3a..6346e7e4 100644 --- a/src/components/EditorExample/prosemirror/extension/scroll.ts +++ b/src/components/EditorExample/prosemirror/extension/scroll.ts @@ -1,3 +1,5 @@ +// 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' diff --git a/src/components/EditorNew/prosemirror/plugins/selectionMenu.ts b/src/components/EditorNew/prosemirror/plugins/selectionMenu.ts index 2de17ac7..5259076c 100644 --- a/src/components/EditorNew/prosemirror/plugins/selectionMenu.ts +++ b/src/components/EditorNew/prosemirror/plugins/selectionMenu.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import { renderGrouped } from 'prosemirror-menu' import { EditorState, Plugin } from 'prosemirror-state' import styles from '../styles/ProseMirror.module.scss' diff --git a/src/components/Feed/Card.module.scss b/src/components/Feed/Card.module.scss index 4b88965d..e64a586d 100644 --- a/src/components/Feed/Card.module.scss +++ b/src/components/Feed/Card.module.scss @@ -411,12 +411,13 @@ } .shoutCardDetails { + @include font-size(1.5rem); + align-items: flex-start; border-top: 2px solid #141414; display: flex; justify-content: space-between; flex-wrap: wrap; - @include font-size(1.5rem); margin-top: 1em; padding: 1em 0 0; position: relative; diff --git a/src/components/Feed/FeedArticlePopup.module.scss b/src/components/Feed/FeedArticlePopup.module.scss index 829ac58b..197e42d4 100644 --- a/src/components/Feed/FeedArticlePopup.module.scss +++ b/src/components/Feed/FeedArticlePopup.module.scss @@ -1,6 +1,6 @@ .feedArticlePopup { box-shadow: none !important; - border: 1px solid rgb(0 0 0 / 0.15); + border: 1px solid rgb(0 0 0 / 15%); border-radius: 1.6rem; padding: 1.6rem !important; diff --git a/src/components/Feed/Sidebar.module.scss b/src/components/Feed/Sidebar.module.scss index ca81ac8d..397cb0e7 100644 --- a/src/components/Feed/Sidebar.module.scss +++ b/src/components/Feed/Sidebar.module.scss @@ -7,12 +7,13 @@ } .counter { + @include font-size(1.2rem); + align-items: center; align-self: flex-start; background: #f6f6f6; border-radius: 0.8rem; display: flex; - @include font-size(1.2rem); font-weight: 500; padding: 0.2em 0.5em; } diff --git a/src/components/Inbox/DialogCard.module.scss b/src/components/Inbox/DialogCard.module.scss index d01b6e28..447f4cee 100644 --- a/src/components/Inbox/DialogCard.module.scss +++ b/src/components/Inbox/DialogCard.module.scss @@ -73,6 +73,7 @@ &.opened, &.opened:hover { background: #000; + .name, .message, .time { diff --git a/src/components/Inbox/Message.module.scss b/src/components/Inbox/Message.module.scss index ef1aa745..c0e5c0f2 100644 --- a/src/components/Inbox/Message.module.scss +++ b/src/components/Inbox/Message.module.scss @@ -51,10 +51,12 @@ $actionsWidth: 32px * 2; z-index: -1; transition: 0.3s ease-in-out; } + &.popupVisible { position: relative; z-index: 100; } + &.popupVisible, &:hover { .actions { @@ -101,6 +103,7 @@ $actionsWidth: 32px * 2; right: unset; left: -$actionsWidth/2; flex-direction: row-reverse; + .reply { transform: scaleX(-1); } diff --git a/src/components/Nav/Header.module.scss b/src/components/Nav/Header.module.scss index b4dab49b..04e5ea63 100644 --- a/src/components/Nav/Header.module.scss +++ b/src/components/Nav/Header.module.scss @@ -53,7 +53,6 @@ .headerInner { align-items: center; background: #fff; - border-bottom: 4px solid #000; flex-wrap: nowrap; justify-content: space-between; margin: 0; diff --git a/src/components/Nav/Header.tsx b/src/components/Nav/Header.tsx index 0f2877d3..93aba250 100644 --- a/src/components/Nav/Header.tsx +++ b/src/components/Nav/Header.tsx @@ -4,15 +4,16 @@ import { Modal } from './Modal' import { AuthModal } from './AuthModal' import { t } from '../../utils/intl' import { useModalStore } from '../../stores/ui' -import { router, Routes, useRouter } from '../../stores/router' +import { router, useRouter } from '../../stores/router' import styles from './Header.module.scss' import { getPagePath } from '@nanostores/router' import { clsx } from 'clsx' import { HeaderAuth } from './HeaderAuth' import { getShareUrl, SharePopup } from '../Article/SharePopup' import { getDescription } from '../../utils/meta' +import { Snackbar } from './Snackbar' -const resources: { name: string; route: keyof Routes }[] = [ +const resources: { name: string; route: 'home' | 'feed' | 'topics' }[] = [ { name: t('zine'), route: 'home' }, { name: t('feed'), route: 'feed' }, { name: t('topics'), route: 'topics' } @@ -110,7 +111,7 @@ export const Header = (props: Props) => { {(r) => (
  • - {r.name} + {r.name}
  • )}
    @@ -153,6 +154,7 @@ export const Header = (props: Props) => { + ) diff --git a/src/components/Nav/Snackbar.module.scss b/src/components/Nav/Snackbar.module.scss new file mode 100644 index 00000000..ae76b39a --- /dev/null +++ b/src/components/Nav/Snackbar.module.scss @@ -0,0 +1,24 @@ +.snackbar { + min-height: 4px; + background-color: #141414; + color: #fff; + transition: background-color 0.3s; + + &.error { + background-color: #d00820; + } +} + +.content { + transition: height 0.3s, color 0.3s; + height: 60px; + display: flex; + align-items: center; + justify-content: center; + + &.enter, + &.exitTo { + height: 0; + color: transparent; + } +} diff --git a/src/components/Nav/Snackbar.tsx b/src/components/Nav/Snackbar.tsx new file mode 100644 index 00000000..bf2113a0 --- /dev/null +++ b/src/components/Nav/Snackbar.tsx @@ -0,0 +1,27 @@ +import { Show } from 'solid-js' +import { useSnackbar } from '../../context/snackbar' +import styles from './Snackbar.module.scss' +import { Transition } from 'solid-transition-group' +import { clsx } from 'clsx' + +export const Snackbar = () => { + const { snackbarMessage } = useSnackbar() + + return ( +
    + setTimeout(() => done(), 300)} + > + +
    {snackbarMessage().body}
    +
    +
    +
    + ) +} diff --git a/src/components/Pages/about/TermsOfUsePage.tsx b/src/components/Pages/about/TermsOfUsePage.tsx index 8a3e7ec7..15a5e9d4 100644 --- a/src/components/Pages/about/TermsOfUsePage.tsx +++ b/src/components/Pages/about/TermsOfUsePage.tsx @@ -1,7 +1,6 @@ import { createSignal, Show } from 'solid-js' import { PageWrap } from '../../_shared/PageWrap' import { Icon } from '../../_shared/Icon' -import { showModal } from '../../../stores/ui' // const title = t('Terms of use') diff --git a/src/components/Pages/profile/ProfileSecurityPage.tsx b/src/components/Pages/profile/ProfileSecurityPage.tsx index b2344f2b..1f867fe2 100644 --- a/src/components/Pages/profile/ProfileSecurityPage.tsx +++ b/src/components/Pages/profile/ProfileSecurityPage.tsx @@ -1,11 +1,10 @@ import { PageWrap } from '../../_shared/PageWrap' -import type { PageProps } from '../../types' import styles from './Settings.module.scss' import { Icon } from '../../_shared/Icon' import { clsx } from 'clsx' import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation' -export const ProfileSecurityPage = (props: PageProps) => { +export const ProfileSecurityPage = () => { return (
    diff --git a/src/components/Pages/profile/ProfileSettingsPage.tsx b/src/components/Pages/profile/ProfileSettingsPage.tsx index 49587b67..3d96ba28 100644 --- a/src/components/Pages/profile/ProfileSettingsPage.tsx +++ b/src/components/Pages/profile/ProfileSettingsPage.tsx @@ -1,6 +1,5 @@ import { PageWrap } from '../../_shared/PageWrap' import { t } from '../../../utils/intl' -import type { PageProps } from '../../types' import { Icon } from '../../_shared/Icon' import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation' import { For, createSignal, Show, onMount } from 'solid-js' @@ -9,12 +8,36 @@ import styles from './Settings.module.scss' import { useProfileForm } from '../../../context/profile' import validateUrl from '../../../utils/validateUrl' import { createFileUploader, UploadFile } from '@solid-primitives/upload' +import { Loading } from '../../Loading' +import { useSession } from '../../../context/session' +import Button from '../../_shared/Button' +import { useSnackbar } from '../../../context/snackbar' -export const ProfileSettingsPage = (props: PageProps) => { - const [addLinkForm, setAddLinkForm] = createSignal(false) - const [incorrectUrl, setIncorrectUrl] = createSignal(false) +const handleFileUpload = async (uploadFile: UploadFile) => { + const formData = new FormData() + formData.append('file', uploadFile.file, uploadFile.name) + const response = await fetch('/api/upload', { + method: 'POST', + body: formData + }) + return response.json() +} + +export const ProfileSettingsPage = () => { + const [addLinkForm, setAddLinkForm] = createSignal(false) + const [incorrectUrl, setIncorrectUrl] = createSignal(false) + const [isSubmitting, setIsSubmitting] = createSignal(false) + const [isUserpicUpdating, setIsUserpicUpdating] = createSignal(false) + + const { + actions: { showSnackbar } + } = useSnackbar() + + const { + actions: { loadSession } + } = useSession() const { form, updateFormField, submit, slugError } = useProfileForm() - let updateForm: HTMLFormElement + const handleChangeSocial = (value: string) => { if (validateUrl(value)) { updateFormField('links', value) @@ -23,28 +46,31 @@ export const ProfileSettingsPage = (props: PageProps) => { setIncorrectUrl(true) } } - const handleSubmit = (event: Event): void => { + + const handleSubmit = async (event: Event) => { event.preventDefault() - submit(form) + setIsSubmitting(true) + + try { + await submit(form) + showSnackbar({ body: t('Profile successfully saved') }) + } catch { + showSnackbar({ type: 'error', body: t('Error') }) + } + + loadSession() + setIsSubmitting(false) } const { selectFiles } = createFileUploader({ multiple: false, accept: 'image/*' }) - const handleFileUpload = async (uploadFile: UploadFile) => { - const formData = new FormData() - formData.append('file', uploadFile.file, uploadFile.name) - const response = await fetch('/api/upload', { - method: 'POST', - body: formData - }) - return response.json() - } - - const handleUserpicUpload = async () => { + const handleAvatarClick = async () => { await selectFiles(async ([uploadFile]) => { try { + setIsUserpicUpdating(true) const fileUrl = await handleFileUpload(uploadFile) updateFormField('userpic', fileUrl) + setIsUserpicUpdating(false) } catch (error) { console.error('[upload avatar] error', error) } @@ -68,13 +94,18 @@ export const ProfileSettingsPage = (props: PageProps) => {

    {t('Profile settings')}

    {t('Here you can customize your profile the way you want.')}

    -
    +

    {t('Userpic')}

    - + }> + {form.name} +

    {t('Name')}

    @@ -187,13 +218,8 @@ export const ProfileSettingsPage = (props: PageProps) => { )}
    -
    -

    - -

    +
    diff --git a/src/components/Pages/profile/ProfileSubscriptionsPage.tsx b/src/components/Pages/profile/ProfileSubscriptionsPage.tsx index d4b65eb9..c871f897 100644 --- a/src/components/Pages/profile/ProfileSubscriptionsPage.tsx +++ b/src/components/Pages/profile/ProfileSubscriptionsPage.tsx @@ -1,12 +1,11 @@ import { PageWrap } from '../../_shared/PageWrap' -import type { PageProps } from '../../types' import styles from './Settings.module.scss' import stylesSettings from '../../../styles/FeedSettings.module.scss' import { clsx } from 'clsx' import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation' import { SearchField } from '../../_shared/SearchField' -export const ProfileSubscriptionsPage = (props: PageProps) => { +export const ProfileSubscriptionsPage = () => { return (
    diff --git a/src/components/Pages/profile/Settings.module.scss b/src/components/Pages/profile/Settings.module.scss index 1ae1cade..056ae465 100644 --- a/src/components/Pages/profile/Settings.module.scss +++ b/src/components/Pages/profile/Settings.module.scss @@ -21,16 +21,13 @@ h5 { width: 18rem; } -.avatar, -.avatarInput { +.avatar { height: 100%; left: 0; position: absolute; top: 0; width: 100%; -} - -.avatar { + cursor: pointer; background: #ccc; border: none; object-fit: cover; diff --git a/src/components/Root.tsx b/src/components/Root.tsx index 771ed7e0..ec78aa91 100644 --- a/src/components/Root.tsx +++ b/src/components/Root.tsx @@ -3,7 +3,7 @@ import { MODALS, setLocale, showModal } from '../stores/ui' import { Component, createEffect, createMemo } from 'solid-js' -import { Routes, useRouter } from '../stores/router' +import { ROUTES, useRouter } from '../stores/router' import { Dynamic, isServer } from 'solid-js/web' import type { PageProps, RootSearchParams } from './types' @@ -35,12 +35,13 @@ 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 { CreateSettingsPage } from './Pages/CreateSettingsPage' +import { SnackbarProvider } from '../context/snackbar' // TODO: lazy load // const SomePage = lazy(() => import('./Pages/SomePage')) -const pagesMap: Record> = { +const pagesMap: Record> = { inbox: InboxPage, expo: LayoutShoutsPage, connect: ConnectPage, @@ -98,8 +99,10 @@ export const Root = (props: PageProps) => { } return ( - - - + + + + + ) } diff --git a/src/components/Topic/Card.tsx b/src/components/Topic/Card.tsx index 4ade9dd4..554090a7 100644 --- a/src/components/Topic/Card.tsx +++ b/src/components/Topic/Card.tsx @@ -5,7 +5,6 @@ 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 { getLogger } from '../../utils/logger' import { clsx } from 'clsx' import { useSession } from '../../context/session' import { ShowOnlyOnClient } from '../_shared/ShowOnlyOnClient' diff --git a/src/components/Views/AllAuthors.tsx b/src/components/Views/AllAuthors.tsx index 5e138c8e..d4e49671 100644 --- a/src/components/Views/AllAuthors.tsx +++ b/src/components/Views/AllAuthors.tsx @@ -11,7 +11,6 @@ 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' type AllAuthorsPageSearchParams = { by: '' | 'name' | 'shouts' | 'followers' diff --git a/src/components/Views/Author.module.scss b/src/components/Views/Author.module.scss index 9b279d03..516f43fa 100644 --- a/src/components/Views/Author.module.scss +++ b/src/components/Views/Author.module.scss @@ -1,11 +1,13 @@ .ratingContainer { @include font-size(1.5rem); + display: inline-block; vertical-align: top; } .ratingControl { @include font-size(1.5rem); + display: inline-flex; margin-left: 1em; vertical-align: middle; @@ -35,10 +37,11 @@ } .subscribersCounter { + @include font-size(1rem); + background: #fff; border: 2px solid #000; border-radius: 100%; - @include font-size(1rem); font-weight: bold; height: 32px; line-height: 30px; diff --git a/src/components/Views/Author.tsx b/src/components/Views/Author.tsx index de01f34a..cd906dfe 100644 --- a/src/components/Views/Author.tsx +++ b/src/components/Views/Author.tsx @@ -6,8 +6,6 @@ import { AuthorFull } from '../Author/Full' import { t } from '../../utils/intl' import { useAuthorsStore } from '../../stores/zine/authors' import { loadShouts, useArticlesStore } from '../../stores/zine/articles' - -import { useTopicsStore } from '../../stores/zine/topics' import { useRouter } from '../../stores/router' import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll' import { splitToPages } from '../../utils/splitToPages' @@ -18,7 +16,6 @@ import { clsx } from 'clsx' import Userpic from '../Author/Userpic' import { Popup } from '../_shared/Popup' import { AuthorCard } from '../Author/Card' -import { loadReactionsBy, REACTIONS_AMOUNT_PER_PAGE } from '../../stores/zine/reactions' import { apiClient } from '../../utils/apiClient' import { Comment } from '../Article/Comment' @@ -43,7 +40,6 @@ export const AuthorView = (props: AuthorProps) => { shouts: props.shouts }) const { authorEntities } = useAuthorsStore({ authors: [props.author] }) - const { topicsByAuthor } = useTopicsStore() const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const author = createMemo(() => authorEntities()[props.authorSlug]) diff --git a/src/components/Views/Feed.module.scss b/src/components/Views/Feed.module.scss index f7d77325..ca371949 100644 --- a/src/components/Views/Feed.module.scss +++ b/src/components/Views/Feed.module.scss @@ -1,5 +1,6 @@ .feedNavigation { @include font-size(1.5rem); + font-weight: 500; h4 { @@ -40,6 +41,7 @@ .feedAside { h4 { @include font-size(2.2rem); + font-weight: bold; margin-bottom: 2.4rem; text-transform: lowercase; @@ -69,7 +71,7 @@ a { position: static; - &:before { + &::before { content: ''; height: 100%; left: 0; @@ -88,6 +90,7 @@ ul { @include font-size(1.4rem); + font-weight: bold; margin: 1rem 0 0; line-height: 1.4; @@ -106,6 +109,7 @@ .comment { @include font-size(1.5rem); + line-height: 1.4; margin-bottom: 2.4rem; @@ -126,6 +130,7 @@ .commentArticleTitle { @include font-size(1.2rem); + line-clamp: 1; -webkit-line-clamp: 1; } diff --git a/src/components/Views/Feed.tsx b/src/components/Views/Feed.tsx index a2d2b5b0..85240624 100644 --- a/src/components/Views/Feed.tsx +++ b/src/components/Views/Feed.tsx @@ -2,7 +2,6 @@ import { createEffect, createMemo, createSignal, For, onMount, Show } from 'soli import '../../styles/Feed.scss' import stylesBeside from '../../components/Feed/Beside.module.scss' import { Icon } from '../_shared/Icon' -import { TopicCard } from '../Topic/Card' import { ArticleCard } from '../Feed/Card' import { AuthorCard } from '../Author/Card' import { t } from '../../utils/intl' @@ -14,12 +13,9 @@ import { useAuthorsStore } from '../../stores/zine/authors' import { useTopicsStore } from '../../stores/zine/topics' import { useTopAuthorsStore } from '../../stores/zine/topAuthors' import { useSession } from '../../context/session' -import stylesArticle from '../../styles/Article.module.scss' import stylesTopic from '../Feed/CardTopic.module.scss' import styles from './Feed.module.scss' import { clsx } from 'clsx' -import Userpic from '../Author/Userpic' -import type { Author } from '../../graphql/types.gen' // const AUTHORSHIP_REACTIONS = [ // ReactionKind.Accept, diff --git a/src/components/Views/Inbox.tsx b/src/components/Views/Inbox.tsx index e49c421f..eefeee63 100644 --- a/src/components/Views/Inbox.tsx +++ b/src/components/Views/Inbox.tsx @@ -22,12 +22,12 @@ type InboxSearchParams = { initChat: string chat: string } -const userSearch = (array: Author[], keyword: string) => { - const searchTerm = keyword.toLowerCase() - return array.filter((value) => { - return value.name.toLowerCase().match(new RegExp(searchTerm, 'g')) - }) -} +// const userSearch = (array: Author[], keyword: string) => { +// const searchTerm = keyword.toLowerCase() +// return array.filter((value) => { +// return value.name.toLowerCase().match(new RegExp(searchTerm, 'g')) +// }) +// } export const InboxView = () => { const { diff --git a/src/components/_shared/CommentEditor/menu/index.ts b/src/components/_shared/CommentEditor/menu/index.ts index f766b400..780fb5a5 100644 --- a/src/components/_shared/CommentEditor/menu/index.ts +++ b/src/components/_shared/CommentEditor/menu/index.ts @@ -1,4 +1,4 @@ -import { blockTypeItem, icons, MenuItem, wrapItem } from 'prosemirror-menu' +import { icons, MenuItem, wrapItem } from 'prosemirror-menu' import { toggleMark } from 'prosemirror-commands' const markActive = (state, type) => { diff --git a/src/components/_shared/CommentEditor/schema.ts b/src/components/_shared/CommentEditor/schema.ts index a0dd6d1a..b016135f 100644 --- a/src/components/_shared/CommentEditor/schema.ts +++ b/src/components/_shared/CommentEditor/schema.ts @@ -12,7 +12,7 @@ export const schema = new Schema({ paragraph: { content: 'inline*', group: 'block', - toDOM: function toDOM(node) { + toDOM: function toDOM() { return ['p', { class: 'paragraph' }, 0] } }, diff --git a/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss b/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss index 0b1f8353..6fad818e 100644 --- a/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss +++ b/src/components/_shared/CommentEditor/styles/CommentEditor.module.scss @@ -18,6 +18,7 @@ display: flex; flex-direction: row; } + .buttons { gap: 10px; } diff --git a/src/components/_shared/Popup/Popup.module.scss b/src/components/_shared/Popup/Popup.module.scss index 2ca89b39..c9859bbf 100644 --- a/src/components/_shared/Popup/Popup.module.scss +++ b/src/components/_shared/Popup/Popup.module.scss @@ -27,6 +27,7 @@ &.bordered { @include font-size(1.6rem); + border: 2px solid #000; padding: 2.4rem; @@ -41,7 +42,8 @@ &.tiny { @include font-size(1.4rem); - box-shadow: 0 4px 60px rgba(0, 0, 0, 0.1); + + box-shadow: 0 4px 60px rgb(0 0 0 / 10%); padding: 1rem; ul li { diff --git a/src/components/_shared/Popup/Popup.tsx b/src/components/_shared/Popup/Popup.tsx index 8a1e6935..835d16a2 100644 --- a/src/components/_shared/Popup/Popup.tsx +++ b/src/components/_shared/Popup/Popup.tsx @@ -2,7 +2,6 @@ import { createEffect, createSignal, JSX, Show } from 'solid-js' import styles from './Popup.module.scss' import { clsx } from 'clsx' import { useOutsideClickHandler } from '../../../utils/useOutsideClickHandler' -import { set } from 'husky' type HorizontalAnchor = 'center' | 'right' diff --git a/src/context/inbox.tsx b/src/context/inbox.tsx index a3943bde..adaa12b3 100644 --- a/src/context/inbox.tsx +++ b/src/context/inbox.tsx @@ -1,5 +1,5 @@ -import { Accessor, createMemo, JSX } from 'solid-js' -import { createContext, createSignal, useContext } from 'solid-js' +import type { Accessor, JSX } from 'solid-js' +import { createContext, createSignal, useContext, createMemo } from 'solid-js' import { createChatClient } from '../graphql/privateGraphQLClient' import type { Chat, Message, MutationCreateMessageArgs } from '../graphql/types.gen' import { apiClient } from '../utils/apiClient' diff --git a/src/context/profile.tsx b/src/context/profile.tsx index 5307e1ac..0e4a8cbf 100644 --- a/src/context/profile.tsx +++ b/src/context/profile.tsx @@ -13,16 +13,12 @@ const useProfileForm = () => { const [slugError, setSlugError] = createSignal() const submit = async (profile: ProfileInput) => { - try { - const response = await apiClient.updateProfile(profile) - if (response.error) { - setSlugError(response.error) - return response.error - } - return response - } catch (error) { - console.error(error) + const response = await apiClient.updateProfile(profile) + if (response.error) { + setSlugError(response.error) + return response.error } + return response } const [form, setForm] = createStore({ diff --git a/src/context/snackbar.tsx b/src/context/snackbar.tsx new file mode 100644 index 00000000..bb7362a4 --- /dev/null +++ b/src/context/snackbar.tsx @@ -0,0 +1,79 @@ +import type { Accessor, JSX } from 'solid-js' +import { createContext, createSignal, useContext } from 'solid-js' +import { delay } from '../utils/delay' + +const DEFAULT_DURATION = 5000 // 5 sec + +type SnackbarMessage = { + type: 'success' | 'error' + body: string | JSX.Element + duration: number +} + +type SnackbarContextType = { + snackbarMessage: Accessor + actions: { + showSnackbar: (message: { + type?: SnackbarMessage['type'] + body: SnackbarMessage['body'] + duration?: SnackbarMessage['duration'] + }) => Promise + } +} + +const SnackbarContext = createContext() + +export function useSnackbar() { + return useContext(SnackbarContext) +} + +const messagesToShow: SnackbarMessage[] = [] + +let currentCheckMessagesPromise = null + +export const SnackbarProvider = (props: { children: JSX.Element }) => { + const [snackbarMessage, setSnackbarMessage] = createSignal(null) + + const checkMessages = async () => { + if (messagesToShow.length === 0) { + currentCheckMessagesPromise = null + return + } + + setSnackbarMessage(messagesToShow[0]) + await delay(messagesToShow[0].duration) + setSnackbarMessage(null) + await delay(1000) + messagesToShow.shift() + await checkMessages() + } + + const showSnackbar = async (message: { + type?: SnackbarMessage['type'] + body: SnackbarMessage['body'] + duration?: SnackbarMessage['duration'] + }): Promise => { + const messageToShow = { + type: message.type ?? 'success', + body: message.body, + duration: message.duration ?? DEFAULT_DURATION + } + + messagesToShow.push(messageToShow) + + if (!currentCheckMessagesPromise) { + currentCheckMessagesPromise = checkMessages() + await currentCheckMessagesPromise + } + + return currentCheckMessagesPromise + } + + const actions = { + showSnackbar + } + + const value: SnackbarContextType = { snackbarMessage, actions } + + return {props.children} +} diff --git a/src/locales/ru.json b/src/locales/ru.json index b086056e..0ce51b42 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -225,9 +225,9 @@ "My subscriptions": "Подписки", "Nothing here yet": "Здесь пока ничего нет", "Edited": "Отредактирован", - "Nothing here yet": "Здесь пока ничего нет", "Invite experts": "Пригласить экспертов", "Subscribe to comments": "Подписаться на комментарии", "Add to bookmarks": "Добавить в закладки", - "Get notifications": "Получать уведомления" + "Get notifications": "Получать уведомления", + "Profile successfully saved": "Профиль успешно сохранён" } diff --git a/src/stores/router.ts b/src/stores/router.ts index fe8e3e32..90e966fb 100644 --- a/src/stores/router.ts +++ b/src/stores/router.ts @@ -3,71 +3,40 @@ import { createRouter, createSearchParams } from '@nanostores/router' import { isServer } from 'solid-js/web' import { useStore } from '@nanostores/solid' -// TODO: more -export interface Routes { - home: void - connect: void - create: void - createSettings: void - topics: void - topic: 'slug' - authors: void - author: 'slug' - feed: void - article: 'slug' - search: 'q' - dogma: void - discussionRules: void - guide: void - help: void - manifest: void - partners: void - principles: void - projects: void - termsOfUse: void - thanks: void - expo: 'layout' - inbox: void // TODO: добавить ID текущего юзера - profileSettings: void - profileSecurity: void - profileSubscriptions: void -} +export const ROUTES = { + home: '/', + inbox: '/inbox', + connect: '/connect', + create: '/create', + createSettings: '/create/settings', + topics: '/topics', + topic: '/topic/:slug', + authors: '/authors', + author: '/author/:slug', + feed: '/feed', + search: '/search/:q?', + article: '/:slug', + dogma: '/about/dogma', + discussionRules: '/about/discussion-rules', + guide: '/about/guide', + help: '/about/help', + manifest: '/about/manifest', + partners: '/about/partners', + principles: '/about/principles', + projects: '/about/projects', + termsOfUse: '/about/terms-of-use', + thanks: '/about/thanks', + expo: '/expo/:layout', + profileSettings: '/profile/settings', + profileSecurity: '/profile/security', + profileSubscriptions: '/profile/subscriptions' +} as const const searchParamsStore = createSearchParams() -const routerStore = createRouter( - { - home: '/', - inbox: '/inbox', - connect: '/connect', - create: '/create', - createSettings: '/create/settings', - topics: '/topics', - topic: '/topic/:slug', - authors: '/authors', - author: '/author/:slug', - feed: '/feed', - search: '/search/:q?', - article: '/:slug', - dogma: '/about/dogma', - discussionRules: '/about/discussion-rules', - guide: '/about/guide', - help: '/about/help', - manifest: '/about/manifest', - partners: '/about/partners', - principles: '/about/principles', - projects: '/about/projects', - termsOfUse: '/about/terms-of-use', - thanks: '/about/thanks', - expo: '/expo/:layout', - profileSettings: '/profile/settings', - profileSecurity: '/profile/security', - profileSubscriptions: '/profile/subscriptions' - }, - { - search: false, - links: false - } -) +const routerStore = createRouter(ROUTES, { + search: false, + links: false +}) export const router = routerStore diff --git a/src/stores/zine/reactions.ts b/src/stores/zine/reactions.ts index be479ce3..2eddf86d 100644 --- a/src/stores/zine/reactions.ts +++ b/src/stores/zine/reactions.ts @@ -1,6 +1,6 @@ import type { Reaction, ReactionInput } from '../../graphql/types.gen' import { apiClient } from '../../utils/apiClient' -import { createEffect, createSignal } from 'solid-js' +import { createSignal } from 'solid-js' // TODO: import { roomConnect } from '../../utils/p2p' export const REACTIONS_AMOUNT_PER_PAGE = 100 diff --git a/src/styles/Feed.scss b/src/styles/Feed.scss index fb5f923c..86282c6d 100644 --- a/src/styles/Feed.scss +++ b/src/styles/Feed.scss @@ -56,9 +56,10 @@ } .feed-filter { + @include font-size(1.7rem); + display: flex; flex-wrap: wrap; - @include font-size(1.7rem); font-weight: 500; list-style: none; margin: 0 0 1.6rem; diff --git a/src/styles/Inbox.module.scss b/src/styles/Inbox.module.scss index 50e61b99..8814ba10 100644 --- a/src/styles/Inbox.module.scss +++ b/src/styles/Inbox.module.scss @@ -38,7 +38,7 @@ main { padding: 10px; height: calc(100% - 10px); - $fade-height: 10px; + $fadeHeight: 10px; .sidebarHeader { display: flex; @@ -50,7 +50,7 @@ main { overflow: hidden; flex: 1; position: relative; - padding: $fade-height 0; + padding: $fadeHeight 0; &::before, &::after { @@ -59,17 +59,17 @@ main { width: 100%; right: 0; z-index: 1; - height: $fade-height; + height: $fadeHeight; } &::before { top: 0; - background: linear-gradient(white, transparent $fade-height); + background: linear-gradient(white, transparent $fadeHeight); } &::after { bottom: 0; - background: linear-gradient(transparent, white $fade-height); + background: linear-gradient(transparent, white $fadeHeight); } .dialogs { @@ -207,6 +207,7 @@ main { flex: 1; overflow: auto; position: relative; + .messagesContainer { left: 0; height: 100%; @@ -216,6 +217,7 @@ main { width: 100%; scroll-behavior: smooth; } + .conversation__date { position: relative; text-align: center; diff --git a/src/utils/delay.ts b/src/utils/delay.ts new file mode 100644 index 00000000..8acc7907 --- /dev/null +++ b/src/utils/delay.ts @@ -0,0 +1 @@ +export const delay = async (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/yarn.lock b/yarn.lock index 0ab94bb8..60c83d48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,6 +217,14 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/abort-controller@^3.266.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz#a9101d6ed54ebd58741cd83fb6aea0f9c187e3b0" + integrity sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g== + dependencies: + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/chunked-blob-reader-native@3.208.0": version "3.208.0" resolved "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz" @@ -605,13 +613,13 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/lib-storage@^3.223.0": - version "3.235.0" - resolved "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.235.0.tgz" - integrity sha512-+xQtPsToeA4RFiWmO+j5DbDsisPBwNb5k87z1NbrlsZkbj7ONTunX5F3qqe2bR+1o7Pb5O1REQrIQohT6QECaw== +"@aws-sdk/lib-storage@^3.266.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.267.0.tgz#ba77c4eb559370ed0f29afac5f273fc9b69dc37f" + integrity sha512-MljL0PavGZ3Yc1kkSjWIAzY6TWTWi7iuCpAi/DQKs0TyjSuX5vtxLmSVv1Wlx3ywrI8HDlo2xG7bvhjDQDN3gw== dependencies: - "@aws-sdk/middleware-endpoint" "3.226.0" - "@aws-sdk/smithy-client" "3.234.0" + "@aws-sdk/middleware-endpoint" "3.267.0" + "@aws-sdk/smithy-client" "3.267.0" buffer "5.6.0" events "3.3.0" stream-browserify "3.0.0" @@ -661,6 +669,20 @@ "@aws-sdk/util-middleware" "3.226.0" tslib "^2.3.1" +"@aws-sdk/middleware-endpoint@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz#2e5ca14e1a26220b9b77dddf0ddec0db8d79155d" + integrity sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw== + dependencies: + "@aws-sdk/middleware-serde" "3.267.0" + "@aws-sdk/protocol-http" "3.267.0" + "@aws-sdk/signature-v4" "3.267.0" + "@aws-sdk/types" "3.267.0" + "@aws-sdk/url-parser" "3.267.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/middleware-expect-continue@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.226.0.tgz" @@ -759,6 +781,14 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/middleware-serde@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz#b1ce247834ad9531e868189616b3adfb2d8af1b2" + integrity sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow== + dependencies: + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/middleware-signing@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz" @@ -786,6 +816,13 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/middleware-stack@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz#f16334b1f99e8714e1f4d98faa065f669aff7885" + integrity sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA== + dependencies: + tslib "^2.3.1" + "@aws-sdk/middleware-user-agent@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz" @@ -832,6 +869,14 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/protocol-http@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz#12c2e0fbaa01f9658daedad8196fa52c74675394" + integrity sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ== + dependencies: + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/querystring-builder@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz" @@ -849,6 +894,14 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/querystring-parser@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz#497758012c335aab08bbea1e5a7d5e6d61dec320" + integrity sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ== + dependencies: + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/service-error-classification@3.229.0": version "3.229.0" resolved "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz" @@ -885,6 +938,19 @@ "@aws-sdk/util-uri-escape" "3.201.0" tslib "^2.3.1" +"@aws-sdk/signature-v4@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz#15812f48f487828353c1e33574cb789cedef659c" + integrity sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.267.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.267.0" + "@aws-sdk/util-uri-escape" "3.201.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + "@aws-sdk/smithy-client@3.234.0": version "3.234.0" resolved "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz" @@ -894,6 +960,15 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/smithy-client@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz#a3148a49900e284c3c140a5b7514e20e6d4342ae" + integrity sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A== + dependencies: + "@aws-sdk/middleware-stack" "3.267.0" + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/token-providers@3.235.0": version "3.235.0" resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.235.0.tgz" @@ -912,6 +987,13 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/types@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.267.0.tgz#fe543d1a1977c4e9e7ca6c32c837fcfd87b32441" + integrity sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ== + dependencies: + tslib "^2.3.1" + "@aws-sdk/url-parser@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz" @@ -921,6 +1003,15 @@ "@aws-sdk/types" "3.226.0" tslib "^2.3.1" +"@aws-sdk/url-parser@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz#c103fba8f2c1c4bed1c6fa85ef4fd27d3147f81d" + integrity sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A== + dependencies: + "@aws-sdk/querystring-parser" "3.267.0" + "@aws-sdk/types" "3.267.0" + tslib "^2.3.1" + "@aws-sdk/util-arn-parser@3.208.0": version "3.208.0" resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz" @@ -1016,6 +1107,13 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/util-middleware@3.267.0": + version "3.267.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz#99a9c72b889e6d8cbd3ee6fa8c7a0190984945ce" + integrity sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A== + dependencies: + tslib "^2.3.1" + "@aws-sdk/util-retry@3.229.0": version "3.229.0" resolved "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz" @@ -1086,6 +1184,14 @@ "@aws-sdk/util-buffer-from" "3.208.0" tslib "^2.3.1" +"@aws-sdk/util-utf8@3.254.0": + version "3.254.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz#909af9c6549833a9a9bf77004b7484bfc96b2c35" + integrity sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + "@aws-sdk/util-waiter@3.226.0": version "3.226.0" resolved "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.226.0.tgz" @@ -1675,7 +1781,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.15.4": +"@babel/runtime@^7.0.0": version "7.20.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.0.tgz" integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q== @@ -3183,11 +3289,6 @@ dependencies: "@types/node" "*" -"@types/lodash@^4.14.175": - version "4.14.186" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz" - integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== - "@types/mdast@^3.0.0": version "3.0.10" resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" @@ -3222,6 +3323,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz" integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== +"@types/node@^17.0.19": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + "@types/node@^18.11.18": version "18.11.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" @@ -3625,6 +3731,11 @@ ansi-align@^3.0.1: dependencies: string-width "^4.1.0" +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -3895,6 +4006,11 @@ async-sema@^3.1.1: resolved "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz" integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -4147,6 +4263,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" @@ -4230,6 +4353,14 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" @@ -4296,7 +4427,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4341,6 +4472,30 @@ change-case-all@1.0.15: upper-case "^2.0.2" upper-case-first "^2.0.2" +change-case@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" + integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + change-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" @@ -4590,6 +4745,14 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + constant-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz" @@ -4731,7 +4894,7 @@ debounce@^1.2.0: resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4828,6 +4991,11 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +degit@^2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/degit/-/degit-2.8.4.tgz#3bb9c5c00f157c44724dd4a50724e4aa75a54d38" + integrity sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -4939,6 +5107,13 @@ dom7@^4.0.4: dependencies: ssr-window "^4.0.0" +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== + dependencies: + no-case "^2.2.0" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" @@ -4969,6 +5144,13 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" @@ -5005,6 +5187,13 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@~3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" @@ -5872,6 +6061,13 @@ file-uri-to-path@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== +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -5969,6 +6165,22 @@ formidable@^2.1.1: once "^1.4.0" qs "^6.11.0" +front-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + dependencies: + js-yaml "^3.13.1" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -6196,7 +6408,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.5, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -6465,6 +6677,14 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + header-case@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" @@ -6547,6 +6767,26 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +hygen@^6.2.11: + version "6.2.11" + resolved "https://registry.yarnpkg.com/hygen/-/hygen-6.2.11.tgz#c8fd1a5da6799783d6511f416048db02df1c2dda" + integrity sha512-t6/zLI2XozP5gvV74nnl8LZSbwpVNFUkUs/O9DwuOdiiBbws5k4AQNVwKZ9FGzcKjdJ5EBBYkVzlcUHkLyY0FQ== + dependencies: + "@types/node" "^17.0.19" + chalk "^4.1.2" + change-case "^3.1.0" + debug "^4.3.3" + degit "^2.8.4" + ejs "^3.1.6" + enquirer "^2.3.6" + execa "^5.0.0" + front-matter "^4.0.2" + fs-extra "^10.0.0" + ignore-walk "^4.0.1" + inflection "^1.12.0" + ora "^5.0.0" + yargs-parser "^21.0.0" + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -6574,6 +6814,13 @@ ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore-walk@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-4.0.1.tgz#fc840e8346cf88a3a9380c5b17933cd8f4d39fa3" + integrity sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw== + dependencies: + minimatch "^3.0.4" + ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.1: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" @@ -6625,6 +6872,11 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +inflection@^1.12.0: + version "1.13.4" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32" + integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -6836,6 +7088,13 @@ is-interactive@^2.0.0: resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== + dependencies: + lower-case "^1.1.0" + is-lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz" @@ -6964,6 +7223,13 @@ is-unicode-supported@^1.1.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== +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== + dependencies: + upper-case "^1.1.0" + is-upper-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz" @@ -7073,6 +7339,16 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jest-changed-files@^29.2.0: version "29.2.0" resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz" @@ -7541,6 +7817,15 @@ jsonc-parser@^3.0.0: resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.1" resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" @@ -7736,11 +8021,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" @@ -7817,6 +8097,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== + dependencies: + lower-case "^1.1.2" + lower-case-first@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz" @@ -7824,6 +8111,11 @@ lower-case-first@^2.0.2: dependencies: tslib "^2.0.3" +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -8430,6 +8722,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" @@ -8484,11 +8783,6 @@ mute-stream@0.0.8: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanoclone@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" - integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== - nanoid@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" @@ -8521,6 +8815,13 @@ nlcst-to-string@^3.0.0: dependencies: "@types/nlcst" "^1.0.0" +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -8738,7 +9039,7 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.4.1: +ora@^5.0.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -8818,6 +9119,13 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== + dependencies: + no-case "^2.2.0" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" @@ -8866,6 +9174,14 @@ parse5@^6.0.0: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" @@ -8874,6 +9190,13 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== + dependencies: + no-case "^2.2.0" + path-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz" @@ -9156,11 +9479,6 @@ prompts@^2.0.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -property-expr@^2.0.4: - version "2.0.5" - resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" - integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== - property-information@^6.0.0: version "6.1.1" resolved "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz" @@ -9842,6 +10160,14 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: dependencies: lru-cache "^6.0.0" +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + sentence-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" @@ -9970,6 +10296,13 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== + dependencies: + no-case "^2.2.0" + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" @@ -9978,21 +10311,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -solid-js-form@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/solid-js-form/-/solid-js-form-0.1.8.tgz#cc50bb7f782fa6f91651a1885b799432b03d6b3b" - integrity sha512-kOKZ5et9t1T8P8GAi4FIyuoGO2Y14YnTyKT7kla3wbtcDeWb4dqvxSqmNHRx8r9ZxTN/hpl3WxmwtOBOPalSaA== - dependencies: - solid-js "^1.1.2" - yup "^0.32.9" - -solid-js@^1.1.2: - version "1.6.6" - resolved "https://registry.npmjs.org/solid-js/-/solid-js-1.6.6.tgz" - integrity sha512-5x33mEbPI8QLuywvFjQP4krjWDr8xiYFgZx9KCBH7b0ZzypQCHaUubob7bK6i+1u6nhaAqhWtvXS587Kb8DShA== - dependencies: - csstype "^3.1.0" - solid-js@^1.6.9: version "1.6.10" resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.6.10.tgz#fbd8e0a4adfe7b38da1885170369ede6a1cc7379" @@ -10000,15 +10318,10 @@ solid-js@^1.6.9: dependencies: csstype "^3.1.0" -solid-jsx@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/solid-jsx/-/solid-jsx-0.9.1.tgz" - integrity sha512-HHTx58rx3tqg5LMGuQnaE1vqZjpl+RMP0jYQnBkTY0xKIASVNSLZJCZoPFrpKH8wWWYyTLHdepgzs8u/e6yz5Q== - -solid-utils@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/solid-utils/-/solid-utils-0.8.1.tgz" - integrity sha512-LLeO7Hr99OLFY+Zfx8U7Hw5VZOaFT8qWoLWGfnq3kDmo7KAGdIoq44ijy7mdYj88e+2cWPdkyhItsS3FGjeS6g== +solid-transition-group@^0.0.13: + version "0.0.13" + resolved "https://registry.yarnpkg.com/solid-transition-group/-/solid-transition-group-0.0.13.tgz#1a476d3798759be106ad1062cc071db139b0d564" + integrity sha512-VA1V0ip4dsNOQJ/dCluCiAPBUuHspYFm4WYG91jpNmcP4rC4DY1S1EGds44JjiUAP7qEoEZdMhPaiS6lqTF7AA== sort-object-keys@^1.1.3: version "1.1.3" @@ -10461,6 +10774,14 @@ svg-tags@^1.0.0: resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + swap-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz" @@ -10539,6 +10860,14 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + title-case@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz" @@ -10570,11 +10899,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" @@ -10851,6 +11175,11 @@ unist-util-visit@^4.0.0, unist-util-visit@^4.1.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unixify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz" @@ -10866,6 +11195,13 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== + dependencies: + upper-case "^1.1.1" + upper-case-first@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" @@ -10873,6 +11209,11 @@ upper-case-first@^2.0.2: dependencies: tslib "^2.0.3" +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + upper-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" @@ -11437,19 +11778,6 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yup@^0.32.9: - version "0.32.11" - resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" - integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/lodash" "^4.14.175" - lodash "^4.17.21" - lodash-es "^4.17.21" - nanoclone "^0.2.1" - property-expr "^2.0.4" - toposort "^2.0.2" - zod@^3.17.3: version "3.19.1" resolved "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz"