Compare commits

...

4 commits

Author SHA1 Message Date
Jesse Wierzbinski 1f03017327
refactor: 🚚 Rename @versia/kit to @versia-server/kit
Some checks failed
Mirror to Codeberg / Mirror (push) Failing after 0s
Test Publish / build (client) (push) Failing after 0s
Test Publish / build (sdk) (push) Failing after 0s
2025-06-15 23:50:34 +02:00
Jesse Wierzbinski 3798e170d0
refactor: 🚚 Move more utilities into packages 2025-06-15 23:43:27 +02:00
Jesse Wierzbinski 5cae547f8d
chore: 💚 Update Nix hashes 2025-06-15 22:26:43 +02:00
Jesse Wierzbinski fde70fa61a
refactor: 🚚 Move testing to its own sub-package 2025-06-15 22:17:33 +02:00
250 changed files with 1626 additions and 1195 deletions

View file

@ -13,4 +13,4 @@ const add = (a: number, b: number): number => a + b;
We always write TypeScript with double quotes and four spaces for indentation, so when your responses include TypeScript code, please follow those conventions. We always write TypeScript with double quotes and four spaces for indentation, so when your responses include TypeScript code, please follow those conventions.
Our codebase uses Drizzle as an ORM, with custom abstractions in `classes/database/` for interacting with the database. The `@versia/kit/db` and `@versia/kit/tables` packages are aliases for these abstractions. Our codebase uses Drizzle as an ORM, with custom abstractions in `classes/database/` for interacting with the database. The `@versia-server/kit/db` and `@versia-server/kit/tables` packages are aliases for these abstractions.

View file

@ -1,8 +1,12 @@
import type { Status } from "@versia/client/schemas"; import type { Status } from "@versia/client/schemas";
import {
fakeRequest,
getTestStatuses,
getTestUsers,
} from "@versia-server/tests";
import { bench, run } from "mitata"; import { bench, run } from "mitata";
import type { z } from "zod"; import type { z } from "zod";
import { configureLoggers } from "@/loggers"; import { configureLoggers } from "@/loggers";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
await configureLoggers(true); await configureLoggers(true);

View file

