mirror of
https://github.com/Shadowfita/docmost.git
synced 2025-11-10 04:22:00 +10:00
fixes
* integrate websocket redis adapter * use APP_SECRET for jwt signing * auto migrate database on startup in production * add updatedAt to update db operations * create enterprise ee package directory * fix comment editor focus * other fixes
This commit is contained in:
4
.dockerignore
Normal file
4
.dockerignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
node_modules
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
dist
|
||||||
18
.env.example
18
.env.example
@ -1,22 +1,15 @@
|
|||||||
APP_URL=http://localhost
|
APP_URL=http://localhost:3000
|
||||||
APP_SECRET=
|
APP_SECRET=REPLACE_WITH_LONG_SECRET
|
||||||
|
|
||||||
PORT=3000
|
PORT=3000
|
||||||
DEBUG_MODE=true
|
|
||||||
NODE_ENV=production
|
|
||||||
|
|
||||||
JWT_SECRET_KEY=ba8642edbed7f6c450e46875e8c835c7e417031abe1f7b03f3e56bb7481706d8
|
|
||||||
JWT_TOKEN_EXPIRES_IN=30d
|
JWT_TOKEN_EXPIRES_IN=30d
|
||||||
|
|
||||||
DATABASE_URL="postgresql://postgres:password@localhost:5432/dc?schema=public"
|
DATABASE_URL="postgresql://postgres:password@localhost:5432/docmost?schema=public"
|
||||||
REDIS_URL=redis://@127.0.0.1:6379
|
REDIS_URL=redis://127.0.0.1:6379
|
||||||
|
|
||||||
# local | s3
|
# local | s3
|
||||||
STORAGE_DRIVER=local
|
STORAGE_DRIVER=local
|
||||||
|
|
||||||
# local config
|
|
||||||
LOCAL_STORAGE_PATH=/storage
|
|
||||||
|
|
||||||
# S3 Config
|
# S3 Config
|
||||||
AWS_S3_ACCESS_KEY_ID=
|
AWS_S3_ACCESS_KEY_ID=
|
||||||
AWS_S3_SECRET_ACCESS_KEY=
|
AWS_S3_SECRET_ACCESS_KEY=
|
||||||
@ -24,7 +17,6 @@ AWS_S3_REGION=
|
|||||||
AWS_S3_BUCKET=
|
AWS_S3_BUCKET=
|
||||||
AWS_S3_ENDPOINT=
|
AWS_S3_ENDPOINT=
|
||||||
AWS_S3_URL=
|
AWS_S3_URL=
|
||||||
AWS_S3_USE_PATH_STYLE_ENDPOINT=false
|
|
||||||
|
|
||||||
# EMAIL drivers: smtp / postmark / log
|
# EMAIL drivers: smtp / postmark / log
|
||||||
MAIL_DRIVER=smtp
|
MAIL_DRIVER=smtp
|
||||||
@ -33,7 +25,7 @@ MAIL_PORT=2525
|
|||||||
MAIL_USERNAME=
|
MAIL_USERNAME=
|
||||||
MAIL_PASSWORD=
|
MAIL_PASSWORD=
|
||||||
MAIL_FROM_ADDRESS=hello@example.com
|
MAIL_FROM_ADDRESS=hello@example.com
|
||||||
MAIL_FROM_NAME=
|
MAIL_FROM_NAME=Docmost
|
||||||
|
|
||||||
# for postmark driver
|
# for postmark driver
|
||||||
POSTMARK_TOKEN=
|
POSTMARK_TOKEN=
|
||||||
|
|||||||
4
apps/client/.dockerignore
Normal file
4
apps/client/.dockerignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
node_modules
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
dist
|
||||||
@ -1,12 +1,12 @@
|
|||||||
import { EditorContent, useEditor } from '@tiptap/react';
|
import { EditorContent, useEditor } from "@tiptap/react";
|
||||||
import { Placeholder } from '@tiptap/extension-placeholder';
|
import { Placeholder } from "@tiptap/extension-placeholder";
|
||||||
import { Underline } from '@tiptap/extension-underline';
|
import { Underline } from "@tiptap/extension-underline";
|
||||||
import { Link } from '@tiptap/extension-link';
|
import { Link } from "@tiptap/extension-link";
|
||||||
import { StarterKit } from '@tiptap/starter-kit';
|
import { StarterKit } from "@tiptap/starter-kit";
|
||||||
import classes from './comment.module.css';
|
import classes from "./comment.module.css";
|
||||||
import { useFocusWithin } from '@mantine/hooks';
|
import { useFocusWithin } from "@mantine/hooks";
|
||||||
import clsx from 'clsx';
|
import clsx from "clsx";
|
||||||
import { forwardRef, useImperativeHandle } from 'react';
|
import { forwardRef, useEffect, useImperativeHandle } from "react";
|
||||||
|
|
||||||
interface CommentEditorProps {
|
interface CommentEditorProps {
|
||||||
defaultContent?: any;
|
defaultContent?: any;
|
||||||
@ -16,43 +16,62 @@ interface CommentEditorProps {
|
|||||||
autofocus?: boolean;
|
autofocus?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CommentEditor = forwardRef(({ defaultContent, onUpdate, editable, placeholder, autofocus }: CommentEditorProps,
|
const CommentEditor = forwardRef(
|
||||||
ref) => {
|
(
|
||||||
const { ref: focusRef, focused } = useFocusWithin();
|
{
|
||||||
|
defaultContent,
|
||||||
|
onUpdate,
|
||||||
|
editable,
|
||||||
|
placeholder,
|
||||||
|
autofocus,
|
||||||
|
}: CommentEditorProps,
|
||||||
|
ref,
|
||||||
|
) => {
|
||||||
|
const { ref: focusRef, focused } = useFocusWithin();
|
||||||
|
|
||||||
const commentEditor = useEditor({
|
const commentEditor = useEditor({
|
||||||
extensions: [
|
extensions: [
|
||||||
StarterKit.configure({
|
StarterKit.configure({
|
||||||
gapcursor: false,
|
gapcursor: false,
|
||||||
dropcursor: false,
|
dropcursor: false,
|
||||||
}),
|
}),
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: placeholder || 'Reply...',
|
placeholder: placeholder || "Reply...",
|
||||||
}),
|
}),
|
||||||
Underline,
|
Underline,
|
||||||
Link,
|
Link,
|
||||||
],
|
],
|
||||||
onUpdate({ editor }) {
|
onUpdate({ editor }) {
|
||||||
if (onUpdate) onUpdate(editor.getJSON());
|
if (onUpdate) onUpdate(editor.getJSON());
|
||||||
},
|
},
|
||||||
content: defaultContent,
|
content: defaultContent,
|
||||||
editable,
|
editable,
|
||||||
autofocus: (autofocus && 'end') || false,
|
autofocus: (autofocus && "end") || false,
|
||||||
});
|
});
|
||||||
|
|
||||||
useImperativeHandle(ref, () => ({
|
useEffect(() => {
|
||||||
clearContent: () => {
|
setTimeout(() => {
|
||||||
commentEditor.commands.clearContent();
|
if (autofocus) {
|
||||||
},
|
commentEditor?.commands.focus("end");
|
||||||
}));
|
}
|
||||||
|
}, 10);
|
||||||
|
}, [commentEditor, autofocus]);
|
||||||
|
|
||||||
return (
|
useImperativeHandle(ref, () => ({
|
||||||
<div ref={focusRef} className={classes.commentEditor}>
|
clearContent: () => {
|
||||||
<EditorContent editor={commentEditor}
|
commentEditor.commands.clearContent();
|
||||||
className={clsx(classes.ProseMirror, { [classes.focused]: focused })}
|
},
|
||||||
/>
|
}));
|
||||||
</div>
|
|
||||||
);
|
return (
|
||||||
});
|
<div ref={focusRef} className={classes.commentEditor}>
|
||||||
|
<EditorContent
|
||||||
|
editor={commentEditor}
|
||||||
|
className={clsx(classes.ProseMirror, { [classes.focused]: focused })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
export default CommentEditor;
|
export default CommentEditor;
|
||||||
|
|||||||
@ -15,7 +15,7 @@ export function UserProvider({ children }: React.PropsWithChildren) {
|
|||||||
|
|
||||||
if (isLoading) return <></>;
|
if (isLoading) return <></>;
|
||||||
|
|
||||||
if (!data.user && !data.workspace) return <></>;
|
if (!data?.user && !data?.workspace) return <></>;
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return <>an error occurred</>;
|
return <>an error occurred</>;
|
||||||
|
|||||||
5
apps/server/.dockerignore
Normal file
5
apps/server/.dockerignore
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
node_modules
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
dist
|
||||||
|
data
|
||||||
2
apps/server/.gitignore
vendored
2
apps/server/.gitignore
vendored
@ -1,9 +1,9 @@
|
|||||||
/storage
|
|
||||||
.env
|
.env
|
||||||
package-lock.json
|
package-lock.json
|
||||||
# compiled output
|
# compiled output
|
||||||
/dist
|
/dist
|
||||||
/node_modules
|
/node_modules
|
||||||
|
/data
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
logs
|
logs
|
||||||
|
|||||||
@ -8,10 +8,10 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nest build",
|
"build": "nest build",
|
||||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||||
"start": "nest start",
|
"start": "cross-env NODE_ENV=development nest start",
|
||||||
"start:dev": "nest start --watch",
|
"start:dev": "cross-env NODE_ENV=development nest start --watch",
|
||||||
"start:debug": "nest start --debug --watch",
|
"start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
|
||||||
"start:prod": "node dist/main",
|
"start:prod": "cross-env NODE_ENV=production node dist/main",
|
||||||
"email:dev": "email dev -p 5019 -d ./src/integrations/transactional/emails",
|
"email:dev": "email dev -p 5019 -d ./src/integrations/transactional/emails",
|
||||||
"migration:create": "tsx src/database/migrate.ts create",
|
"migration:create": "tsx src/database/migrate.ts create",
|
||||||
"migration:up": "tsx src/database/migrate.ts up",
|
"migration:up": "tsx src/database/migrate.ts up",
|
||||||
@ -37,6 +37,7 @@
|
|||||||
"@nestjs/common": "^10.3.9",
|
"@nestjs/common": "^10.3.9",
|
||||||
"@nestjs/config": "^3.2.2",
|
"@nestjs/config": "^3.2.2",
|
||||||
"@nestjs/core": "^10.3.9",
|
"@nestjs/core": "^10.3.9",
|
||||||
|
"@nestjs/event-emitter": "^2.0.4",
|
||||||
"@nestjs/jwt": "^10.2.0",
|
"@nestjs/jwt": "^10.2.0",
|
||||||
"@nestjs/mapped-types": "^2.0.5",
|
"@nestjs/mapped-types": "^2.0.5",
|
||||||
"@nestjs/passport": "^10.0.3",
|
"@nestjs/passport": "^10.0.3",
|
||||||
@ -45,6 +46,7 @@
|
|||||||
"@nestjs/websockets": "^10.3.9",
|
"@nestjs/websockets": "^10.3.9",
|
||||||
"@react-email/components": "0.0.19",
|
"@react-email/components": "0.0.19",
|
||||||
"@react-email/render": "^0.0.15",
|
"@react-email/render": "^0.0.15",
|
||||||
|
"@socket.io/redis-adapter": "^8.3.0",
|
||||||
"@types/pg": "^8.11.6",
|
"@types/pg": "^8.11.6",
|
||||||
"bcrypt": "^5.1.1",
|
"bcrypt": "^5.1.1",
|
||||||
"bullmq": "^5.7.14",
|
"bullmq": "^5.7.14",
|
||||||
@ -64,6 +66,8 @@
|
|||||||
"pg": "^8.11.5",
|
"pg": "^8.11.5",
|
||||||
"pg-tsquery": "^8.4.2",
|
"pg-tsquery": "^8.4.2",
|
||||||
"postmark": "^4.0.2",
|
"postmark": "^4.0.2",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"redis": "^4.6.14",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
"sanitize-filename-ts": "^1.0.2",
|
"sanitize-filename-ts": "^1.0.2",
|
||||||
|
|||||||
@ -44,7 +44,7 @@ export class TokenService {
|
|||||||
|
|
||||||
async verifyJwt(token: string) {
|
async verifyJwt(token: string) {
|
||||||
return this.jwtService.verifyAsync(token, {
|
return this.jwtService.verifyAsync(token, {
|
||||||
secret: this.environmentService.getJwtSecret(),
|
secret: this.environmentService.getAppSecret(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
|
|||||||
super({
|
super({
|
||||||
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
||||||
ignoreExpiration: false,
|
ignoreExpiration: false,
|
||||||
secretOrKey: environmentService.getJwtSecret(),
|
secretOrKey: environmentService.getAppSecret(),
|
||||||
passReqToCallback: true,
|
passReqToCallback: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import { PageHistoryRepo } from './repos/page/page-history.repo';
|
|||||||
import { AttachmentRepo } from './repos/attachment/attachment.repo';
|
import { AttachmentRepo } from './repos/attachment/attachment.repo';
|
||||||
import { KyselyDB } from '@docmost/db/types/kysely.types';
|
import { KyselyDB } from '@docmost/db/types/kysely.types';
|
||||||
import * as process from 'node:process';
|
import * as process from 'node:process';
|
||||||
|
import { MigrationService } from '@docmost/db/services/migration.service';
|
||||||
|
|
||||||
// https://github.com/brianc/node-postgres/issues/811
|
// https://github.com/brianc/node-postgres/issues/811
|
||||||
types.setTypeParser(types.builtins.INT8, (val) => Number(val));
|
types.setTypeParser(types.builtins.INT8, (val) => Number(val));
|
||||||
@ -39,7 +40,7 @@ types.setTypeParser(types.builtins.INT8, (val) => Number(val));
|
|||||||
}),
|
}),
|
||||||
plugins: [new CamelCasePlugin()],
|
plugins: [new CamelCasePlugin()],
|
||||||
log: (event: LogEvent) => {
|
log: (event: LogEvent) => {
|
||||||
if (environmentService.getEnv() !== 'development') return;
|
if (environmentService.getNodeEnv() !== 'development') return;
|
||||||
if (event.level === 'query') {
|
if (event.level === 'query') {
|
||||||
// console.log(event.query.sql);
|
// console.log(event.query.sql);
|
||||||
//if (event.query.parameters.length > 0) {
|
//if (event.query.parameters.length > 0) {
|
||||||
@ -52,6 +53,7 @@ types.setTypeParser(types.builtins.INT8, (val) => Number(val));
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
|
MigrationService,
|
||||||
WorkspaceRepo,
|
WorkspaceRepo,
|
||||||
UserRepo,
|
UserRepo,
|
||||||
GroupRepo,
|
GroupRepo,
|
||||||
@ -79,10 +81,18 @@ types.setTypeParser(types.builtins.INT8, (val) => Number(val));
|
|||||||
export class DatabaseModule implements OnModuleDestroy, OnApplicationBootstrap {
|
export class DatabaseModule implements OnModuleDestroy, OnApplicationBootstrap {
|
||||||
private readonly logger = new Logger(DatabaseModule.name);
|
private readonly logger = new Logger(DatabaseModule.name);
|
||||||
|
|
||||||
constructor(@InjectKysely() private readonly db: KyselyDB) {}
|
constructor(
|
||||||
|
@InjectKysely() private readonly db: KyselyDB,
|
||||||
|
private readonly migrationService: MigrationService,
|
||||||
|
private readonly environmentService: EnvironmentService,
|
||||||
|
) {}
|
||||||
|
|
||||||
async onApplicationBootstrap() {
|
async onApplicationBootstrap() {
|
||||||
await this.establishConnection();
|
await this.establishConnection();
|
||||||
|
|
||||||
|
if (this.environmentService.getNodeEnv() === 'production') {
|
||||||
|
await this.migrationService.migrateToLatest();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onModuleDestroy(): Promise<void> {
|
async onModuleDestroy(): Promise<void> {
|
||||||
@ -110,7 +120,7 @@ export class DatabaseModule implements OnModuleDestroy, OnApplicationBootstrap {
|
|||||||
|
|
||||||
if (i < retryAttempts - 1) {
|
if (i < retryAttempts - 1) {
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
`Retrying [${i + 1}/${retryAttempts}] in ${retryDelay} ms`,
|
`Retrying [${i + 1}/${retryAttempts}] in ${retryDelay / 1000} seconds`,
|
||||||
);
|
);
|
||||||
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -16,9 +16,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
|||||||
.addColumn('default_role', 'varchar', (col) =>
|
.addColumn('default_role', 'varchar', (col) =>
|
||||||
col.defaultTo(UserRole.MEMBER).notNull(),
|
col.defaultTo(UserRole.MEMBER).notNull(),
|
||||||
)
|
)
|
||||||
.addColumn('allowed_email_domains', sql`varchar[]`, (col) =>
|
.addColumn('email_domains', sql`varchar[]`, (col) => col.defaultTo('{}'))
|
||||||
col.defaultTo('{}'),
|
|
||||||
)
|
|
||||||
.addColumn('default_space_id', 'uuid', (col) => col)
|
.addColumn('default_space_id', 'uuid', (col) => col)
|
||||||
.addColumn('created_at', 'timestamptz', (col) =>
|
.addColumn('created_at', 'timestamptz', (col) =>
|
||||||
col.notNull().defaultTo(sql`now()`),
|
col.notNull().defaultTo(sql`now()`),
|
||||||
|
|||||||
@ -11,7 +11,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
|||||||
.addColumn('email_verified_at', 'timestamptz', (col) => col)
|
.addColumn('email_verified_at', 'timestamptz', (col) => col)
|
||||||
.addColumn('password', 'varchar', (col) => col)
|
.addColumn('password', 'varchar', (col) => col)
|
||||||
.addColumn('avatar_url', 'varchar', (col) => col)
|
.addColumn('avatar_url', 'varchar', (col) => col)
|
||||||
.addColumn('role', 'varchar', (col) => col.notNull())
|
.addColumn('role', 'varchar', (col) => col)
|
||||||
.addColumn('invited_by_id', 'uuid', (col) =>
|
.addColumn('invited_by_id', 'uuid', (col) =>
|
||||||
col.references('users.id').onDelete('set null'),
|
col.references('users.id').onDelete('set null'),
|
||||||
)
|
)
|
||||||
|
|||||||
@ -12,7 +12,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
|||||||
.addColumn('slug', 'varchar', (col) => col.notNull())
|
.addColumn('slug', 'varchar', (col) => col.notNull())
|
||||||
.addColumn('logo', 'varchar', (col) => col)
|
.addColumn('logo', 'varchar', (col) => col)
|
||||||
.addColumn('visibility', 'varchar', (col) =>
|
.addColumn('visibility', 'varchar', (col) =>
|
||||||
col.defaultTo(SpaceVisibility.OPEN).notNull(),
|
col.defaultTo(SpaceVisibility.PRIVATE).notNull(),
|
||||||
)
|
)
|
||||||
.addColumn('default_role', 'varchar', (col) =>
|
.addColumn('default_role', 'varchar', (col) =>
|
||||||
col.defaultTo(SpaceRole.WRITER).notNull(),
|
col.defaultTo(SpaceRole.WRITER).notNull(),
|
||||||
|
|||||||
@ -19,6 +19,7 @@ export async function up(db: Kysely<any>): Promise<void> {
|
|||||||
.addColumn('workspace_id', 'uuid', (col) =>
|
.addColumn('workspace_id', 'uuid', (col) =>
|
||||||
col.references('workspaces.id').notNull(),
|
col.references('workspaces.id').notNull(),
|
||||||
)
|
)
|
||||||
|
.addColumn('resolved_at', 'timestamptz', (col) => col)
|
||||||
.addColumn('created_at', 'timestamptz', (col) =>
|
.addColumn('created_at', 'timestamptz', (col) =>
|
||||||
col.notNull().defaultTo(sql`now()`),
|
col.notNull().defaultTo(sql`now()`),
|
||||||
)
|
)
|
||||||
|
|||||||
@ -54,7 +54,7 @@ export class GroupRepo {
|
|||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await this.db
|
await this.db
|
||||||
.updateTable('groups')
|
.updateTable('groups')
|
||||||
.set(updatableGroup)
|
.set({ ...updatableGroup, updatedAt: new Date() })
|
||||||
.where('id', '=', groupId)
|
.where('id', '=', groupId)
|
||||||
.where('workspaceId', '=', workspaceId)
|
.where('workspaceId', '=', workspaceId)
|
||||||
.execute();
|
.execute();
|
||||||
|
|||||||
@ -17,8 +17,13 @@ import { DB } from '@docmost/db/types/db';
|
|||||||
export class PageHistoryRepo {
|
export class PageHistoryRepo {
|
||||||
constructor(@InjectKysely() private readonly db: KyselyDB) {}
|
constructor(@InjectKysely() private readonly db: KyselyDB) {}
|
||||||
|
|
||||||
async findById(pageHistoryId: string): Promise<PageHistory> {
|
async findById(
|
||||||
return await this.db
|
pageHistoryId: string,
|
||||||
|
trx?: KyselyTransaction,
|
||||||
|
): Promise<PageHistory> {
|
||||||
|
const db = dbOrTx(this.db, trx);
|
||||||
|
|
||||||
|
return await db
|
||||||
.selectFrom('pageHistory')
|
.selectFrom('pageHistory')
|
||||||
.selectAll()
|
.selectAll()
|
||||||
.select((eb) => this.withLastUpdatedBy(eb))
|
.select((eb) => this.withLastUpdatedBy(eb))
|
||||||
@ -38,18 +43,21 @@ export class PageHistoryRepo {
|
|||||||
.executeTakeFirst();
|
.executeTakeFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
async saveHistory(page: Page): Promise<void> {
|
async saveHistory(page: Page, trx?: KyselyTransaction): Promise<void> {
|
||||||
await this.insertPageHistory({
|
await this.insertPageHistory(
|
||||||
pageId: page.id,
|
{
|
||||||
slugId: page.slugId,
|
pageId: page.id,
|
||||||
title: page.title,
|
slugId: page.slugId,
|
||||||
content: page.content,
|
title: page.title,
|
||||||
icon: page.icon,
|
content: page.content,
|
||||||
coverPhoto: page.coverPhoto,
|
icon: page.icon,
|
||||||
lastUpdatedById: page.lastUpdatedById ?? page.creatorId,
|
coverPhoto: page.coverPhoto,
|
||||||
spaceId: page.spaceId,
|
lastUpdatedById: page.lastUpdatedById ?? page.creatorId,
|
||||||
workspaceId: page.workspaceId,
|
spaceId: page.spaceId,
|
||||||
});
|
workspaceId: page.workspaceId,
|
||||||
|
},
|
||||||
|
trx,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async findPageHistoryByPageId(pageId: string, pagination: PaginationOptions) {
|
async findPageHistoryByPageId(pageId: string, pagination: PaginationOptions) {
|
||||||
@ -68,6 +76,18 @@ export class PageHistoryRepo {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async findPageLastHistory(pageId: string, trx?: KyselyTransaction) {
|
||||||
|
const db = dbOrTx(this.db, trx);
|
||||||
|
|
||||||
|
return await db
|
||||||
|
.selectFrom('pageHistory')
|
||||||
|
.selectAll()
|
||||||
|
.where('pageId', '=', pageId)
|
||||||
|
.limit(1)
|
||||||
|
.orderBy('createdAt', 'desc')
|
||||||
|
.executeTakeFirst();
|
||||||
|
}
|
||||||
|
|
||||||
withLastUpdatedBy(eb: ExpressionBuilder<DB, 'pageHistory'>) {
|
withLastUpdatedBy(eb: ExpressionBuilder<DB, 'pageHistory'>) {
|
||||||
return jsonObjectFrom(
|
return jsonObjectFrom(
|
||||||
eb
|
eb
|
||||||
|
|||||||
@ -46,9 +46,13 @@ export class PageRepo {
|
|||||||
includeContent?: boolean;
|
includeContent?: boolean;
|
||||||
includeYdoc?: boolean;
|
includeYdoc?: boolean;
|
||||||
includeSpace?: boolean;
|
includeSpace?: boolean;
|
||||||
|
withLock?: boolean;
|
||||||
|
trx?: KyselyTransaction;
|
||||||
},
|
},
|
||||||
): Promise<Page> {
|
): Promise<Page> {
|
||||||
let query = this.db
|
const db = dbOrTx(this.db, opts?.trx);
|
||||||
|
|
||||||
|
let query = db
|
||||||
.selectFrom('pages')
|
.selectFrom('pages')
|
||||||
.select(this.baseFields)
|
.select(this.baseFields)
|
||||||
.$if(opts?.includeContent, (qb) => qb.select('content'))
|
.$if(opts?.includeContent, (qb) => qb.select('content'))
|
||||||
@ -58,6 +62,10 @@ export class PageRepo {
|
|||||||
query = query.select((eb) => this.withSpace(eb));
|
query = query.select((eb) => this.withSpace(eb));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts?.withLock && opts?.trx) {
|
||||||
|
query = query.forUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
if (isValidUUID(pageId)) {
|
if (isValidUUID(pageId)) {
|
||||||
query = query.where('id', '=', pageId);
|
query = query.where('id', '=', pageId);
|
||||||
} else {
|
} else {
|
||||||
@ -73,7 +81,9 @@ export class PageRepo {
|
|||||||
trx?: KyselyTransaction,
|
trx?: KyselyTransaction,
|
||||||
) {
|
) {
|
||||||
const db = dbOrTx(this.db, trx);
|
const db = dbOrTx(this.db, trx);
|
||||||
let query = db.updateTable('pages').set(updatablePage);
|
let query = db
|
||||||
|
.updateTable('pages')
|
||||||
|
.set({ ...updatablePage, updatedAt: new Date() });
|
||||||
|
|
||||||
if (isValidUUID(pageId)) {
|
if (isValidUUID(pageId)) {
|
||||||
query = query.where('id', '=', pageId);
|
query = query.where('id', '=', pageId);
|
||||||
|
|||||||
@ -77,7 +77,7 @@ export class SpaceRepo {
|
|||||||
const db = dbOrTx(this.db, trx);
|
const db = dbOrTx(this.db, trx);
|
||||||
return db
|
return db
|
||||||
.updateTable('spaces')
|
.updateTable('spaces')
|
||||||
.set(updatableSpace)
|
.set({ ...updatableSpace, updatedAt: new Date() })
|
||||||
.where('id', '=', spaceId)
|
.where('id', '=', spaceId)
|
||||||
.where('workspaceId', '=', workspaceId)
|
.where('workspaceId', '=', workspaceId)
|
||||||
.returningAll()
|
.returningAll()
|
||||||
|
|||||||
@ -80,7 +80,7 @@ export class UserRepo {
|
|||||||
|
|
||||||
return await db
|
return await db
|
||||||
.updateTable('users')
|
.updateTable('users')
|
||||||
.set(updatableUser)
|
.set({ ...updatableUser, updatedAt: new Date() })
|
||||||
.where('id', '=', userId)
|
.where('id', '=', userId)
|
||||||
.where('workspaceId', '=', workspaceId)
|
.where('workspaceId', '=', workspaceId)
|
||||||
.execute();
|
.execute();
|
||||||
|
|||||||
@ -53,7 +53,7 @@ export class WorkspaceRepo {
|
|||||||
const db = dbOrTx(this.db, trx);
|
const db = dbOrTx(this.db, trx);
|
||||||
return db
|
return db
|
||||||
.updateTable('workspaces')
|
.updateTable('workspaces')
|
||||||
.set(updatableWorkspace)
|
.set({ ...updatableWorkspace, updatedAt: new Date() })
|
||||||
.where('id', '=', workspaceId)
|
.where('id', '=', workspaceId)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|||||||
47
apps/server/src/database/services/migration.service.ts
Normal file
47
apps/server/src/database/services/migration.service.ts
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
import { Migrator, FileMigrationProvider } from 'kysely';
|
||||||
|
import { InjectKysely } from 'nestjs-kysely';
|
||||||
|
import { KyselyDB } from '@docmost/db/types/kysely.types';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class MigrationService {
|
||||||
|
private readonly logger = new Logger(`Database${MigrationService.name}`);
|
||||||
|
|
||||||
|
constructor(@InjectKysely() private readonly db: KyselyDB) {}
|
||||||
|
|
||||||
|
async migrateToLatest(): Promise<void> {
|
||||||
|
const migrator = new Migrator({
|
||||||
|
db: this.db,
|
||||||
|
provider: new FileMigrationProvider({
|
||||||
|
fs,
|
||||||
|
path,
|
||||||
|
migrationFolder: path.join(__dirname, '..', 'migrations'),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const { error, results } = await migrator.migrateToLatest();
|
||||||
|
|
||||||
|
if (results && results.length === 0) {
|
||||||
|
this.logger.log('No pending database migrations');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
results?.forEach((it) => {
|
||||||
|
if (it.status === 'Success') {
|
||||||
|
this.logger.log(
|
||||||
|
`Migration "${it.migrationName}" executed successfully`,
|
||||||
|
);
|
||||||
|
} else if (it.status === 'Error') {
|
||||||
|
this.logger.error(`Failed to execute migration "${it.migrationName}"`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
this.logger.error('Failed to run database migration. Exiting program.');
|
||||||
|
this.logger.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
apps/server/src/helpers/constants.ts
Normal file
2
apps/server/src/helpers/constants.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export const APP_DATA_PATH = 'data';
|
||||||
|
export const LOCAL_STORAGE_PATH = `${APP_DATA_PATH}/storage`;
|
||||||
@ -1,3 +1,4 @@
|
|||||||
export * from './utils';
|
export * from './utils';
|
||||||
export * from './nanoid.utils';
|
export * from './nanoid.utils';
|
||||||
export * from './file.helper';
|
export * from './file.helper';
|
||||||
|
export * from './constants';
|
||||||
|
|||||||
@ -3,12 +3,6 @@ import * as bcrypt from 'bcrypt';
|
|||||||
|
|
||||||
export const envPath = path.resolve(process.cwd(), '..', '..', '.env');
|
export const envPath = path.resolve(process.cwd(), '..', '..', '.env');
|
||||||
|
|
||||||
export function generateHostname(name: string): string {
|
|
||||||
let hostname = name.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
||||||
hostname = hostname.substring(0, 30);
|
|
||||||
return hostname;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function hashPassword(password: string) {
|
export async function hashPassword(password: string) {
|
||||||
const saltRounds = 12;
|
const saltRounds = 12;
|
||||||
return bcrypt.hash(password, saltRounds);
|
return bcrypt.hash(password, saltRounds);
|
||||||
@ -21,15 +15,12 @@ export async function comparePasswordHash(
|
|||||||
return bcrypt.compare(plainPassword, passwordHash);
|
return bcrypt.compare(plainPassword, passwordHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getRandomInt(min = 4, max = 5) {
|
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type RedisConfig = {
|
export type RedisConfig = {
|
||||||
host: string;
|
host: string;
|
||||||
port: number;
|
port: number;
|
||||||
password?: string;
|
password?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function parseRedisUrl(redisUrl: string): RedisConfig {
|
export function parseRedisUrl(redisUrl: string): RedisConfig {
|
||||||
// format - redis[s]://[[username][:password]@][host][:port][/db-number]
|
// format - redis[s]://[[username][:password]@][host][:port][/db-number]
|
||||||
const { hostname, port, password } = new URL(redisUrl);
|
const { hostname, port, password } = new URL(redisUrl);
|
||||||
@ -37,3 +28,9 @@ export function parseRedisUrl(redisUrl: string): RedisConfig {
|
|||||||
|
|
||||||
return { host: hostname, port: portInt, password };
|
return { host: hostname, port: portInt, password };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function createRetryStrategy() {
|
||||||
|
return function (times: number): number {
|
||||||
|
return Math.max(Math.min(Math.exp(times), 20000), 3000);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@ -5,8 +5,8 @@ import { ConfigService } from '@nestjs/config';
|
|||||||
export class EnvironmentService {
|
export class EnvironmentService {
|
||||||
constructor(private configService: ConfigService) {}
|
constructor(private configService: ConfigService) {}
|
||||||
|
|
||||||
getEnv(): string {
|
getNodeEnv(): string {
|
||||||
return this.configService.get<string>('NODE_ENV');
|
return this.configService.get<string>('NODE_ENV', 'development');
|
||||||
}
|
}
|
||||||
|
|
||||||
getAppUrl(): string {
|
getAppUrl(): string {
|
||||||
@ -17,7 +17,7 @@ export class EnvironmentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getPort(): number {
|
getPort(): number {
|
||||||
return parseInt(this.configService.get<string>('PORT'));
|
return parseInt(this.configService.get<string>('PORT', '3000'));
|
||||||
}
|
}
|
||||||
|
|
||||||
getAppSecret(): string {
|
getAppSecret(): string {
|
||||||
@ -28,20 +28,19 @@ export class EnvironmentService {
|
|||||||
return this.configService.get<string>('DATABASE_URL');
|
return this.configService.get<string>('DATABASE_URL');
|
||||||
}
|
}
|
||||||
|
|
||||||
getJwtSecret(): string {
|
getRedisUrl(): string {
|
||||||
return this.configService.get<string>('JWT_SECRET_KEY');
|
return this.configService.get<string>(
|
||||||
|
'REDIS_URL',
|
||||||
|
'redis://localhost:6379',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
getJwtTokenExpiresIn(): string {
|
getJwtTokenExpiresIn(): string {
|
||||||
return this.configService.get<string>('JWT_TOKEN_EXPIRES_IN');
|
return this.configService.get<string>('JWT_TOKEN_EXPIRES_IN', '30d');
|
||||||
}
|
}
|
||||||
|
|
||||||
getStorageDriver(): string {
|
getStorageDriver(): string {
|
||||||
return this.configService.get<string>('STORAGE_DRIVER');
|
return this.configService.get<string>('STORAGE_DRIVER', 'local');
|
||||||
}
|
|
||||||
|
|
||||||
getLocalStoragePath(): string {
|
|
||||||
return this.configService.get<string>('LOCAL_STORAGE_PATH');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getAwsS3AccessKeyId(): string {
|
getAwsS3AccessKeyId(): string {
|
||||||
@ -68,27 +67,12 @@ export class EnvironmentService {
|
|||||||
return this.configService.get<string>('AWS_S3_URL');
|
return this.configService.get<string>('AWS_S3_URL');
|
||||||
}
|
}
|
||||||
|
|
||||||
getAwsS3UsePathStyleEndpoint(): boolean {
|
|
||||||
return this.configService.get<boolean>('AWS_S3_USE_PATH_STYLE_ENDPOINT');
|
|
||||||
}
|
|
||||||
|
|
||||||
isCloud(): boolean {
|
|
||||||
const cloudConfig = this.configService
|
|
||||||
.get<string>('CLOUD', 'false')
|
|
||||||
.toLowerCase();
|
|
||||||
return cloudConfig === 'true';
|
|
||||||
}
|
|
||||||
|
|
||||||
isSelfHosted(): boolean {
|
|
||||||
return !this.isCloud();
|
|
||||||
}
|
|
||||||
|
|
||||||
getMailDriver(): string {
|
getMailDriver(): string {
|
||||||
return this.configService.get<string>('MAIL_DRIVER', 'log');
|
return this.configService.get<string>('MAIL_DRIVER', 'log');
|
||||||
}
|
}
|
||||||
|
|
||||||
getMailHost(): string {
|
getMailHost(): string {
|
||||||
return this.configService.get<string>('MAIL_HOST', '127.0.0.1');
|
return this.configService.get<string>('MAIL_HOST');
|
||||||
}
|
}
|
||||||
|
|
||||||
getMailPort(): number {
|
getMailPort(): number {
|
||||||
@ -115,10 +99,14 @@ export class EnvironmentService {
|
|||||||
return this.configService.get<string>('POSTMARK_TOKEN');
|
return this.configService.get<string>('POSTMARK_TOKEN');
|
||||||
}
|
}
|
||||||
|
|
||||||
getRedisUrl(): string {
|
isCloud(): boolean {
|
||||||
return this.configService.get<string>(
|
const cloudConfig = this.configService
|
||||||
'REDIS_URL',
|
.get<string>('CLOUD', 'false')
|
||||||
'redis://@127.0.0.1:6379',
|
.toLowerCase();
|
||||||
);
|
return cloudConfig === 'true';
|
||||||
|
}
|
||||||
|
|
||||||
|
isSelfHosted(): boolean {
|
||||||
|
return !this.isCloud();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,12 @@
|
|||||||
import { IsString, IsUrl, validateSync } from 'class-validator';
|
import { IsNotEmpty, IsUrl, validateSync } from 'class-validator';
|
||||||
import { plainToInstance } from 'class-transformer';
|
import { plainToInstance } from 'class-transformer';
|
||||||
|
|
||||||
export class EnvironmentVariables {
|
export class EnvironmentVariables {
|
||||||
@IsString()
|
@IsNotEmpty()
|
||||||
NODE_ENV: string;
|
|
||||||
|
|
||||||
@IsUrl({ protocols: ['postgres', 'postgresql'], require_tld: false })
|
@IsUrl({ protocols: ['postgres', 'postgresql'], require_tld: false })
|
||||||
DATABASE_URL: string;
|
DATABASE_URL: string;
|
||||||
|
|
||||||
@IsString()
|
@IsNotEmpty()
|
||||||
APP_SECRET: string;
|
APP_SECRET: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
apps/server/src/integrations/logger/internal-log-filter.ts
Normal file
19
apps/server/src/integrations/logger/internal-log-filter.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { ConsoleLogger } from '@nestjs/common';
|
||||||
|
|
||||||
|
export class InternalLogFilter extends ConsoleLogger {
|
||||||
|
static contextsToIgnore = [
|
||||||
|
'InstanceLoader',
|
||||||
|
'RoutesResolver',
|
||||||
|
'RouterExplorer',
|
||||||
|
'WebSocketsController',
|
||||||
|
];
|
||||||
|
|
||||||
|
log(_: any, context?: string): void {
|
||||||
|
if (
|
||||||
|
process.env.NODE_ENV !== 'production' ||
|
||||||
|
!InternalLogFilter.contextsToIgnore.includes(context)
|
||||||
|
) {
|
||||||
|
super.log.apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import { Global, Module } from '@nestjs/common';
|
import { Global, Module } from '@nestjs/common';
|
||||||
import { BullModule } from '@nestjs/bullmq';
|
import { BullModule } from '@nestjs/bullmq';
|
||||||
import { EnvironmentService } from '../environment/environment.service';
|
import { EnvironmentService } from '../environment/environment.service';
|
||||||
import { parseRedisUrl } from '../../helpers';
|
import { createRetryStrategy, parseRedisUrl } from '../../helpers';
|
||||||
import { QueueName } from './constants';
|
import { QueueName } from './constants';
|
||||||
|
|
||||||
@Global()
|
@Global()
|
||||||
@ -15,9 +15,7 @@ import { QueueName } from './constants';
|
|||||||
host: redisConfig.host,
|
host: redisConfig.host,
|
||||||
port: redisConfig.port,
|
port: redisConfig.port,
|
||||||
password: redisConfig.password,
|
password: redisConfig.password,
|
||||||
retryStrategy: function (times: number) {
|
retryStrategy: createRetryStrategy(),
|
||||||
return Math.max(Math.min(Math.exp(times), 20000), 1000);
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
defaultJobOptions: {
|
defaultJobOptions: {
|
||||||
attempts: 3,
|
attempts: 3,
|
||||||
|
|||||||
@ -30,7 +30,7 @@ export class StaticModule implements OnModuleInit {
|
|||||||
const windowVar = '<!--window-config-->';
|
const windowVar = '<!--window-config-->';
|
||||||
|
|
||||||
const configString = {
|
const configString = {
|
||||||
ENV: this.environmentService.getEnv(),
|
ENV: this.environmentService.getNodeEnv(),
|
||||||
APP_URL: this.environmentService.getAppUrl(),
|
APP_URL: this.environmentService.getAppUrl(),
|
||||||
IS_CLOUD: this.environmentService.isCloud(),
|
IS_CLOUD: this.environmentService.isCloud(),
|
||||||
};
|
};
|
||||||
|
|||||||
@ -11,6 +11,8 @@ import {
|
|||||||
StorageOption,
|
StorageOption,
|
||||||
} from '../interfaces';
|
} from '../interfaces';
|
||||||
import { LocalDriver, S3Driver } from '../drivers';
|
import { LocalDriver, S3Driver } from '../drivers';
|
||||||
|
import * as process from 'node:process';
|
||||||
|
import { LOCAL_STORAGE_PATH } from '../../../helpers';
|
||||||
|
|
||||||
function createStorageDriver(disk: StorageConfig): StorageDriver {
|
function createStorageDriver(disk: StorageConfig): StorageDriver {
|
||||||
switch (disk.driver) {
|
switch (disk.driver) {
|
||||||
@ -33,8 +35,7 @@ export const storageDriverConfigProvider = {
|
|||||||
return {
|
return {
|
||||||
driver,
|
driver,
|
||||||
config: {
|
config: {
|
||||||
storagePath:
|
storagePath: process.cwd() + '/' + LOCAL_STORAGE_PATH,
|
||||||
process.cwd() + '/' + environmentService.getLocalStoragePath(),
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import {
|
|||||||
import { NotFoundException, ValidationPipe } from '@nestjs/common';
|
import { NotFoundException, ValidationPipe } from '@nestjs/common';
|
||||||
import { TransformHttpResponseInterceptor } from './interceptors/http-response.interceptor';
|
import { TransformHttpResponseInterceptor } from './interceptors/http-response.interceptor';
|
||||||
import fastifyMultipart from '@fastify/multipart';
|
import fastifyMultipart from '@fastify/multipart';
|
||||||
|
import { WsRedisIoAdapter } from './ws/adapter/ws-redis.adapter';
|
||||||
|
import { InternalLogFilter } from './integrations/logger/internal-log-filter';
|
||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create<NestFastifyApplication>(
|
const app = await NestFactory.create<NestFastifyApplication>(
|
||||||
@ -15,10 +17,18 @@ async function bootstrap() {
|
|||||||
ignoreTrailingSlash: true,
|
ignoreTrailingSlash: true,
|
||||||
ignoreDuplicateSlashes: true,
|
ignoreDuplicateSlashes: true,
|
||||||
}),
|
}),
|
||||||
|
{
|
||||||
|
logger: new InternalLogFilter(),
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
app.setGlobalPrefix('api');
|
app.setGlobalPrefix('api');
|
||||||
|
|
||||||
|
const redisIoAdapter = new WsRedisIoAdapter(app);
|
||||||
|
await redisIoAdapter.connectToRedis();
|
||||||
|
|
||||||
|
app.useWebSocketAdapter(redisIoAdapter);
|
||||||
|
|
||||||
await app.register(fastifyMultipart);
|
await app.register(fastifyMultipart);
|
||||||
|
|
||||||
app
|
app
|
||||||
@ -50,7 +60,7 @@ async function bootstrap() {
|
|||||||
app.useGlobalInterceptors(new TransformHttpResponseInterceptor());
|
app.useGlobalInterceptors(new TransformHttpResponseInterceptor());
|
||||||
app.enableShutdownHooks();
|
app.enableShutdownHooks();
|
||||||
|
|
||||||
await app.listen(process.env.PORT || 3000);
|
await app.listen(process.env.PORT || 3000, '0.0.0.0');
|
||||||
}
|
}
|
||||||
|
|
||||||
bootstrap();
|
bootstrap();
|
||||||
|
|||||||
26
apps/server/src/ws/adapter/ws-redis.adapter.ts
Normal file
26
apps/server/src/ws/adapter/ws-redis.adapter.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { IoAdapter } from '@nestjs/platform-socket.io';
|
||||||
|
import { ServerOptions } from 'socket.io';
|
||||||
|
import { createAdapter } from '@socket.io/redis-adapter';
|
||||||
|
import Redis, { RedisOptions } from 'ioredis';
|
||||||
|
import { createRetryStrategy } from '../../helpers';
|
||||||
|
|
||||||
|
export class WsRedisIoAdapter extends IoAdapter {
|
||||||
|
private adapterConstructor: ReturnType<typeof createAdapter>;
|
||||||
|
|
||||||
|
async connectToRedis(): Promise<void> {
|
||||||
|
const options: RedisOptions = {
|
||||||
|
retryStrategy: createRetryStrategy(),
|
||||||
|
};
|
||||||
|
|
||||||
|
const pubClient = new Redis(process.env.REDIS_URL, options);
|
||||||
|
const subClient = new Redis(process.env.REDIS_URL, options);
|
||||||
|
|
||||||
|
this.adapterConstructor = createAdapter(pubClient, subClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
createIOServer(port: number, options?: ServerOptions): any {
|
||||||
|
const server = super.createIOServer(port, options);
|
||||||
|
server.adapter(this.adapterConstructor);
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "nx run-many -t build",
|
"build": "nx run-many -t build",
|
||||||
|
"start": "pnpm --filter ./apps/server run start:prod",
|
||||||
"server:build": "nx run server:build",
|
"server:build": "nx run server:build",
|
||||||
"client:build": "nx run client:build",
|
"client:build": "nx run client:build",
|
||||||
"editor-ext:editor-ext": "nx run editor-ext:build",
|
"editor-ext:editor-ext": "nx run editor-ext:build",
|
||||||
@ -14,10 +15,12 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@docmost/editor-ext": "workspace:*",
|
"@docmost/editor-ext": "workspace:*",
|
||||||
|
"@hocuspocus/extension-redis": "^2.13.0",
|
||||||
"@hocuspocus/provider": "^2.13.0",
|
"@hocuspocus/provider": "^2.13.0",
|
||||||
"@hocuspocus/server": "^2.13.0",
|
"@hocuspocus/server": "^2.13.0",
|
||||||
"@hocuspocus/transformer": "^2.13.0",
|
"@hocuspocus/transformer": "^2.13.0",
|
||||||
"@sindresorhus/slugify": "^2.2.1",
|
"@sindresorhus/slugify": "^2.2.1",
|
||||||
|
"@tiptap/core": "^2.4.0",
|
||||||
"@tiptap/extension-code-block": "^2.4.0",
|
"@tiptap/extension-code-block": "^2.4.0",
|
||||||
"@tiptap/extension-collaboration": "^2.4.0",
|
"@tiptap/extension-collaboration": "^2.4.0",
|
||||||
"@tiptap/extension-collaboration-cursor": "^2.4.0",
|
"@tiptap/extension-collaboration-cursor": "^2.4.0",
|
||||||
@ -45,7 +48,9 @@
|
|||||||
"@tiptap/react": "^2.4.0",
|
"@tiptap/react": "^2.4.0",
|
||||||
"@tiptap/starter-kit": "^2.4.0",
|
"@tiptap/starter-kit": "^2.4.0",
|
||||||
"@tiptap/suggestion": "^2.4.0",
|
"@tiptap/suggestion": "^2.4.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"fractional-indexing-jittered": "^0.9.1",
|
"fractional-indexing-jittered": "^0.9.1",
|
||||||
|
"ioredis": "^5.4.1",
|
||||||
"tiptap-extension-global-drag-handle": "^0.1.8",
|
"tiptap-extension-global-drag-handle": "^0.1.8",
|
||||||
"y-indexeddb": "^9.0.12",
|
"y-indexeddb": "^9.0.12",
|
||||||
"yjs": "^13.6.15"
|
"yjs": "^13.6.15"
|
||||||
|
|||||||
0
packages/ee/LICENSE
Normal file
0
packages/ee/LICENSE
Normal file
252
pnpm-lock.yaml
generated
252
pnpm-lock.yaml
generated
@ -11,6 +11,9 @@ importers:
|
|||||||
'@docmost/editor-ext':
|
'@docmost/editor-ext':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:packages/editor-ext
|
version: link:packages/editor-ext
|
||||||
|
'@hocuspocus/extension-redis':
|
||||||
|
specifier: ^2.13.0
|
||||||
|
version: 2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
||||||
'@hocuspocus/provider':
|
'@hocuspocus/provider':
|
||||||
specifier: ^2.13.0
|
specifier: ^2.13.0
|
||||||
version: 2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
version: 2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
||||||
@ -23,6 +26,9 @@ importers:
|
|||||||
'@sindresorhus/slugify':
|
'@sindresorhus/slugify':
|
||||||
specifier: ^2.2.1
|
specifier: ^2.2.1
|
||||||
version: 2.2.1
|
version: 2.2.1
|
||||||
|
'@tiptap/core':
|
||||||
|
specifier: ^2.4.0
|
||||||
|
version: 2.4.0(@tiptap/pm@2.4.0)
|
||||||
'@tiptap/extension-code-block':
|
'@tiptap/extension-code-block':
|
||||||
specifier: ^2.4.0
|
specifier: ^2.4.0
|
||||||
version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)
|
version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)
|
||||||
@ -104,9 +110,15 @@ importers:
|
|||||||
'@tiptap/suggestion':
|
'@tiptap/suggestion':
|
||||||
specifier: ^2.4.0
|
specifier: ^2.4.0
|
||||||
version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)
|
version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)
|
||||||
|
cross-env:
|
||||||
|
specifier: ^7.0.3
|
||||||
|
version: 7.0.3
|
||||||
fractional-indexing-jittered:
|
fractional-indexing-jittered:
|
||||||
specifier: ^0.9.1
|
specifier: ^0.9.1
|
||||||
version: 0.9.1
|
version: 0.9.1
|
||||||
|
ioredis:
|
||||||
|
specifier: ^5.4.1
|
||||||
|
version: 5.4.1
|
||||||
tiptap-extension-global-drag-handle:
|
tiptap-extension-global-drag-handle:
|
||||||
specifier: ^0.1.8
|
specifier: ^0.1.8
|
||||||
version: 0.1.8
|
version: 0.1.8
|
||||||
@ -119,7 +131,7 @@ importers:
|
|||||||
devDependencies:
|
devDependencies:
|
||||||
'@nx/js':
|
'@nx/js':
|
||||||
specifier: 19.1.2
|
specifier: 19.1.2
|
||||||
version: 19.1.2(@babel/traverse@7.24.1)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
version: 19.1.2(@babel/traverse@7.24.6)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
||||||
nx:
|
nx:
|
||||||
specifier: 19.1.2
|
specifier: 19.1.2
|
||||||
version: 19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2))
|
version: 19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2))
|
||||||
@ -307,6 +319,9 @@ importers:
|
|||||||
'@nestjs/core':
|
'@nestjs/core':
|
||||||
specifier: ^10.3.9
|
specifier: ^10.3.9
|
||||||
version: 10.3.9(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
version: 10.3.9(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
'@nestjs/event-emitter':
|
||||||
|
specifier: ^2.0.4
|
||||||
|
version: 2.0.4(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1))
|
||||||
'@nestjs/jwt':
|
'@nestjs/jwt':
|
||||||
specifier: ^10.2.0
|
specifier: ^10.2.0
|
||||||
version: 10.2.0(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))
|
version: 10.2.0(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))
|
||||||
@ -331,6 +346,9 @@ importers:
|
|||||||
'@react-email/render':
|
'@react-email/render':
|
||||||
specifier: ^0.0.15
|
specifier: ^0.0.15
|
||||||
version: 0.0.15
|
version: 0.0.15
|
||||||
|
'@socket.io/redis-adapter':
|
||||||
|
specifier: ^8.3.0
|
||||||
|
version: 8.3.0(socket.io-adapter@2.5.4)
|
||||||
'@types/pg':
|
'@types/pg':
|
||||||
specifier: ^8.11.6
|
specifier: ^8.11.6
|
||||||
version: 8.11.6
|
version: 8.11.6
|
||||||
@ -388,6 +406,12 @@ importers:
|
|||||||
postmark:
|
postmark:
|
||||||
specifier: ^4.0.2
|
specifier: ^4.0.2
|
||||||
version: 4.0.2
|
version: 4.0.2
|
||||||
|
react:
|
||||||
|
specifier: ^18.3.1
|
||||||
|
version: 18.3.1
|
||||||
|
redis:
|
||||||
|
specifier: ^4.6.14
|
||||||
|
version: 4.6.14
|
||||||
reflect-metadata:
|
reflect-metadata:
|
||||||
specifier: ^0.2.2
|
specifier: ^0.2.2
|
||||||
version: 0.2.2
|
version: 0.2.2
|
||||||
@ -1875,6 +1899,12 @@ packages:
|
|||||||
'@hocuspocus/common@2.13.0':
|
'@hocuspocus/common@2.13.0':
|
||||||
resolution: {integrity: sha512-gyuUZ/7Jlht/cokGSTYWmG2+ZR1amBkV7gZgY6Bw8ko0OkUbEFsRdzWaB6RVcYNv+ZvYcsbkM8JU6rPsNykMrg==}
|
resolution: {integrity: sha512-gyuUZ/7Jlht/cokGSTYWmG2+ZR1amBkV7gZgY6Bw8ko0OkUbEFsRdzWaB6RVcYNv+ZvYcsbkM8JU6rPsNykMrg==}
|
||||||
|
|
||||||
|
'@hocuspocus/extension-redis@2.13.0':
|
||||||
|
resolution: {integrity: sha512-II4aPdET+jYKVO1RsCTIVOC2nTs4WnaVE7Jlh6QMyndQ23fW2+WbYqikjsZo+/n5LFtr0sev77o8CDMLL7ladQ==}
|
||||||
|
peerDependencies:
|
||||||
|
y-protocols: ^1.0.6
|
||||||
|
yjs: ^13.6.8
|
||||||
|
|
||||||
'@hocuspocus/provider@2.13.0':
|
'@hocuspocus/provider@2.13.0':
|
||||||
resolution: {integrity: sha512-xWRcyjW3koQajBCTEK3X2PrwaadUpaABsbYGKMWlr6I86pfknLJR8QIjEw1xgump9EbXjwtoXP6V6wuBkN4wkQ==}
|
resolution: {integrity: sha512-xWRcyjW3koQajBCTEK3X2PrwaadUpaABsbYGKMWlr6I86pfknLJR8QIjEw1xgump9EbXjwtoXP6V6wuBkN4wkQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -2168,6 +2198,12 @@ packages:
|
|||||||
'@nestjs/websockets':
|
'@nestjs/websockets':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
'@nestjs/event-emitter@2.0.4':
|
||||||
|
resolution: {integrity: sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==}
|
||||||
|
peerDependencies:
|
||||||
|
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
|
||||||
|
'@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
|
||||||
|
|
||||||
'@nestjs/jwt@10.2.0':
|
'@nestjs/jwt@10.2.0':
|
||||||
resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==}
|
resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -2862,6 +2898,35 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^18.2.0
|
react: ^18.2.0
|
||||||
|
|
||||||
|
'@redis/bloom@1.2.0':
|
||||||
|
resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@redis/client': ^1.0.0
|
||||||
|
|
||||||
|
'@redis/client@1.5.16':
|
||||||
|
resolution: {integrity: sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==}
|
||||||
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
'@redis/graph@1.1.1':
|
||||||
|
resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==}
|
||||||
|
peerDependencies:
|
||||||
|
'@redis/client': ^1.0.0
|
||||||
|
|
||||||
|
'@redis/json@1.0.6':
|
||||||
|
resolution: {integrity: sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==}
|
||||||
|
peerDependencies:
|
||||||
|
'@redis/client': ^1.0.0
|
||||||
|
|
||||||
|
'@redis/search@1.1.6':
|
||||||
|
resolution: {integrity: sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==}
|
||||||
|
peerDependencies:
|
||||||
|
'@redis/client': ^1.0.0
|
||||||
|
|
||||||
|
'@redis/time-series@1.0.5':
|
||||||
|
resolution: {integrity: sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@redis/client': ^1.0.0
|
||||||
|
|
||||||
'@remirror/core-constants@2.0.2':
|
'@remirror/core-constants@2.0.2':
|
||||||
resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==}
|
resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==}
|
||||||
|
|
||||||
@ -3164,6 +3229,12 @@ packages:
|
|||||||
'@socket.io/component-emitter@3.1.0':
|
'@socket.io/component-emitter@3.1.0':
|
||||||
resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==}
|
resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==}
|
||||||
|
|
||||||
|
'@socket.io/redis-adapter@8.3.0':
|
||||||
|
resolution: {integrity: sha512-ly0cra+48hDmChxmIpnESKrc94LjRL80TEmZVscuQ/WWkRP81nNj8W8cCGMqbI4L6NCuAaPRSzZF1a9GlAxxnA==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
socket.io-adapter: ^2.5.4
|
||||||
|
|
||||||
'@swc/core-darwin-arm64@1.3.101':
|
'@swc/core-darwin-arm64@1.3.101':
|
||||||
resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==}
|
resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@ -3263,11 +3334,6 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^18.0.0
|
react: ^18.0.0
|
||||||
|
|
||||||
'@tiptap/core@2.3.1':
|
|
||||||
resolution: {integrity: sha512-ycpQlmczAOc05TgB5sc3RUTEEBXAVmS8MR9PqQzg96qidaRfVkgE+2w4k7t83PMHl2duC0MGqOCy96pLYwSpeg==}
|
|
||||||
peerDependencies:
|
|
||||||
'@tiptap/pm': ^2.0.0
|
|
||||||
|
|
||||||
'@tiptap/core@2.4.0':
|
'@tiptap/core@2.4.0':
|
||||||
resolution: {integrity: sha512-YJSahk8pkxpCs8SflCZfTnJpE7IPyUWIylfgXM2DefjRQa5DZ+c6sNY0s/zbxKYFQ6AuHVX40r9pCfcqHChGxQ==}
|
resolution: {integrity: sha512-YJSahk8pkxpCs8SflCZfTnJpE7IPyUWIylfgXM2DefjRQa5DZ+c6sNY0s/zbxKYFQ6AuHVX40r9pCfcqHChGxQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -4098,6 +4164,9 @@ packages:
|
|||||||
bl@4.1.0:
|
bl@4.1.0:
|
||||||
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
||||||
|
|
||||||
|
bluebird@3.7.2:
|
||||||
|
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
|
||||||
|
|
||||||
bowser@2.11.0:
|
bowser@2.11.0:
|
||||||
resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
|
resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
|
||||||
|
|
||||||
@ -4397,6 +4466,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
|
resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
|
cross-env@7.0.3:
|
||||||
|
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
|
||||||
|
engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
cross-spawn@7.0.3:
|
cross-spawn@7.0.3:
|
||||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
@ -4465,6 +4539,10 @@ packages:
|
|||||||
delegates@1.0.0:
|
delegates@1.0.0:
|
||||||
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
||||||
|
|
||||||
|
denque@1.5.1:
|
||||||
|
resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==}
|
||||||
|
engines: {node: '>=0.10'}
|
||||||
|
|
||||||
denque@2.1.0:
|
denque@2.1.0:
|
||||||
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
@ -4765,6 +4843,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
eventemitter2@6.4.9:
|
||||||
|
resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==}
|
||||||
|
|
||||||
events@3.3.0:
|
events@3.3.0:
|
||||||
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
||||||
engines: {node: '>=0.8.x'}
|
engines: {node: '>=0.8.x'}
|
||||||
@ -4972,6 +5053,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
|
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
generic-pool@3.9.0:
|
||||||
|
resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==}
|
||||||
|
engines: {node: '>= 4'}
|
||||||
|
|
||||||
gensync@1.0.0-beta.2:
|
gensync@1.0.0-beta.2:
|
||||||
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
|
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
@ -5167,6 +5252,10 @@ packages:
|
|||||||
invariant@2.2.4:
|
invariant@2.2.4:
|
||||||
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
|
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
|
||||||
|
|
||||||
|
ioredis@4.28.5:
|
||||||
|
resolution: {integrity: sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
ioredis@5.4.1:
|
ioredis@5.4.1:
|
||||||
resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
|
resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
|
||||||
engines: {node: '>=12.22.0'}
|
engines: {node: '>=12.22.0'}
|
||||||
@ -5639,6 +5728,9 @@ packages:
|
|||||||
lodash.defaults@4.2.0:
|
lodash.defaults@4.2.0:
|
||||||
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
|
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
|
||||||
|
|
||||||
|
lodash.flatten@4.4.0:
|
||||||
|
resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
|
||||||
|
|
||||||
lodash.includes@4.3.0:
|
lodash.includes@4.3.0:
|
||||||
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
|
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
|
||||||
|
|
||||||
@ -5951,6 +6043,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
|
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
notepack.io@3.0.1:
|
||||||
|
resolution: {integrity: sha512-TKC/8zH5pXIAMVQio2TvVDTtPRX+DJPHDqjRbxogtFiByHyzKmy96RA0JtCQJ+WouyyL4A10xomQzgbUT+1jCg==}
|
||||||
|
|
||||||
npm-package-arg@11.0.1:
|
npm-package-arg@11.0.1:
|
||||||
resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==}
|
resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==}
|
||||||
engines: {node: ^16.14.0 || >=18.0.0}
|
engines: {node: ^16.14.0 || >=18.0.0}
|
||||||
@ -6052,6 +6147,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
p-map@2.1.0:
|
||||||
|
resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
p-try@2.2.0:
|
p-try@2.2.0:
|
||||||
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
|
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@ -6597,6 +6696,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
|
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
|
||||||
|
redis-commands@1.7.0:
|
||||||
|
resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==}
|
||||||
|
|
||||||
redis-errors@1.2.0:
|
redis-errors@1.2.0:
|
||||||
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@ -6605,6 +6707,13 @@ packages:
|
|||||||
resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
|
resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
|
redis@4.6.14:
|
||||||
|
resolution: {integrity: sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==}
|
||||||
|
|
||||||
|
redlock@4.2.0:
|
||||||
|
resolution: {integrity: sha512-j+oQlG+dOwcetUt2WJWttu4CZVeRzUrcVcISFmEmfyuwCVSJ93rDT7YSgg7H7rnxwoRyk/jU46kycVka5tW7jA==}
|
||||||
|
engines: {node: '>=8.0.0'}
|
||||||
|
|
||||||
redux@4.2.1:
|
redux@4.2.1:
|
||||||
resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==}
|
resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==}
|
||||||
|
|
||||||
@ -7238,6 +7347,10 @@ packages:
|
|||||||
uc.micro@2.0.0:
|
uc.micro@2.0.0:
|
||||||
resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==}
|
resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==}
|
||||||
|
|
||||||
|
uid2@1.0.0:
|
||||||
|
resolution: {integrity: sha512-+I6aJUv63YAcY9n4mQreLUt0d4lvwkkopDNmpomkAUz0fAkEMV9pRWxN0EjhW1YfRhcuyHg2v3mwddCDW1+LFQ==}
|
||||||
|
engines: {node: '>= 4.0.0'}
|
||||||
|
|
||||||
uid@2.0.2:
|
uid@2.0.2:
|
||||||
resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
|
resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@ -9383,6 +9496,21 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lib0: 0.2.93
|
lib0: 0.2.93
|
||||||
|
|
||||||
|
'@hocuspocus/extension-redis@2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)':
|
||||||
|
dependencies:
|
||||||
|
'@hocuspocus/server': 2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
||||||
|
ioredis: 4.28.5
|
||||||
|
kleur: 4.1.5
|
||||||
|
lodash.debounce: 4.0.8
|
||||||
|
redlock: 4.2.0
|
||||||
|
uuid: 9.0.1
|
||||||
|
y-protocols: 1.0.6(yjs@13.6.15)
|
||||||
|
yjs: 13.6.15
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- bufferutil
|
||||||
|
- supports-color
|
||||||
|
- utf-8-validate
|
||||||
|
|
||||||
'@hocuspocus/provider@2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)':
|
'@hocuspocus/provider@2.13.0(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@hocuspocus/common': 2.13.0
|
'@hocuspocus/common': 2.13.0
|
||||||
@ -9411,7 +9539,7 @@ snapshots:
|
|||||||
|
|
||||||
'@hocuspocus/transformer@2.13.0(@tiptap/pm@2.4.0)(y-prosemirror@1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15))(yjs@13.6.15)':
|
'@hocuspocus/transformer@2.13.0(@tiptap/pm@2.4.0)(y-prosemirror@1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15))(yjs@13.6.15)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tiptap/core': 2.3.1(@tiptap/pm@2.4.0)
|
'@tiptap/core': 2.4.0(@tiptap/pm@2.4.0)
|
||||||
'@tiptap/pm': 2.4.0
|
'@tiptap/pm': 2.4.0
|
||||||
'@tiptap/starter-kit': 2.4.0(@tiptap/pm@2.4.0)
|
'@tiptap/starter-kit': 2.4.0(@tiptap/pm@2.4.0)
|
||||||
y-prosemirror: 1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
y-prosemirror: 1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15)
|
||||||
@ -9809,6 +9937,12 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
|
|
||||||
|
'@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
|
||||||
|
dependencies:
|
||||||
|
'@nestjs/common': 10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
'@nestjs/core': 10.3.9(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
eventemitter2: 6.4.9
|
||||||
|
|
||||||
'@nestjs/jwt@10.2.0(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
|
'@nestjs/jwt@10.2.0(@nestjs/common@10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/common': 10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/common': 10.3.9(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
@ -9943,9 +10077,9 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- nx
|
- nx
|
||||||
|
|
||||||
'@nrwl/js@19.1.2(@babel/traverse@7.24.1)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)':
|
'@nrwl/js@19.1.2(@babel/traverse@7.24.6)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nx/js': 19.1.2(@babel/traverse@7.24.1)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
'@nx/js': 19.1.2(@babel/traverse@7.24.6)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@babel/traverse'
|
- '@babel/traverse'
|
||||||
- '@swc-node/register'
|
- '@swc-node/register'
|
||||||
@ -9996,7 +10130,7 @@ snapshots:
|
|||||||
tslib: 2.6.2
|
tslib: 2.6.2
|
||||||
yargs-parser: 21.1.1
|
yargs-parser: 21.1.1
|
||||||
|
|
||||||
'@nx/js@19.1.2(@babel/traverse@7.24.1)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)':
|
'@nx/js@19.1.2(@babel/traverse@7.24.6)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.24.3
|
'@babel/core': 7.24.3
|
||||||
'@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.24.3)
|
'@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.24.3)
|
||||||
@ -10005,12 +10139,12 @@ snapshots:
|
|||||||
'@babel/preset-env': 7.23.8(@babel/core@7.24.3)
|
'@babel/preset-env': 7.23.8(@babel/core@7.24.3)
|
||||||
'@babel/preset-typescript': 7.23.3(@babel/core@7.24.3)
|
'@babel/preset-typescript': 7.23.3(@babel/core@7.24.3)
|
||||||
'@babel/runtime': 7.23.7
|
'@babel/runtime': 7.23.7
|
||||||
'@nrwl/js': 19.1.2(@babel/traverse@7.24.1)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
'@nrwl/js': 19.1.2(@babel/traverse@7.24.6)(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.14.0)(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))(typescript@5.4.5)
|
||||||
'@nx/devkit': 19.1.2(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))
|
'@nx/devkit': 19.1.2(nx@19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2)))
|
||||||
'@nx/workspace': 19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2))
|
'@nx/workspace': 19.1.2(@swc/core@1.3.101(@swc/helpers@0.5.2))
|
||||||
babel-plugin-const-enum: 1.2.0(@babel/core@7.24.3)
|
babel-plugin-const-enum: 1.2.0(@babel/core@7.24.3)
|
||||||
babel-plugin-macros: 2.8.0
|
babel-plugin-macros: 2.8.0
|
||||||
babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.24.3)(@babel/traverse@7.24.1)
|
babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.24.3)(@babel/traverse@7.24.6)
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
columnify: 1.6.0
|
columnify: 1.6.0
|
||||||
detect-port: 1.5.1
|
detect-port: 1.5.1
|
||||||
@ -10529,6 +10663,32 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
|
||||||
|
'@redis/bloom@1.2.0(@redis/client@1.5.16)':
|
||||||
|
dependencies:
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
|
||||||
|
'@redis/client@1.5.16':
|
||||||
|
dependencies:
|
||||||
|
cluster-key-slot: 1.1.2
|
||||||
|
generic-pool: 3.9.0
|
||||||
|
yallist: 4.0.0
|
||||||
|
|
||||||
|
'@redis/graph@1.1.1(@redis/client@1.5.16)':
|
||||||
|
dependencies:
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
|
||||||
|
'@redis/json@1.0.6(@redis/client@1.5.16)':
|
||||||
|
dependencies:
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
|
||||||
|
'@redis/search@1.1.6(@redis/client@1.5.16)':
|
||||||
|
dependencies:
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
|
||||||
|
'@redis/time-series@1.0.5(@redis/client@1.5.16)':
|
||||||
|
dependencies:
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
|
||||||
'@remirror/core-constants@2.0.2': {}
|
'@remirror/core-constants@2.0.2': {}
|
||||||
|
|
||||||
'@remirror/core-helpers@3.0.0':
|
'@remirror/core-helpers@3.0.0':
|
||||||
@ -10938,6 +11098,15 @@ snapshots:
|
|||||||
|
|
||||||
'@socket.io/component-emitter@3.1.0': {}
|
'@socket.io/component-emitter@3.1.0': {}
|
||||||
|
|
||||||
|
'@socket.io/redis-adapter@8.3.0(socket.io-adapter@2.5.4)':
|
||||||
|
dependencies:
|
||||||
|
debug: 4.3.4
|
||||||
|
notepack.io: 3.0.1
|
||||||
|
socket.io-adapter: 2.5.4
|
||||||
|
uid2: 1.0.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
'@swc/core-darwin-arm64@1.3.101':
|
'@swc/core-darwin-arm64@1.3.101':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -11017,10 +11186,6 @@ snapshots:
|
|||||||
'@tanstack/query-core': 5.40.0
|
'@tanstack/query-core': 5.40.0
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
|
||||||
'@tiptap/core@2.3.1(@tiptap/pm@2.4.0)':
|
|
||||||
dependencies:
|
|
||||||
'@tiptap/pm': 2.4.0
|
|
||||||
|
|
||||||
'@tiptap/core@2.4.0(@tiptap/pm@2.4.0)':
|
'@tiptap/core@2.4.0(@tiptap/pm@2.4.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tiptap/pm': 2.4.0
|
'@tiptap/pm': 2.4.0
|
||||||
@ -11946,12 +12111,12 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.24.3)(@babel/traverse@7.24.1):
|
babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.24.3)(@babel/traverse@7.24.6):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.24.3
|
'@babel/core': 7.24.3
|
||||||
'@babel/helper-plugin-utils': 7.24.0
|
'@babel/helper-plugin-utils': 7.24.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@babel/traverse': 7.24.1
|
'@babel/traverse': 7.24.6
|
||||||
|
|
||||||
babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3):
|
babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -11997,6 +12162,8 @@ snapshots:
|
|||||||
inherits: 2.0.4
|
inherits: 2.0.4
|
||||||
readable-stream: 3.6.2
|
readable-stream: 3.6.2
|
||||||
|
|
||||||
|
bluebird@3.7.2: {}
|
||||||
|
|
||||||
bowser@2.11.0: {}
|
bowser@2.11.0: {}
|
||||||
|
|
||||||
brace-expansion@1.1.11:
|
brace-expansion@1.1.11:
|
||||||
@ -12295,6 +12462,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
luxon: 3.4.4
|
luxon: 3.4.4
|
||||||
|
|
||||||
|
cross-env@7.0.3:
|
||||||
|
dependencies:
|
||||||
|
cross-spawn: 7.0.3
|
||||||
|
|
||||||
cross-spawn@7.0.3:
|
cross-spawn@7.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
path-key: 3.1.1
|
path-key: 3.1.1
|
||||||
@ -12341,6 +12512,8 @@ snapshots:
|
|||||||
|
|
||||||
delegates@1.0.0: {}
|
delegates@1.0.0: {}
|
||||||
|
|
||||||
|
denque@1.5.1: {}
|
||||||
|
|
||||||
denque@2.1.0: {}
|
denque@2.1.0: {}
|
||||||
|
|
||||||
depd@2.0.0: {}
|
depd@2.0.0: {}
|
||||||
@ -12684,6 +12857,8 @@ snapshots:
|
|||||||
|
|
||||||
event-target-shim@5.0.1: {}
|
event-target-shim@5.0.1: {}
|
||||||
|
|
||||||
|
eventemitter2@6.4.9: {}
|
||||||
|
|
||||||
events@3.3.0: {}
|
events@3.3.0: {}
|
||||||
|
|
||||||
execa@5.1.1:
|
execa@5.1.1:
|
||||||
@ -12942,6 +13117,8 @@ snapshots:
|
|||||||
strip-ansi: 6.0.1
|
strip-ansi: 6.0.1
|
||||||
wide-align: 1.1.5
|
wide-align: 1.1.5
|
||||||
|
|
||||||
|
generic-pool@3.9.0: {}
|
||||||
|
|
||||||
gensync@1.0.0-beta.2: {}
|
gensync@1.0.0-beta.2: {}
|
||||||
|
|
||||||
get-caller-file@2.0.5: {}
|
get-caller-file@2.0.5: {}
|
||||||
@ -13174,6 +13351,22 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify: 1.4.0
|
loose-envify: 1.4.0
|
||||||
|
|
||||||
|
ioredis@4.28.5:
|
||||||
|
dependencies:
|
||||||
|
cluster-key-slot: 1.1.2
|
||||||
|
debug: 4.3.4
|
||||||
|
denque: 1.5.1
|
||||||
|
lodash.defaults: 4.2.0
|
||||||
|
lodash.flatten: 4.4.0
|
||||||
|
lodash.isarguments: 3.1.0
|
||||||
|
p-map: 2.1.0
|
||||||
|
redis-commands: 1.7.0
|
||||||
|
redis-errors: 1.2.0
|
||||||
|
redis-parser: 3.0.0
|
||||||
|
standard-as-callback: 2.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
ioredis@5.4.1:
|
ioredis@5.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ioredis/commands': 1.2.0
|
'@ioredis/commands': 1.2.0
|
||||||
@ -13784,6 +13977,8 @@ snapshots:
|
|||||||
|
|
||||||
lodash.defaults@4.2.0: {}
|
lodash.defaults@4.2.0: {}
|
||||||
|
|
||||||
|
lodash.flatten@4.4.0: {}
|
||||||
|
|
||||||
lodash.includes@4.3.0: {}
|
lodash.includes@4.3.0: {}
|
||||||
|
|
||||||
lodash.isarguments@3.1.0: {}
|
lodash.isarguments@3.1.0: {}
|
||||||
@ -14048,6 +14243,8 @@ snapshots:
|
|||||||
|
|
||||||
normalize-range@0.1.2: {}
|
normalize-range@0.1.2: {}
|
||||||
|
|
||||||
|
notepack.io@3.0.1: {}
|
||||||
|
|
||||||
npm-package-arg@11.0.1:
|
npm-package-arg@11.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
hosted-git-info: 7.0.1
|
hosted-git-info: 7.0.1
|
||||||
@ -14204,6 +14401,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-limit: 3.1.0
|
p-limit: 3.1.0
|
||||||
|
|
||||||
|
p-map@2.1.0: {}
|
||||||
|
|
||||||
p-try@2.2.0: {}
|
p-try@2.2.0: {}
|
||||||
|
|
||||||
parent-module@1.0.1:
|
parent-module@1.0.1:
|
||||||
@ -14833,12 +15032,27 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
|
|
||||||
|
redis-commands@1.7.0: {}
|
||||||
|
|
||||||
redis-errors@1.2.0: {}
|
redis-errors@1.2.0: {}
|
||||||
|
|
||||||
redis-parser@3.0.0:
|
redis-parser@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
redis-errors: 1.2.0
|
redis-errors: 1.2.0
|
||||||
|
|
||||||
|
redis@4.6.14:
|
||||||
|
dependencies:
|
||||||
|
'@redis/bloom': 1.2.0(@redis/client@1.5.16)
|
||||||
|
'@redis/client': 1.5.16
|
||||||
|
'@redis/graph': 1.1.1(@redis/client@1.5.16)
|
||||||
|
'@redis/json': 1.0.6(@redis/client@1.5.16)
|
||||||
|
'@redis/search': 1.1.6(@redis/client@1.5.16)
|
||||||
|
'@redis/time-series': 1.0.5(@redis/client@1.5.16)
|
||||||
|
|
||||||
|
redlock@4.2.0:
|
||||||
|
dependencies:
|
||||||
|
bluebird: 3.7.2
|
||||||
|
|
||||||
redux@4.2.1:
|
redux@4.2.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.23.7
|
'@babel/runtime': 7.23.7
|
||||||
@ -15522,6 +15736,8 @@ snapshots:
|
|||||||
|
|
||||||
uc.micro@2.0.0: {}
|
uc.micro@2.0.0: {}
|
||||||
|
|
||||||
|
uid2@1.0.0: {}
|
||||||
|
|
||||||
uid@2.0.2:
|
uid@2.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@lukeed/csprng': 1.1.0
|
'@lukeed/csprng': 1.1.0
|
||||||
|
|||||||
Reference in New Issue
Block a user