diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index d47c8e76..cf9a6609 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -33,7 +33,10 @@ import { } from '@gitroom/nestjs-libraries/integrations/social.abstract'; import { timer } from '@gitroom/helpers/utils/timer'; import { TelegramProvider } from '@gitroom/nestjs-libraries/integrations/social/telegram.provider'; -import { AuthorizationActions, Sections } from '@gitroom/backend/services/auth/permissions/permission.exception.class'; +import { + AuthorizationActions, + Sections, +} from '@gitroom/backend/services/auth/permissions/permission.exception.class'; @ApiTags('Integrations') @Controller('/integrations') @@ -95,6 +98,7 @@ export class IntegrationsController { id: p.id, internalId: p.internalId, disabled: p.disabled, + editor: findIntegration.editor, picture: p.picture || '/no-picture.jpg', identifier: p.providerIdentifier, inBetweenSteps: p.inBetweenSteps, @@ -255,85 +259,62 @@ export class IntegrationsController { throw new Error('Invalid integration'); } - if (getIntegration.type === 'social') { - const integrationProvider = this._integrationManager.getSocialIntegration( - getIntegration.providerIdentifier - ); - if (!integrationProvider) { - throw new Error('Invalid provider'); - } - - if (integrationProvider[body.name]) { - try { - const load = await integrationProvider[body.name]( - getIntegration.token, - body.data, - getIntegration.internalId, - getIntegration - ); - - return load; - } catch (err) { - if (err instanceof RefreshToken) { - const { accessToken, refreshToken, expiresIn, additionalSettings } = - await integrationProvider.refreshToken( - getIntegration.refreshToken - ); - - if (accessToken) { - await this._integrationService.createOrUpdateIntegration( - additionalSettings, - !!integrationProvider.oneTimeToken, - getIntegration.organizationId, - getIntegration.name, - getIntegration.picture!, - 'social', - getIntegration.internalId, - getIntegration.providerIdentifier, - accessToken, - refreshToken, - expiresIn - ); - - getIntegration.token = accessToken; - - if (integrationProvider.refreshWait) { - await timer(10000); - } - return this.functionIntegration(org, body); - } else { - await this._integrationService.disconnectChannel( - org.id, - getIntegration - ); - return false; - } - } - - return false; - } - } - throw new Error('Function not found'); + const integrationProvider = this._integrationManager.getSocialIntegration( + getIntegration.providerIdentifier + ); + if (!integrationProvider) { + throw new Error('Invalid provider'); } - if (getIntegration.type === 'article') { - const integrationProvider = - this._integrationManager.getArticlesIntegration( - getIntegration.providerIdentifier - ); - if (!integrationProvider) { - throw new Error('Invalid provider'); - } - - if (integrationProvider[body.name]) { - return integrationProvider[body.name]( + if (integrationProvider[body.name]) { + try { + const load = await integrationProvider[body.name]( getIntegration.token, body.data, - getIntegration.internalId + getIntegration.internalId, + getIntegration ); + + return load; + } catch (err) { + if (err instanceof RefreshToken) { + const { accessToken, refreshToken, expiresIn, additionalSettings } = + await integrationProvider.refreshToken(getIntegration.refreshToken); + + if (accessToken) { + await this._integrationService.createOrUpdateIntegration( + additionalSettings, + !!integrationProvider.oneTimeToken, + getIntegration.organizationId, + getIntegration.name, + getIntegration.picture!, + 'social', + getIntegration.internalId, + getIntegration.providerIdentifier, + accessToken, + refreshToken, + expiresIn + ); + + getIntegration.token = accessToken; + + if (integrationProvider.refreshWait) { + await timer(10000); + } + return this.functionIntegration(org, body); + } else { + await this._integrationService.disconnectChannel( + org.id, + getIntegration + ); + return false; + } + } + + return false; } - throw new Error('Function not found'); } + throw new Error('Function not found'); } @Post('/social/:integration/connect') diff --git a/apps/frontend/src/app/global.scss b/apps/frontend/src/app/global.scss index 547773ae..2047d477 100644 --- a/apps/frontend/src/app/global.scss +++ b/apps/frontend/src/app/global.scss @@ -543,4 +543,13 @@ html[dir='rtl'] [dir='ltr'] { .ProseMirror .mention { font-weight: bold; color: #ae8afc; +} + +.ProseMirror ul, .preview ul { + list-style: disc; + padding-left: 20px; +} + +.preview ul, .preview li { + white-space: nowrap; } \ No newline at end of file diff --git a/apps/frontend/src/components/launches/calendar.context.tsx b/apps/frontend/src/components/launches/calendar.context.tsx index 785fdac5..368e6c7b 100644 --- a/apps/frontend/src/components/launches/calendar.context.tsx +++ b/apps/frontend/src/components/launches/calendar.context.tsx @@ -68,6 +68,7 @@ export interface Integrations { id: string; disabled?: boolean; inBetweenSteps: boolean; + editor: 'normal' | 'markdown' | 'html'; display: string; identifier: string; type: string; diff --git a/apps/frontend/src/components/launches/general.preview.component.tsx b/apps/frontend/src/components/launches/general.preview.component.tsx index 7eb53c06..15e716e4 100644 --- a/apps/frontend/src/components/launches/general.preview.component.tsx +++ b/apps/frontend/src/components/launches/general.preview.component.tsx @@ -40,7 +40,6 @@ export const GeneralPreviewComponent: FC<{ return { text: finalValue, images: p.image }; }); - console.log(renderContent); return (
@@ -103,8 +102,8 @@ export const GeneralPreviewComponent: FC<{ : integration?.display || '@username'}
-
 {
+  const fetch = useFetch();
+
+  const load = useCallback(async (path: string) => {
+    return (await (await fetch(path)).json()).integrations;
+  }, []);
+
+  return useSWR('/integrations/list', load, {
+    fallbackData: [],
+  });
+};
\ No newline at end of file
diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx
index bdcca075..9db322d8 100644
--- a/apps/frontend/src/components/launches/launches.component.tsx
+++ b/apps/frontend/src/components/launches/launches.component.tsx
@@ -24,6 +24,8 @@ import { GeneratorComponent } from './generator/generator';
 import { useVariables } from '@gitroom/react/helpers/variable.context';
 import { NewPost } from '@gitroom/frontend/components/launches/new.post';
 import { useT } from '@gitroom/react/translation/get.transation.service.client';
+import { useIntegrationList } from '@gitroom/frontend/components/launches/helpers/use.integration.list';
+
 interface MenuComponentInterface {
   refreshChannel: (
     integration: Integration & {
@@ -283,16 +285,13 @@ export const LaunchesComponent = () => {
   const fireEvents = useFireEvents();
   const t = useT();
   const [reload, setReload] = useState(false);
-  const load = useCallback(async (path: string) => {
-    return (await (await fetch(path)).json()).integrations;
-  }, []);
+
   const {
     isLoading,
     data: integrations,
     mutate,
-  } = useSWR('/integrations/list', load, {
-    fallbackData: [],
-  });
+  } = useIntegrationList();
+
   const totalNonDisabledChannels = useMemo(() => {
     return (
       integrations?.filter((integration: any) => !integration.disabled)
@@ -453,7 +452,9 @@ export const LaunchesComponent = () => {
                     user?.tier?.ai &&
                     billingEnabled && }
                   
- {process.env.NEXT_PUBLIC_VERSION ? `${process.env.NEXT_PUBLIC_VERSION}` : ''} + {process.env.NEXT_PUBLIC_VERSION + ? `${process.env.NEXT_PUBLIC_VERSION}` + : ''}
diff --git a/apps/frontend/src/components/new-launch/add.edit.modal.tsx b/apps/frontend/src/components/new-launch/add.edit.modal.tsx index d08e1358..7898c823 100644 --- a/apps/frontend/src/components/new-launch/add.edit.modal.tsx +++ b/apps/frontend/src/components/new-launch/add.edit.modal.tsx @@ -115,6 +115,7 @@ export const AddEditModalInnerInner: FC = (props) => { setCurrent, internal, setTags, + setEditor, } = useLaunchStore( useShallow((state) => ({ reset: state.reset, @@ -124,6 +125,7 @@ export const AddEditModalInnerInner: FC = (props) => { global: state.global, internal: state.internal, setTags: state.setTags, + setEditor: state.setEditor, })) ); @@ -154,6 +156,9 @@ export const AddEditModalInnerInner: FC = (props) => { ); setCurrent(existingData.integration); } + else { + setEditor('normal'); + } if (props.focusedChannel) { setCurrent(props.focusedChannel); diff --git a/apps/frontend/src/components/new-launch/bullets.component.tsx b/apps/frontend/src/components/new-launch/bullets.component.tsx new file mode 100644 index 00000000..48fbceab --- /dev/null +++ b/apps/frontend/src/components/new-launch/bullets.component.tsx @@ -0,0 +1,20 @@ +'use client'; + +import { FC, useCallback } from 'react'; + +export const Bullets: FC<{ + editor: any; + currentValue: string; +}> = ({ editor }) => { + const bullet = () => { + editor.commands.toggleBulletList(); + }; + return ( +
+ A +
+ ); +}; diff --git a/apps/frontend/src/components/new-launch/editor.tsx b/apps/frontend/src/components/new-launch/editor.tsx index c2db7923..43991a3c 100644 --- a/apps/frontend/src/components/new-launch/editor.tsx +++ b/apps/frontend/src/components/new-launch/editor.tsx @@ -45,6 +45,8 @@ import Paragraph from '@tiptap/extension-paragraph'; import Underline from '@tiptap/extension-underline'; import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; import { History } from '@tiptap/extension-history'; +import { BulletList, ListItem } from '@tiptap/extension-list'; +import { Bullets } from '@gitroom/frontend/components/new-launch/bullets.component'; const InterceptBoldShortcut = Extension.create({ name: 'preventBoldWithUnderline', @@ -147,6 +149,9 @@ export const EditorWrapper: FC<{ totalChars, postComment, dummy, + editor, + loadedState, + setLoadedState, } = useLaunchStore( useShallow((state) => ({ internal: state.internal.find((p) => p.integration.id === state.current), @@ -172,6 +177,9 @@ export const EditorWrapper: FC<{ appendInternalValueMedia: state.appendInternalValueMedia, appendGlobalValueMedia: state.appendGlobalValueMedia, postComment: state.postComment, + editor: state.editor, + loadedState: state.loaded, + setLoadedState: state.setLoaded })) ); @@ -179,12 +187,13 @@ export const EditorWrapper: FC<{ const [loaded, setLoaded] = useState(true); useEffect(() => { - if (loaded) { + if (loaded && loadedState) { return; } + setLoadedState(true); setLoaded(true); - }, [loaded]); + }, [loaded, loadedState]); const canEdit = useMemo(() => { return current === 'global' || !!internal; @@ -341,7 +350,7 @@ export const EditorWrapper: FC<{ [current, global, internal] ); - if (!loaded) { + if (!loaded || !loadedState) { return null; } @@ -371,6 +380,7 @@ export const EditorWrapper: FC<{
= (props) => { const { + editorType = 'normal', allValues, pictures, setImages, @@ -520,7 +532,24 @@ export const Editor: FC<{ [uppy] ); - const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }); + const { getRootProps, isDragActive } = useDropzone({ onDrop }); + + const editorOptions = useMemo(() => { + if (editorType === 'normal') { + return []; + } + + const list = []; + + if ( + editorType === ('markdown' as const) || + editorType === ('html' as const) + ) { + list.push(BulletList, ListItem); + } + + return list; + }, [editorType]); const editor = useEditor({ extensions: [ @@ -536,6 +565,7 @@ export const Editor: FC<{ depth: 100, // default is 100 newGroupDelay: 100, // default is 500ms }), + ...editorOptions, ], content: props.value || '', shouldRerenderOnTransaction: true, @@ -590,6 +620,9 @@ export const Editor: FC<{ + {(editorType === 'markdown' || editorType === 'html') && ( + + )}
setEmojiPickerOpen(!emojiPickerOpen)} diff --git a/apps/frontend/src/components/new-launch/providers/high.order.provider.tsx b/apps/frontend/src/components/new-launch/providers/high.order.provider.tsx index c3cf1018..61ac2b2d 100644 --- a/apps/frontend/src/components/new-launch/providers/high.order.provider.tsx +++ b/apps/frontend/src/components/new-launch/providers/high.order.provider.tsx @@ -74,7 +74,6 @@ export const withProvider = function (params: { const fetch = useFetch(); const { current, - integrations, selectedIntegration, setCurrent, internal, @@ -87,6 +86,7 @@ export const withProvider = function (params: { justCurrent, allIntegrations, setPostComment, + setEditor, dummy, } = useLaunchStore( useShallow((state) => ({ @@ -104,6 +104,7 @@ export const withProvider = function (params: { setCurrent: state.setCurrent, setTotalChars: state.setTotalChars, setPostComment: state.setPostComment, + setEditor: state.setEditor, selectedIntegration: state.selectedIntegrations.find( (p) => p.integration.id === props.id ), @@ -118,9 +119,11 @@ export const withProvider = function (params: { if (isGlobal) { setPostComment(PostComment.ALL); setTotalChars(0); + setEditor('normal'); } if (current) { + setEditor(selectedIntegration?.integration.editor); setPostComment(postComment); setTotalChars( typeof maximumCharacters === 'number' @@ -246,25 +249,27 @@ export const withProvider = function (params: { {t('preview', 'Preview')}
- {current && (!!SettingsComponent || !!data?.internalPlugs?.length) && ( -
- -
- )} + {current && + (!!SettingsComponent || !!data?.internalPlugs?.length) && ( +
+ +
+ )}
- {current && (tab === 0 || - (!SettingsComponent && !data?.internalPlugs?.length)) && + {current && + (tab === 0 || + (!SettingsComponent && !data?.internalPlugs?.length)) && !value?.[0]?.content?.length && (
{t( diff --git a/apps/frontend/src/components/new-launch/providers/show.all.providers.tsx b/apps/frontend/src/components/new-launch/providers/show.all.providers.tsx index 292d01cd..8e83b804 100644 --- a/apps/frontend/src/components/new-launch/providers/show.all.providers.tsx +++ b/apps/frontend/src/components/new-launch/providers/show.all.providers.tsx @@ -24,11 +24,12 @@ import NostrProvider from '@gitroom/frontend/components/new-launch/providers/nos import VkProvider from '@gitroom/frontend/components/new-launch/providers/vk/vk.provider'; import { useLaunchStore } from '@gitroom/frontend/components/new-launch/store'; import { useShallow } from 'zustand/react/shallow'; -import React, { createRef, FC, forwardRef, useImperativeHandle } from 'react'; +import React, { FC, forwardRef, useEffect, useImperativeHandle } from 'react'; import { GeneralPreviewComponent } from '@gitroom/frontend/components/launches/general.preview.component'; import { IntegrationContext } from '@gitroom/frontend/components/launches/helpers/use.integration'; import { Button } from '@gitroom/react/form/button'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; +import { PostComment } from '@gitroom/frontend/components/new-launch/providers/high.order.provider'; export const Providers = [ { @@ -154,8 +155,10 @@ export const ShowAllProviders = forwardRef((props, ref) => { ); }, triggerAll: () => { - return selectedIntegrations.map(async (p) => await p.ref?.current.trigger()); - } + return selectedIntegrations.map( + async (p) => await p.ref?.current.trigger() + ); + }, })); return ( @@ -176,15 +179,18 @@ export const ShowAllProviders = forwardRef((props, ref) => { >
-
{global?.[0]?.content?.length === 0 ? ( -
{t('start_writing_your_post', 'Start writing your post for a preview')}
+
+ {t( + 'start_writing_your_post', + 'Start writing your post for a preview' + )} +
) : ( )} diff --git a/apps/frontend/src/components/new-launch/store.ts b/apps/frontend/src/components/new-launch/store.ts index c229f517..6f0ecac2 100644 --- a/apps/frontend/src/components/new-launch/store.ts +++ b/apps/frontend/src/components/new-launch/store.ts @@ -25,6 +25,8 @@ interface SelectedIntegrations { } interface StoreState { + editor: undefined | 'normal' | 'markdown' | 'html'; + loaded: boolean; date: dayjs.Dayjs; postComment: PostComment; dummy: boolean; @@ -118,9 +120,13 @@ interface StoreState { setPostComment: (postComment: PostComment) => void; setActivateExitButton?: (activateExitButton: boolean) => void; setDummy: (dummy: boolean) => void; + setEditor: (editor: 'normal' | 'markdown' | 'html') => void; + setLoaded?: (loaded: boolean) => void; } const initialState = { + editor: undefined as undefined, + loaded: true, dummy: false, activateExitButton: true, date: dayjs(), @@ -154,13 +160,22 @@ export const useLaunchStore = create()((set) => ({ ); if (existing) { + const selectedList = state.selectedIntegrations.filter( + (s, index) => s.integration.id !== existing.integration.id + ); + return { ...(existing.integration.id === state.current ? { current: 'global' } : {}), - selectedIntegrations: state.selectedIntegrations.filter( - (s, index) => s.integration.id !== existing.integration.id - ), + loaded: false, + selectedIntegrations: selectedList, + ...(selectedList.length === 0 + ? { + current: 'global', + editor: 'normal', + } + : {}), }; } @@ -512,4 +527,12 @@ export const useLaunchStore = create()((set) => ({ set((state) => ({ dummy, })), + setEditor: (editor: 'normal' | 'markdown' | 'html') => + set((state) => ({ + editor, + })), + setLoaded: (loaded: boolean) => + set((state) => ({ + loaded, + })), })); diff --git a/libraries/helpers/src/utils/strip.html.validation.ts b/libraries/helpers/src/utils/strip.html.validation.ts index f78eb2f3..fd2129ee 100644 --- a/libraries/helpers/src/utils/strip.html.validation.ts +++ b/libraries/helpers/src/utils/strip.html.validation.ts @@ -145,11 +145,11 @@ export const stripHtmlValidation = ( .replace(/<\/p>/gi, ''); if (replaceBold) { - return striptags(convertLinkedinMention(convertToAscii(html))); + return striptags(convertLinkedinMention(convertToAscii(html)), ['ul', 'li']); } // Strip all other tags - return striptags(html); + return striptags(html, ['ul', 'li']); }; export const convertLinkedinMention = (value: string) => { diff --git a/libraries/nestjs-libraries/src/integrations/article/article.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/article/article.integrations.interface.ts deleted file mode 100644 index c1d8a040..00000000 --- a/libraries/nestjs-libraries/src/integrations/article/article.integrations.interface.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface ArticleIntegrationsInterface { - authenticate(token: string): Promise<{ - id: string; - name: string; - token: string; - picture: string; - username: string; - }>; - post( - token: string, - content: string, - settings: object - ): Promise<{ postId: string; releaseURL: string }>; -} - -export interface ArticleProvider extends ArticleIntegrationsInterface { - identifier: string; - name: string; -} diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index fea9bd95..50fed756 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -1,16 +1,13 @@ import 'reflect-metadata'; -import { - Injectable, -} from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { XProvider } from '@gitroom/nestjs-libraries/integrations/social/x.provider'; import { SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { LinkedinProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.provider'; import { RedditProvider } from '@gitroom/nestjs-libraries/integrations/social/reddit.provider'; import { DevToProvider } from '@gitroom/nestjs-libraries/integrations/social/dev.to.provider'; import { HashnodeProvider } from '@gitroom/nestjs-libraries/integrations/social/hashnode.provider'; -import { MediumProvider } from '@gitroom/nestjs-libraries/integrations/article/medium.provider'; -import { ArticleProvider } from '@gitroom/nestjs-libraries/integrations/article/article.integrations.interface'; +import { MediumProvider } from '@gitroom/nestjs-libraries/integrations/social/medium.provider'; import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/facebook.provider'; import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; @@ -58,9 +55,6 @@ export const socialIntegrationList: SocialProvider[] = [ // new MastodonCustomProvider(), ]; -const articleIntegrationList: ArticleProvider[] = [ -]; - @Injectable() export class IntegrationManager { async getAllIntegrations() { @@ -70,15 +64,13 @@ export class IntegrationManager { name: p.name, identifier: p.identifier, toolTip: p.toolTip, + editor: p.editor, isExternal: !!p.externalUrl, isWeb3: !!p.isWeb3, ...(p.customFields ? { customFields: await p.customFields() } : {}), })) ), - article: articleIntegrationList.map((p) => ({ - name: p.name, - identifier: p.identifier, - })), + article: [] as any[], }; } @@ -123,10 +115,4 @@ export class IntegrationManager { getSocialIntegration(integration: string): SocialProvider { return socialIntegrationList.find((i) => i.identifier === integration)!; } - getAllowedArticlesIntegrations() { - return articleIntegrationList.map((p) => p.identifier); - } - getArticlesIntegration(integration: string): ArticleProvider { - return articleIntegrationList.find((i) => i.identifier === integration)!; - } } diff --git a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts index 7c3cd67c..38709136 100644 --- a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts @@ -131,6 +131,7 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { name = 'Bluesky'; isBetweenSteps = false; scopes = ['write:statuses', 'profile', 'write:media']; + editor = 'normal' as const; async customFields() { return [ diff --git a/libraries/nestjs-libraries/src/integrations/social/dev.to.provider.ts b/libraries/nestjs-libraries/src/integrations/social/dev.to.provider.ts index 71dbfa82..76f9c29c 100644 --- a/libraries/nestjs-libraries/src/integrations/social/dev.to.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/dev.to.provider.ts @@ -13,6 +13,7 @@ export class DevToProvider extends SocialAbstract implements SocialProvider { identifier = 'devto'; name = 'Dev.to'; isBetweenSteps = false; + editor = 'markdown' as const; scopes = [] as string[]; async generateAuthUrl() { diff --git a/libraries/nestjs-libraries/src/integrations/social/discord.provider.ts b/libraries/nestjs-libraries/src/integrations/social/discord.provider.ts index fd7085fe..6d8cfe9f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/discord.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/discord.provider.ts @@ -11,6 +11,7 @@ export class DiscordProvider extends SocialAbstract implements SocialProvider { identifier = 'discord'; name = 'Discord'; isBetweenSteps = false; + editor = 'markdown' as const; scopes = ['identify', 'guilds']; async refreshToken(refreshToken: string): Promise { const { access_token, expires_in, refresh_token } = await ( diff --git a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts index be917891..4dcab6b9 100644 --- a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts @@ -17,6 +17,7 @@ export class DribbbleProvider extends SocialAbstract implements SocialProvider { name = 'Dribbble'; isBetweenSteps = false; scopes = ['public', 'upload']; + editor = 'normal' as const; async refreshToken(refreshToken: string): Promise { const { access_token, expires_in } = await ( diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 485f9b64..acbe33d6 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -22,6 +22,7 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { 'pages_read_engagement', 'read_insights', ]; + editor = 'normal' as const; override handleErrors(body: string): | { diff --git a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts index ec5a6ed2..18b89a86 100644 --- a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts @@ -25,6 +25,7 @@ export class FarcasterProvider isBetweenSteps = false; isWeb3 = true; scopes = [] as string[]; + editor = 'normal' as const; async refreshToken(refresh_token: string): Promise { return { diff --git a/libraries/nestjs-libraries/src/integrations/social/hashnode.provider.ts b/libraries/nestjs-libraries/src/integrations/social/hashnode.provider.ts index df2cac67..55e097f4 100644 --- a/libraries/nestjs-libraries/src/integrations/social/hashnode.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/hashnode.provider.ts @@ -5,7 +5,7 @@ import { SocialProvider, } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -import { tags } from '@gitroom/nestjs-libraries/integrations/article/hashnode.tags'; +import { tags } from '@gitroom/nestjs-libraries/integrations/social/hashnode.tags'; import { jsonToGraphQLQuery } from 'json-to-graphql-query'; import { HashnodeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/hashnode.settings.dto'; import dayjs from 'dayjs'; @@ -17,6 +17,7 @@ export class HashnodeProvider extends SocialAbstract implements SocialProvider { name = 'Hashnode'; isBetweenSteps = false; scopes = [] as string[]; + editor = 'markdown' as const; async generateAuthUrl() { const state = makeId(6); diff --git a/libraries/nestjs-libraries/src/integrations/article/hashnode.tags.ts b/libraries/nestjs-libraries/src/integrations/social/hashnode.tags.ts similarity index 100% rename from libraries/nestjs-libraries/src/integrations/article/hashnode.tags.ts rename to libraries/nestjs-libraries/src/integrations/social/hashnode.tags.ts diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 85c6482f..2ca9b079 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -11,7 +11,6 @@ import dayjs from 'dayjs'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; import { InstagramDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/instagram.dto'; import { Integration } from '@prisma/client'; -import { number } from 'yup'; export class InstagramProvider extends SocialAbstract @@ -30,6 +29,7 @@ export class InstagramProvider 'instagram_manage_comments', 'instagram_manage_insights', ]; + editor = 'normal' as const; async refreshToken(refresh_token: string): Promise { return { diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.standalone.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.standalone.provider.ts index 578ee393..b5afc47a 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.standalone.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.standalone.provider.ts @@ -27,6 +27,8 @@ export class InstagramStandaloneProvider 'instagram_business_manage_insights', ]; + editor = 'normal' as const; + public override handleErrors(body: string): { type: "refresh-token" | "bad-body"; value: string } | undefined { return instagramProvider.handleErrors(body); } diff --git a/libraries/nestjs-libraries/src/integrations/social/lemmy.provider.ts b/libraries/nestjs-libraries/src/integrations/social/lemmy.provider.ts index 165ea086..56d46aee 100644 --- a/libraries/nestjs-libraries/src/integrations/social/lemmy.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/lemmy.provider.ts @@ -17,6 +17,7 @@ export class LemmyProvider extends SocialAbstract implements SocialProvider { name = 'Lemmy'; isBetweenSteps = false; scopes = [] as string[]; + editor = 'normal' as const; async customFields() { return [ diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts index 8d36cb06..96109f6a 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -30,6 +30,8 @@ export class LinkedinPageProvider 'r_organization_social', ]; + editor = 'normal' as const; + override async refreshToken( refresh_token: string ): Promise { diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index d99b902f..0f479501 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -31,6 +31,7 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider { 'r_organization_social', ]; refreshWait = true; + editor = 'normal' as const; async refreshToken(refresh_token: string): Promise { const { diff --git a/libraries/nestjs-libraries/src/integrations/social/mastodon.custom.provider.ts b/libraries/nestjs-libraries/src/integrations/social/mastodon.custom.provider.ts index bc4915e6..d38c1b2b 100644 --- a/libraries/nestjs-libraries/src/integrations/social/mastodon.custom.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/mastodon.custom.provider.ts @@ -9,6 +9,8 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; export class MastodonCustomProvider extends MastodonProvider { override identifier = 'mastodon-custom'; override name = 'M. Instance'; + editor = 'normal' as const; + async externalUrl(url: string) { const form = new FormData(); form.append('client_name', 'Postiz'); diff --git a/libraries/nestjs-libraries/src/integrations/social/mastodon.provider.ts b/libraries/nestjs-libraries/src/integrations/social/mastodon.provider.ts index 977ed51e..b9f1da7e 100644 --- a/libraries/nestjs-libraries/src/integrations/social/mastodon.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/mastodon.provider.ts @@ -13,6 +13,7 @@ export class MastodonProvider extends SocialAbstract implements SocialProvider { name = 'Mastodon'; isBetweenSteps = false; scopes = ['write:statuses', 'profile', 'write:media']; + editor = 'normal' as const; async refreshToken(refreshToken: string): Promise { return { diff --git a/libraries/nestjs-libraries/src/integrations/article/medium.provider.ts b/libraries/nestjs-libraries/src/integrations/social/medium.provider.ts similarity index 93% rename from libraries/nestjs-libraries/src/integrations/article/medium.provider.ts rename to libraries/nestjs-libraries/src/integrations/social/medium.provider.ts index 1f1d1e32..cf7d05ee 100644 --- a/libraries/nestjs-libraries/src/integrations/article/medium.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/medium.provider.ts @@ -1,5 +1,3 @@ -import { ArticleProvider } from '@gitroom/nestjs-libraries/integrations/article/article.integrations.interface'; -import { MediumSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/medium.settings.dto'; import { AuthTokenDetails, PostDetails, @@ -16,6 +14,7 @@ export class MediumProvider extends SocialAbstract implements SocialProvider { name = 'Medium'; isBetweenSteps = false; scopes = [] as string[]; + editor = 'markdown' as const; async generateAuthUrl() { const state = makeId(6); diff --git a/libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts b/libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts index d41214fd..e165a31f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts @@ -27,7 +27,8 @@ export class NostrProvider extends SocialAbstract implements SocialProvider { identifier = 'nostr'; name = 'Nostr'; isBetweenSteps = false; - scopes = []; + scopes = [] as string[]; + editor = 'normal' as const; async customFields() { return [ diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 588f7cd5..0ce6e1b4 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -28,6 +28,8 @@ export class PinterestProvider 'user_accounts:read', ]; + editor = 'normal' as const; + async refreshToken(refreshToken: string): Promise { const { access_token, expires_in } = await ( await this.fetch('https://api.pinterest.com/v5/oauth/token', { diff --git a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts index e0ba88d2..1dfd9aaf 100644 --- a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts @@ -15,6 +15,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { name = 'Reddit'; isBetweenSteps = false; scopes = ['read', 'identity', 'submit', 'flair']; + editor = 'normal' as const; async refreshToken(refreshToken: string): Promise { const { diff --git a/libraries/nestjs-libraries/src/integrations/social/slack.provider.ts b/libraries/nestjs-libraries/src/integrations/social/slack.provider.ts index 02e58d82..ad45c12a 100644 --- a/libraries/nestjs-libraries/src/integrations/social/slack.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/slack.provider.ts @@ -13,6 +13,7 @@ export class SlackProvider extends SocialAbstract implements SocialProvider { identifier = 'slack'; name = 'Slack'; isBetweenSteps = false; + editor = 'normal' as const; scopes = [ 'channels:read', 'chat:write', diff --git a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts index 19f019a8..f666752b 100644 --- a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts +++ b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts @@ -114,6 +114,7 @@ export interface SocialProvider refreshWait?: boolean; convertToJPEG?: boolean; isWeb3?: boolean; + editor: 'normal' | 'markdown' | 'html'; customFields?: () => Promise< { key: string; diff --git a/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts index 427b48db..3578c73e 100644 --- a/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/telegram.provider.ts @@ -23,6 +23,7 @@ export class TelegramProvider extends SocialAbstract implements SocialProvider { isBetweenSteps = false; isWeb3 = true; scopes = [] as string[]; + editor = 'normal' as const; async refreshToken(refresh_token: string): Promise { return { diff --git a/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts b/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts index dca5a974..b426cfe7 100644 --- a/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts @@ -25,6 +25,8 @@ export class ThreadsProvider extends SocialAbstract implements SocialProvider { 'threads_manage_insights', ]; + editor = 'normal' as const; + async refreshToken(refresh_token: string): Promise { const { access_token } = await ( await this.fetch( diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index cc6ad3d3..0f26a51f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -25,6 +25,8 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { 'user.info.profile', ]; + editor = 'normal' as const; + override handleErrors(body: string): | { type: 'refresh-token' | 'bad-body'; diff --git a/libraries/nestjs-libraries/src/integrations/social/vk.provider.ts b/libraries/nestjs-libraries/src/integrations/social/vk.provider.ts index 34a390b3..e5b45abb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/vk.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/vk.provider.ts @@ -26,6 +26,8 @@ export class VkProvider extends SocialAbstract implements SocialProvider { 'video', ]; + editor = 'normal' as const; + async refreshToken(refresh: string): Promise { const [oldRefreshToken, device_id] = refresh.split('&&&&'); const formData = new FormData(); diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index d3039438..c6ac2445 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -26,6 +26,8 @@ export class XProvider extends SocialAbstract implements SocialProvider { toolTip = 'You will be logged in into your current account, if you would like a different account, change it first on X'; + editor = 'normal' as const; + @Plug({ identifier: 'x-autoRepostPost', title: 'Auto Repost Posts', diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts index 1dbc6003..ce0b2e27 100644 --- a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -63,6 +63,8 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { 'https://www.googleapis.com/auth/yt-analytics.readonly', ]; + editor = 'normal' as const; + async refreshToken(refresh_token: string): Promise { const { client, oauth2 } = clientAndYoutube(); client.setCredentials({ refresh_token }); diff --git a/package.json b/package.json index c6427c10..61696e69 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "@tiptap/extension-bold": "^3.0.6", "@tiptap/extension-document": "^3.0.6", "@tiptap/extension-history": "^3.0.7", + "@tiptap/extension-list": "^3.0.7", "@tiptap/extension-paragraph": "^3.0.6", "@tiptap/extension-text": "^3.0.6", "@tiptap/extension-underline": "^3.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c071f20b..f63b7bd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,6 +123,9 @@ importers: '@tiptap/extension-history': specifier: ^3.0.7 version: 3.0.7(@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-list': + specifier: ^3.0.7 + version: 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) '@tiptap/extension-paragraph': specifier: ^3.0.6 version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) @@ -5524,11 +5527,11 @@ packages: peerDependencies: '@tiptap/extension-list': ^3.0.6 - '@tiptap/extension-list@3.0.6': - resolution: {integrity: sha512-pg4R8cjUSMKuMjfOJexFt961U0UDUXfChXQh7PI7BCRCxLAtUvm2l0kGg4OMXiM1PM/ylTApdtUDal0gdOuSrQ==} + '@tiptap/extension-list@3.0.7': + resolution: {integrity: sha512-rwu5dXRO0YLyxndMHI17PoxK0x0ZaMZKRZflqOy8fSnXNwd3Tdy8/6a9tsmpgO38kOZEYuvMVaeB7J/+UeBVLg==} peerDependencies: - '@tiptap/core': ^3.0.6 - '@tiptap/pm': ^3.0.6 + '@tiptap/core': ^3.0.7 + '@tiptap/pm': ^3.0.7 '@tiptap/extension-ordered-list@3.0.6': resolution: {integrity: sha512-9SbeGO6kGKoX8GwhaSgpFNCGxlzfGu5otK5DE+Unn5F8/gIYGBJkXTZE1tj8XzPmH6lWhmKJQPudANnW6yuKqg==} @@ -21155,9 +21158,9 @@ snapshots: '@tiptap/pm': 3.0.6 optional: true - '@tiptap/extension-bullet-list@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + '@tiptap/extension-bullet-list@3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': dependencies: - '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list': 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) '@tiptap/extension-code-block@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': dependencies: @@ -21214,22 +21217,22 @@ snapshots: '@tiptap/pm': 3.0.6 linkifyjs: 4.3.1 - '@tiptap/extension-list-item@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + '@tiptap/extension-list-item@3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': dependencies: - '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list': 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) - '@tiptap/extension-list-keymap@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + '@tiptap/extension-list-keymap@3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': dependencies: - '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list': 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) - '@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + '@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': dependencies: '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) '@tiptap/pm': 3.0.6 - '@tiptap/extension-ordered-list@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + '@tiptap/extension-ordered-list@3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': dependencies: - '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list': 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) '@tiptap/extension-paragraph@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': dependencies: @@ -21293,7 +21296,7 @@ snapshots: '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) '@tiptap/extension-blockquote': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) '@tiptap/extension-bold': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) - '@tiptap/extension-bullet-list': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-bullet-list': 3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) '@tiptap/extension-code': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) '@tiptap/extension-code-block': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) '@tiptap/extension-document': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) @@ -21304,10 +21307,10 @@ snapshots: '@tiptap/extension-horizontal-rule': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) '@tiptap/extension-italic': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) '@tiptap/extension-link': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) - '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) - '@tiptap/extension-list-item': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) - '@tiptap/extension-list-keymap': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) - '@tiptap/extension-ordered-list': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-list': 3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list-item': 3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-list-keymap': 3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-ordered-list': 3.0.6(@tiptap/extension-list@3.0.7(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) '@tiptap/extension-paragraph': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) '@tiptap/extension-strike': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) '@tiptap/extension-text': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))