@ -19,8 +19,9 @@
"@scalar/hono-api-reference": "catalog:", "@scalar/hono-api-reference": "catalog:",
"@sentry/bun": "catalog:", "@sentry/bun": "catalog:",
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"@versia-server/kit": "workspace:*",
"@versia-server/tests": "workspace:*",
"@versia/client": "workspace:*", "@versia/client": "workspace:*",
"@versia/kit": "workspace:*",
"@versia/sdk": "workspace:*", "@versia/sdk": "workspace:*",
"altcha-lib": "catalog:", "altcha-lib": "catalog:",
"blurhash": "catalog:", "blurhash": "catalog:",
@ -66,6 +67,7 @@
"zod-validation-error": "catalog:", "zod-validation-error": "catalog:",
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "catalog:",
"@types/bun": "catalog:", "@types/bun": "catalog:",
"@types/html-to-text": "catalog:", "@types/html-to-text": "catalog:",
"@types/markdown-it-container": "catalog:", "@types/markdown-it-container": "catalog:",
@ -88,12 +90,15 @@
"name": "@versia-server/api", "name": "@versia-server/api",
"version": "0.9.0-alpha.0", "version": "0.9.0-alpha.0",
"dependencies": { "dependencies": {
"@hono/zod-validator": "catalog:",
"@logtape/logtape": "catalog:", "@logtape/logtape": "catalog:",
"@scalar/hono-api-reference": "catalog:", "@scalar/hono-api-reference": "catalog:",
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"@versia-server/kit": "workspace:*",
"@versia-server/tests": "workspace:*",
"@versia/client": "workspace:*", "@versia/client": "workspace:*",
"@versia/kit": "workspace:*",
"@versia/sdk": "workspace:*", "@versia/sdk": "workspace:*",
"altcha-lib": "catalog:",
"bun-bagel": "catalog:", "bun-bagel": "catalog:",
"chalk": "catalog:", "chalk": "catalog:",
"drizzle-orm": "catalog:", "drizzle-orm": "catalog:",
@ -103,12 +108,15 @@
"ip-matching": "catalog:", "ip-matching": "catalog:",
"iso-639-1": "catalog:", "iso-639-1": "catalog:",
"jose": "catalog:", "jose": "catalog:",
"magic-regexp": "catalog:",
"qs": "catalog:",
"sharp": "catalog:", "sharp": "catalog:",
"string-comparison": "catalog:", "string-comparison": "catalog:",
"unicode-emoji-json": "catalog:", "unicode-emoji-json": "catalog:",
"youch": "catalog:", "youch": "catalog:",
"zod": "catalog:", "zod": "catalog:",
"zod-openapi": "catalog:", "zod-openapi": "catalog:",
"zod-validation-error": "catalog:",
}, },
}, },
"packages/client": { "packages/client": {
@ -138,9 +146,11 @@
}, },
}, },
"packages/plugin-kit": { "packages/plugin-kit": {
"name": "@versia/kit", "name": "@versia-server/kit",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@hackmd/markdown-it-task-lists": "catalog:",
"@hono/zod-validator": "catalog:",
"@logtape/logtape": "catalog:", "@logtape/logtape": "catalog:",
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"@versia/client": "workspace:*", "@versia/client": "workspace:*",
@ -151,8 +161,14 @@
"hono": "catalog:", "hono": "catalog:",
"hono-openapi": "catalog:", "hono-openapi": "catalog:",
"html-to-text": "catalog:", "html-to-text": "catalog:",
"ioredis": "catalog:",
"linkify-html": "catalog:",
"magic-regexp": "catalog:", "magic-regexp": "catalog:",
"markdown-it": "catalog:",
"markdown-it-container": "catalog:",
"markdown-it-toc-done-right": "catalog:",
"mitt": "catalog:", "mitt": "catalog:",
"qs": "catalog:",
"sharp": "catalog:", "sharp": "catalog:",
"zod": "catalog:", "zod": "catalog:",
"zod-to-json-schema": "catalog:", "zod-to-json-schema": "catalog:",
@ -168,13 +184,24 @@
"zod": "catalog:", "zod": "catalog:",
}, },
}, },
"packages/tests": {
"name": "@versia-server/tests",
"version": "0.0.1",
"dependencies": {
"@versia-server/config": "workspace:*",
"@versia-server/kit": "workspace:*",
"@versia/client": "workspace:*",
"altcha-lib": "catalog:",
"drizzle-orm": "catalog:",
},
},
"packages/worker": { "packages/worker": {
"name": "@versia-server/worker", "name": "@versia-server/worker",
"version": "0.9.0-alpha.0", "version": "0.9.0-alpha.0",
"dependencies": { "dependencies": {
"@logtape/logtape": "catalog:", "@logtape/logtape": "catalog:",
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"@versia/kit": "workspace:*", "@versia-server/kit": "workspace:*",
"chalk": "catalog:", "chalk": "catalog:",
}, },
}, },
@ -182,6 +209,7 @@
"trustedDependencies": [ "trustedDependencies": [
"sharp", "sharp",
"esbuild", "esbuild",
"@biomejs/biome",
"msgpackr-extract", "msgpackr-extract",
], ],
"catalog": { "catalog": {
@ -311,6 +339,24 @@
"@badgateway/oauth2-client": ["@badgateway/oauth2-client@3.2.0", "", {}, "sha512-EHsoV6oLHot7HeYkIoSxCZApNgBjwNo1OTV9kXIDnmijGAshlVkJreVAAtexFn+sfDKPE0JW5SCPYJV1y4IoMg=="], "@badgateway/oauth2-client": ["@badgateway/oauth2-client@3.2.0", "", {}, "sha512-EHsoV6oLHot7HeYkIoSxCZApNgBjwNo1OTV9kXIDnmijGAshlVkJreVAAtexFn+sfDKPE0JW5SCPYJV1y4IoMg=="],
"@biomejs/biome": ["@biomejs/biome@2.0.0-beta.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0-beta.5", "@biomejs/cli-darwin-x64": "2.0.0-beta.5", "@biomejs/cli-linux-arm64": "2.0.0-beta.5", "@biomejs/cli-linux-arm64-musl": "2.0.0-beta.5", "@biomejs/cli-linux-x64": "2.0.0-beta.5", "@biomejs/cli-linux-x64-musl": "2.0.0-beta.5", "@biomejs/cli-win32-arm64": "2.0.0-beta.5", "@biomejs/cli-win32-x64": "2.0.0-beta.5" }, "bin": { "biome": "bin/biome" } }, "sha512-1ldO4AepieVvg4aLi1ubZkA7NsefQT2UTNssbJbDiQTGem8kCHx/PZCwLxIR6UzFpGIjh0xsDzivyVvhnmqmuA=="],
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0-beta.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pnJiaoDpwGo+ctGkMu4POcO8jgOgCErBdYbhutr+K9rxxJS+TlHLr0LR91GCEWbGV2O1oyZRFQcW21rYFoak4w=="],
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0-beta.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-WwEZpqcmsNoFpZkUFNQcbZo52WK4hLGQ0vZk3PQ8JlZ55gJsHiyhtv6aem6fVlyVCvZgpsC0sYPLE3VvFVKNAQ=="],
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0-beta.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAF1de+Ki0vnq14NwDXouKkAR/iviyMNrUngSHjTGFC4z8XGVEfIw0ZMSm7fAdJZ5fAWodt9HiYmEAVs5EtHQg=="],
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0-beta.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-4vxNkYx1uEt211W8hLdXddc7icRHQgYENb72g6uTd/tLVPSBvIwqUAxAOkU+9Ai1E/8R4sWy7HIxREgpuFgbNA=="],
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0-beta.5", "", { "os": "linux", "cpu": "x64" }, "sha512-I0Pt1VHeL1mN8G7ZwV2u9AfzBd5ZKfbvHUI4x2wETUZbwcQlAu/nEzEa2LUe5HqSmnctTR36ig7RkkM9qbmIrA=="],
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0-beta.5", "", { "os": "linux", "cpu": "x64" }, "sha512-nUeKGO517GtRCxziVD9les1HiCs2s2/WIVITMN9+9RRuLOko8r+T77E8ZXEmlfLOfOIOeE6z62WITqei3oNccA=="],
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0-beta.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-YXW6hgbrgBcWQ1SLO69ypWlluPchgQV5C1lTG4xOcBUWdCsfYuQirM64S6Dov7SFPqsMIoFC6LlQRW+n8qAyiA=="],
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0-beta.5", "", { "os": "win32", "cpu": "x64" }, "sha512-N7Yby52BJmvEdst1iMbclE5hxxefboaXKRJLm1tLfBYr4FeuoCe6j8HdiQSwhCRdIUGFFqBLaDXh//LLF6EReA=="],
"@bull-board/api": ["@bull-board/api@6.10.1", "", { "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { "@bull-board/ui": "6.10.1" } }, "sha512-VPkZa2XZI2Wk2MqK1XyiiS+tOhNan54mnm2fpv2KA0fdZ92mQqNjhKkOpsykhQv9XUEc8cCRlZqGxf67YCMJbQ=="], "@bull-board/api": ["@bull-board/api@6.10.1", "", { "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { "@bull-board/ui": "6.10.1" } }, "sha512-VPkZa2XZI2Wk2MqK1XyiiS+tOhNan54mnm2fpv2KA0fdZ92mQqNjhKkOpsykhQv9XUEc8cCRlZqGxf67YCMJbQ=="],
"@bull-board/hono": ["@bull-board/hono@6.10.1", "", { "dependencies": { "@bull-board/api": "6.10.1", "@bull-board/ui": "6.10.1", "ejs": "^3.1.10" }, "peerDependencies": { "hono": "^4" } }, "sha512-2I9BUS7jbtQ4tCKOJdVKQn6uW8MXJKUGIhHLK2r4X8kiXZvk2I7jjt0KZ4VNyF9nfoBblgX5WemxE4sU61kGGg=="], "@bull-board/hono": ["@bull-board/hono@6.10.1", "", { "dependencies": { "@bull-board/api": "6.10.1", "@bull-board/ui": "6.10.1", "ejs": "^3.1.10" }, "peerDependencies": { "hono": "^4" } }, "sha512-2I9BUS7jbtQ4tCKOJdVKQn6uW8MXJKUGIhHLK2r4X8kiXZvk2I7jjt0KZ4VNyF9nfoBblgX5WemxE4sU61kGGg=="],
@ -693,12 +739,14 @@
"@versia-server/config": ["@versia-server/config@workspace:packages/config"], "@versia-server/config": ["@versia-server/config@workspace:packages/config"],
"@versia-server/kit": ["@versia-server/kit@workspace:packages/plugin-kit"],
"@versia-server/tests": ["@versia-server/tests@workspace:packages/tests"],
"@versia-server/worker": ["@versia-server/worker@workspace:packages/worker"], "@versia-server/worker": ["@versia-server/worker@workspace:packages/worker"],
"@versia/client": ["@versia/client@workspace:packages/client"], "@versia/client": ["@versia/client@workspace:packages/client"],
"@versia/kit": ["@versia/kit@workspace:packages/plugin-kit"],
"@versia/sdk": ["@versia/sdk@workspace:packages/sdk"], "@versia/sdk": ["@versia/sdk@workspace:packages/sdk"],
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="], "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="],

View file

@ -2,4 +2,4 @@
"@jsr" = "https://npm.jsr.io" "@jsr" = "https://npm.jsr.io"
[test] [test]
preload = ["./tests/setup.ts"] preload = ["./packages/tests/setup.ts"]

View file

