Merge pull request #73 from Discours/profile
profile settings, s3 upload
This commit is contained in:
commit
c9666e63f9
|
@ -1,6 +1,5 @@
|
||||||
import MG from 'mailgun.js'
|
import MG from 'mailgun.js'
|
||||||
import fd from 'form-data'
|
import fd from 'form-data'
|
||||||
import type Options from 'mailgun.js/interfaces/Options'
|
|
||||||
|
|
||||||
const mgOptions = {
|
const mgOptions = {
|
||||||
key: process.env.MAILGUN_API_KEY,
|
key: process.env.MAILGUN_API_KEY,
|
||||||
|
@ -25,7 +24,7 @@ export default async function handler(req, res) {
|
||||||
key: mgOptions.key
|
key: mgOptions.key
|
||||||
//url?: string;
|
//url?: string;
|
||||||
//public_key?: string;
|
//public_key?: string;
|
||||||
} as Options)
|
})
|
||||||
const data = messageData(`${contact}: ${subject}`, message)
|
const data = messageData(`${contact}: ${subject}`, message)
|
||||||
client.messages.create(mgOptions.domain, data).then(console.log).catch(console.error)
|
client.messages.create(mgOptions.domain, data).then(console.log).catch(console.error)
|
||||||
} catch (error) {
|
} catch (error) {
|
|
@ -22,6 +22,6 @@ export default async function handler(req, res) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const handler = () => {
|
export const handler = (req, res) => {
|
||||||
return 'WIP'
|
return 'WIP'
|
||||||
}
|
}
|
85
api/upload.ts
Normal file
85
api/upload.ts
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
import { Writable } from 'stream'
|
||||||
|
import formidable from 'formidable'
|
||||||
|
import { S3Client } from '@aws-sdk/client-s3'
|
||||||
|
import { Upload } from '@aws-sdk/lib-storage'
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
api: {
|
||||||
|
bodyParser: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const BUCKET_NAME = process.env.S3_BUCKET || 'discours-io'
|
||||||
|
const s3 = new S3Client({
|
||||||
|
region: process.env.S3_REGION || 'eu-west-1',
|
||||||
|
credentials: {
|
||||||
|
accessKeyId: process.env.S3_ACCESS_KEY,
|
||||||
|
secretAccessKey: process.env.S3_SECRET_KEY
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const formidableConfig = {
|
||||||
|
keepExtensions: true,
|
||||||
|
maxFileSize: 10_000_000,
|
||||||
|
maxFieldsSize: 10_000_000,
|
||||||
|
maxFields: 7,
|
||||||
|
allowEmptyFiles: false,
|
||||||
|
multiples: false
|
||||||
|
}
|
||||||
|
|
||||||
|
const formidablePromise = async (req, opts) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const form = formidable(opts)
|
||||||
|
|
||||||
|
form.parse(req, (err, fields, files) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err)
|
||||||
|
}
|
||||||
|
return resolve({ fields, files })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileConsumer = (acc) => {
|
||||||
|
return new Writable({
|
||||||
|
write: (chunk, _enc, next) => {
|
||||||
|
acc.push(chunk)
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handler(req, res) {
|
||||||
|
if (req.method === 'POST') {
|
||||||
|
try {
|
||||||
|
const chunks = []
|
||||||
|
const { fields, files }: any = await formidablePromise(req, {
|
||||||
|
...formidableConfig,
|
||||||
|
// consume this, otherwise formidable tries to save the file to disk
|
||||||
|
fileWriteStreamHandler: () => fileConsumer(chunks)
|
||||||
|
})
|
||||||
|
|
||||||
|
const data = Buffer.concat(chunks)
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
Bucket: process.env.S3_BUCKET || 'discours-io',
|
||||||
|
Key: fields.name + '.' + fields.ext,
|
||||||
|
Body: data,
|
||||||
|
ACL: 'public-read',
|
||||||
|
'Content-Type': fields.type
|
||||||
|
}
|
||||||
|
|
||||||
|
const upload = new Upload({ params, client: s3 })
|
||||||
|
await upload.done()
|
||||||
|
// console.log(upload)
|
||||||
|
const { singleUploadResult: result }: any = upload
|
||||||
|
return res.status(200).json(result.Location)
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.status(405).end()
|
||||||
|
}
|
||||||
|
|
||||||
|
export default handler
|
|
@ -34,9 +34,8 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.216.0",
|
"@aws-sdk/client-s3": "^3.216.0",
|
||||||
"@aws-sdk/s3-presigned-post": "^3.216.0",
|
"@aws-sdk/lib-storage": "^3.223.0",
|
||||||
"@aws-sdk/signature-v4-multi-region": "^3.215.0",
|
"formidable": "^2.1.1",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.215.0",
|
|
||||||
"mailgun.js": "^8.0.2"
|
"mailgun.js": "^8.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -3,35 +3,53 @@ import { t } from '../../../utils/intl'
|
||||||
import type { PageProps } from '../../types'
|
import type { PageProps } from '../../types'
|
||||||
import { Icon } from '../../_shared/Icon'
|
import { Icon } from '../../_shared/Icon'
|
||||||
import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation'
|
import ProfileSettingsNavigation from '../../Discours/ProfileSettingsNavigation'
|
||||||
import { For, createSignal, Show } from 'solid-js'
|
import { For, createSignal, Show, onMount } from 'solid-js'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import styles from './Settings.module.scss'
|
import styles from './Settings.module.scss'
|
||||||
import { useProfileForm } from '../../../context/profile'
|
import { useProfileForm } from '../../../context/profile'
|
||||||
import { createFileUploader } from '@solid-primitives/upload'
|
import { createFileUploader } from '@solid-primitives/upload'
|
||||||
|
import validateUrl from '../../../utils/validateUrl'
|
||||||
|
|
||||||
export const ProfileSettingsPage = (props: PageProps) => {
|
export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
const [addLinkForm, setAddLinkForm] = createSignal<boolean>(false)
|
const [addLinkForm, setAddLinkForm] = createSignal<boolean>(false)
|
||||||
const { form, updateFormField, submit } = useProfileForm()
|
const [incorrectUrl, setIncorrectUrl] = createSignal<boolean>(false)
|
||||||
|
const { form, updateFormField, submit, slugError } = useProfileForm()
|
||||||
const handleChangeSocial = (value) => {
|
const handleChangeSocial = (value) => {
|
||||||
updateFormField('links', value)
|
if (validateUrl(value)) {
|
||||||
setAddLinkForm(false)
|
updateFormField('links', value)
|
||||||
|
setAddLinkForm(false)
|
||||||
|
} else {
|
||||||
|
setIncorrectUrl(true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const handleSubmit = (event: Event): void => {
|
const handleSubmit = (event: Event): void => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
submit(form)
|
submit(form)
|
||||||
}
|
}
|
||||||
const { selectFiles: selectFilesAsync } = createFileUploader({ accept: 'image/*' })
|
|
||||||
|
const { files, selectFiles: selectFilesAsync } = createFileUploader({ accept: 'image/*' })
|
||||||
|
|
||||||
const handleUpload = () => {
|
const handleUpload = () => {
|
||||||
selectFilesAsync(async ([{ source, name, size, file }]) => {
|
selectFilesAsync(async ([{ source, name, size, file }]) => {
|
||||||
|
const image = { source, name, size, file }
|
||||||
try {
|
try {
|
||||||
console.log({ source, name, size, file })
|
const formData = new FormData()
|
||||||
// DO UPLOAD STUFF HERE AND RETURN URL
|
formData.append('type', file.type)
|
||||||
|
formData.append('name', image.source.split('/').pop())
|
||||||
|
formData.append('ext', image.name.split('.').pop())
|
||||||
|
const resp = await fetch('/api/upload', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
})
|
||||||
|
const url = await resp.json()
|
||||||
|
updateFormField('userpic', url)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.error('[upload] error', error)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const [hostname, setHostname] = createSignal('new.discours.io')
|
||||||
|
onMount(() => setHostname(window?.location.host))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageWrap>
|
<PageWrap>
|
||||||
|
@ -52,7 +70,7 @@ export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
<div class="pretty-form__item">
|
<div class="pretty-form__item">
|
||||||
<div class={styles.avatarContainer}>
|
<div class={styles.avatarContainer}>
|
||||||
<img class={styles.avatar} src={form.userpic} alt={form.name} />
|
<img class={styles.avatar} src={form.userpic} alt={form.name} />
|
||||||
<button type="button" class={styles.avatarInput} onClick={handleUpload} />
|
<input type="button" class={styles.avatarInput} onClick={handleUpload} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h4>{t('Name')}</h4>
|
<h4>{t('Name')}</h4>
|
||||||
|
@ -76,7 +94,7 @@ export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
<h4>{t('Address on Discourse')}</h4>
|
<h4>{t('Address on Discourse')}</h4>
|
||||||
<div class="pretty-form__item">
|
<div class="pretty-form__item">
|
||||||
<div class={styles.discoursName}>
|
<div class={styles.discoursName}>
|
||||||
<label for="user-address">https://new.discours.io/author/</label>
|
<label for="user-address">https://{hostname()}/author/</label>
|
||||||
<div class={styles.discoursNameField}>
|
<div class={styles.discoursNameField}>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
@ -86,9 +104,7 @@ export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
value={form.slug}
|
value={form.slug}
|
||||||
class="nolabel"
|
class="nolabel"
|
||||||
/>
|
/>
|
||||||
<p class="form-message form-message--error">
|
<p class="form-message form-message--error">{t(`${slugError()}`)}</p>
|
||||||
{t('Sorry, this address is already taken, please choose another one.')}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -152,6 +168,9 @@ export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
onChange={(event) => handleChangeSocial(event.currentTarget.value)}
|
onChange={(event) => handleChangeSocial(event.currentTarget.value)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<Show when={incorrectUrl()}>
|
||||||
|
<p class="form-message form-message--error">{t('It does not look like url')}</p>
|
||||||
|
</Show>
|
||||||
</Show>
|
</Show>
|
||||||
<For each={form.links}>
|
<For each={form.links}>
|
||||||
{(link) => (
|
{(link) => (
|
||||||
|
@ -175,7 +194,6 @@ export const ProfileSettingsPage = (props: PageProps) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<pre>{JSON.stringify(form, null, 2)}</pre>
|
|
||||||
</div>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
</PageWrap>
|
</PageWrap>
|
||||||
|
|
|
@ -1,23 +1,29 @@
|
||||||
import { createEffect, createMemo } from 'solid-js'
|
import { createEffect, createMemo, createSignal } from 'solid-js'
|
||||||
import { createStore } from 'solid-js/store'
|
import { createStore } from 'solid-js/store'
|
||||||
import { useSession } from './session'
|
import { useSession } from './session'
|
||||||
import { loadAuthor, useAuthorsStore } from '../stores/zine/authors'
|
import { loadAuthor, useAuthorsStore } from '../stores/zine/authors'
|
||||||
import { apiClient } from '../utils/apiClient'
|
import { apiClient } from '../utils/apiClient'
|
||||||
import type { ProfileInput } from '../graphql/types.gen'
|
import type { ProfileInput } from '../graphql/types.gen'
|
||||||
|
|
||||||
const submit = async (profile: ProfileInput) => {
|
|
||||||
try {
|
|
||||||
await apiClient.updateProfile(profile)
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const useProfileForm = () => {
|
const useProfileForm = () => {
|
||||||
const { session } = useSession()
|
const { session } = useSession()
|
||||||
const currentSlug = createMemo(() => session()?.user?.slug)
|
const currentSlug = createMemo(() => session()?.user?.slug)
|
||||||
const { authorEntities } = useAuthorsStore({ authors: [] })
|
const { authorEntities } = useAuthorsStore({ authors: [] })
|
||||||
const currentAuthor = createMemo(() => authorEntities()[currentSlug()])
|
const currentAuthor = createMemo(() => authorEntities()[currentSlug()])
|
||||||
|
const [slugError, setSlugError] = createSignal<string>()
|
||||||
|
|
||||||
|
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 [form, setForm] = createStore<ProfileInput>({
|
const [form, setForm] = createStore<ProfileInput>({
|
||||||
name: '',
|
name: '',
|
||||||
|
@ -30,12 +36,11 @@ const useProfileForm = () => {
|
||||||
|
|
||||||
createEffect(async () => {
|
createEffect(async () => {
|
||||||
if (!currentSlug()) return
|
if (!currentSlug()) return
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await loadAuthor({ slug: currentSlug() })
|
await loadAuthor({ slug: currentSlug() })
|
||||||
setForm({
|
setForm({
|
||||||
name: currentAuthor()?.name,
|
name: currentAuthor()?.name,
|
||||||
slug: currentAuthor()?.name,
|
slug: currentAuthor()?.slug,
|
||||||
bio: currentAuthor()?.bio,
|
bio: currentAuthor()?.bio,
|
||||||
about: currentAuthor()?.about,
|
about: currentAuthor()?.about,
|
||||||
userpic: currentAuthor()?.userpic,
|
userpic: currentAuthor()?.userpic,
|
||||||
|
@ -62,7 +67,7 @@ const useProfileForm = () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { form, submit, updateFormField }
|
return { form, submit, updateFormField, slugError }
|
||||||
}
|
}
|
||||||
|
|
||||||
export { useProfileForm }
|
export { useProfileForm }
|
||||||
|
|
|
@ -7,6 +7,7 @@ export default gql`
|
||||||
slug
|
slug
|
||||||
name
|
name
|
||||||
bio
|
bio
|
||||||
|
about
|
||||||
userpic
|
userpic
|
||||||
communities
|
communities
|
||||||
links
|
links
|
||||||
|
|
|
@ -55,9 +55,9 @@ export type AuthorsBy = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Chat = {
|
export type Chat = {
|
||||||
admins?: Maybe<Array<Maybe<Scalars['String']>>>
|
admins?: Maybe<Array<Maybe<Scalars['Int']>>>
|
||||||
createdAt: Scalars['Int']
|
createdAt: Scalars['Int']
|
||||||
createdBy: Scalars['String']
|
createdBy: Scalars['Int']
|
||||||
description?: Maybe<Scalars['String']>
|
description?: Maybe<Scalars['String']>
|
||||||
id: Scalars['String']
|
id: Scalars['String']
|
||||||
members?: Maybe<Array<Maybe<ChatMember>>>
|
members?: Maybe<Array<Maybe<ChatMember>>>
|
||||||
|
@ -66,7 +66,7 @@ export type Chat = {
|
||||||
title?: Maybe<Scalars['String']>
|
title?: Maybe<Scalars['String']>
|
||||||
unread?: Maybe<Scalars['Int']>
|
unread?: Maybe<Scalars['Int']>
|
||||||
updatedAt: Scalars['Int']
|
updatedAt: Scalars['Int']
|
||||||
users?: Maybe<Array<Maybe<Scalars['String']>>>
|
users?: Maybe<Array<Maybe<Scalars['Int']>>>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ChatInput = {
|
export type ChatInput = {
|
||||||
|
@ -79,6 +79,7 @@ export type ChatMember = {
|
||||||
id: Scalars['Int']
|
id: Scalars['Int']
|
||||||
lastSeen?: Maybe<Scalars['DateTime']>
|
lastSeen?: Maybe<Scalars['DateTime']>
|
||||||
name: Scalars['String']
|
name: Scalars['String']
|
||||||
|
online?: Maybe<Scalars['Boolean']>
|
||||||
slug: Scalars['String']
|
slug: Scalars['String']
|
||||||
userpic?: Maybe<Scalars['String']>
|
userpic?: Maybe<Scalars['String']>
|
||||||
}
|
}
|
||||||
|
@ -140,12 +141,13 @@ export type LoadShoutsOptions = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Message = {
|
export type Message = {
|
||||||
author: Scalars['String']
|
author: Scalars['Int']
|
||||||
body: Scalars['String']
|
body: Scalars['String']
|
||||||
chatId: Scalars['String']
|
chatId: Scalars['String']
|
||||||
createdAt: Scalars['Int']
|
createdAt: Scalars['Int']
|
||||||
id: Scalars['Int']
|
id: Scalars['Int']
|
||||||
replyTo?: Maybe<Scalars['String']>
|
replyTo?: Maybe<Scalars['String']>
|
||||||
|
seen?: Maybe<Scalars['Boolean']>
|
||||||
updatedAt?: Maybe<Scalars['Int']>
|
updatedAt?: Maybe<Scalars['Int']>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,6 +356,7 @@ export type Query = {
|
||||||
loadShout?: Maybe<Shout>
|
loadShout?: Maybe<Shout>
|
||||||
loadShouts: Array<Maybe<Shout>>
|
loadShouts: Array<Maybe<Shout>>
|
||||||
markdownBody: Scalars['String']
|
markdownBody: Scalars['String']
|
||||||
|
searchMessages: Result
|
||||||
searchRecipients: Result
|
searchRecipients: Result
|
||||||
signIn: AuthResult
|
signIn: AuthResult
|
||||||
signOut: AuthResult
|
signOut: AuthResult
|
||||||
|
@ -418,6 +421,12 @@ export type QueryMarkdownBodyArgs = {
|
||||||
body: Scalars['String']
|
body: Scalars['String']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type QuerySearchMessagesArgs = {
|
||||||
|
by: MessagesBy
|
||||||
|
limit?: InputMaybe<Scalars['Int']>
|
||||||
|
offset?: InputMaybe<Scalars['Int']>
|
||||||
|
}
|
||||||
|
|
||||||
export type QuerySearchRecipientsArgs = {
|
export type QuerySearchRecipientsArgs = {
|
||||||
limit?: InputMaybe<Scalars['Int']>
|
limit?: InputMaybe<Scalars['Int']>
|
||||||
offset?: InputMaybe<Scalars['Int']>
|
offset?: InputMaybe<Scalars['Int']>
|
||||||
|
@ -621,19 +630,12 @@ export type Stat = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Subscription = {
|
export type Subscription = {
|
||||||
newMessage: Message
|
collabUpdate?: Maybe<Reaction>
|
||||||
onlineUpdated: Array<User>
|
newMessage?: Maybe<Message>
|
||||||
reactionUpdated: ReactionUpdating
|
|
||||||
shoutUpdated: Shout
|
|
||||||
userUpdated: User
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SubscriptionNewMessageArgs = {
|
export type SubscriptionCollabUpdateArgs = {
|
||||||
chats?: InputMaybe<Array<Scalars['Int']>>
|
collab: Scalars['Int']
|
||||||
}
|
|
||||||
|
|
||||||
export type SubscriptionReactionUpdatedArgs = {
|
|
||||||
shout: Scalars['String']
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Token = {
|
export type Token = {
|
||||||
|
@ -670,6 +672,7 @@ export type TopicStat = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type User = {
|
export type User = {
|
||||||
|
about?: Maybe<Scalars['String']>
|
||||||
bio?: Maybe<Scalars['String']>
|
bio?: Maybe<Scalars['String']>
|
||||||
communities?: Maybe<Array<Maybe<Scalars['Int']>>>
|
communities?: Maybe<Array<Maybe<Scalars['Int']>>>
|
||||||
createdAt: Scalars['DateTime']
|
createdAt: Scalars['DateTime']
|
||||||
|
|
|
@ -203,5 +203,7 @@
|
||||||
"Where": "Откуда",
|
"Where": "Откуда",
|
||||||
"Date of Birth": "Дата рождения",
|
"Date of Birth": "Дата рождения",
|
||||||
"Social networks": "Социальные сети",
|
"Social networks": "Социальные сети",
|
||||||
"Save settings": "Сохранить настройки"
|
"Save settings": "Сохранить настройки",
|
||||||
|
"slug is used by another user": "Имя уже занято другим пользователем",
|
||||||
|
"It does not look like url": "Это не похоже на ссылку"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
// pages/api/upload.ts
|
|
||||||
|
|
||||||
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
|
|
||||||
import { createPresignedPost } from '@aws-sdk/s3-presigned-post'
|
|
||||||
|
|
||||||
export default async function handler(req, res) {
|
|
||||||
const s3Client = new S3Client({
|
|
||||||
region: process.env.S3_REGION || 'eu-west-1',
|
|
||||||
credentials: {
|
|
||||||
accessKeyId: process.env.S3_ACCESS_KEY,
|
|
||||||
secretAccessKey: process.env.S3_SECRET_KEY
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const post = await createPresignedPost(s3Client, {
|
|
||||||
Bucket: process.env.S3_BUCKET_NAME || 'discours-io',
|
|
||||||
Key: req.query.file,
|
|
||||||
Fields: {
|
|
||||||
acl: 'public-read',
|
|
||||||
'Content-Type': req.query.fileType
|
|
||||||
},
|
|
||||||
Expires: 600, // seconds
|
|
||||||
Conditions: [
|
|
||||||
['content-length-range', 0, 22 * 1048576] // up to 22 MB
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
res.status(200).json(post)
|
|
||||||
}
|
|
|
@ -6,6 +6,7 @@ main {
|
||||||
}
|
}
|
||||||
|
|
||||||
.messages {
|
.messages {
|
||||||
|
display: none;
|
||||||
top: 74px;
|
top: 74px;
|
||||||
height: calc(100% - 74px);
|
height: calc(100% - 74px);
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -13,11 +14,8 @@ main {
|
||||||
padding-left: 42px;
|
padding-left: 42px;
|
||||||
padding-right: 26px;
|
padding-right: 26px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: flex;
|
|
||||||
flex: 1;
|
flex: 1;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
position: fixed;
|
|
||||||
z-index: 900;
|
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
|
@ -213,12 +213,12 @@ export const apiClient = {
|
||||||
},
|
},
|
||||||
getAuthor: async ({ slug }: { slug: string }): Promise<Author> => {
|
getAuthor: async ({ slug }: { slug: string }): Promise<Author> => {
|
||||||
const response = await publicGraphQLClient.query(authorBySlug, { slug }).toPromise()
|
const response = await publicGraphQLClient.query(authorBySlug, { slug }).toPromise()
|
||||||
// console.debug('getAuthor', response)
|
|
||||||
return response.data.getAuthor
|
return response.data.getAuthor
|
||||||
},
|
},
|
||||||
updateProfile: async (input: ProfileInput) => {
|
updateProfile: async (input: ProfileInput) => {
|
||||||
const response = await privateGraphQLClient.mutation(updateProfile, { profile: input }).toPromise()
|
const response = await privateGraphQLClient.mutation(updateProfile, { profile: input }).toPromise()
|
||||||
console.debug('updateProfile', response)
|
console.log('!!! response.data.getAuthor:', response.data.updateProfile)
|
||||||
|
return response.data.updateProfile
|
||||||
},
|
},
|
||||||
getTopic: async ({ slug }: { slug: string }): Promise<Topic> => {
|
getTopic: async ({ slug }: { slug: string }): Promise<Topic> => {
|
||||||
const response = await publicGraphQLClient.query(topicBySlug, { slug }).toPromise()
|
const response = await publicGraphQLClient.query(topicBySlug, { slug }).toPromise()
|
||||||
|
|
5
src/utils/validateUrl.ts
Normal file
5
src/utils/validateUrl.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
const validateUrl = (value: string) => {
|
||||||
|
return /^(http|https):\/\/[^ "]+$/.test(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default validateUrl
|
12
vercel.json
Normal file
12
vercel.json
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"functions": {
|
||||||
|
"api/upload.ts": {
|
||||||
|
"memory": 3008,
|
||||||
|
"maxDuration": 30
|
||||||
|
},
|
||||||
|
"api/feedback.js": {
|
||||||
|
"memory": 3008,
|
||||||
|
"maxDuration": 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
178
yarn.lock
178
yarn.lock
|
@ -630,6 +630,18 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/lib-storage@^3.223.0":
|
||||||
|
version "3.223.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.223.0.tgz#c7852e1096ca95fbea57e7963c8eb065d6b2f62e"
|
||||||
|
integrity sha512-MZmXUemwHyItiZ0Nm/gg47QWYcd04fk2o4+MFziX38kjM2F3lIA+4aSBX78z5Bkrnpd0xdMh0Tl4TmwHYfmsrg==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/middleware-endpoint" "3.222.0"
|
||||||
|
"@aws-sdk/smithy-client" "3.222.0"
|
||||||
|
buffer "5.6.0"
|
||||||
|
events "3.3.0"
|
||||||
|
stream-browserify "3.0.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/md5-js@3.215.0":
|
"@aws-sdk/md5-js@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.215.0.tgz#54c3874c61066a90706c523a056418c4ca68340a"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.215.0.tgz#54c3874c61066a90706c523a056418c4ca68340a"
|
||||||
|
@ -674,6 +686,20 @@
|
||||||
"@aws-sdk/util-middleware" "3.215.0"
|
"@aws-sdk/util-middleware" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/middleware-endpoint@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.222.0.tgz#7494bde024f05d88810408b41f51a87c91b626c1"
|
||||||
|
integrity sha512-e1bM+CvuUWmBdydQpV5sF8cxZrXQ++0G5s1M7pLimKdWXQvCQ1ZEwA3LLi2IWomXmS9a3BaH3iKAf87RTWjIXw==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/middleware-serde" "3.222.0"
|
||||||
|
"@aws-sdk/protocol-http" "3.222.0"
|
||||||
|
"@aws-sdk/signature-v4" "3.222.0"
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
"@aws-sdk/url-parser" "3.222.0"
|
||||||
|
"@aws-sdk/util-config-provider" "3.208.0"
|
||||||
|
"@aws-sdk/util-middleware" "3.222.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/middleware-expect-continue@3.215.0":
|
"@aws-sdk/middleware-expect-continue@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.215.0.tgz#189af8a5eb9c80f5d1a1014f4e6f8c1503b1cdbe"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.215.0.tgz#189af8a5eb9c80f5d1a1014f4e6f8c1503b1cdbe"
|
||||||
|
@ -772,6 +798,14 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/middleware-serde@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.222.0.tgz#b4decb3bbb8e373d393e0c607b5af175cbfc2396"
|
||||||
|
integrity sha512-UoeLbgCJB07dX8tRByR0KzZaOwCoIyXj/SfFTuOhBUjkpKwqFCam/hofDlK3FR6kvl+xiURv57W/FtKV/9TDHg==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/middleware-signing@3.215.0":
|
"@aws-sdk/middleware-signing@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz#f86febdae93066749f0715997121135eea2f6867"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.215.0.tgz#f86febdae93066749f0715997121135eea2f6867"
|
||||||
|
@ -799,6 +833,13 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/middleware-stack@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.222.0.tgz#c55b4f8408e6b111f25ca3a5ce24118e54968dfd"
|
||||||
|
integrity sha512-ASKbstAKbOBUZhFhst6/NCr11x94BDBiQn2zDs2Lvjo89n2efMeb4wEr17VCMZVeKI6ojtPFa1ZVLsH8AOn4Yw==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/middleware-user-agent@3.215.0":
|
"@aws-sdk/middleware-user-agent@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz#24c87d5e8e4c31a5a274403d503e72cb99ac85ed"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz#24c87d5e8e4c31a5a274403d503e72cb99ac85ed"
|
||||||
|
@ -845,6 +886,14 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/protocol-http@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.222.0.tgz#c5f82957d304bb2eb31a117c9a5d86a7772b4f86"
|
||||||
|
integrity sha512-Zj+ytEgrOagCE7yczjdDan7W+1a0OL5DPAx69Z00NxGoBI2h0GRZD28dRYb3Pzs5/Ft4KbCedH/RUnyaYjaZxw==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/querystring-builder@3.215.0":
|
"@aws-sdk/querystring-builder@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz#2a8b21560bdf24e6b24ef31c4287da4e0c459ed4"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz#2a8b21560bdf24e6b24ef31c4287da4e0c459ed4"
|
||||||
|
@ -862,16 +911,12 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/s3-presigned-post@^3.216.0":
|
"@aws-sdk/querystring-parser@3.222.0":
|
||||||
version "3.216.0"
|
version "3.222.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.216.0.tgz#690627a7191c60f933225352e46d20fb27683bdd"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.222.0.tgz#2b53b529d8c3ce347ac1900bcf16e728fe4e28b7"
|
||||||
integrity sha512-NlwZW/wRzQvwBKzEc4bS0i6iduxHgUWf3ImYxPKwArE0U/vxK6bXnNSvy24VsiXuvz99lY09batmFvomzstIYA==
|
integrity sha512-3KfkCA/753PlF5QqhGuQ7u+NOgLyiBFeV8R8ut/pfBmG8fF6l3RKrkbcu+87QpqXntRzG+RLHDqS7ryT3B2ICg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@aws-sdk/middleware-endpoint" "3.215.0"
|
"@aws-sdk/types" "3.222.0"
|
||||||
"@aws-sdk/signature-v4" "3.215.0"
|
|
||||||
"@aws-sdk/types" "3.215.0"
|
|
||||||
"@aws-sdk/util-format-url" "3.215.0"
|
|
||||||
"@aws-sdk/util-hex-encoding" "3.201.0"
|
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/service-error-classification@3.215.0":
|
"@aws-sdk/service-error-classification@3.215.0":
|
||||||
|
@ -887,7 +932,7 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/signature-v4-multi-region@3.215.0", "@aws-sdk/signature-v4-multi-region@^3.215.0":
|
"@aws-sdk/signature-v4-multi-region@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.215.0.tgz#20349ce6f1fe3a8f4597db230c76afe82ab079b2"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.215.0.tgz#20349ce6f1fe3a8f4597db230c76afe82ab079b2"
|
||||||
integrity sha512-XOUUNWs6I4vAa+Byj6qL/+DCWA5CjcRyA9sitYy8sNqhLcet8WoYf7vJL2LW1nvdzRb/pGBNWLiQOZ+9sadYeg==
|
integrity sha512-XOUUNWs6I4vAa+Byj6qL/+DCWA5CjcRyA9sitYy8sNqhLcet8WoYf7vJL2LW1nvdzRb/pGBNWLiQOZ+9sadYeg==
|
||||||
|
@ -910,6 +955,18 @@
|
||||||
"@aws-sdk/util-uri-escape" "3.201.0"
|
"@aws-sdk/util-uri-escape" "3.201.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/signature-v4@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.222.0.tgz#1c96d67d172eb68a89240eed834489d2ed79700b"
|
||||||
|
integrity sha512-2qQZuKqx56b2uN2rdjdKL6u0Cvk82uTGNtIuetmySY9xPEAljSBdriaxTqNqK9Gs3M4obG22alUK4a85uwqS3g==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/is-array-buffer" "3.201.0"
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
"@aws-sdk/util-hex-encoding" "3.201.0"
|
||||||
|
"@aws-sdk/util-middleware" "3.222.0"
|
||||||
|
"@aws-sdk/util-uri-escape" "3.201.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/smithy-client@3.215.0":
|
"@aws-sdk/smithy-client@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz#cda96b076f7df19157340623872a8914f2a3bb8c"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz#cda96b076f7df19157340623872a8914f2a3bb8c"
|
||||||
|
@ -919,6 +976,15 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/smithy-client@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.222.0.tgz#c7dddbd82e9da4d3fc1416c98169593635873bd9"
|
||||||
|
integrity sha512-4dnU7TvwKxVuOWduvFGClYe0EgNov5Ke1ef7O1bdKaj5MmlH6wBDgGJM4NKREBFapC2dUXkoPtwsihtYBci1Bw==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/middleware-stack" "3.222.0"
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/token-providers@3.216.0":
|
"@aws-sdk/token-providers@3.216.0":
|
||||||
version "3.216.0"
|
version "3.216.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz#b158ef490ed002d5956d8d855627297a551963d6"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.216.0.tgz#b158ef490ed002d5956d8d855627297a551963d6"
|
||||||
|
@ -935,6 +1001,11 @@
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.215.0.tgz#72a595e2c1a5c8c3f0291bccf71d481412b1843b"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.215.0.tgz#72a595e2c1a5c8c3f0291bccf71d481412b1843b"
|
||||||
integrity sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==
|
integrity sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==
|
||||||
|
|
||||||
|
"@aws-sdk/types@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.222.0.tgz#e61eb257f0ad2eaa65f7a72b9a2882f914fbcbb5"
|
||||||
|
integrity sha512-yXRYptInkfEFaOvWFxlRXsRh9jWOmQc1sZeKqjfx2UCtzNJ7ebedN0VfCz4SaDotcw9Q4JWuN66qhRMJjDx7/w==
|
||||||
|
|
||||||
"@aws-sdk/url-parser@3.215.0":
|
"@aws-sdk/url-parser@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz#4accbedd5fb81dc2f18e28f0f50dbd781b0b63a1"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz#4accbedd5fb81dc2f18e28f0f50dbd781b0b63a1"
|
||||||
|
@ -944,6 +1015,15 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/url-parser@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.222.0.tgz#74118f3d824d2bb7415fe909c4db62aff5f42667"
|
||||||
|
integrity sha512-1+QbVdT/phYDb5JDQRJWoZeCujkXaI5m8z3bIiPxcRRY3NPuluDGrfX3kfnFen5s9QGByLvJxWKWZS+i+iUFRg==
|
||||||
|
dependencies:
|
||||||
|
"@aws-sdk/querystring-parser" "3.222.0"
|
||||||
|
"@aws-sdk/types" "3.222.0"
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/util-arn-parser@3.208.0":
|
"@aws-sdk/util-arn-parser@3.208.0":
|
||||||
version "3.208.0"
|
version "3.208.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823"
|
||||||
|
@ -1018,15 +1098,6 @@
|
||||||
"@aws-sdk/types" "3.215.0"
|
"@aws-sdk/types" "3.215.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/util-format-url@3.215.0":
|
|
||||||
version "3.215.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.215.0.tgz#dcdccccbc810911a65b871f0341dbcefc8474272"
|
|
||||||
integrity sha512-j8X2pIwpSxtS23Za6t36pQjeVe5ouunoMuOj4wdj2uB3Cbf2vvd84J5lF8bUHQA35f5PRqdYtU1KyolQudCXsA==
|
|
||||||
dependencies:
|
|
||||||
"@aws-sdk/querystring-builder" "3.215.0"
|
|
||||||
"@aws-sdk/types" "3.215.0"
|
|
||||||
tslib "^2.3.1"
|
|
||||||
|
|
||||||
"@aws-sdk/util-hex-encoding@3.201.0":
|
"@aws-sdk/util-hex-encoding@3.201.0":
|
||||||
version "3.201.0"
|
version "3.201.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d"
|
||||||
|
@ -1048,6 +1119,13 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@aws-sdk/util-middleware@3.222.0":
|
||||||
|
version "3.222.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.222.0.tgz#e23a5109081769762492890672b15ea54297bd0e"
|
||||||
|
integrity sha512-Y4BPtSa+6+qvg6OVW6RrdDx0OADfWa2Uxsxqdozpdnx2OQY0q+1diqsNgFMV+FIvdXqffE147KG7roG+/AfPeA==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/util-stream-browser@3.215.0":
|
"@aws-sdk/util-stream-browser@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.215.0.tgz#6439e76dcc90cb535ab5fb882c6d669aa74f7c79"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.215.0.tgz#6439e76dcc90cb535ab5fb882c6d669aa74f7c79"
|
||||||
|
@ -1086,7 +1164,7 @@
|
||||||
bowser "^2.11.0"
|
bowser "^2.11.0"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
"@aws-sdk/util-user-agent-node@3.215.0", "@aws-sdk/util-user-agent-node@^3.215.0":
|
"@aws-sdk/util-user-agent-node@3.215.0":
|
||||||
version "3.215.0"
|
version "3.215.0"
|
||||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz#620beb9ba2b2775cdf51e39789ea919b10b4d903"
|
resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz#620beb9ba2b2775cdf51e39789ea919b10b4d903"
|
||||||
integrity sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==
|
integrity sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==
|
||||||
|
@ -3554,7 +3632,7 @@ arrify@^1.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
|
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
|
||||||
integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
|
integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
|
||||||
|
|
||||||
asap@~2.0.3:
|
asap@^2.0.0, asap@~2.0.3:
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
|
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
|
||||||
integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
|
integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
|
||||||
|
@ -3840,7 +3918,7 @@ base-64@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a"
|
resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a"
|
||||||
integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==
|
integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==
|
||||||
|
|
||||||
base64-js@^1.3.1:
|
base64-js@^1.0.2, base64-js@^1.3.1:
|
||||||
version "1.5.1"
|
version "1.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||||
|
@ -3961,6 +4039,14 @@ buffer-from@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
||||||
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
||||||
|
|
||||||
|
buffer@5.6.0:
|
||||||
|
version "5.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
|
||||||
|
integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
|
||||||
|
dependencies:
|
||||||
|
base64-js "^1.0.2"
|
||||||
|
ieee754 "^1.1.4"
|
||||||
|
|
||||||
buffer@^5.5.0:
|
buffer@^5.5.0:
|
||||||
version "5.7.1"
|
version "5.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
||||||
|
@ -4633,6 +4719,14 @@ detect-node@^2.0.4:
|
||||||
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
|
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
|
||||||
integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
|
integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
|
||||||
|
|
||||||
|
dezalgo@^1.0.4:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
|
||||||
|
integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==
|
||||||
|
dependencies:
|
||||||
|
asap "^2.0.0"
|
||||||
|
wrappy "1"
|
||||||
|
|
||||||
diff-sequences@^29.3.1:
|
diff-sequences@^29.3.1:
|
||||||
version "29.3.1"
|
version "29.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e"
|
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e"
|
||||||
|
@ -5449,7 +5543,7 @@ event-target-shim@^5.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
||||||
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
|
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
|
||||||
|
|
||||||
events@^3.3.0:
|
events@3.3.0, events@^3.3.0:
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
|
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
|
||||||
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
|
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
|
||||||
|
@ -5715,6 +5809,16 @@ formdata-polyfill@^4.0.10:
|
||||||
dependencies:
|
dependencies:
|
||||||
fetch-blob "^3.1.2"
|
fetch-blob "^3.1.2"
|
||||||
|
|
||||||
|
formidable@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f"
|
||||||
|
integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==
|
||||||
|
dependencies:
|
||||||
|
dezalgo "^1.0.4"
|
||||||
|
hexoid "^1.0.0"
|
||||||
|
once "^1.4.0"
|
||||||
|
qs "^6.11.0"
|
||||||
|
|
||||||
fs-minipass@^2.0.0:
|
fs-minipass@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
|
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
|
||||||
|
@ -6218,6 +6322,11 @@ header-case@^2.0.4:
|
||||||
capital-case "^1.0.4"
|
capital-case "^1.0.4"
|
||||||
tslib "^2.0.3"
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
hexoid@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18"
|
||||||
|
integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==
|
||||||
|
|
||||||
hosted-git-info@^2.1.4:
|
hosted-git-info@^2.1.4:
|
||||||
version "2.8.9"
|
version "2.8.9"
|
||||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
|
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
|
||||||
|
@ -6314,7 +6423,7 @@ idb@^7.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b"
|
resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b"
|
||||||
integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==
|
integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==
|
||||||
|
|
||||||
ieee754@^1.1.13, ieee754@^1.2.1:
|
ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||||
|
@ -6378,7 +6487,7 @@ inflight@^1.0.4:
|
||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
|
inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
@ -8491,7 +8600,7 @@ object.values@^1.1.5:
|
||||||
define-properties "^1.1.4"
|
define-properties "^1.1.4"
|
||||||
es-abstract "^1.20.4"
|
es-abstract "^1.20.4"
|
||||||
|
|
||||||
once@^1.3.0:
|
once@^1.3.0, once@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
||||||
|
@ -9128,6 +9237,13 @@ pvutils@^1.1.3:
|
||||||
resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3"
|
resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3"
|
||||||
integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==
|
integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==
|
||||||
|
|
||||||
|
qs@^6.11.0:
|
||||||
|
version "6.11.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
|
||||||
|
integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
|
||||||
|
dependencies:
|
||||||
|
side-channel "^1.0.4"
|
||||||
|
|
||||||
queue-microtask@^1.2.2, queue-microtask@^1.2.3:
|
queue-microtask@^1.2.2, queue-microtask@^1.2.3:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
|
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
|
||||||
|
@ -9169,7 +9285,7 @@ read-pkg@^5.2.0:
|
||||||
parse-json "^5.0.0"
|
parse-json "^5.0.0"
|
||||||
type-fest "^0.6.0"
|
type-fest "^0.6.0"
|
||||||
|
|
||||||
readable-stream@^3.4.0, readable-stream@^3.6.0:
|
readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
|
||||||
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
|
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
|
||||||
|
@ -9933,6 +10049,14 @@ stack-utils@^2.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
escape-string-regexp "^2.0.0"
|
escape-string-regexp "^2.0.0"
|
||||||
|
|
||||||
|
stream-browserify@3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
|
||||||
|
integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
|
||||||
|
dependencies:
|
||||||
|
inherits "~2.0.4"
|
||||||
|
readable-stream "^3.5.0"
|
||||||
|
|
||||||
streamsearch@^1.1.0:
|
streamsearch@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user