gavaengine 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.js +0 -1
- package/dist/{chunk-PZ5SO7QO.js → chunk-WPVUAMRJ.js} +6 -16
- package/dist/{chunk-PZ5SO7QO.js.map → chunk-WPVUAMRJ.js.map} +1 -1
- package/dist/components/index.js +1 -2
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/providers/index.js +0 -1
- package/package.json +1 -1
- package/dist/chunk-AOSHQP7D.js +0 -12
- package/dist/chunk-AOSHQP7D.js.map +0 -1
package/dist/components/index.js
CHANGED
|
@@ -32,14 +32,13 @@ import {
|
|
|
32
32
|
VideoExtension,
|
|
33
33
|
VideoView,
|
|
34
34
|
useDefaultNavigation
|
|
35
|
-
} from "../chunk-
|
|
35
|
+
} from "../chunk-WPVUAMRJ.js";
|
|
36
36
|
import {
|
|
37
37
|
ComponentRegistryProvider,
|
|
38
38
|
useComponentRegistry,
|
|
39
39
|
useRegisteredComponent
|
|
40
40
|
} from "../chunk-MANXBV2D.js";
|
|
41
41
|
import "../chunk-IU2SMMVV.js";
|
|
42
|
-
import "../chunk-AOSHQP7D.js";
|
|
43
42
|
export {
|
|
44
43
|
ArticleEditor,
|
|
45
44
|
ArticleList,
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
VideoExtension,
|
|
28
28
|
VideoView,
|
|
29
29
|
useDefaultNavigation
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-WPVUAMRJ.js";
|
|
31
31
|
import {
|
|
32
32
|
ActionsProvider,
|
|
33
33
|
ComponentRegistryProvider,
|
|
@@ -55,7 +55,6 @@ import {
|
|
|
55
55
|
AuthProvider,
|
|
56
56
|
useGavaAuth
|
|
57
57
|
} from "./chunk-IU2SMMVV.js";
|
|
58
|
-
import "./chunk-AOSHQP7D.js";
|
|
59
58
|
|
|
60
59
|
// src/content/types.ts
|
|
61
60
|
function defineContentType(contentType) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/content/types.ts","../src/types.ts","../src/handlers/revisions.ts","../src/handlers/articles.ts","../src/handlers/users.ts","../src/handlers/media.ts","../src/handlers/upload.ts","../src/handlers/auth.ts","../src/handlers/auth-utils.ts","../src/handlers/content.ts","../src/handlers/categories.ts"],"sourcesContent":["export type GEFieldType =\n | \"text\"\n | \"richtext\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"image\"\n | \"select\"\n | \"slug\"\n | \"relationship\"\n | \"json\";\n\nexport interface GEFieldDef {\n name: string;\n type: GEFieldType;\n label: string;\n required?: boolean;\n defaultValue?: any;\n placeholder?: string;\n options?: string[]; // for 'select' type\n generateFrom?: string; // for 'slug' type — field name to auto-generate from\n relationTo?: string; // for 'relationship' type — content type slug\n hidden?: boolean; // hide from editor\n admin?: {\n width?: \"full\" | \"half\";\n position?: \"main\" | \"sidebar\";\n };\n}\n\nexport interface GEContentType {\n slug: string; // 'articles', 'pages', 'events'\n labels: {\n singular: string;\n plural: string;\n };\n fields: GEFieldDef[];\n statuses?: string[]; // ['draft', 'published'] — custom statuses\n defaultStatus?: string;\n publishedStatus?: string;\n features?: {\n revisions?: boolean;\n views?: boolean;\n search?: boolean;\n };\n admin?: {\n listColumns?: string[];\n searchableFields?: string[];\n defaultSort?: {\n field: string;\n direction: \"asc\" | \"desc\";\n };\n };\n}\n\n// Helper to define a content type with full type safety\nexport function defineContentType(contentType: GEContentType): GEContentType {\n return {\n statuses: [\"draft\", \"published\"],\n defaultStatus: \"draft\",\n publishedStatus: \"published\",\n features: {\n revisions: true,\n views: false,\n search: true,\n },\n ...contentType,\n };\n}\n\n// Built-in \"articles\" content type matching the legacy v0.x schema\nexport const articlesContentType: GEContentType = defineContentType({\n slug: \"articles\",\n labels: { singular: \"Article\", plural: \"Articles\" },\n fields: [\n { name: \"title\", type: \"text\", label: \"Title\", placeholder: \"Article title\" },\n { name: \"slug\", type: \"slug\", label: \"Slug\", generateFrom: \"title\", admin: { position: \"sidebar\" } },\n { name: \"excerpt\", type: \"text\", label: \"Excerpt\", placeholder: \"Brief description...\", admin: { position: \"sidebar\" } },\n { name: \"content\", type: \"richtext\", label: \"Content\" },\n { name: \"coverImage\", type: \"image\", label: \"Cover image\", admin: { position: \"sidebar\" } },\n { name: \"category\", type: \"select\", label: \"Category\", admin: { position: \"sidebar\" } },\n { name: \"authorName\", type: \"text\", label: \"Author\", admin: { position: \"sidebar\" } },\n ],\n features: { revisions: true, views: true, search: true },\n admin: {\n listColumns: [\"title\", \"category\", \"status\", \"updatedAt\"],\n searchableFields: [\"title\", \"excerpt\", \"authorName\"],\n defaultSort: { field: \"updatedAt\", direction: \"desc\" },\n },\n});\n","import type { LucideIcon } from \"lucide-react\";\n\nexport interface GENavItem {\n name: string;\n href: string;\n icon: LucideIcon;\n visible?: (role: string) => boolean;\n}\n\nexport interface GESplashConfig {\n words?: string[];\n topText?: string;\n bottomText?: string;\n}\n\nexport interface GEColorOption {\n label: string;\n value: string;\n}\n\nexport interface GEArticle {\n id: string;\n title: string;\n slug: string;\n excerpt: string;\n content: string;\n coverImage: string;\n category: string;\n status: string;\n authorName: string;\n viewCount?: number;\n createdAt: Date;\n updatedAt: Date;\n publishedAt: Date | null;\n}\n\nexport interface GEUser {\n id: string;\n name: string;\n email: string;\n role: string;\n createdAt: Date;\n}\n\nexport interface GEMedia {\n id: string;\n filename: string;\n path: string;\n mimeType: string;\n size: number;\n createdAt: Date;\n uploader: { name: string };\n}\n\nexport interface GERevision {\n id: string;\n title: string;\n content: string;\n excerpt: string;\n coverImage: string;\n category: string;\n note: string;\n createdAt: Date;\n editor: { name: string };\n}\n\nexport interface GESession {\n user: {\n id: string;\n name?: string | null;\n email?: string | null;\n role: string;\n };\n}\n\n// v2.0 content-based actions interface\nexport interface GEContentActions {\n getAll(options?: {\n search?: string;\n status?: string;\n }): Promise<any[]>;\n getById(id: string): Promise<any | null>;\n create(data?: Record<string, any>): Promise<string>;\n update(\n id: string,\n data: Record<string, any>\n ): Promise<{ success: boolean }>;\n delete(id: string): Promise<{ success: boolean }>;\n publish?(id: string): Promise<{ success: boolean }>;\n unpublish?(id: string): Promise<{ success: boolean }>;\n}\n\n// v2.0 actions interface with content-based structure\nexport interface GEActionsV2 {\n content: Record<string, GEContentActions>;\n media: {\n getMedia: (search?: string) => Promise<GEMedia[]>;\n deleteMedia: (id: string) => Promise<{ success: boolean }>;\n };\n users: {\n getUsers: () => Promise<GEUser[]>;\n getUserById: (id: string) => Promise<GEUser | null>;\n createUser: (formData: FormData) => Promise<{ error?: string } | void>;\n updateUser: (\n id: string,\n formData: FormData\n ) => Promise<{ error?: string } | void>;\n deleteUser: (id: string) => Promise<{ error?: string } | void>;\n };\n revisions: {\n getRevisions: (contentId: string) => Promise<GERevision[]>;\n restoreRevision: (\n contentId: string,\n revisionId: string\n ) => Promise<{ success: boolean }>;\n };\n uploadUrl: string;\n}\n\n// Legacy v1.x flat actions interface (backward compat)\nexport interface GEActions {\n // Articles\n getArticles: () => Promise<GEArticle[]>;\n getArticleById: (id: string) => Promise<GEArticle | null>;\n createArticle: () => Promise<string>;\n updateArticle: (\n id: string,\n data: {\n title?: string;\n slug?: string;\n excerpt?: string;\n content?: string;\n coverImage?: string;\n category?: string;\n authorName?: string;\n }\n ) => Promise<{ success: boolean }>;\n deleteArticle: (id: string) => Promise<{ success: boolean }>;\n publishArticle: (id: string) => Promise<{ success: boolean }>;\n unpublishArticle: (id: string) => Promise<{ success: boolean }>;\n\n // Media\n getMedia: (search?: string) => Promise<GEMedia[]>;\n deleteMedia: (id: string) => Promise<{ success: boolean }>;\n uploadUrl: string;\n\n // Revisions\n getRevisions: (articleId: string) => Promise<GERevision[]>;\n restoreRevision: (\n articleId: string,\n revisionId: string\n ) => Promise<{ success: boolean }>;\n\n // Users\n getUsers: () => Promise<GEUser[]>;\n getUserById: (id: string) => Promise<GEUser | null>;\n createUser: (formData: FormData) => Promise<{ error?: string } | void>;\n updateUser: (\n id: string,\n formData: FormData\n ) => Promise<{ error?: string } | void>;\n deleteUser: (id: string) => Promise<{ error?: string } | void>;\n}\n\n/**\n * @deprecated Use GEActionsV2 instead. This helper maps v1.x flat actions to v2.x structure.\n */\nexport function createLegacyActions(v2Actions: GEActionsV2, contentSlug: string = \"articles\"): GEActions {\n const content = v2Actions.content[contentSlug];\n if (!content) {\n throw new Error(`Content type \"${contentSlug}\" not found in actions`);\n }\n\n return {\n getArticles: () => content.getAll(),\n getArticleById: (id) => content.getById(id),\n createArticle: () => content.create(),\n updateArticle: (id, data) => content.update(id, data),\n deleteArticle: (id) => content.delete(id),\n publishArticle: (id) => content.publish?.(id) ?? Promise.resolve({ success: false }),\n unpublishArticle: (id) => content.unpublish?.(id) ?? Promise.resolve({ success: false }),\n getMedia: v2Actions.media.getMedia,\n deleteMedia: v2Actions.media.deleteMedia,\n uploadUrl: v2Actions.uploadUrl,\n getRevisions: v2Actions.revisions.getRevisions,\n restoreRevision: v2Actions.revisions.restoreRevision,\n getUsers: v2Actions.users.getUsers,\n getUserById: v2Actions.users.getUserById,\n createUser: v2Actions.users.createUser,\n updateUser: v2Actions.users.updateUser,\n deleteUser: v2Actions.users.deleteUser,\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createRevisionHandlers(prisma: any, config: GavaEngineConfig) {\n const throttleMs = config.editor.revisionThrottleMinutes * 60 * 1000;\n const articleModel = config.models.article;\n const revisionModel = config.models.articleRevision;\n\n return {\n async getRevisions(articleId: string) {\n return prisma[revisionModel].findMany({\n where: { articleId },\n include: { editor: { select: { name: true } } },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async restoreRevision(\n articleId: string,\n revisionId: string,\n editorId: string\n ) {\n const article = await prisma[articleModel].findUnique({\n where: { id: articleId },\n });\n if (!article) throw new Error(\"Article not found\");\n\n const revision = await prisma[revisionModel].findUnique({\n where: { id: revisionId },\n });\n if (!revision || revision.articleId !== articleId) {\n throw new Error(\"Revision not found\");\n }\n\n // Save current state before restoring\n await prisma[revisionModel].create({\n data: {\n articleId,\n title: article.title,\n content: article.content,\n excerpt: article.excerpt,\n coverImage: article.coverImage,\n category: article.category,\n editorId,\n note: config.strings.beforeRestore,\n },\n });\n\n // Restore\n await prisma[articleModel].update({\n where: { id: articleId },\n data: {\n title: revision.title,\n content: revision.content,\n excerpt: revision.excerpt,\n coverImage: revision.coverImage,\n category: revision.category,\n updatedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async createRevisionSnapshot(\n articleId: string,\n editorId: string,\n note: string = \"\"\n ) {\n const article = await prisma[articleModel].findUnique({\n where: { id: articleId },\n });\n if (!article) return;\n\n // Throttle: only create if last revision was > threshold ago\n const threshold = new Date(Date.now() - throttleMs);\n const recent = await prisma[revisionModel].findFirst({\n where: { articleId, createdAt: { gte: threshold } },\n orderBy: { createdAt: \"desc\" },\n });\n\n if (recent && !note) return;\n\n await prisma[revisionModel].create({\n data: {\n articleId,\n title: article.title,\n content: article.content,\n excerpt: article.excerpt,\n coverImage: article.coverImage,\n category: article.category,\n editorId,\n note,\n },\n });\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\nimport { createRevisionHandlers } from \"./revisions.js\";\n\nexport function createArticleHandlers(prisma: any, config: GavaEngineConfig) {\n const revisionHandlers = createRevisionHandlers(prisma, config);\n const articleModel = config.models.article;\n\n return {\n async getArticles() {\n return prisma[articleModel].findMany({\n orderBy: { updatedAt: \"desc\" },\n });\n },\n\n async getArticleById(id: string) {\n return prisma[articleModel].findUnique({\n where: { id },\n });\n },\n\n async createArticle(authorName: string) {\n const article = await prisma[articleModel].create({\n data: {\n authorName,\n },\n });\n return article.id;\n },\n\n async updateArticle(\n userId: string,\n id: string,\n data: {\n title?: string;\n slug?: string;\n excerpt?: string;\n content?: string;\n coverImage?: string;\n category?: string;\n authorName?: string;\n }\n ) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await revisionHandlers.createRevisionSnapshot(id, userId);\n\n await prisma[articleModel].update({\n where: { id },\n data: { ...data, updatedAt: new Date() },\n });\n\n return { success: true };\n },\n\n async deleteArticle(id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await prisma[articleModel].delete({ where: { id } });\n return { success: true };\n },\n\n async publishArticle(userId: string, id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n if (!article.title || !article.slug) {\n throw new Error(\n \"Title and slug are required for publishing\"\n );\n }\n\n await revisionHandlers.createRevisionSnapshot(\n id,\n userId,\n config.strings.publishedNote\n );\n\n await prisma[articleModel].update({\n where: { id },\n data: {\n status: config.statuses.published,\n publishedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async unpublishArticle(id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await prisma[articleModel].update({\n where: { id },\n data: {\n status: config.statuses.draft,\n publishedAt: null,\n },\n });\n\n return { success: true };\n },\n };\n}\n","import bcrypt from \"bcryptjs\";\nimport type { GavaEngineConfig } from \"../config.js\";\n\nexport function createUserHandlers(prisma: any, config: GavaEngineConfig) {\n const userModel = config.models.user;\n\n return {\n async getUsers() {\n return prisma[userModel].findMany({\n select: {\n id: true,\n name: true,\n email: true,\n role: true,\n createdAt: true,\n },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async getUserById(id: string) {\n return prisma[userModel].findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n email: true,\n role: true,\n },\n });\n },\n\n async createUser(formData: FormData) {\n const name = formData.get(\"name\") as string;\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n const role = formData.get(\"role\") as string;\n\n if (!name || !email || !password || !role) {\n return { error: config.strings.allFieldsRequired };\n }\n\n if (!config.roles.list.includes(role)) {\n return { error: config.strings.invalidRole };\n }\n\n if (password.length < 6) {\n return { error: config.strings.passwordMinLength };\n }\n\n const existing = await prisma[userModel].findUnique({ where: { email } });\n if (existing) {\n return { error: config.strings.emailExists };\n }\n\n const hashedPassword = await bcrypt.hash(password, 10);\n\n await prisma[userModel].create({\n data: {\n name,\n email,\n password: hashedPassword,\n role,\n },\n });\n\n return { success: true };\n },\n\n async updateUser(id: string, formData: FormData) {\n const name = formData.get(\"name\") as string;\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n const role = formData.get(\"role\") as string;\n\n if (!name || !email || !role) {\n return { error: config.strings.allFieldsRequired };\n }\n\n if (!config.roles.list.includes(role)) {\n return { error: config.strings.invalidRole };\n }\n\n const existing = await prisma[userModel].findUnique({ where: { email } });\n if (existing && existing.id !== id) {\n return { error: config.strings.emailExists };\n }\n\n const data: {\n name: string;\n email: string;\n role: string;\n password?: string;\n } = {\n name,\n email,\n role,\n };\n\n if (password && password.length > 0) {\n if (password.length < 6) {\n return { error: config.strings.passwordMinLength };\n }\n data.password = await bcrypt.hash(password, 10);\n }\n\n await prisma[userModel].update({\n where: { id },\n data,\n });\n\n return { success: true };\n },\n\n async deleteUser(currentUserId: string, id: string) {\n if (currentUserId === id) {\n return { error: config.strings.cannotDeleteSelf };\n }\n\n await prisma[userModel].delete({ where: { id } });\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createMediaHandlers(prisma: any, config: GavaEngineConfig) {\n const mediaModel = config.models.media;\n const articleModel = config.models.article;\n\n return {\n async getMedia(search?: string) {\n return prisma[mediaModel].findMany({\n where: search ? { filename: { contains: search } } : undefined,\n include: { uploader: { select: { name: true } } },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async deleteMedia(\n userId: string,\n userRole: string,\n id: string,\n deleteFileFromDisk?: (path: string) => Promise<void>\n ) {\n const media = await prisma[mediaModel].findUnique({ where: { id } });\n if (!media) throw new Error(\"File not found\");\n\n // Writers can only delete their own media\n if (userRole === \"scrittore\" && media.uploaderId !== userId) {\n throw new Error(\"Unauthorized\");\n }\n\n // Check if image is used in articles\n const usedInArticles = await prisma[articleModel].findMany({\n where: {\n OR: [\n { coverImage: media.path },\n { content: { contains: media.path } },\n ],\n },\n select: { id: true, title: true },\n });\n\n if (usedInArticles.length > 0) {\n const titles = usedInArticles\n .map((a: { title: string }) => a.title || \"Untitled\")\n .join(\", \");\n throw new Error(\n `Cannot delete: image is used in ${usedInArticles.length} article(s) (${titles})`\n );\n }\n\n // Delete file from disk if handler provided\n if (deleteFileFromDisk) {\n try {\n await deleteFileFromDisk(media.path);\n } catch {\n // File may already be missing\n }\n }\n\n await prisma[mediaModel].delete({ where: { id } });\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport interface UploadResult {\n url?: string;\n error?: string;\n}\n\nexport interface FileStorage {\n save(filename: string, buffer: Buffer, mimeType: string): Promise<string>;\n}\n\nexport function createUploadHandler(\n prisma: any,\n config: GavaEngineConfig,\n storage: FileStorage\n) {\n const allowedTypes = [\n ...config.upload.imageTypes,\n ...config.upload.videoTypes,\n ];\n\n const mediaModel = config.models.media;\n\n return {\n async handleUpload(\n file: {\n name: string;\n type: string;\n size: number;\n arrayBuffer: () => Promise<ArrayBuffer>;\n },\n uploaderId: string\n ): Promise<UploadResult> {\n if (!allowedTypes.includes(file.type)) {\n return { error: \"Unsupported file type\" };\n }\n\n const isVideo = config.upload.videoTypes.includes(file.type);\n const maxSize = isVideo\n ? config.upload.maxVideoSize\n : config.upload.maxImageSize;\n\n if (file.size > maxSize) {\n return {\n error: `File too large. Max ${isVideo ? config.upload.maxVideoSize / (1024 * 1024) : config.upload.maxImageSize / (1024 * 1024)}MB.`,\n };\n }\n\n const buffer = Buffer.from(await file.arrayBuffer());\n const url = await storage.save(file.name, buffer, file.type);\n\n await prisma[mediaModel].create({\n data: {\n filename: file.name,\n path: url,\n mimeType: file.type,\n size: file.size,\n uploaderId,\n },\n });\n\n return { url };\n },\n };\n}\n","import bcrypt from \"bcryptjs\";\nimport type { GavaEngineConfig } from \"../config.js\";\n\nexport function buildCredentialsProvider(prisma: any, config?: GavaEngineConfig) {\n const userModel = config?.models?.user ?? \"user\";\n\n return {\n credentials: {\n email: {},\n password: {},\n },\n async authorize(credentials: Record<string, unknown>) {\n const email = credentials.email as string;\n const password = credentials.password as string;\n\n if (!email || !password) return null;\n\n const user = await prisma[userModel].findUnique({\n where: { email },\n });\n\n if (!user) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n return {\n id: user.id,\n name: user.name,\n email: user.email,\n role: user.role,\n };\n },\n };\n}\n\nexport function buildAuthCallbacks(config: GavaEngineConfig) {\n return {\n async jwt({\n token,\n user,\n }: {\n token: Record<string, unknown>;\n user?: Record<string, unknown>;\n }) {\n if (user) {\n token.id = user.id as string;\n token.role = user.role as string;\n }\n return token;\n },\n async session({\n session,\n token,\n }: {\n session: Record<string, any>;\n token: Record<string, unknown>;\n }) {\n if (session.user) {\n session.user.id = token.id as string;\n session.user.role = token.role as string;\n }\n return session;\n },\n authorized({\n auth,\n request: { nextUrl },\n }: {\n auth: Record<string, any> | null;\n request: { nextUrl: URL };\n }) {\n const isLoggedIn = !!auth;\n const role = auth?.user?.role;\n const pathname = nextUrl.pathname;\n\n if (pathname === config.routes.login && isLoggedIn) {\n return Response.redirect(new URL(config.routes.articles, nextUrl));\n }\n\n if (pathname.startsWith(config.routes.dashboard)) {\n if (!isLoggedIn) {\n return Response.redirect(new URL(config.routes.login, nextUrl));\n }\n\n if (\n pathname.startsWith(config.routes.users) &&\n role !== config.roles.adminRole\n ) {\n return Response.redirect(\n new URL(config.routes.articles, nextUrl)\n );\n }\n }\n\n return true;\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createAuthUtils(config: GavaEngineConfig) {\n return {\n canEdit(role: string): boolean {\n return config.roles.canEdit(role);\n },\n canPublish(role: string): boolean {\n return config.roles.canPublish(role);\n },\n isAdmin(role: string): boolean {\n return role === config.roles.adminRole;\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\nimport type { GEContentType } from \"../content/types.js\";\n\nexport interface ContentHandlers {\n getAll(options?: {\n search?: string;\n status?: string;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n }): Promise<any[]>;\n getById(id: string): Promise<any | null>;\n create(data?: Record<string, any>): Promise<string>;\n update(id: string, data: Record<string, any>): Promise<{ success: boolean }>;\n delete(id: string): Promise<{ success: boolean }>;\n publish?(userId: string, id: string): Promise<{ success: boolean }>;\n unpublish?(id: string): Promise<{ success: boolean }>;\n}\n\nexport function createContentHandlers(\n prisma: any,\n contentType: GEContentType,\n config: GavaEngineConfig\n): ContentHandlers {\n const modelName = contentType.slug.replace(/s$/, \"\").replace(/(^|\\-)(\\w)/g, (_m, _p1, p2) => p2.toUpperCase());\n // Try to find the Prisma model — fallback to slug\n const model = prisma[modelName] ?? prisma[contentType.slug];\n\n if (!model) {\n throw new Error(\n `Prisma model \"${modelName}\" not found for content type \"${contentType.slug}\"`\n );\n }\n\n const defaultSort = contentType.admin?.defaultSort\n ? { [contentType.admin.defaultSort.field]: contentType.admin.defaultSort.direction }\n : { updatedAt: \"desc\" };\n\n const searchableFields = contentType.admin?.searchableFields ?? [\"title\"];\n\n return {\n async getAll(options) {\n const where: Record<string, any> = {};\n\n if (options?.search) {\n where.OR = searchableFields.map((field) => ({\n [field]: { contains: options.search },\n }));\n }\n\n if (options?.status) {\n where.status = options.status;\n }\n\n return model.findMany({\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: options?.orderBy ?? defaultSort,\n });\n },\n\n async getById(id: string) {\n return model.findUnique({ where: { id } });\n },\n\n async create(data?: Record<string, any>) {\n const createData: Record<string, any> = {};\n\n // Set default values from field definitions\n for (const field of contentType.fields) {\n if (field.defaultValue !== undefined) {\n createData[field.name] = field.defaultValue;\n }\n }\n\n // Set default status\n if (contentType.defaultStatus) {\n createData.status = contentType.defaultStatus;\n }\n\n // Merge provided data\n if (data) {\n Object.assign(createData, data);\n }\n\n const record = await model.create({\n data: createData,\n });\n\n return record.id;\n },\n\n async update(id: string, data: Record<string, any>) {\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: { ...data, updatedAt: new Date() },\n });\n\n return { success: true };\n },\n\n async delete(id: string) {\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.delete({ where: { id } });\n return { success: true };\n },\n\n async publish(userId: string, id: string) {\n if (!contentType.publishedStatus) return { success: false };\n\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: {\n status: contentType.publishedStatus,\n publishedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async unpublish(id: string) {\n if (!contentType.defaultStatus) return { success: false };\n\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: {\n status: contentType.defaultStatus,\n publishedAt: null,\n },\n });\n\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createCategoryHandlers(prisma: any, config: GavaEngineConfig) {\n const categoryModel = prisma.category;\n\n return {\n async getCategories() {\n if (!categoryModel) {\n // Fallback: return config categories as static list\n return config.categories.map((name, i) => ({\n id: `static-${i}`,\n name,\n slug: name.toLowerCase().replace(/\\s+/g, \"-\"),\n sortOrder: i,\n }));\n }\n\n return categoryModel.findMany({\n orderBy: { sortOrder: \"asc\" },\n });\n },\n\n async createCategory(data: { name: string; slug?: string; sortOrder?: number }) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n const slug =\n data.slug ??\n data.name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\n return categoryModel.create({\n data: {\n name: data.name,\n slug,\n sortOrder: data.sortOrder ?? 0,\n },\n });\n },\n\n async updateCategory(\n id: string,\n data: { name?: string; slug?: string; sortOrder?: number }\n ) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n return categoryModel.update({\n where: { id },\n data,\n });\n },\n\n async deleteCategory(id: string) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n await categoryModel.delete({ where: { id } });\n return { success: true };\n },\n\n async seedCategories() {\n if (!categoryModel) return;\n\n const existing = await categoryModel.count();\n if (existing > 0) return;\n\n for (let i = 0; i < config.categories.length; i++) {\n const name = config.categories[i];\n const slug = name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\n await categoryModel.create({\n data: {\n name,\n slug,\n sortOrder: i,\n },\n });\n }\n },\n };\n}\n"],"mappings":"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","names":["bcrypt"]}
|
|
1
|
+
{"version":3,"sources":["../src/content/types.ts","../src/types.ts","../src/handlers/revisions.ts","../src/handlers/articles.ts","../src/handlers/users.ts","../src/handlers/media.ts","../src/handlers/upload.ts","../src/handlers/auth.ts","../src/handlers/auth-utils.ts","../src/handlers/content.ts","../src/handlers/categories.ts"],"sourcesContent":["export type GEFieldType =\n | \"text\"\n | \"richtext\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"image\"\n | \"select\"\n | \"slug\"\n | \"relationship\"\n | \"json\";\n\nexport interface GEFieldDef {\n name: string;\n type: GEFieldType;\n label: string;\n required?: boolean;\n defaultValue?: any;\n placeholder?: string;\n options?: string[]; // for 'select' type\n generateFrom?: string; // for 'slug' type — field name to auto-generate from\n relationTo?: string; // for 'relationship' type — content type slug\n hidden?: boolean; // hide from editor\n admin?: {\n width?: \"full\" | \"half\";\n position?: \"main\" | \"sidebar\";\n };\n}\n\nexport interface GEContentType {\n slug: string; // 'articles', 'pages', 'events'\n labels: {\n singular: string;\n plural: string;\n };\n fields: GEFieldDef[];\n statuses?: string[]; // ['draft', 'published'] — custom statuses\n defaultStatus?: string;\n publishedStatus?: string;\n features?: {\n revisions?: boolean;\n views?: boolean;\n search?: boolean;\n };\n admin?: {\n listColumns?: string[];\n searchableFields?: string[];\n defaultSort?: {\n field: string;\n direction: \"asc\" | \"desc\";\n };\n };\n}\n\n// Helper to define a content type with full type safety\nexport function defineContentType(contentType: GEContentType): GEContentType {\n return {\n statuses: [\"draft\", \"published\"],\n defaultStatus: \"draft\",\n publishedStatus: \"published\",\n features: {\n revisions: true,\n views: false,\n search: true,\n },\n ...contentType,\n };\n}\n\n// Built-in \"articles\" content type matching the legacy v0.x schema\nexport const articlesContentType: GEContentType = defineContentType({\n slug: \"articles\",\n labels: { singular: \"Article\", plural: \"Articles\" },\n fields: [\n { name: \"title\", type: \"text\", label: \"Title\", placeholder: \"Article title\" },\n { name: \"slug\", type: \"slug\", label: \"Slug\", generateFrom: \"title\", admin: { position: \"sidebar\" } },\n { name: \"excerpt\", type: \"text\", label: \"Excerpt\", placeholder: \"Brief description...\", admin: { position: \"sidebar\" } },\n { name: \"content\", type: \"richtext\", label: \"Content\" },\n { name: \"coverImage\", type: \"image\", label: \"Cover image\", admin: { position: \"sidebar\" } },\n { name: \"category\", type: \"select\", label: \"Category\", admin: { position: \"sidebar\" } },\n { name: \"authorName\", type: \"text\", label: \"Author\", admin: { position: \"sidebar\" } },\n ],\n features: { revisions: true, views: true, search: true },\n admin: {\n listColumns: [\"title\", \"category\", \"status\", \"updatedAt\"],\n searchableFields: [\"title\", \"excerpt\", \"authorName\"],\n defaultSort: { field: \"updatedAt\", direction: \"desc\" },\n },\n});\n","import type { LucideIcon } from \"lucide-react\";\n\nexport interface GENavItem {\n name: string;\n href: string;\n icon: LucideIcon;\n visible?: (role: string) => boolean;\n}\n\nexport interface GESplashConfig {\n words?: string[];\n topText?: string;\n bottomText?: string;\n}\n\nexport interface GEColorOption {\n label: string;\n value: string;\n}\n\nexport interface GEArticle {\n id: string;\n title: string;\n slug: string;\n excerpt: string;\n content: string;\n coverImage: string;\n category: string;\n status: string;\n authorName: string;\n viewCount?: number;\n createdAt: Date;\n updatedAt: Date;\n publishedAt: Date | null;\n}\n\nexport interface GEUser {\n id: string;\n name: string;\n email: string;\n role: string;\n createdAt: Date;\n}\n\nexport interface GEMedia {\n id: string;\n filename: string;\n path: string;\n mimeType: string;\n size: number;\n createdAt: Date;\n uploader: { name: string };\n}\n\nexport interface GERevision {\n id: string;\n title: string;\n content: string;\n excerpt: string;\n coverImage: string;\n category: string;\n note: string;\n createdAt: Date;\n editor: { name: string };\n}\n\nexport interface GESession {\n user: {\n id: string;\n name?: string | null;\n email?: string | null;\n role: string;\n };\n}\n\n// v2.0 content-based actions interface\nexport interface GEContentActions {\n getAll(options?: {\n search?: string;\n status?: string;\n }): Promise<any[]>;\n getById(id: string): Promise<any | null>;\n create(data?: Record<string, any>): Promise<string>;\n update(\n id: string,\n data: Record<string, any>\n ): Promise<{ success: boolean }>;\n delete(id: string): Promise<{ success: boolean }>;\n publish?(id: string): Promise<{ success: boolean }>;\n unpublish?(id: string): Promise<{ success: boolean }>;\n}\n\n// v2.0 actions interface with content-based structure\nexport interface GEActionsV2 {\n content: Record<string, GEContentActions>;\n media: {\n getMedia: (search?: string) => Promise<GEMedia[]>;\n deleteMedia: (id: string) => Promise<{ success: boolean }>;\n };\n users: {\n getUsers: () => Promise<GEUser[]>;\n getUserById: (id: string) => Promise<GEUser | null>;\n createUser: (formData: FormData) => Promise<{ error?: string } | void>;\n updateUser: (\n id: string,\n formData: FormData\n ) => Promise<{ error?: string } | void>;\n deleteUser: (id: string) => Promise<{ error?: string } | void>;\n };\n revisions: {\n getRevisions: (contentId: string) => Promise<GERevision[]>;\n restoreRevision: (\n contentId: string,\n revisionId: string\n ) => Promise<{ success: boolean }>;\n };\n uploadUrl: string;\n}\n\n// Legacy v1.x flat actions interface (backward compat)\nexport interface GEActions {\n // Articles\n getArticles: () => Promise<GEArticle[]>;\n getArticleById: (id: string) => Promise<GEArticle | null>;\n createArticle: () => Promise<string>;\n updateArticle: (\n id: string,\n data: {\n title?: string;\n slug?: string;\n excerpt?: string;\n content?: string;\n coverImage?: string;\n category?: string;\n authorName?: string;\n }\n ) => Promise<{ success: boolean }>;\n deleteArticle: (id: string) => Promise<{ success: boolean }>;\n publishArticle: (id: string) => Promise<{ success: boolean }>;\n unpublishArticle: (id: string) => Promise<{ success: boolean }>;\n\n // Media\n getMedia: (search?: string) => Promise<GEMedia[]>;\n deleteMedia: (id: string) => Promise<{ success: boolean }>;\n uploadUrl: string;\n\n // Revisions\n getRevisions: (articleId: string) => Promise<GERevision[]>;\n restoreRevision: (\n articleId: string,\n revisionId: string\n ) => Promise<{ success: boolean }>;\n\n // Users\n getUsers: () => Promise<GEUser[]>;\n getUserById: (id: string) => Promise<GEUser | null>;\n createUser: (formData: FormData) => Promise<{ error?: string } | void>;\n updateUser: (\n id: string,\n formData: FormData\n ) => Promise<{ error?: string } | void>;\n deleteUser: (id: string) => Promise<{ error?: string } | void>;\n}\n\n/**\n * @deprecated Use GEActionsV2 instead. This helper maps v1.x flat actions to v2.x structure.\n */\nexport function createLegacyActions(v2Actions: GEActionsV2, contentSlug: string = \"articles\"): GEActions {\n const content = v2Actions.content[contentSlug];\n if (!content) {\n throw new Error(`Content type \"${contentSlug}\" not found in actions`);\n }\n\n return {\n getArticles: () => content.getAll(),\n getArticleById: (id) => content.getById(id),\n createArticle: () => content.create(),\n updateArticle: (id, data) => content.update(id, data),\n deleteArticle: (id) => content.delete(id),\n publishArticle: (id) => content.publish?.(id) ?? Promise.resolve({ success: false }),\n unpublishArticle: (id) => content.unpublish?.(id) ?? Promise.resolve({ success: false }),\n getMedia: v2Actions.media.getMedia,\n deleteMedia: v2Actions.media.deleteMedia,\n uploadUrl: v2Actions.uploadUrl,\n getRevisions: v2Actions.revisions.getRevisions,\n restoreRevision: v2Actions.revisions.restoreRevision,\n getUsers: v2Actions.users.getUsers,\n getUserById: v2Actions.users.getUserById,\n createUser: v2Actions.users.createUser,\n updateUser: v2Actions.users.updateUser,\n deleteUser: v2Actions.users.deleteUser,\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createRevisionHandlers(prisma: any, config: GavaEngineConfig) {\n const throttleMs = config.editor.revisionThrottleMinutes * 60 * 1000;\n const articleModel = config.models.article;\n const revisionModel = config.models.articleRevision;\n\n return {\n async getRevisions(articleId: string) {\n return prisma[revisionModel].findMany({\n where: { articleId },\n include: { editor: { select: { name: true } } },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async restoreRevision(\n articleId: string,\n revisionId: string,\n editorId: string\n ) {\n const article = await prisma[articleModel].findUnique({\n where: { id: articleId },\n });\n if (!article) throw new Error(\"Article not found\");\n\n const revision = await prisma[revisionModel].findUnique({\n where: { id: revisionId },\n });\n if (!revision || revision.articleId !== articleId) {\n throw new Error(\"Revision not found\");\n }\n\n // Save current state before restoring\n await prisma[revisionModel].create({\n data: {\n articleId,\n title: article.title,\n content: article.content,\n excerpt: article.excerpt,\n coverImage: article.coverImage,\n category: article.category,\n editorId,\n note: config.strings.beforeRestore,\n },\n });\n\n // Restore\n await prisma[articleModel].update({\n where: { id: articleId },\n data: {\n title: revision.title,\n content: revision.content,\n excerpt: revision.excerpt,\n coverImage: revision.coverImage,\n category: revision.category,\n updatedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async createRevisionSnapshot(\n articleId: string,\n editorId: string,\n note: string = \"\"\n ) {\n const article = await prisma[articleModel].findUnique({\n where: { id: articleId },\n });\n if (!article) return;\n\n // Throttle: only create if last revision was > threshold ago\n const threshold = new Date(Date.now() - throttleMs);\n const recent = await prisma[revisionModel].findFirst({\n where: { articleId, createdAt: { gte: threshold } },\n orderBy: { createdAt: \"desc\" },\n });\n\n if (recent && !note) return;\n\n await prisma[revisionModel].create({\n data: {\n articleId,\n title: article.title,\n content: article.content,\n excerpt: article.excerpt,\n coverImage: article.coverImage,\n category: article.category,\n editorId,\n note,\n },\n });\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\nimport { createRevisionHandlers } from \"./revisions.js\";\n\nexport function createArticleHandlers(prisma: any, config: GavaEngineConfig) {\n const revisionHandlers = createRevisionHandlers(prisma, config);\n const articleModel = config.models.article;\n\n return {\n async getArticles() {\n return prisma[articleModel].findMany({\n orderBy: { updatedAt: \"desc\" },\n });\n },\n\n async getArticleById(id: string) {\n return prisma[articleModel].findUnique({\n where: { id },\n });\n },\n\n async createArticle(authorName: string) {\n const article = await prisma[articleModel].create({\n data: {\n authorName,\n },\n });\n return article.id;\n },\n\n async updateArticle(\n userId: string,\n id: string,\n data: {\n title?: string;\n slug?: string;\n excerpt?: string;\n content?: string;\n coverImage?: string;\n category?: string;\n authorName?: string;\n }\n ) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await revisionHandlers.createRevisionSnapshot(id, userId);\n\n await prisma[articleModel].update({\n where: { id },\n data: { ...data, updatedAt: new Date() },\n });\n\n return { success: true };\n },\n\n async deleteArticle(id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await prisma[articleModel].delete({ where: { id } });\n return { success: true };\n },\n\n async publishArticle(userId: string, id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n if (!article.title || !article.slug) {\n throw new Error(\n \"Title and slug are required for publishing\"\n );\n }\n\n await revisionHandlers.createRevisionSnapshot(\n id,\n userId,\n config.strings.publishedNote\n );\n\n await prisma[articleModel].update({\n where: { id },\n data: {\n status: config.statuses.published,\n publishedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async unpublishArticle(id: string) {\n const article = await prisma[articleModel].findUnique({ where: { id } });\n if (!article) throw new Error(\"Article not found\");\n\n await prisma[articleModel].update({\n where: { id },\n data: {\n status: config.statuses.draft,\n publishedAt: null,\n },\n });\n\n return { success: true };\n },\n };\n}\n","import bcrypt from \"bcryptjs\";\nimport type { GavaEngineConfig } from \"../config.js\";\n\nexport function createUserHandlers(prisma: any, config: GavaEngineConfig) {\n const userModel = config.models.user;\n\n return {\n async getUsers() {\n return prisma[userModel].findMany({\n select: {\n id: true,\n name: true,\n email: true,\n role: true,\n createdAt: true,\n },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async getUserById(id: string) {\n return prisma[userModel].findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n email: true,\n role: true,\n },\n });\n },\n\n async createUser(formData: FormData) {\n const name = formData.get(\"name\") as string;\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n const role = formData.get(\"role\") as string;\n\n if (!name || !email || !password || !role) {\n return { error: config.strings.allFieldsRequired };\n }\n\n if (!config.roles.list.includes(role)) {\n return { error: config.strings.invalidRole };\n }\n\n if (password.length < 6) {\n return { error: config.strings.passwordMinLength };\n }\n\n const existing = await prisma[userModel].findUnique({ where: { email } });\n if (existing) {\n return { error: config.strings.emailExists };\n }\n\n const hashedPassword = await bcrypt.hash(password, 10);\n\n await prisma[userModel].create({\n data: {\n name,\n email,\n password: hashedPassword,\n role,\n },\n });\n\n return { success: true };\n },\n\n async updateUser(id: string, formData: FormData) {\n const name = formData.get(\"name\") as string;\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n const role = formData.get(\"role\") as string;\n\n if (!name || !email || !role) {\n return { error: config.strings.allFieldsRequired };\n }\n\n if (!config.roles.list.includes(role)) {\n return { error: config.strings.invalidRole };\n }\n\n const existing = await prisma[userModel].findUnique({ where: { email } });\n if (existing && existing.id !== id) {\n return { error: config.strings.emailExists };\n }\n\n const data: {\n name: string;\n email: string;\n role: string;\n password?: string;\n } = {\n name,\n email,\n role,\n };\n\n if (password && password.length > 0) {\n if (password.length < 6) {\n return { error: config.strings.passwordMinLength };\n }\n data.password = await bcrypt.hash(password, 10);\n }\n\n await prisma[userModel].update({\n where: { id },\n data,\n });\n\n return { success: true };\n },\n\n async deleteUser(currentUserId: string, id: string) {\n if (currentUserId === id) {\n return { error: config.strings.cannotDeleteSelf };\n }\n\n await prisma[userModel].delete({ where: { id } });\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createMediaHandlers(prisma: any, config: GavaEngineConfig) {\n const mediaModel = config.models.media;\n const articleModel = config.models.article;\n\n return {\n async getMedia(search?: string) {\n return prisma[mediaModel].findMany({\n where: search ? { filename: { contains: search } } : undefined,\n include: { uploader: { select: { name: true } } },\n orderBy: { createdAt: \"desc\" },\n });\n },\n\n async deleteMedia(\n userId: string,\n userRole: string,\n id: string,\n deleteFileFromDisk?: (path: string) => Promise<void>\n ) {\n const media = await prisma[mediaModel].findUnique({ where: { id } });\n if (!media) throw new Error(\"File not found\");\n\n // Writers can only delete their own media\n if (userRole === \"scrittore\" && media.uploaderId !== userId) {\n throw new Error(\"Unauthorized\");\n }\n\n // Check if image is used in articles\n const usedInArticles = await prisma[articleModel].findMany({\n where: {\n OR: [\n { coverImage: media.path },\n { content: { contains: media.path } },\n ],\n },\n select: { id: true, title: true },\n });\n\n if (usedInArticles.length > 0) {\n const titles = usedInArticles\n .map((a: { title: string }) => a.title || \"Untitled\")\n .join(\", \");\n throw new Error(\n `Cannot delete: image is used in ${usedInArticles.length} article(s) (${titles})`\n );\n }\n\n // Delete file from disk if handler provided\n if (deleteFileFromDisk) {\n try {\n await deleteFileFromDisk(media.path);\n } catch {\n // File may already be missing\n }\n }\n\n await prisma[mediaModel].delete({ where: { id } });\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport interface UploadResult {\n url?: string;\n error?: string;\n}\n\nexport interface FileStorage {\n save(filename: string, buffer: Buffer, mimeType: string): Promise<string>;\n}\n\nexport function createUploadHandler(\n prisma: any,\n config: GavaEngineConfig,\n storage: FileStorage\n) {\n const allowedTypes = [\n ...config.upload.imageTypes,\n ...config.upload.videoTypes,\n ];\n\n const mediaModel = config.models.media;\n\n return {\n async handleUpload(\n file: {\n name: string;\n type: string;\n size: number;\n arrayBuffer: () => Promise<ArrayBuffer>;\n },\n uploaderId: string\n ): Promise<UploadResult> {\n if (!allowedTypes.includes(file.type)) {\n return { error: \"Unsupported file type\" };\n }\n\n const isVideo = config.upload.videoTypes.includes(file.type);\n const maxSize = isVideo\n ? config.upload.maxVideoSize\n : config.upload.maxImageSize;\n\n if (file.size > maxSize) {\n return {\n error: `File too large. Max ${isVideo ? config.upload.maxVideoSize / (1024 * 1024) : config.upload.maxImageSize / (1024 * 1024)}MB.`,\n };\n }\n\n const buffer = Buffer.from(await file.arrayBuffer());\n const url = await storage.save(file.name, buffer, file.type);\n\n await prisma[mediaModel].create({\n data: {\n filename: file.name,\n path: url,\n mimeType: file.type,\n size: file.size,\n uploaderId,\n },\n });\n\n return { url };\n },\n };\n}\n","import bcrypt from \"bcryptjs\";\nimport type { GavaEngineConfig } from \"../config.js\";\n\nexport function buildCredentialsProvider(prisma: any, config?: GavaEngineConfig) {\n const userModel = config?.models?.user ?? \"user\";\n\n return {\n credentials: {\n email: {},\n password: {},\n },\n async authorize(credentials: Record<string, unknown>) {\n const email = credentials.email as string;\n const password = credentials.password as string;\n\n if (!email || !password) return null;\n\n const user = await prisma[userModel].findUnique({\n where: { email },\n });\n\n if (!user) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n return {\n id: user.id,\n name: user.name,\n email: user.email,\n role: user.role,\n };\n },\n };\n}\n\nexport function buildAuthCallbacks(config: GavaEngineConfig) {\n return {\n async jwt({\n token,\n user,\n }: {\n token: Record<string, unknown>;\n user?: Record<string, unknown>;\n }) {\n if (user) {\n token.id = user.id as string;\n token.role = user.role as string;\n }\n return token;\n },\n async session({\n session,\n token,\n }: {\n session: Record<string, any>;\n token: Record<string, unknown>;\n }) {\n if (session.user) {\n session.user.id = token.id as string;\n session.user.role = token.role as string;\n }\n return session;\n },\n authorized({\n auth,\n request: { nextUrl },\n }: {\n auth: Record<string, any> | null;\n request: { nextUrl: URL };\n }) {\n const isLoggedIn = !!auth;\n const role = auth?.user?.role;\n const pathname = nextUrl.pathname;\n\n if (pathname === config.routes.login && isLoggedIn) {\n return Response.redirect(new URL(config.routes.articles, nextUrl));\n }\n\n if (pathname.startsWith(config.routes.dashboard)) {\n if (!isLoggedIn) {\n return Response.redirect(new URL(config.routes.login, nextUrl));\n }\n\n if (\n pathname.startsWith(config.routes.users) &&\n role !== config.roles.adminRole\n ) {\n return Response.redirect(\n new URL(config.routes.articles, nextUrl)\n );\n }\n }\n\n return true;\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createAuthUtils(config: GavaEngineConfig) {\n return {\n canEdit(role: string): boolean {\n return config.roles.canEdit(role);\n },\n canPublish(role: string): boolean {\n return config.roles.canPublish(role);\n },\n isAdmin(role: string): boolean {\n return role === config.roles.adminRole;\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\nimport type { GEContentType } from \"../content/types.js\";\n\nexport interface ContentHandlers {\n getAll(options?: {\n search?: string;\n status?: string;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n }): Promise<any[]>;\n getById(id: string): Promise<any | null>;\n create(data?: Record<string, any>): Promise<string>;\n update(id: string, data: Record<string, any>): Promise<{ success: boolean }>;\n delete(id: string): Promise<{ success: boolean }>;\n publish?(userId: string, id: string): Promise<{ success: boolean }>;\n unpublish?(id: string): Promise<{ success: boolean }>;\n}\n\nexport function createContentHandlers(\n prisma: any,\n contentType: GEContentType,\n config: GavaEngineConfig\n): ContentHandlers {\n const modelName = contentType.slug.replace(/s$/, \"\").replace(/(^|\\-)(\\w)/g, (_m, _p1, p2) => p2.toUpperCase());\n // Try to find the Prisma model — fallback to slug\n const model = prisma[modelName] ?? prisma[contentType.slug];\n\n if (!model) {\n throw new Error(\n `Prisma model \"${modelName}\" not found for content type \"${contentType.slug}\"`\n );\n }\n\n const defaultSort = contentType.admin?.defaultSort\n ? { [contentType.admin.defaultSort.field]: contentType.admin.defaultSort.direction }\n : { updatedAt: \"desc\" };\n\n const searchableFields = contentType.admin?.searchableFields ?? [\"title\"];\n\n return {\n async getAll(options) {\n const where: Record<string, any> = {};\n\n if (options?.search) {\n where.OR = searchableFields.map((field) => ({\n [field]: { contains: options.search },\n }));\n }\n\n if (options?.status) {\n where.status = options.status;\n }\n\n return model.findMany({\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: options?.orderBy ?? defaultSort,\n });\n },\n\n async getById(id: string) {\n return model.findUnique({ where: { id } });\n },\n\n async create(data?: Record<string, any>) {\n const createData: Record<string, any> = {};\n\n // Set default values from field definitions\n for (const field of contentType.fields) {\n if (field.defaultValue !== undefined) {\n createData[field.name] = field.defaultValue;\n }\n }\n\n // Set default status\n if (contentType.defaultStatus) {\n createData.status = contentType.defaultStatus;\n }\n\n // Merge provided data\n if (data) {\n Object.assign(createData, data);\n }\n\n const record = await model.create({\n data: createData,\n });\n\n return record.id;\n },\n\n async update(id: string, data: Record<string, any>) {\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: { ...data, updatedAt: new Date() },\n });\n\n return { success: true };\n },\n\n async delete(id: string) {\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.delete({ where: { id } });\n return { success: true };\n },\n\n async publish(userId: string, id: string) {\n if (!contentType.publishedStatus) return { success: false };\n\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: {\n status: contentType.publishedStatus,\n publishedAt: new Date(),\n },\n });\n\n return { success: true };\n },\n\n async unpublish(id: string) {\n if (!contentType.defaultStatus) return { success: false };\n\n const record = await model.findUnique({ where: { id } });\n if (!record) throw new Error(`${contentType.labels.singular} not found`);\n\n await model.update({\n where: { id },\n data: {\n status: contentType.defaultStatus,\n publishedAt: null,\n },\n });\n\n return { success: true };\n },\n };\n}\n","import type { GavaEngineConfig } from \"../config.js\";\n\nexport function createCategoryHandlers(prisma: any, config: GavaEngineConfig) {\n const categoryModel = prisma.category;\n\n return {\n async getCategories() {\n if (!categoryModel) {\n // Fallback: return config categories as static list\n return config.categories.map((name, i) => ({\n id: `static-${i}`,\n name,\n slug: name.toLowerCase().replace(/\\s+/g, \"-\"),\n sortOrder: i,\n }));\n }\n\n return categoryModel.findMany({\n orderBy: { sortOrder: \"asc\" },\n });\n },\n\n async createCategory(data: { name: string; slug?: string; sortOrder?: number }) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n const slug =\n data.slug ??\n data.name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\n return categoryModel.create({\n data: {\n name: data.name,\n slug,\n sortOrder: data.sortOrder ?? 0,\n },\n });\n },\n\n async updateCategory(\n id: string,\n data: { name?: string; slug?: string; sortOrder?: number }\n ) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n return categoryModel.update({\n where: { id },\n data,\n });\n },\n\n async deleteCategory(id: string) {\n if (!categoryModel) {\n throw new Error(\"Category model not available — categories are static from config\");\n }\n\n await categoryModel.delete({ where: { id } });\n return { success: true };\n },\n\n async seedCategories() {\n if (!categoryModel) return;\n\n const existing = await categoryModel.count();\n if (existing > 0) return;\n\n for (let i = 0; i < config.categories.length; i++) {\n const name = config.categories[i];\n const slug = name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\n await categoryModel.create({\n data: {\n name,\n slug,\n sortOrder: i,\n },\n });\n }\n },\n };\n}\n"],"mappings":"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","names":["bcrypt"]}
|
package/dist/providers/index.js
CHANGED
package/package.json
CHANGED
package/dist/chunk-AOSHQP7D.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
-
}) : x)(function(x) {
|
|
5
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
__require
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=chunk-AOSHQP7D.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|