@ -1,359 +0,0 @@
import markdownItTaskLists from "@hackmd/markdown-it-task-lists";
import { db, type Note, User } from "@versia/kit/db";
import { Instances, Users } from "@versia/kit/tables";
import type * as VersiaEntities from "@versia/sdk/entities";
import { FederationRequester } from "@versia/sdk/http";
import { config } from "@versia-server/config";
import { and, eq, inArray, isNull, or, sql } from "drizzle-orm";
import linkifyHtml from "linkify-html";
import {
anyOf,
charIn,
createRegExp,
digit,
exactly,
global,
letter,
} from "magic-regexp";
import MarkdownIt from "markdown-it";
import markdownItContainer from "markdown-it-container";
import markdownItTocDoneRight from "markdown-it-toc-done-right";
import { mentionValidator } from "@/api";
import { sanitizeHtml, sanitizeHtmlInline } from "@/sanitization";
import { transformOutputToUserWithRelations, userRelations } from "./user.ts";
/**
* Wrapper against the Status object to make it easier to work with
* @param query
* @returns
*/
export const findManyNotes = async (
query: Parameters<typeof db.query.Notes.findMany>[0],
userId?: string,
): Promise<(typeof Note.$type)[]> => {
const output = await db.query.Notes.findMany({
...query,
with: {
...query?.with,
attachments: {
with: {
media: true,
},
},
reactions: {
with: {
emoji: {
with: {
instance: true,
media: true,
},
},
},
},
emojis: {
with: {
emoji: {
with: {
instance: true,
media: true,
},
},
},
},
author: {
with: {
...userRelations,
},
},
mentions: {
with: {
user: {
with: {
instance: true,
},
},
},
},
reblog: {
with: {
attachments: {
with: {
media: true,
},
},
reactions: {
with: {
emoji: {
with: {
instance: true,
media: true,
},
},
},
},
emojis: {
with: {
emoji: {
with: {
instance: true,
media: true,
},
},
},
},
likes: true,
application: true,
mentions: {
with: {
user: {
with: userRelations,
},
},
},
author: {
with: {
...userRelations,
},
},
},
extras: {
pinned: userId
? sql`EXISTS (SELECT 1 FROM "UserToPinnedNotes" WHERE "UserToPinnedNotes"."noteId" = "Notes_reblog".id AND "UserToPinnedNotes"."userId" = ${userId})`.as(
"pinned",
)
: sql`false`.as("pinned"),
reblogged: userId
? sql`EXISTS (SELECT 1 FROM "Notes" WHERE "Notes"."authorId" = ${userId} AND "Notes"."reblogId" = "Notes_reblog".id)`.as(
"reblogged",
)
: sql`false`.as("reblogged"),
muted: userId
? sql`EXISTS (SELECT 1 FROM "Relationships" WHERE "Relationships"."ownerId" = ${userId} AND "Relationships"."subjectId" = "Notes_reblog"."authorId" AND "Relationships"."muting" = true)`.as(
"muted",
)
: sql`false`.as("muted"),
liked: userId
? sql`EXISTS (SELECT 1 FROM "Likes" WHERE "Likes"."likedId" = "Notes_reblog".id AND "Likes"."likerId" = ${userId})`.as(
"liked",
)
: sql`false`.as("liked"),
},
},
reply: true,
quote: true,
},
extras: {
pinned: userId
? sql`EXISTS (SELECT 1 FROM "UserToPinnedNotes" WHERE "UserToPinnedNotes"."noteId" = "Notes".id AND "UserToPinnedNotes"."userId" = ${userId})`.as(
"pinned",
)
: sql`false`.as("pinned"),
reblogged: userId
? sql`EXISTS (SELECT 1 FROM "Notes" WHERE "Notes"."authorId" = ${userId} AND "Notes"."reblogId" = "Notes".id)`.as(
"reblogged",
)
: sql`false`.as("reblogged"),
muted: userId
? sql`EXISTS (SELECT 1 FROM "Relationships" WHERE "Relationships"."ownerId" = ${userId} AND "Relationships"."subjectId" = "Notes"."authorId" AND "Relationships"."muting" = true)`.as(
"muted",
)
: sql`false`.as("muted"),
liked: userId
? sql`EXISTS (SELECT 1 FROM "Likes" WHERE "Likes"."likedId" = "Notes".id AND "Likes"."likerId" = ${userId})`.as(
"liked",
)
: sql`false`.as("liked"),
...query?.extras,
},
});
return output.map((post) => ({
...post,
author: transformOutputToUserWithRelations(post.author),
mentions: post.mentions.map((mention) => ({
...mention.user,
endpoints: mention.user.endpoints,
})),
attachments: post.attachments.map((attachment) => attachment.media),
emojis: (post.emojis ?? []).map((emoji) => emoji.emoji),
reblog: post.reblog && {
...post.reblog,
author: transformOutputToUserWithRelations(post.reblog.author),
mentions: post.reblog.mentions.map((mention) => ({
...mention.user,
endpoints: mention.user.endpoints,
})),
attachments: post.reblog.attachments.map(
(attachment) => attachment.media,
),
emojis: (post.reblog.emojis ?? []).map((emoji) => emoji.emoji),
pinned: Boolean(post.reblog.pinned),
reblogged: Boolean(post.reblog.reblogged),
muted: Boolean(post.reblog.muted),
liked: Boolean(post.reblog.liked),
},
pinned: Boolean(post.pinned),
reblogged: Boolean(post.reblogged),
muted: Boolean(post.muted),
liked: Boolean(post.liked),
}));
};
/**
* Get people mentioned in the content (match @username or @username@domain.com mentions)
* @param text The text to parse mentions from.
* @returns An array of users mentioned in the text.
*/
export const parseTextMentions = async (text: string): Promise<User[]> => {
const mentionedPeople = [...text.matchAll(mentionValidator)];
if (mentionedPeople.length === 0) {
return [];
}
const baseUrlHost = config.http.base_url.host;
const isLocal = (host?: string): boolean => host === baseUrlHost || !host;
// Find local and matching users
const foundUsers = await db
.select({
id: Users.id,
username: Users.username,
baseUrl: Instances.baseUrl,
})
.from(Users)
.leftJoin(Instances, eq(Users.instanceId, Instances.id))
.where(
or(
...mentionedPeople.map((person) =>
and(
eq(Users.username, person[1] ?? ""),
isLocal(person[2])
? isNull(Users.instanceId)
: eq(Instances.baseUrl, person[2] ?? ""),
),
),
),
);
// Separate found and unresolved users
const finalList = await User.manyFromSql(
inArray(
Users.id,
foundUsers.map((u) => u.id),
),
);
// Every remote user that isn't in database
const notFoundRemoteUsers = mentionedPeople.filter(
(p) =>
!(
foundUsers.some(
(user) => user.username === p[1] && user.baseUrl === p[2],
) || isLocal(p[2])
),
);
// Resolve remote mentions not in database
for (const person of notFoundRemoteUsers) {
const url = await FederationRequester.resolveWebFinger(
person[1] ?? "",
person[2] ?? "",
);
if (url) {
const user = await User.resolve(url);
if (user) {
finalList.push(user);
}
}
}
return finalList;
};
export const replaceTextMentions = (text: string, mentions: User[]): string => {
return mentions.reduce((finalText, mention) => {
const { username, instance } = mention.data;
const { uri } = mention;
const baseHost = config.http.base_url.host;
const linkTemplate = (displayText: string): string =>
`<a class="u-url mention" rel="nofollow noopener noreferrer" target="_blank" href="${uri}">${displayText}</a>`;
if (mention.remote) {
return finalText.replaceAll(
`@${username}@${instance?.baseUrl}`,
linkTemplate(`@${username}@${instance?.baseUrl}`),
);
}
return finalText.replace(
createRegExp(
exactly(
exactly(`@${username}`)
.notBefore(anyOf(letter, digit, charIn("@")))
.notAfter(anyOf(letter, digit, charIn("@"))),
).or(exactly(`@${username}@${baseHost}`)),
[global],
),
linkTemplate(`@${username}@${baseHost}`),
);
}, text);
};
export const contentToHtml = async (
content: VersiaEntities.TextContentFormat,
mentions: User[] = [],
inline = false,
): Promise<string> => {
const sanitizer = inline ? sanitizeHtmlInline : sanitizeHtml;
let htmlContent = "";
if (content.data["text/html"]) {
htmlContent = await sanitizer(content.data["text/html"].content);
} else if (content.data["text/markdown"]) {
htmlContent = await sanitizer(
await markdownParse(content.data["text/markdown"].content),
);
} else if (content.data["text/plain"]?.content) {
htmlContent = (await sanitizer(content.data["text/plain"].content))
.split("\n")
.map((line) => `<p>${line}</p>`)
.join("\n");
}
htmlContent = replaceTextMentions(htmlContent, mentions);
return linkifyHtml(htmlContent, {
defaultProtocol: "https",
validate: { email: (): false => false },
target: "_blank",
rel: "nofollow noopener noreferrer",
});
};
export const markdownParse = async (content: string): Promise<string> => {
return (await getMarkdownRenderer()).render(content);
};
export const getMarkdownRenderer = (): MarkdownIt => {
const renderer = MarkdownIt({
html: true,
linkify: true,
});
renderer.use(markdownItTocDoneRight, {
containerClass: "toc",
level: [1, 2, 3, 4],
listType: "ul",
listClass: "toc-list",
itemClass: "toc-item",
linkClass: "toc-link",
});
renderer.use(markdownItTaskLists);
renderer.use(markdownItContainer);
return renderer;
};

View file

@ -1,101 +0,0 @@
import {
type Application,
db,
type Emoji,
type Instance,
type Media,
type Role,
type Token,
type User,
} from "@versia/kit/db";
import type { Users } from "@versia/kit/tables";
import type { InferSelectModel } from "drizzle-orm";
export const userRelations = {
instance: true,
emojis: {
with: {
emoji: {
with: {
instance: true,
media: true,
},
},
},
},
avatar: true,
header: true,
roles: {
with: {
role: true,
},
},
} as const;
export interface AuthData {
user: User | null;
token: Token | null;
application: Application | null;
}
export const transformOutputToUserWithRelations = (
user: Omit<InferSelectModel<typeof Users>, "endpoints"> & {
followerCount: unknown;
followingCount: unknown;
statusCount: unknown;
avatar: typeof Media.$type | null;
header: typeof Media.$type | null;
emojis: {
userId: string;
emojiId: string;
emoji?: typeof Emoji.$type;
}[];
instance: typeof Instance.$type | null;
roles: {
userId: string;
roleId: string;
role?: typeof Role.$type;
}[];
endpoints: unknown;
},
): typeof User.$type => {
return {
...user,
followerCount: Number(user.followerCount),
followingCount: Number(user.followingCount),
statusCount: Number(user.statusCount),
endpoints:
user.endpoints ??
({} as Partial<{
dislikes: string;
featured: string;
likes: string;
followers: string;
following: string;
inbox: string;
outbox: string;
}>),
emojis: user.emojis.map(
(emoji) =>
(emoji as unknown as Record<string, object>)
.emoji as typeof Emoji.$type,
),
roles: user.roles
.map((role) => role.role)
.filter(Boolean) as (typeof Role.$type)[],
};
};
export const findManyUsers = async (
query: Parameters<typeof db.query.Users.findMany>[0],
): Promise<(typeof User.$type)[]> => {
const output = await db.query.Users.findMany({
...query,
with: {
...userRelations,
...query?.with,
},
});
return output.map((user) => transformOutputToUserWithRelations(user));
};

View file

@ -1,5 +1,9 @@
import { getLogger, type Logger } from "@logtape/logtape"; import { getLogger, type Logger } from "@logtape/logtape";
import { ApiError } from "@versia/kit"; import { EntitySorter, type JSONObject } from "@versia/sdk";
import { verify } from "@versia/sdk/crypto";
import * as VersiaEntities from "@versia/sdk/entities";
import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { import {
type Instance, type Instance,
Like, Like,
@ -7,12 +11,8 @@ import {
Reaction, Reaction,
Relationship, Relationship,
User, User,
} from "@versia/kit/db"; } from "@versia-server/kit/db";
import { Likes, Notes } from "@versia/kit/tables"; import { Likes, Notes } from "@versia-server/kit/tables";
import { EntitySorter, type JSONObject } from "@versia/sdk";
import { verify } from "@versia/sdk/crypto";
import * as VersiaEntities from "@versia/sdk/entities";
import { config } from "@versia-server/config";
import type { SocketAddress } from "bun"; import type { SocketAddress } from "bun";
import { Glob } from "bun"; import { Glob } from "bun";
import chalk from "chalk"; import chalk from "chalk";

View file

@ -1,6 +1,6 @@
import { describe, expect, it } from "bun:test"; import { describe, expect, it } from "bun:test";
import { mockModule } from "@versia-server/tests";
import sharp from "sharp"; import sharp from "sharp";
import { mockModule } from "~/tests/utils.ts";
import { calculateBlurhash } from "./blurhash.ts"; import { calculateBlurhash } from "./blurhash.ts";
describe("BlurhashPreprocessor", () => { describe("BlurhashPreprocessor", () => {

View file

@ -1,7 +1,7 @@
import { readdir } from "node:fs/promises"; import { readdir } from "node:fs/promises";
import { getLogger, type Logger } from "@logtape/logtape"; import { getLogger, type Logger } from "@logtape/logtape";
import { type Manifest, manifestSchema, Plugin } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { type Manifest, manifestSchema, Plugin } from "@versia-server/kit";
import { file, sleep } from "bun"; import { file, sleep } from "bun";
import chalk from "chalk"; import chalk from "chalk";
import { parseJSON5, parseJSONC } from "confbox"; import { parseJSON5, parseJSONC } from "confbox";

View file

@ -1,10 +1,10 @@
import { User } from "@versia/kit/db";
import type { JSONObject } from "@versia/sdk"; import type { JSONObject } from "@versia/sdk";
import * as VersiaEntities from "@versia/sdk/entities"; import * as VersiaEntities from "@versia/sdk/entities";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { User } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import chalk from "chalk"; import chalk from "chalk";
import { connection } from "~/utils/redis.ts";
export enum DeliveryJobType { export enum DeliveryJobType {
FederateEntity = "federateEntity", FederateEntity = "federateEntity",

View file

@ -1,9 +1,9 @@
import { Instance } from "@versia/kit/db";
import { Instances } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Instance } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Instances } from "@versia-server/kit/tables";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { connection } from "~/utils/redis.ts";
export enum FetchJobType { export enum FetchJobType {
Instance = "instance", Instance = "instance",

View file

@ -1,11 +1,11 @@
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import { ApiError } from "@versia/kit";
import { Instance, User } from "@versia/kit/db";
import type { JSONObject } from "@versia/sdk"; import type { JSONObject } from "@versia/sdk";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { Instance, User } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import type { SocketAddress } from "bun"; import type { SocketAddress } from "bun";
import { connection } from "~/utils/redis.ts";
import { InboxProcessor } from "../inbox/processor.ts"; import { InboxProcessor } from "../inbox/processor.ts";
export enum InboxJobType { export enum InboxJobType {

View file

@ -1,7 +1,7 @@
import { Media } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Media } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import { connection } from "~/utils/redis.ts";
import { calculateBlurhash } from "../media/preprocessors/blurhash.ts"; import { calculateBlurhash } from "../media/preprocessors/blurhash.ts";
import { convertImage } from "../media/preprocessors/image-conversion.ts"; import { convertImage } from "../media/preprocessors/image-conversion.ts";

View file

@ -1,9 +1,9 @@
import { Note, PushSubscription, Token, User } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Note, PushSubscription, Token, User } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import { sendNotification } from "web-push"; import { sendNotification } from "web-push";
import { htmlToText } from "@/content_types.ts"; import { htmlToText } from "@/content_types.ts";
import { connection } from "~/utils/redis.ts";
export enum PushJobType { export enum PushJobType {
Notify = "notify", Notify = "notify",

View file

@ -1,7 +1,7 @@
import { Relationship, User } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Relationship, User } from "@versia-server/kit/db";
import { connection } from "@versia-server/kit/redis";
import { Queue, Worker } from "bullmq"; import { Queue, Worker } from "bullmq";
import { connection } from "~/utils/redis.ts";
export enum RelationshipJobType { export enum RelationshipJobType {
Unmute = "unmute", Unmute = "unmute",

View file

@ -4,8 +4,8 @@
*/ */
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import { db, Note, User } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { db, Note, User } from "@versia-server/kit/db";
import type { SQL, ValueOrArray } from "drizzle-orm"; import type { SQL, ValueOrArray } from "drizzle-orm";
import { import {
Ingest as SonicChannelIngest, Ingest as SonicChannelIngest,

View file

@ -3,7 +3,7 @@ import { friendlyErrorPlugin } from "@clerc/plugin-friendly-error";
import { helpPlugin } from "@clerc/plugin-help"; import { helpPlugin } from "@clerc/plugin-help";
import { notFoundPlugin } from "@clerc/plugin-not-found"; import { notFoundPlugin } from "@clerc/plugin-not-found";
import { versionPlugin } from "@clerc/plugin-version"; import { versionPlugin } from "@clerc/plugin-version";
import { setupDatabase } from "@versia/kit/db"; import { setupDatabase } from "@versia-server/kit/db";
import { Clerc } from "clerc"; import { Clerc } from "clerc";
import { searchManager } from "~/classes/search/search-manager.ts"; import { searchManager } from "~/classes/search/search-manager.ts";
import pkg from "~/package.json" with { type: "json" }; import pkg from "~/package.json" with { type: "json" };

View file

@ -1,5 +1,5 @@
import { Instance } from "@versia/kit/db"; import { Instance } from "@versia-server/kit/db";
import { Instances } from "@versia/kit/tables"; import { Instances } from "@versia-server/kit/tables";
import chalk from "chalk"; import chalk from "chalk";
// @ts-expect-error - Root import is required or the Clec type definitions won't work // @ts-expect-error - Root import is required or the Clec type definitions won't work
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work // biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work

View file

@ -1,6 +1,6 @@
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { User } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import chalk from "chalk"; import chalk from "chalk";
// @ts-expect-error - Root import is required or the Clec type definitions won't work // @ts-expect-error - Root import is required or the Clec type definitions won't work
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work // biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work

View file

@ -1,4 +1,4 @@
import { User } from "@versia/kit/db"; import { User } from "@versia-server/kit/db";
import chalk from "chalk"; import chalk from "chalk";
// @ts-expect-error - Root import is required or the Clec type definitions won't work // @ts-expect-error - Root import is required or the Clec type definitions won't work
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work // biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work

View file

@ -1,4 +1,4 @@
import { Token } from "@versia/kit/db"; import { Token } from "@versia-server/kit/db";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import chalk from "chalk"; import chalk from "chalk";
// @ts-expect-error - Root import is required or the Clec type definitions won't work // @ts-expect-error - Root import is required or the Clec type definitions won't work

View file

@ -1,7 +1,7 @@
import { Instance, User } from "@versia/kit/db"; import { Instance, User } from "@versia-server/kit/db";
import { Users } from "@versia/kit/tables"; import { parseUserAddress } from "@versia-server/kit/parsers";
import { Users } from "@versia-server/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { parseUserAddress } from "@/api";
export const retrieveUser = async ( export const retrieveUser = async (
usernameOrHandle: string, usernameOrHandle: string,

View file

@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1744536153, "lastModified": 1749903597,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", "narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", "rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -21,7 +21,7 @@ in
pnpmDeps = pnpm.fetchDeps { pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src pnpmInstallFlags; inherit (finalAttrs) pname version src pnpmInstallFlags;
hash = "sha256-6lcsXcMEh7UbB5aLJzgJKUzynZbSZPgdj6l9E7RVx7c="; hash = "sha256-nC1bYW+It2N0Mp8+Yh1uk3MOj8DABOCNP5E3LbMuCEQ=";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -121,7 +121,9 @@
"check": "bunx tsc -p .", "check": "bunx tsc -p .",
"test": "bun test", "test": "bun test",
"run-api": "bun run packages/api/build.ts && cd dist && ln -s ../config config && bun run packages/api/index.js", "run-api": "bun run packages/api/build.ts && cd dist && ln -s ../config config && bun run packages/api/index.js",
"run-worker": "bun run packages/worker/build.ts && cd dist && ln -s ../config config && bun run packages/worker/index.js" "run-worker": "bun run packages/worker/build.ts && cd dist && ln -s ../config config && bun run packages/worker/index.js",
"dev": "bun run --hot packages/api/index.ts",
"worker:dev": "bun run --hot packages/worker/index.ts"
}, },
"trustedDependencies": [ "trustedDependencies": [
"@biomejs/biome", "@biomejs/biome",
@ -131,6 +133,7 @@
"sharp" "sharp"
], ],
"devDependencies": { "devDependencies": {
"@biomejs/biome": "catalog:",
"@types/bun": "catalog:", "@types/bun": "catalog:",
"@types/html-to-text": "catalog:", "@types/html-to-text": "catalog:",
"@types/markdown-it-container": "catalog:", "@types/markdown-it-container": "catalog:",
@ -164,8 +167,9 @@
"@scalar/hono-api-reference": "catalog:", "@scalar/hono-api-reference": "catalog:",
"@sentry/bun": "catalog:", "@sentry/bun": "catalog:",
"@versia/client": "workspace:*", "@versia/client": "workspace:*",
"@versia/kit": "workspace:*", "@versia-server/kit": "workspace:*",
"@versia/sdk": "workspace:*", "@versia/sdk": "workspace:*",
"@versia-server/tests": "workspace:*",
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"altcha-lib": "catalog:", "altcha-lib": "catalog:",
"blurhash": "catalog:", "blurhash": "catalog:",

View file

@ -1,8 +1,8 @@
import { resolve } from "node:path"; import { resolve } from "node:path";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import { Scalar } from "@scalar/hono-api-reference"; import { Scalar } from "@scalar/hono-api-reference";
import { ApiError } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import chalk from "chalk"; import chalk from "chalk";
import { Hono } from "hono"; import { Hono } from "hono";
import { serveStatic } from "hono/bun"; import { serveStatic } from "hono/bun";

View file

@ -1,6 +1,6 @@
import { readdir } from "node:fs/promises"; import { readdir } from "node:fs/promises";
import { $, build } from "bun"; import { $, build } from "bun";
import { routes } from "~/packages/api/routes"; import { routes } from "./routes.ts";
console.log("Building..."); console.log("Building...");

View file

@ -1,5 +1,5 @@
import { ApiError } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { createMiddleware } from "hono/factory"; import { createMiddleware } from "hono/factory";
export const agentBans = createMiddleware(async (context, next) => { export const agentBans = createMiddleware(async (context, next) => {

View file

@ -1,4 +1,4 @@
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { createMiddleware } from "hono/factory"; import { createMiddleware } from "hono/factory";
export const boundaryCheck = createMiddleware(async (context, next) => { export const boundaryCheck = createMiddleware(async (context, next) => {

View file

@ -1,6 +1,6 @@
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import { ApiError } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import type { SocketAddress } from "bun"; import type { SocketAddress } from "bun";
import { createMiddleware } from "hono/factory"; import { createMiddleware } from "hono/factory";
import { matches } from "ip-matching"; import { matches } from "ip-matching";

View file

@ -1,4 +1,4 @@
import type { ApiError } from "@versia/kit"; import type { ApiError } from "@versia-server/kit";
import { env } from "bun"; import { env } from "bun";
import type { MiddlewareHandler } from "hono"; import type { MiddlewareHandler } from "hono";
import { rateLimiter } from "hono-rate-limiter"; import { rateLimiter } from "hono-rate-limiter";

View file

@ -43,7 +43,8 @@
}, },
"dependencies": { "dependencies": {
"@versia-server/config": "workspace:*", "@versia-server/config": "workspace:*",
"@versia/kit": "workspace:*", "@versia-server/tests": "workspace:*",
"@versia-server/kit": "workspace:*",
"@versia/client": "workspace:*", "@versia/client": "workspace:*",
"@versia/sdk": "workspace:*", "@versia/sdk": "workspace:*",
"@logtape/logtape": "catalog:", "@logtape/logtape": "catalog:",
@ -62,6 +63,11 @@
"zod-openapi": "catalog:", "zod-openapi": "catalog:",
"@scalar/hono-api-reference": "catalog:", "@scalar/hono-api-reference": "catalog:",
"hono-rate-limiter": "catalog:", "hono-rate-limiter": "catalog:",
"ip-matching": "catalog:" "ip-matching": "catalog:",
"qs": "catalog:",
"magic-regexp": "catalog:",
"altcha-lib": "catalog:",
"@hono/zod-validator": "catalog:",
"zod-validation-error": "catalog:"
} }
} }

View file

@ -1,9 +1,9 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { Application } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Application } from "@versia-server/kit/db";
import { fakeRequest, getTestUsers } from "@versia-server/tests";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { fakeRequest, getTestUsers } from "~/tests/utils";
const { users, deleteUsers, passwords } = await getTestUsers(1); const { users, deleteUsers, passwords } = await getTestUsers(1);

View file

@ -1,7 +1,8 @@
import { ApiError } from "@versia/kit";
import { Application, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { apiRoute, handleZodError } from "@versia-server/kit/api";
import { Application, User } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { password as bunPassword } from "bun"; import { password as bunPassword } from "bun";
import { eq, or } from "drizzle-orm"; import { eq, or } from "drizzle-orm";
import type { Context } from "hono"; import type { Context } from "hono";
@ -10,7 +11,6 @@ import { describeRoute } from "hono-openapi";
import { validator } from "hono-openapi/zod"; import { validator } from "hono-openapi/zod";
import { SignJWT } from "jose"; import { SignJWT } from "jose";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, handleZodError } from "@/api";
const returnError = ( const returnError = (
context: Context, context: Context,

View file

@ -1,11 +1,11 @@
import { db } from "@versia/kit/db";
import { Applications, Tokens } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { apiRoute, handleZodError } from "@versia-server/kit/api";
import { db } from "@versia-server/kit/db";
import { Applications, Tokens } from "@versia-server/kit/tables";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { validator } from "hono-openapi/zod"; import { validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, handleZodError } from "@/api";
/** /**
* OAuth Code flow * OAuth Code flow

View file

@ -1,9 +1,9 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { Application } from "@versia/kit/db";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { Application } from "@versia-server/kit/db";
import { fakeRequest, getTestUsers } from "@versia-server/tests";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { fakeRequest, getTestUsers } from "~/tests/utils";
const { users, deleteUsers, passwords } = await getTestUsers(1); const { users, deleteUsers, passwords } = await getTestUsers(1);
const token = randomString(32, "hex"); const token = randomString(32, "hex");

View file

@ -1,13 +1,13 @@
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { apiRoute, handleZodError } from "@versia-server/kit/api";
import { User } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { password as bunPassword } from "bun"; import { password as bunPassword } from "bun";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import type { Context } from "hono"; import type { Context } from "hono";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { validator } from "hono-openapi/zod"; import { validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, handleZodError } from "@/api";
const returnError = ( const returnError = (
context: Context, context: Context,

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,9 +1,14 @@
import { RolePermission } from "@versia/client/schemas"; import { RolePermission } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
import { getFeed } from "@/rss"; import { getFeed } from "@/rss";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,9 +1,14 @@
import { RolePermission } from "@versia/client/schemas"; import { RolePermission } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
import { getFeed } from "@/rss"; import { getFeed } from "@/rss";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(3); const { users, deleteUsers } = await getTestUsers(3);

View file

@ -3,12 +3,17 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -2,14 +2,19 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Timeline } from "@versia/kit/db"; import {
import { Users } from "@versia/kit/tables"; apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Timeline } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -2,14 +2,19 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Timeline } from "@versia/kit/db"; import {
import { Users } from "@versia/kit/tables"; apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Timeline } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,9 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestStatuses, getTestUsers } from "~/tests/utils"; import {
generateClient,
getTestStatuses,
getTestUsers,
} from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(5, users[0])).toReversed(); const timeline = (await getTestStatuses(5, users[0])).toReversed();

View file

@ -2,10 +2,10 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,12 +2,17 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
import { import {
RelationshipJobType, RelationshipJobType,
relationshipQueue, relationshipQueue,

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,12 +2,17 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,10 +2,10 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -2,11 +2,11 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { User } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { User } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,8 +1,8 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { RolePermission } from "@versia/client/schemas"; import { RolePermission } from "@versia/client/schemas";
import { Role } from "@versia/kit/db"; import { Role } from "@versia-server/kit/db";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);
let role: Role; let role: Role;

View file

@ -3,12 +3,17 @@ import {
RolePermission, RolePermission,
Role as RoleSchema, Role as RoleSchema,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Role } from "@versia/kit/db"; import {
apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Role } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { validator } from "hono-openapi/zod"; import { validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => { export default apiRoute((app) => {
app.post( app.post(

View file

@ -1,8 +1,8 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { RolePermission } from "@versia/client/schemas"; import { RolePermission } from "@versia/client/schemas";
import { Role } from "@versia/kit/db"; import { Role } from "@versia-server/kit/db";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);
let role: Role; let role: Role;

View file

@ -1,9 +1,9 @@
import { Role as RoleSchema } from "@versia/client/schemas"; import { Role as RoleSchema } from "@versia/client/schemas";
import { Role } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Role } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => { export default apiRoute((app) => {
app.get( app.get(

View file

@ -3,7 +3,7 @@ import {
generateClient, generateClient,
getTestStatuses, getTestStatuses,
getTestUsers, getTestUsers,
} from "~/tests/utils.ts"; } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(5, users[1])).toReversed(); const timeline = (await getTestStatuses(5, users[1])).toReversed();

View file

@ -3,14 +3,19 @@ import {
Status as StatusSchema, Status as StatusSchema,
zBoolean, zBoolean,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Timeline } from "@versia/kit/db"; import {
import { Notes } from "@versia/kit/tables"; apiRoute,
auth,
handleZodError,
withUserParam,
} from "@versia-server/kit/api";
import { Timeline } from "@versia-server/kit/db";
import { Notes } from "@versia-server/kit/tables";
import { and, eq, gt, gte, inArray, isNull, lt, or, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, isNull, lt, or, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(3); const { users, deleteUsers } = await getTestUsers(3);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,11 +2,11 @@ import {
Relationship as RelationshipSchema, Relationship as RelationshipSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth, withUserParam } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.post( app.post(

View file

@ -1,5 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils.ts"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -3,14 +3,19 @@ import {
FamiliarFollowers as FamiliarFollowersSchema, FamiliarFollowers as FamiliarFollowersSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { db, User } from "@versia/kit/db"; import {
import type { Users } from "@versia/kit/tables"; apiRoute,
auth,
handleZodError,
qsQuery,
} from "@versia-server/kit/api";
import { db, User } from "@versia-server/kit/db";
import type { Users } from "@versia-server/kit/tables";
import { type InferSelectModel, sql } from "drizzle-orm"; import { type InferSelectModel, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, qsQuery } from "@/api";
import { rateLimit } from "../../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -1,9 +1,9 @@
import { afterEach, describe, expect, test } from "bun:test"; import { afterEach, describe, expect, test } from "bun:test";
import { db } from "@versia/kit/db"; import { db } from "@versia-server/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia-server/kit/tables";
import { generateClient, getSolvedChallenge } from "@versia-server/tests";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { generateClient, getSolvedChallenge } from "~/tests/utils";
const username = randomString(10, "hex"); const username = randomString(10, "hex");
const username2 = randomString(10, "hex"); const username2 = randomString(10, "hex");

View file

@ -1,14 +1,20 @@
import { Account as AccountSchema, zBoolean } from "@versia/client/schemas"; import { Account as AccountSchema, zBoolean } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import {
apiRoute,
auth,
handleZodError,
jsonOrForm,
qsQuery,
} from "@versia-server/kit/api";
import { User } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import ISO6391 from "iso-639-1"; import ISO6391 from "iso-639-1";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, jsonOrForm, qsQuery } from "@/api";
import { tempmailDomains } from "@/tempmail"; import { tempmailDomains } from "@/tempmail";
import { rateLimit } from "../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../middlewares/rate-limit.ts";

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -2,15 +2,16 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { Instance, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
import { Instance, User } from "@versia-server/kit/db";
import { parseUserAddress } from "@versia-server/kit/parsers";
import { Users } from "@versia-server/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, parseUserAddress } from "@/api";
import { rateLimit } from "../../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,8 +1,8 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { db } from "@versia/kit/db"; import { db } from "@versia-server/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia-server/kit/tables";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -4,12 +4,17 @@ import {
RolePermission, RolePermission,
zBoolean, zBoolean,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Relationship } from "@versia/kit/db"; import {
apiRoute,
auth,
handleZodError,
qsQuery,
} from "@versia-server/kit/api";
import { Relationship } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, qsQuery } from "@/api";
import { rateLimit } from "../../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);

View file

@ -3,15 +3,16 @@ import {
RolePermission, RolePermission,
zBoolean, zBoolean,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { User } from "@versia/kit/db"; import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
import { Users } from "@versia/kit/tables"; import { User } from "@versia-server/kit/db";
import { parseUserAddress } from "@versia-server/kit/parsers";
import { Users } from "@versia-server/kit/tables";
import { eq, ilike, not, or, sql } from "drizzle-orm"; import { eq, ilike, not, or, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import stringComparison from "string-comparison"; import stringComparison from "string-comparison";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, parseUserAddress } from "@/api";
import { rateLimit } from "../../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,6 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(1); const { users, deleteUsers } = await getTestUsers(1);

View file

@ -3,19 +3,24 @@ import {
RolePermission, RolePermission,
zBoolean, zBoolean,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { Emoji, Media, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import * as VersiaEntities from "@versia/sdk/entities"; import * as VersiaEntities from "@versia/sdk/entities";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import {
apiRoute,
auth,
handleZodError,
jsonOrForm,
} from "@versia-server/kit/api";
import { Emoji, Media, User } from "@versia-server/kit/db";
import { versiaTextToHtml } from "@versia-server/kit/parsers";
import { Users } from "@versia-server/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, jsonOrForm } from "@/api";
import { mergeAndDeduplicate } from "@/lib"; import { mergeAndDeduplicate } from "@/lib";
import { sanitizedHtmlStrip } from "@/sanitization"; import { sanitizedHtmlStrip } from "@/sanitization";
import { contentToHtml } from "~/classes/functions/status";
import { rateLimit } from "../../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
export default apiRoute((app) => export default apiRoute((app) =>
@ -242,7 +247,7 @@ export default apiRoute((app) =>
if (note) { if (note) {
self.source.note = note; self.source.note = note;
self.note = await contentToHtml( self.note = await versiaTextToHtml(
new VersiaEntities.TextContentFormat({ new VersiaEntities.TextContentFormat({
"text/markdown": { "text/markdown": {
content: note, content: note,
@ -329,7 +334,7 @@ export default apiRoute((app) =>
self.source.fields = []; self.source.fields = [];
for (const field of fields_attributes) { for (const field of fields_attributes) {
// Can be Markdown or plaintext, also has emojis // Can be Markdown or plaintext, also has emojis
const parsedName = await contentToHtml( const parsedName = await versiaTextToHtml(
new VersiaEntities.TextContentFormat({ new VersiaEntities.TextContentFormat({
"text/markdown": { "text/markdown": {
content: field.name, content: field.name,
@ -340,7 +345,7 @@ export default apiRoute((app) =>
true, true,
); );
const parsedValue = await contentToHtml( const parsedValue = await versiaTextToHtml(
new VersiaEntities.TextContentFormat({ new VersiaEntities.TextContentFormat({
"text/markdown": { "text/markdown": {
content: field.value, content: field.value,

View file

@ -1,6 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(1); const { users, deleteUsers } = await getTestUsers(1);

View file

@ -1,8 +1,8 @@
import { Account } from "@versia/client/schemas"; import { Account } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { apiRoute, auth } from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -2,13 +2,13 @@ import {
Application as ApplicationSchema, Application as ApplicationSchema,
CredentialApplication as CredentialApplicationSchema, CredentialApplication as CredentialApplicationSchema,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Application } from "@versia/kit/db"; import { apiRoute, handleZodError, jsonOrForm } from "@versia-server/kit/api";
import { Application } from "@versia-server/kit/db";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, handleZodError, jsonOrForm } from "@/api";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { rateLimit } from "../../../../middlewares/rate-limit.ts"; import { rateLimit } from "../../../../middlewares/rate-limit.ts";

View file

@ -2,11 +2,11 @@ import {
Application as ApplicationSchema, Application as ApplicationSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Application } from "@versia/kit/db"; import { apiRoute, auth } from "@versia-server/kit/api";
import { Application } from "@versia-server/kit/db";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { generateClient, getTestUsers } from "~/tests/utils"; import { generateClient, getTestUsers } from "@versia-server/tests";
const { users, deleteUsers } = await getTestUsers(3); const { users, deleteUsers } = await getTestUsers(3);

View file

@ -2,14 +2,14 @@ import {
Account as AccountSchema, Account as AccountSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Timeline } from "@versia/kit/db"; import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
import { Users } from "@versia/kit/tables"; import { Timeline } from "@versia-server/kit/db";
import { Users } from "@versia-server/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,5 +1,5 @@
import { describe, expect, test } from "bun:test"; import { describe, expect, test } from "bun:test";
import { generateClient } from "~/tests/utils"; import { generateClient } from "@versia-server/tests";
// /api/v1/challenges // /api/v1/challenges
describe("/api/v1/challenges", () => { describe("/api/v1/challenges", () => {

View file

@ -1,9 +1,9 @@
import { Challenge } from "@versia/client/schemas"; import { Challenge } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import { apiRoute, auth } from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { apiRoute, auth } from "@/api";
import { generateChallenge } from "@/challenges"; import { generateChallenge } from "@/challenges";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,8 +1,8 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { db } from "@versia/kit/db"; import { db } from "@versia-server/kit/db";
import { Emojis } from "@versia/kit/tables"; import { Emojis } from "@versia-server/kit/tables";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);

View file

@ -2,14 +2,14 @@ import {
CustomEmoji as CustomEmojiSchema, CustomEmoji as CustomEmojiSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Emoji } from "@versia/kit/db"; import { apiRoute, auth } from "@versia-server/kit/api";
import { Emojis } from "@versia/kit/tables"; import { Emoji } from "@versia-server/kit/db";
import { Emojis } from "@versia-server/kit/tables";
import { and, eq, isNull, or } from "drizzle-orm"; import { and, eq, isNull, or } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver } from "hono-openapi/zod"; import { resolver } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

View file

@ -1,8 +1,8 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { db } from "@versia/kit/db"; import { db } from "@versia-server/kit/db";
import { Emojis } from "@versia/kit/tables"; import { Emojis } from "@versia-server/kit/tables";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(2); const { users, deleteUsers } = await getTestUsers(2);
let id = ""; let id = "";

View file

@ -2,18 +2,18 @@ import {
CustomEmoji as CustomEmojiSchema, CustomEmoji as CustomEmojiSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { describeRoute } from "hono-openapi"; import { ApiError } from "@versia-server/kit";
import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod";
import { import {
apiRoute, apiRoute,
auth, auth,
handleZodError, handleZodError,
jsonOrForm, jsonOrForm,
withEmojiParam, withEmojiParam,
} from "@/api"; } from "@versia-server/kit/api";
import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod";
import { mimeLookup } from "@/content_types"; import { mimeLookup } from "@/content_types";
export default apiRoute((app) => { export default apiRoute((app) => {

View file

@ -1,9 +1,9 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { db } from "@versia/kit/db"; import { db } from "@versia-server/kit/db";
import { Emojis } from "@versia/kit/tables"; import { Emojis } from "@versia-server/kit/tables";
import { generateClient, getTestUsers } from "@versia-server/tests";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import sharp from "sharp"; import sharp from "sharp";
import { generateClient, getTestUsers } from "~/tests/utils";
const { users, deleteUsers } = await getTestUsers(3); const { users, deleteUsers } = await getTestUsers(3);

View file

@ -2,16 +2,21 @@ import {
CustomEmoji as CustomEmojiSchema, CustomEmoji as CustomEmojiSchema,
RolePermission, RolePermission,
} from "@versia/client/schemas"; } from "@versia/client/schemas";
import { ApiError } from "@versia/kit";
import { Emoji, Media } from "@versia/kit/db";
import { Emojis } from "@versia/kit/tables";
import { config } from "@versia-server/config"; import { config } from "@versia-server/config";
import { ApiError } from "@versia-server/kit";
import {
apiRoute,
auth,
handleZodError,
jsonOrForm,
} from "@versia-server/kit/api";
import { Emoji, Media } from "@versia-server/kit/db";
import { Emojis } from "@versia-server/kit/tables";
import { randomUUIDv7 } from "bun"; import { randomUUIDv7 } from "bun";
import { and, eq, isNull, or } from "drizzle-orm"; import { and, eq, isNull, or } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types"; import { mimeLookup } from "@/content_types";
export default apiRoute((app) => export default apiRoute((app) =>

View file

@ -1,12 +1,12 @@
import { RolePermission, Status as StatusSchema } from "@versia/client/schemas"; import { RolePermission, Status as StatusSchema } from "@versia/client/schemas";
import { ApiError } from "@versia/kit"; import { ApiError } from "@versia-server/kit";
import { Timeline } from "@versia/kit/db"; import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
import { Notes } from "@versia/kit/tables"; import { Timeline } from "@versia-server/kit/db";
import { Notes } from "@versia-server/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { describeRoute } from "hono-openapi"; import { describeRoute } from "hono-openapi";
import { resolver, validator } from "hono-openapi/zod"; import { resolver, validator } from "hono-openapi/zod";
import { z } from "zod"; import { z } from "zod";
import { apiRoute, auth, handleZodError } from "@/api";
export default apiRoute((app) => export default apiRoute((app) =>
app.get( app.get(

Some files were not shown because too many files have changed in this diff Show more