@geenius/docs 0.1.0 → 0.4.0
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/CHANGELOG.md +7 -0
- package/README.md +53 -1
- package/package.json +96 -13
- package/packages/convex/dist/index.d.ts +503 -0
- package/packages/convex/dist/index.js +482 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/dist/index.d.ts +439 -0
- package/packages/react/dist/index.js +4954 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react-css/{src/styles.css → dist/index.css} +183 -223
- package/packages/react-css/dist/index.css.map +1 -0
- package/packages/react-css/dist/index.d.ts +443 -0
- package/packages/react-css/dist/index.js +5058 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/dist/index.d.ts +684 -0
- package/packages/shared/dist/index.js +788 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/solidjs/dist/index.d.ts +435 -0
- package/packages/solidjs/dist/index.js +4584 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs-css/{src/styles.css → dist/index.css} +183 -223
- package/packages/solidjs-css/dist/index.css.map +1 -0
- package/packages/solidjs-css/dist/index.d.ts +432 -0
- package/packages/solidjs-css/dist/index.js +4934 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/README.md +0 -1
- package/packages/convex/package.json +0 -12
- package/packages/convex/src/convex.config.ts +0 -3
- package/packages/convex/src/index.ts +0 -3
- package/packages/convex/src/mutations.ts +0 -270
- package/packages/convex/src/queries.ts +0 -175
- package/packages/convex/src/schema.ts +0 -55
- package/packages/react/README.md +0 -1
- package/packages/react/package.json +0 -36
- package/packages/react/src/DocsLayout.tsx +0 -116
- package/packages/react/src/DocsProvider.tsx +0 -93
- package/packages/react/src/RouterDocsContent.tsx +0 -148
- package/packages/react/src/RouterDocsLayout.tsx +0 -161
- package/packages/react/src/components/Breadcrumbs.tsx +0 -34
- package/packages/react/src/components/DocPage.tsx +0 -191
- package/packages/react/src/components/DocSearch.tsx +0 -140
- package/packages/react/src/components/DocSidebar.tsx +0 -86
- package/packages/react/src/components/DocsLayout.tsx +0 -62
- package/packages/react/src/components/EditButton.tsx +0 -26
- package/packages/react/src/components/PageNavigation.tsx +0 -45
- package/packages/react/src/components/TableOfContents.tsx +0 -46
- package/packages/react/src/components/VersionSelector.tsx +0 -60
- package/packages/react/src/components/index.ts +0 -9
- package/packages/react/src/hooks/index.ts +0 -8
- package/packages/react/src/hooks/useDocSearch.ts +0 -55
- package/packages/react/src/hooks/useDocs.ts +0 -57
- package/packages/react/src/hooks/useDocsAdmin.ts +0 -151
- package/packages/react/src/hooks/useTableOfContents.ts +0 -66
- package/packages/react/src/index.ts +0 -38
- package/packages/react/src/pages/DocSearchPage.tsx +0 -129
- package/packages/react/src/pages/DocViewPage.tsx +0 -158
- package/packages/react/src/pages/DocsAdminPage.tsx +0 -330
- package/packages/react/src/pages/DocsIndexPage.tsx +0 -172
- package/packages/react/src/pages/index.ts +0 -4
- package/packages/react/src/useDocs.ts +0 -58
- package/packages/react/tsup.config.ts +0 -12
- package/packages/react-css/README.md +0 -1
- package/packages/react-css/package.json +0 -37
- package/packages/react-css/src/DocsLayout.tsx +0 -117
- package/packages/react-css/src/DocsProvider.tsx +0 -93
- package/packages/react-css/src/RouterDocsContent.tsx +0 -60
- package/packages/react-css/src/RouterDocsLayout.tsx +0 -101
- package/packages/react-css/src/components/DocPage.tsx +0 -21
- package/packages/react-css/src/components/DocSearch.tsx +0 -55
- package/packages/react-css/src/components/DocSidebar.tsx +0 -56
- package/packages/react-css/src/components/DocsLayout.tsx +0 -28
- package/packages/react-css/src/components/common.tsx +0 -93
- package/packages/react-css/src/components/index.ts +0 -5
- package/packages/react-css/src/hooks/index.ts +0 -2
- package/packages/react-css/src/index.ts +0 -6
- package/packages/react-css/src/index.tsx +0 -3
- package/packages/react-css/src/pages/DocViewPage.tsx +0 -78
- package/packages/react-css/src/pages/DocsAdminPage.tsx +0 -101
- package/packages/react-css/src/pages/DocsIndexPage.tsx +0 -68
- package/packages/react-css/src/pages/index.ts +0 -3
- package/packages/react-css/src/useDocs.ts +0 -58
- package/packages/react-css/tsconfig.json +0 -19
- package/packages/react-css/tsup.config.ts +0 -10
- package/packages/shared/README.md +0 -1
- package/packages/shared/package.json +0 -31
- package/packages/shared/src/__tests__/docs.test.ts +0 -69
- package/packages/shared/src/config.ts +0 -80
- package/packages/shared/src/index.ts +0 -179
- package/packages/shared/src/providers/astro.ts +0 -94
- package/packages/shared/src/providers/fumadocs.ts +0 -116
- package/packages/shared/src/providers/internal.ts +0 -80
- package/packages/shared/src/types.ts +0 -73
- package/packages/shared/tsconfig.json +0 -18
- package/packages/shared/tsup.config.ts +0 -12
- package/packages/shared/vitest.config.ts +0 -4
- package/packages/solidjs/README.md +0 -1
- package/packages/solidjs/package.json +0 -33
- package/packages/solidjs/src/DocsLayout.tsx +0 -87
- package/packages/solidjs/src/DocsProvider.tsx +0 -95
- package/packages/solidjs/src/RouterDocsContent.tsx +0 -147
- package/packages/solidjs/src/RouterDocsLayout.tsx +0 -161
- package/packages/solidjs/src/components/Breadcrumbs.tsx +0 -27
- package/packages/solidjs/src/components/DocPage.tsx +0 -110
- package/packages/solidjs/src/components/DocSearch.tsx +0 -81
- package/packages/solidjs/src/components/DocSidebar.tsx +0 -92
- package/packages/solidjs/src/components/DocsLayout.tsx +0 -38
- package/packages/solidjs/src/components/EditButton.tsx +0 -15
- package/packages/solidjs/src/components/PageNavigation.tsx +0 -31
- package/packages/solidjs/src/components/TableOfContents.tsx +0 -41
- package/packages/solidjs/src/components/VersionSelector.tsx +0 -30
- package/packages/solidjs/src/components/index.ts +0 -9
- package/packages/solidjs/src/createDocs.ts +0 -62
- package/packages/solidjs/src/index.ts +0 -28
- package/packages/solidjs/src/pages/DocSearchPage.tsx +0 -72
- package/packages/solidjs/src/pages/DocViewPage.tsx +0 -80
- package/packages/solidjs/src/pages/DocsAdminPage.tsx +0 -123
- package/packages/solidjs/src/pages/DocsIndexPage.tsx +0 -85
- package/packages/solidjs/src/pages/index.ts +0 -4
- package/packages/solidjs/src/primitives/createDocSearch.ts +0 -42
- package/packages/solidjs/src/primitives/createDocs.ts +0 -35
- package/packages/solidjs/src/primitives/createDocsAdmin.ts +0 -63
- package/packages/solidjs/src/primitives/createTableOfContents.ts +0 -51
- package/packages/solidjs/src/primitives/index.ts +0 -4
- package/packages/solidjs/tsup.config.ts +0 -12
- package/packages/solidjs-css/README.md +0 -1
- package/packages/solidjs-css/package.json +0 -36
- package/packages/solidjs-css/src/DocsLayout.tsx +0 -106
- package/packages/solidjs-css/src/DocsProvider.tsx +0 -95
- package/packages/solidjs-css/src/RouterDocsContent.tsx +0 -54
- package/packages/solidjs-css/src/RouterDocsLayout.tsx +0 -104
- package/packages/solidjs-css/src/createDocs.ts +0 -62
- package/packages/solidjs-css/src/index.ts +0 -7
- package/packages/solidjs-css/src/index.tsx +0 -17
- package/packages/solidjs-css/src/pages/DocViewPage.tsx +0 -111
- package/packages/solidjs-css/src/pages/DocsAdminPage.tsx +0 -332
- package/packages/solidjs-css/src/pages/DocsIndexPage.tsx +0 -116
- package/packages/solidjs-css/src/pages/index.ts +0 -3
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/tsconfig.json +0 -20
- package/packages/solidjs-css/tsup.config.ts +0 -10
- package/pnpm-workspace.yaml +0 -2
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { defineComponent, defineTable, defineSchema, mutationGeneric, queryGeneric } from 'convex/server';
|
|
2
|
+
import { v } from 'convex/values';
|
|
3
|
+
|
|
4
|
+
// src/convex.config.ts
|
|
5
|
+
var component = defineComponent("docs");
|
|
6
|
+
var convex_config_default = component;
|
|
7
|
+
var query = queryGeneric;
|
|
8
|
+
var mutation = mutationGeneric;
|
|
9
|
+
|
|
10
|
+
// src/mutations.ts
|
|
11
|
+
var createSection = mutation({
|
|
12
|
+
args: {
|
|
13
|
+
title: v.string(),
|
|
14
|
+
slug: v.string(),
|
|
15
|
+
parentId: v.optional(v.id("doc_sections")),
|
|
16
|
+
order: v.number(),
|
|
17
|
+
icon: v.optional(v.string()),
|
|
18
|
+
description: v.optional(v.string()),
|
|
19
|
+
access: v.union(v.literal("public"), v.literal("team"), v.literal("admin"))
|
|
20
|
+
},
|
|
21
|
+
returns: v.id("doc_sections"),
|
|
22
|
+
handler: async (ctx, args) => {
|
|
23
|
+
return await ctx.db.insert("doc_sections", {
|
|
24
|
+
...args,
|
|
25
|
+
createdAt: Date.now()
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
var updateSection = mutation({
|
|
30
|
+
args: {
|
|
31
|
+
sectionId: v.id("doc_sections"),
|
|
32
|
+
title: v.optional(v.string()),
|
|
33
|
+
slug: v.optional(v.string()),
|
|
34
|
+
order: v.optional(v.number()),
|
|
35
|
+
icon: v.optional(v.string()),
|
|
36
|
+
description: v.optional(v.string()),
|
|
37
|
+
access: v.optional(
|
|
38
|
+
v.union(v.literal("public"), v.literal("team"), v.literal("admin"))
|
|
39
|
+
)
|
|
40
|
+
},
|
|
41
|
+
returns: v.null(),
|
|
42
|
+
handler: async (ctx, args) => {
|
|
43
|
+
const { sectionId, ...updates } = args;
|
|
44
|
+
const clean = Object.fromEntries(
|
|
45
|
+
Object.entries(updates).filter(([, val]) => val !== void 0)
|
|
46
|
+
);
|
|
47
|
+
await ctx.db.patch(sectionId, clean);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
var deleteSection = mutation({
|
|
52
|
+
args: { sectionId: v.id("doc_sections") },
|
|
53
|
+
returns: v.null(),
|
|
54
|
+
handler: async (ctx, args) => {
|
|
55
|
+
const pages = await ctx.db.query("doc_pages").withIndex("by_sectionId", (q) => q.eq("sectionId", args.sectionId)).collect();
|
|
56
|
+
for (const page of pages) {
|
|
57
|
+
const indexEntries = await ctx.db.query("doc_search_index").withIndex("by_pageId", (q) => q.eq("pageId", page._id)).collect();
|
|
58
|
+
for (const entry of indexEntries) {
|
|
59
|
+
await ctx.db.delete(entry._id);
|
|
60
|
+
}
|
|
61
|
+
await ctx.db.delete(page._id);
|
|
62
|
+
}
|
|
63
|
+
await ctx.db.delete(args.sectionId);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
var reorderSections = mutation({
|
|
68
|
+
args: { sectionIds: v.array(v.id("doc_sections")) },
|
|
69
|
+
returns: v.null(),
|
|
70
|
+
handler: async (ctx, args) => {
|
|
71
|
+
for (let i = 0; i < args.sectionIds.length; i++) {
|
|
72
|
+
await ctx.db.patch(args.sectionIds[i], { order: i });
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
var createPage = mutation({
|
|
78
|
+
args: {
|
|
79
|
+
title: v.string(),
|
|
80
|
+
slug: v.string(),
|
|
81
|
+
content: v.string(),
|
|
82
|
+
sectionId: v.id("doc_sections"),
|
|
83
|
+
access: v.union(v.literal("public"), v.literal("team"), v.literal("admin")),
|
|
84
|
+
tags: v.optional(v.array(v.string())),
|
|
85
|
+
version: v.optional(v.string()),
|
|
86
|
+
status: v.optional(
|
|
87
|
+
v.union(v.literal("draft"), v.literal("published"), v.literal("archived"))
|
|
88
|
+
),
|
|
89
|
+
author: v.optional(
|
|
90
|
+
v.object({ name: v.string(), avatar: v.optional(v.string()) })
|
|
91
|
+
),
|
|
92
|
+
excerpt: v.optional(v.string()),
|
|
93
|
+
order: v.optional(v.number())
|
|
94
|
+
},
|
|
95
|
+
returns: v.id("doc_pages"),
|
|
96
|
+
handler: async (ctx, args) => {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const stripped = args.content.replace(/```[\s\S]*?```/g, "").replace(/[#*_~>|-]/g, "").trim();
|
|
99
|
+
const words = stripped.split(/\s+/).filter(Boolean);
|
|
100
|
+
const wordCount = words.length;
|
|
101
|
+
const readingTime = Math.max(1, Math.ceil(wordCount / 225));
|
|
102
|
+
return await ctx.db.insert("doc_pages", {
|
|
103
|
+
title: args.title,
|
|
104
|
+
slug: args.slug,
|
|
105
|
+
content: args.content,
|
|
106
|
+
excerpt: args.excerpt,
|
|
107
|
+
sectionId: args.sectionId,
|
|
108
|
+
order: args.order ?? 0,
|
|
109
|
+
author: args.author ?? { name: "Anonymous" },
|
|
110
|
+
version: args.version,
|
|
111
|
+
access: args.access,
|
|
112
|
+
tags: args.tags ?? [],
|
|
113
|
+
status: args.status ?? "draft",
|
|
114
|
+
createdAt: now,
|
|
115
|
+
updatedAt: now,
|
|
116
|
+
wordCount,
|
|
117
|
+
readingTime,
|
|
118
|
+
viewCount: 0
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
var updatePage = mutation({
|
|
123
|
+
args: {
|
|
124
|
+
pageId: v.id("doc_pages"),
|
|
125
|
+
title: v.optional(v.string()),
|
|
126
|
+
slug: v.optional(v.string()),
|
|
127
|
+
content: v.optional(v.string()),
|
|
128
|
+
excerpt: v.optional(v.string()),
|
|
129
|
+
sectionId: v.optional(v.id("doc_sections")),
|
|
130
|
+
order: v.optional(v.number()),
|
|
131
|
+
access: v.optional(
|
|
132
|
+
v.union(v.literal("public"), v.literal("team"), v.literal("admin"))
|
|
133
|
+
),
|
|
134
|
+
tags: v.optional(v.array(v.string())),
|
|
135
|
+
version: v.optional(v.string()),
|
|
136
|
+
status: v.optional(
|
|
137
|
+
v.union(v.literal("draft"), v.literal("published"), v.literal("archived"))
|
|
138
|
+
),
|
|
139
|
+
lastEditedBy: v.optional(
|
|
140
|
+
v.object({ name: v.string(), editedAt: v.string() })
|
|
141
|
+
)
|
|
142
|
+
},
|
|
143
|
+
returns: v.null(),
|
|
144
|
+
handler: async (ctx, args) => {
|
|
145
|
+
const { pageId, ...updates } = args;
|
|
146
|
+
const clean = Object.fromEntries(
|
|
147
|
+
Object.entries(updates).filter(([, val]) => val !== void 0)
|
|
148
|
+
);
|
|
149
|
+
if (typeof clean.content === "string") {
|
|
150
|
+
const stripped = clean.content.replace(/```[\s\S]*?```/g, "").replace(/[#*_~>|-]/g, "").trim();
|
|
151
|
+
const words = stripped.split(/\s+/).filter(Boolean);
|
|
152
|
+
clean.wordCount = words.length;
|
|
153
|
+
clean.readingTime = Math.max(1, Math.ceil(words.length / 225));
|
|
154
|
+
}
|
|
155
|
+
clean.updatedAt = Date.now();
|
|
156
|
+
await ctx.db.patch(pageId, clean);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
var publishPage = mutation({
|
|
161
|
+
args: { pageId: v.id("doc_pages") },
|
|
162
|
+
returns: v.null(),
|
|
163
|
+
handler: async (ctx, args) => {
|
|
164
|
+
await ctx.db.patch(args.pageId, {
|
|
165
|
+
status: "published",
|
|
166
|
+
updatedAt: Date.now()
|
|
167
|
+
});
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
var archivePage = mutation({
|
|
172
|
+
args: { pageId: v.id("doc_pages") },
|
|
173
|
+
returns: v.null(),
|
|
174
|
+
handler: async (ctx, args) => {
|
|
175
|
+
await ctx.db.patch(args.pageId, {
|
|
176
|
+
status: "archived",
|
|
177
|
+
updatedAt: Date.now()
|
|
178
|
+
});
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
var deletePage = mutation({
|
|
183
|
+
args: { pageId: v.id("doc_pages") },
|
|
184
|
+
returns: v.null(),
|
|
185
|
+
handler: async (ctx, args) => {
|
|
186
|
+
const indexEntries = await ctx.db.query("doc_search_index").withIndex("by_pageId", (q) => q.eq("pageId", args.pageId)).collect();
|
|
187
|
+
for (const entry of indexEntries) {
|
|
188
|
+
await ctx.db.delete(entry._id);
|
|
189
|
+
}
|
|
190
|
+
await ctx.db.delete(args.pageId);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
var reorderPages = mutation({
|
|
195
|
+
args: { pageIds: v.array(v.id("doc_pages")) },
|
|
196
|
+
returns: v.null(),
|
|
197
|
+
handler: async (ctx, args) => {
|
|
198
|
+
for (let i = 0; i < args.pageIds.length; i++) {
|
|
199
|
+
await ctx.db.patch(args.pageIds[i], { order: i });
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
var incrementViewCount = mutation({
|
|
205
|
+
args: { pageId: v.id("doc_pages") },
|
|
206
|
+
returns: v.null(),
|
|
207
|
+
handler: async (ctx, args) => {
|
|
208
|
+
const page = await ctx.db.get(args.pageId);
|
|
209
|
+
if (page) {
|
|
210
|
+
await ctx.db.patch(args.pageId, { viewCount: (page.viewCount ?? 0) + 1 });
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
var movePage = mutation({
|
|
216
|
+
args: {
|
|
217
|
+
pageId: v.id("doc_pages"),
|
|
218
|
+
newSectionId: v.id("doc_sections"),
|
|
219
|
+
newOrder: v.number()
|
|
220
|
+
},
|
|
221
|
+
returns: v.null(),
|
|
222
|
+
handler: async (ctx, args) => {
|
|
223
|
+
await ctx.db.patch(args.pageId, {
|
|
224
|
+
sectionId: args.newSectionId,
|
|
225
|
+
order: args.newOrder,
|
|
226
|
+
updatedAt: Date.now()
|
|
227
|
+
});
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
var docAccessValidator = v.union(
|
|
232
|
+
v.literal("public"),
|
|
233
|
+
v.literal("team"),
|
|
234
|
+
v.literal("admin")
|
|
235
|
+
);
|
|
236
|
+
var docStatusValidator = v.union(
|
|
237
|
+
v.literal("draft"),
|
|
238
|
+
v.literal("published"),
|
|
239
|
+
v.literal("archived")
|
|
240
|
+
);
|
|
241
|
+
var docAuthorValidator = v.object({
|
|
242
|
+
name: v.string(),
|
|
243
|
+
avatar: v.optional(v.string())
|
|
244
|
+
});
|
|
245
|
+
var docRevisionValidator = v.object({
|
|
246
|
+
name: v.string(),
|
|
247
|
+
editedAt: v.string()
|
|
248
|
+
});
|
|
249
|
+
var docSectionValidator = v.object({
|
|
250
|
+
_id: v.id("doc_sections"),
|
|
251
|
+
_creationTime: v.number(),
|
|
252
|
+
title: v.string(),
|
|
253
|
+
slug: v.string(),
|
|
254
|
+
parentId: v.optional(v.id("doc_sections")),
|
|
255
|
+
order: v.number(),
|
|
256
|
+
icon: v.optional(v.string()),
|
|
257
|
+
description: v.optional(v.string()),
|
|
258
|
+
access: docAccessValidator,
|
|
259
|
+
createdAt: v.number()
|
|
260
|
+
});
|
|
261
|
+
var docPageValidator = v.object({
|
|
262
|
+
_id: v.id("doc_pages"),
|
|
263
|
+
_creationTime: v.number(),
|
|
264
|
+
title: v.string(),
|
|
265
|
+
slug: v.string(),
|
|
266
|
+
content: v.string(),
|
|
267
|
+
excerpt: v.optional(v.string()),
|
|
268
|
+
sectionId: v.id("doc_sections"),
|
|
269
|
+
order: v.number(),
|
|
270
|
+
author: docAuthorValidator,
|
|
271
|
+
lastEditedBy: v.optional(docRevisionValidator),
|
|
272
|
+
version: v.optional(v.string()),
|
|
273
|
+
access: docAccessValidator,
|
|
274
|
+
tags: v.array(v.string()),
|
|
275
|
+
status: docStatusValidator,
|
|
276
|
+
createdAt: v.number(),
|
|
277
|
+
updatedAt: v.number(),
|
|
278
|
+
wordCount: v.number(),
|
|
279
|
+
readingTime: v.number(),
|
|
280
|
+
viewCount: v.number()
|
|
281
|
+
});
|
|
282
|
+
var hydratedPageValidator = v.object({
|
|
283
|
+
_id: v.id("doc_pages"),
|
|
284
|
+
_creationTime: v.number(),
|
|
285
|
+
id: v.id("doc_pages"),
|
|
286
|
+
title: v.string(),
|
|
287
|
+
slug: v.string(),
|
|
288
|
+
content: v.string(),
|
|
289
|
+
excerpt: v.optional(v.string()),
|
|
290
|
+
sectionId: v.id("doc_sections"),
|
|
291
|
+
order: v.number(),
|
|
292
|
+
author: docAuthorValidator,
|
|
293
|
+
lastEditedBy: v.optional(docRevisionValidator),
|
|
294
|
+
version: v.optional(v.string()),
|
|
295
|
+
access: docAccessValidator,
|
|
296
|
+
tags: v.array(v.string()),
|
|
297
|
+
status: docStatusValidator,
|
|
298
|
+
createdAt: v.number(),
|
|
299
|
+
updatedAt: v.number(),
|
|
300
|
+
wordCount: v.number(),
|
|
301
|
+
readingTime: v.number(),
|
|
302
|
+
viewCount: v.number()
|
|
303
|
+
});
|
|
304
|
+
var sectionTreeItemValidator = v.object({
|
|
305
|
+
_id: v.id("doc_sections"),
|
|
306
|
+
_creationTime: v.number(),
|
|
307
|
+
id: v.id("doc_sections"),
|
|
308
|
+
title: v.string(),
|
|
309
|
+
slug: v.string(),
|
|
310
|
+
parentId: v.optional(v.id("doc_sections")),
|
|
311
|
+
order: v.number(),
|
|
312
|
+
icon: v.optional(v.string()),
|
|
313
|
+
description: v.optional(v.string()),
|
|
314
|
+
access: docAccessValidator,
|
|
315
|
+
createdAt: v.number(),
|
|
316
|
+
pages: v.array(hydratedPageValidator),
|
|
317
|
+
pageCount: v.number()
|
|
318
|
+
});
|
|
319
|
+
var listSections = query({
|
|
320
|
+
args: { access: v.optional(docAccessValidator) },
|
|
321
|
+
returns: v.array(docSectionValidator),
|
|
322
|
+
handler: async (ctx, args) => {
|
|
323
|
+
let sections = await ctx.db.query("doc_sections").withIndex("by_order").collect();
|
|
324
|
+
if (args.access) {
|
|
325
|
+
sections = sections.filter((s) => s.access === args.access);
|
|
326
|
+
}
|
|
327
|
+
return sections.sort((a, b) => a.order - b.order);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
var getSection = query({
|
|
331
|
+
args: { sectionId: v.id("doc_sections") },
|
|
332
|
+
returns: v.union(v.null(), docSectionValidator),
|
|
333
|
+
handler: async (ctx, args) => {
|
|
334
|
+
return await ctx.db.get(args.sectionId);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
var listPagesBySection = query({
|
|
338
|
+
args: {
|
|
339
|
+
sectionId: v.id("doc_sections"),
|
|
340
|
+
status: v.optional(docStatusValidator)
|
|
341
|
+
},
|
|
342
|
+
returns: v.array(docPageValidator),
|
|
343
|
+
handler: async (ctx, args) => {
|
|
344
|
+
let pages = await ctx.db.query("doc_pages").withIndex("by_sectionId", (q) => q.eq("sectionId", args.sectionId)).collect();
|
|
345
|
+
if (args.status) {
|
|
346
|
+
pages = pages.filter((p) => p.status === args.status);
|
|
347
|
+
}
|
|
348
|
+
return pages.sort((a, b) => a.order - b.order);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
var getPage = query({
|
|
352
|
+
args: {
|
|
353
|
+
sectionId: v.id("doc_sections"),
|
|
354
|
+
slug: v.string()
|
|
355
|
+
},
|
|
356
|
+
returns: v.union(v.null(), docPageValidator),
|
|
357
|
+
handler: async (ctx, args) => {
|
|
358
|
+
const pages = await ctx.db.query("doc_pages").withIndex("by_sectionId", (q) => q.eq("sectionId", args.sectionId)).collect();
|
|
359
|
+
return pages.find((p) => p.slug === args.slug) ?? null;
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
var getPageById = query({
|
|
363
|
+
args: { pageId: v.id("doc_pages") },
|
|
364
|
+
returns: v.union(v.null(), docPageValidator),
|
|
365
|
+
handler: async (ctx, args) => {
|
|
366
|
+
return await ctx.db.get(args.pageId);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
var searchPages = query({
|
|
370
|
+
args: {
|
|
371
|
+
query: v.string(),
|
|
372
|
+
access: v.optional(docAccessValidator)
|
|
373
|
+
},
|
|
374
|
+
returns: v.array(docPageValidator),
|
|
375
|
+
handler: async (ctx, args) => {
|
|
376
|
+
const q = args.query.toLowerCase();
|
|
377
|
+
if (!q) return [];
|
|
378
|
+
let pages = await ctx.db.query("doc_pages").collect();
|
|
379
|
+
if (args.access) {
|
|
380
|
+
pages = pages.filter((p) => p.access === args.access);
|
|
381
|
+
}
|
|
382
|
+
const results = pages.filter(
|
|
383
|
+
(p) => p.title.toLowerCase().includes(q) || p.content.toLowerCase().includes(q) || p.tags.some((t) => t.toLowerCase().includes(q))
|
|
384
|
+
).slice(0, 20);
|
|
385
|
+
return results;
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
var getFullTree = query({
|
|
389
|
+
args: { access: v.optional(docAccessValidator) },
|
|
390
|
+
returns: v.array(sectionTreeItemValidator),
|
|
391
|
+
handler: async (ctx, args) => {
|
|
392
|
+
let sections = await ctx.db.query("doc_sections").withIndex("by_order").collect();
|
|
393
|
+
if (args.access) {
|
|
394
|
+
sections = sections.filter((s) => s.access === args.access);
|
|
395
|
+
}
|
|
396
|
+
sections.sort((a, b) => a.order - b.order);
|
|
397
|
+
const tree = [];
|
|
398
|
+
for (const section of sections) {
|
|
399
|
+
const pages = await ctx.db.query("doc_pages").withIndex("by_sectionId", (q) => q.eq("sectionId", section._id)).collect();
|
|
400
|
+
const publishedPages = pages.filter((p) => p.status === "published").sort((a, b) => a.order - b.order);
|
|
401
|
+
tree.push({
|
|
402
|
+
...section,
|
|
403
|
+
id: section._id,
|
|
404
|
+
pages: publishedPages.map((p) => ({ ...p, id: p._id })),
|
|
405
|
+
pageCount: publishedPages.length
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
return tree;
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
var getRecentPages = query({
|
|
412
|
+
args: {
|
|
413
|
+
limit: v.optional(v.number()),
|
|
414
|
+
access: v.optional(docAccessValidator)
|
|
415
|
+
},
|
|
416
|
+
returns: v.array(hydratedPageValidator),
|
|
417
|
+
handler: async (ctx, args) => {
|
|
418
|
+
let pages = await ctx.db.query("doc_pages").collect();
|
|
419
|
+
pages = pages.filter((p) => p.status === "published");
|
|
420
|
+
if (args.access) {
|
|
421
|
+
pages = pages.filter((p) => p.access === args.access);
|
|
422
|
+
}
|
|
423
|
+
pages.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
424
|
+
return pages.slice(0, args.limit ?? 10).map((p) => ({ ...p, id: p._id }));
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
var getPageVersions = query({
|
|
428
|
+
args: { slug: v.string() },
|
|
429
|
+
returns: v.array(hydratedPageValidator),
|
|
430
|
+
handler: async (ctx, args) => {
|
|
431
|
+
const pages = await ctx.db.query("doc_pages").withIndex("by_slug", (q) => q.eq("slug", args.slug)).collect();
|
|
432
|
+
return pages.filter((p) => p.version).sort((a, b) => (b.version ?? "").localeCompare(a.version ?? "")).map((p) => ({ ...p, id: p._id }));
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
var docsTables = {
|
|
436
|
+
doc_sections: defineTable({
|
|
437
|
+
title: v.string(),
|
|
438
|
+
slug: v.string(),
|
|
439
|
+
parentId: v.optional(v.id("doc_sections")),
|
|
440
|
+
order: v.number(),
|
|
441
|
+
icon: v.optional(v.string()),
|
|
442
|
+
description: v.optional(v.string()),
|
|
443
|
+
access: v.union(v.literal("public"), v.literal("team"), v.literal("admin")),
|
|
444
|
+
createdAt: v.number()
|
|
445
|
+
}).index("by_slug", ["slug"]).index("by_parentId", ["parentId"]).index("by_order", ["order"]),
|
|
446
|
+
doc_pages: defineTable({
|
|
447
|
+
title: v.string(),
|
|
448
|
+
slug: v.string(),
|
|
449
|
+
content: v.string(),
|
|
450
|
+
excerpt: v.optional(v.string()),
|
|
451
|
+
sectionId: v.id("doc_sections"),
|
|
452
|
+
order: v.number(),
|
|
453
|
+
author: v.object({ name: v.string(), avatar: v.optional(v.string()) }),
|
|
454
|
+
lastEditedBy: v.optional(
|
|
455
|
+
v.object({ name: v.string(), editedAt: v.string() })
|
|
456
|
+
),
|
|
457
|
+
version: v.optional(v.string()),
|
|
458
|
+
access: v.union(v.literal("public"), v.literal("team"), v.literal("admin")),
|
|
459
|
+
tags: v.array(v.string()),
|
|
460
|
+
status: v.union(
|
|
461
|
+
v.literal("draft"),
|
|
462
|
+
v.literal("published"),
|
|
463
|
+
v.literal("archived")
|
|
464
|
+
),
|
|
465
|
+
createdAt: v.number(),
|
|
466
|
+
updatedAt: v.number(),
|
|
467
|
+
wordCount: v.number(),
|
|
468
|
+
readingTime: v.number(),
|
|
469
|
+
viewCount: v.number()
|
|
470
|
+
}).index("by_sectionId", ["sectionId"]).index("by_slug", ["slug"]).index("by_status", ["status"]).index("by_access", ["access"]),
|
|
471
|
+
doc_search_index: defineTable({
|
|
472
|
+
pageId: v.id("doc_pages"),
|
|
473
|
+
sectionId: v.id("doc_sections"),
|
|
474
|
+
tokens: v.array(v.string()),
|
|
475
|
+
updatedAt: v.number()
|
|
476
|
+
}).index("by_pageId", ["pageId"])
|
|
477
|
+
};
|
|
478
|
+
defineSchema(docsTables);
|
|
479
|
+
|
|
480
|
+
export { archivePage, convex_config_default as componentDefinition, createPage, createSection, deletePage, deleteSection, docsTables, getFullTree, getPage, getPageById, getPageVersions, getRecentPages, getSection, incrementViewCount, listPagesBySection, listSections, movePage, publishPage, reorderPages, reorderSections, searchPages, updatePage, updateSection };
|
|
481
|
+
//# sourceMappingURL=index.js.map
|
|
482
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convex.config.ts","../src/_generated/server.js","../src/mutations.ts","../src/queries.ts","../src/schema.ts"],"names":["v"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module docsConvexConfig\n * @package @geenius/docs-convex\n * @description Declares the Convex component identity for the docs package so\n * consuming apps can register the component under the canonical docs name.\n */\n\nimport { defineComponent } from 'convex/server'\n\n/**\n * Convex component definition for the docs package.\n */\nconst component = defineComponent('docs')\n\nexport default component\n","/* eslint-disable */\n/**\n * THIS CODE IS AUTOMATICALLY GENERATED by @geenius/db codegen.\n *\n * Template version: 1.34-r2\n * Generated at: 2026-04-13\n * Convex SDK: ^1.34.0\n *\n * DO NOT EDIT THIS FILE MANUALLY.\n * To regenerate, run: geenius-convex-codegen\n * @module\n */\n\nimport {\n actionGeneric,\n httpActionGeneric,\n queryGeneric,\n mutationGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"convex/server\";\n\nexport const query = queryGeneric;\nexport const internalQuery = internalQueryGeneric;\nexport const mutation = mutationGeneric;\nexport const internalMutation = internalMutationGeneric;\nexport const action = actionGeneric;\nexport const internalAction = internalActionGeneric;\nexport const httpAction = httpActionGeneric;\n","/**\n * @module docsConvexMutations\n * @package @geenius/docs-convex\n * @description Declares the typed Convex mutation surface for creating,\n * updating, reordering, publishing, and deleting docs sections and pages.\n */\n\nimport { v } from 'convex/values'\nimport { mutation } from './_generated/server.js'\n\n/**\n * Creates a docs section record.\n */\nexport const createSection = mutation({\n args: {\n title: v.string(),\n slug: v.string(),\n parentId: v.optional(v.id('doc_sections')),\n order: v.number(),\n icon: v.optional(v.string()),\n description: v.optional(v.string()),\n access: v.union(v.literal('public'), v.literal('team'), v.literal('admin')),\n },\n returns: v.id('doc_sections'),\n handler: async (ctx, args) => {\n return await ctx.db.insert('doc_sections', {\n ...args,\n createdAt: Date.now(),\n })\n },\n})\n\n/**\n * Updates mutable fields on a docs section.\n */\nexport const updateSection = mutation({\n args: {\n sectionId: v.id('doc_sections'),\n title: v.optional(v.string()),\n slug: v.optional(v.string()),\n order: v.optional(v.number()),\n icon: v.optional(v.string()),\n description: v.optional(v.string()),\n access: v.optional(\n v.union(v.literal('public'), v.literal('team'), v.literal('admin'))\n ),\n },\n returns: v.null(),\n handler: async (ctx, args) => {\n const { sectionId, ...updates } = args\n const clean = Object.fromEntries(\n Object.entries(updates).filter(([, val]) => val !== undefined)\n )\n await ctx.db.patch(sectionId, clean)\n return null\n },\n})\n\n/**\n * Deletes a docs section and its dependent pages and search index entries.\n */\nexport const deleteSection = mutation({\n args: { sectionId: v.id('doc_sections') },\n returns: v.null(),\n handler: async (ctx, args) => {\n const pages = await ctx.db\n .query('doc_pages')\n .withIndex('by_sectionId', (q) => q.eq('sectionId', args.sectionId))\n .collect()\n\n for (const page of pages) {\n const indexEntries = await ctx.db\n .query('doc_search_index')\n .withIndex('by_pageId', (q) => q.eq('pageId', page._id))\n .collect()\n for (const entry of indexEntries) {\n await ctx.db.delete(entry._id)\n }\n await ctx.db.delete(page._id)\n }\n\n await ctx.db.delete(args.sectionId)\n return null\n },\n})\n\n/**\n * Reorders sections according to the provided id sequence.\n */\nexport const reorderSections = mutation({\n args: { sectionIds: v.array(v.id('doc_sections')) },\n returns: v.null(),\n handler: async (ctx, args) => {\n for (let i = 0; i < args.sectionIds.length; i++) {\n await ctx.db.patch(args.sectionIds[i], { order: i })\n }\n return null\n },\n})\n\n/**\n * Creates a docs page and derives reading-time metadata from its content.\n */\nexport const createPage = mutation({\n args: {\n title: v.string(),\n slug: v.string(),\n content: v.string(),\n sectionId: v.id('doc_sections'),\n access: v.union(v.literal('public'), v.literal('team'), v.literal('admin')),\n tags: v.optional(v.array(v.string())),\n version: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal('draft'), v.literal('published'), v.literal('archived'))\n ),\n author: v.optional(\n v.object({ name: v.string(), avatar: v.optional(v.string()) })\n ),\n excerpt: v.optional(v.string()),\n order: v.optional(v.number()),\n },\n returns: v.id('doc_pages'),\n handler: async (ctx, args) => {\n const now = Date.now()\n const stripped = args.content\n .replace(/```[\\s\\S]*?```/g, '')\n .replace(/[#*_~>|-]/g, '')\n .trim()\n const words = stripped.split(/\\s+/).filter(Boolean)\n const wordCount = words.length\n const readingTime = Math.max(1, Math.ceil(wordCount / 225))\n\n return await ctx.db.insert('doc_pages', {\n title: args.title,\n slug: args.slug,\n content: args.content,\n excerpt: args.excerpt,\n sectionId: args.sectionId,\n order: args.order ?? 0,\n author: args.author ?? { name: \"Anonymous\" },\n version: args.version,\n access: args.access,\n tags: args.tags ?? [],\n status: args.status ?? 'draft',\n createdAt: now,\n updatedAt: now,\n wordCount,\n readingTime,\n viewCount: 0,\n })\n },\n})\n\n/**\n * Updates an existing docs page and recalculates derived metadata when needed.\n */\nexport const updatePage = mutation({\n args: {\n pageId: v.id('doc_pages'),\n title: v.optional(v.string()),\n slug: v.optional(v.string()),\n content: v.optional(v.string()),\n excerpt: v.optional(v.string()),\n sectionId: v.optional(v.id('doc_sections')),\n order: v.optional(v.number()),\n access: v.optional(\n v.union(v.literal('public'), v.literal('team'), v.literal('admin'))\n ),\n tags: v.optional(v.array(v.string())),\n version: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal('draft'), v.literal('published'), v.literal('archived'))\n ),\n lastEditedBy: v.optional(\n v.object({ name: v.string(), editedAt: v.string() })\n ),\n },\n returns: v.null(),\n handler: async (ctx, args) => {\n const { pageId, ...updates } = args\n const clean: Record<string, unknown> = Object.fromEntries(\n Object.entries(updates).filter(([, val]) => val !== undefined)\n )\n\n if (typeof clean.content === 'string') {\n const stripped = clean.content\n .replace(/```[\\s\\S]*?```/g, '')\n .replace(/[#*_~>|-]/g, '')\n .trim()\n const words = stripped.split(/\\s+/).filter(Boolean)\n clean.wordCount = words.length\n clean.readingTime = Math.max(1, Math.ceil(words.length / 225))\n }\n\n clean.updatedAt = Date.now()\n await ctx.db.patch(pageId, clean)\n return null\n },\n})\n\n/**\n * Publishes a docs page.\n */\nexport const publishPage = mutation({\n args: { pageId: v.id('doc_pages') },\n returns: v.null(),\n handler: async (ctx, args) => {\n await ctx.db.patch(args.pageId, {\n status: 'published',\n updatedAt: Date.now(),\n })\n return null\n },\n})\n\n/**\n * Archives a docs page.\n */\nexport const archivePage = mutation({\n args: { pageId: v.id('doc_pages') },\n returns: v.null(),\n handler: async (ctx, args) => {\n await ctx.db.patch(args.pageId, {\n status: 'archived',\n updatedAt: Date.now(),\n })\n return null\n },\n})\n\n/**\n * Deletes a docs page and its search index entries.\n */\nexport const deletePage = mutation({\n args: { pageId: v.id('doc_pages') },\n returns: v.null(),\n handler: async (ctx, args) => {\n const indexEntries = await ctx.db\n .query('doc_search_index')\n .withIndex('by_pageId', (q) => q.eq('pageId', args.pageId))\n .collect()\n for (const entry of indexEntries) {\n await ctx.db.delete(entry._id)\n }\n await ctx.db.delete(args.pageId)\n return null\n },\n})\n\n/**\n * Reorders pages within a section according to the provided id sequence.\n */\nexport const reorderPages = mutation({\n args: { pageIds: v.array(v.id('doc_pages')) },\n returns: v.null(),\n handler: async (ctx, args) => {\n for (let i = 0; i < args.pageIds.length; i++) {\n await ctx.db.patch(args.pageIds[i], { order: i })\n }\n return null\n },\n})\n\n/**\n * Increments the view count for a docs page.\n */\nexport const incrementViewCount = mutation({\n args: { pageId: v.id('doc_pages') },\n returns: v.null(),\n handler: async (ctx, args) => {\n const page = await ctx.db.get(args.pageId)\n if (page) {\n await ctx.db.patch(args.pageId, { viewCount: (page.viewCount ?? 0) + 1 })\n }\n return null\n },\n})\n\n/**\n * Moves a docs page into a new section and order slot.\n */\nexport const movePage = mutation({\n args: {\n pageId: v.id('doc_pages'),\n newSectionId: v.id('doc_sections'),\n newOrder: v.number(),\n },\n returns: v.null(),\n handler: async (ctx, args) => {\n await ctx.db.patch(args.pageId, {\n sectionId: args.newSectionId,\n order: args.newOrder,\n updatedAt: Date.now(),\n })\n return null\n },\n})\n","/**\n * @module docsConvexQueries\n * @package @geenius/docs-convex\n * @description Declares the typed Convex query surface used by the docs\n * package. The validators mirror the schema so consumers never fall back to\n * `v.any()` for docs sections, pages, or tree payloads.\n */\n\nimport { v } from \"convex/values\";\nimport { query } from \"./_generated/server.js\";\n\nconst docAccessValidator = v.union(\n v.literal(\"public\"),\n v.literal(\"team\"),\n v.literal(\"admin\"),\n);\n\nconst docStatusValidator = v.union(\n v.literal(\"draft\"),\n v.literal(\"published\"),\n v.literal(\"archived\"),\n);\n\nconst docAuthorValidator = v.object({\n name: v.string(),\n avatar: v.optional(v.string()),\n});\n\nconst docRevisionValidator = v.object({\n name: v.string(),\n editedAt: v.string(),\n});\n\nconst docSectionValidator = v.object({\n _id: v.id(\"doc_sections\"),\n _creationTime: v.number(),\n title: v.string(),\n slug: v.string(),\n parentId: v.optional(v.id(\"doc_sections\")),\n order: v.number(),\n icon: v.optional(v.string()),\n description: v.optional(v.string()),\n access: docAccessValidator,\n createdAt: v.number(),\n});\n\nconst docPageValidator = v.object({\n _id: v.id(\"doc_pages\"),\n _creationTime: v.number(),\n title: v.string(),\n slug: v.string(),\n content: v.string(),\n excerpt: v.optional(v.string()),\n sectionId: v.id(\"doc_sections\"),\n order: v.number(),\n author: docAuthorValidator,\n lastEditedBy: v.optional(docRevisionValidator),\n version: v.optional(v.string()),\n access: docAccessValidator,\n tags: v.array(v.string()),\n status: docStatusValidator,\n createdAt: v.number(),\n updatedAt: v.number(),\n wordCount: v.number(),\n readingTime: v.number(),\n viewCount: v.number(),\n});\n\nconst hydratedPageValidator = v.object({\n _id: v.id(\"doc_pages\"),\n _creationTime: v.number(),\n id: v.id(\"doc_pages\"),\n title: v.string(),\n slug: v.string(),\n content: v.string(),\n excerpt: v.optional(v.string()),\n sectionId: v.id(\"doc_sections\"),\n order: v.number(),\n author: docAuthorValidator,\n lastEditedBy: v.optional(docRevisionValidator),\n version: v.optional(v.string()),\n access: docAccessValidator,\n tags: v.array(v.string()),\n status: docStatusValidator,\n createdAt: v.number(),\n updatedAt: v.number(),\n wordCount: v.number(),\n readingTime: v.number(),\n viewCount: v.number(),\n});\n\nconst sectionTreeItemValidator = v.object({\n _id: v.id(\"doc_sections\"),\n _creationTime: v.number(),\n id: v.id(\"doc_sections\"),\n title: v.string(),\n slug: v.string(),\n parentId: v.optional(v.id(\"doc_sections\")),\n order: v.number(),\n icon: v.optional(v.string()),\n description: v.optional(v.string()),\n access: docAccessValidator,\n createdAt: v.number(),\n pages: v.array(hydratedPageValidator),\n pageCount: v.number(),\n});\n\nexport const listSections = query({\n args: { access: v.optional(docAccessValidator) },\n returns: v.array(docSectionValidator),\n handler: async (ctx, args) => {\n let sections = await ctx.db\n .query(\"doc_sections\")\n .withIndex(\"by_order\")\n .collect();\n\n if (args.access) {\n sections = sections.filter((s) => s.access === args.access);\n }\n\n return sections.sort((a, b) => a.order - b.order);\n },\n});\n\nexport const getSection = query({\n args: { sectionId: v.id(\"doc_sections\") },\n returns: v.union(v.null(), docSectionValidator),\n handler: async (ctx, args) => {\n return await ctx.db.get(args.sectionId);\n },\n});\n\nexport const listPagesBySection = query({\n args: {\n sectionId: v.id(\"doc_sections\"),\n status: v.optional(docStatusValidator),\n },\n returns: v.array(docPageValidator),\n handler: async (ctx, args) => {\n let pages = await ctx.db\n .query(\"doc_pages\")\n .withIndex(\"by_sectionId\", (q) => q.eq(\"sectionId\", args.sectionId))\n .collect();\n\n if (args.status) {\n pages = pages.filter((p) => p.status === args.status);\n }\n\n return pages.sort((a, b) => a.order - b.order);\n },\n});\n\nexport const getPage = query({\n args: {\n sectionId: v.id(\"doc_sections\"),\n slug: v.string(),\n },\n returns: v.union(v.null(), docPageValidator),\n handler: async (ctx, args) => {\n const pages = await ctx.db\n .query(\"doc_pages\")\n .withIndex(\"by_sectionId\", (q) => q.eq(\"sectionId\", args.sectionId))\n .collect();\n\n return pages.find((p) => p.slug === args.slug) ?? null;\n },\n});\n\nexport const getPageById = query({\n args: { pageId: v.id(\"doc_pages\") },\n returns: v.union(v.null(), docPageValidator),\n handler: async (ctx, args) => {\n return await ctx.db.get(args.pageId);\n },\n});\n\nexport const searchPages = query({\n args: {\n query: v.string(),\n access: v.optional(docAccessValidator),\n },\n returns: v.array(docPageValidator),\n handler: async (ctx, args) => {\n const q = args.query.toLowerCase();\n if (!q) return [];\n\n let pages = await ctx.db.query(\"doc_pages\").collect();\n\n if (args.access) {\n pages = pages.filter((p) => p.access === args.access);\n }\n\n const results = pages\n .filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n p.content.toLowerCase().includes(q) ||\n p.tags.some((t: string) => t.toLowerCase().includes(q))\n )\n .slice(0, 20);\n\n return results;\n },\n});\n\nexport const getFullTree = query({\n args: { access: v.optional(docAccessValidator) },\n returns: v.array(sectionTreeItemValidator),\n handler: async (ctx, args) => {\n let sections = await ctx.db\n .query(\"doc_sections\")\n .withIndex(\"by_order\")\n .collect();\n\n if (args.access) {\n sections = sections.filter((s) => s.access === args.access);\n }\n\n sections.sort((a, b) => a.order - b.order);\n\n const tree = [];\n for (const section of sections) {\n const pages = await ctx.db\n .query(\"doc_pages\")\n .withIndex(\"by_sectionId\", (q) => q.eq(\"sectionId\", section._id))\n .collect();\n\n const publishedPages = pages\n .filter((p) => p.status === \"published\")\n .sort((a, b) => a.order - b.order);\n\n tree.push({\n ...section,\n id: section._id,\n pages: publishedPages.map((p) => ({ ...p, id: p._id })),\n pageCount: publishedPages.length,\n });\n }\n\n return tree;\n },\n});\n\nexport const getRecentPages = query({\n args: {\n limit: v.optional(v.number()),\n access: v.optional(docAccessValidator),\n },\n returns: v.array(hydratedPageValidator),\n handler: async (ctx, args) => {\n let pages = await ctx.db.query(\"doc_pages\").collect();\n\n pages = pages.filter((p) => p.status === \"published\");\n\n if (args.access) {\n pages = pages.filter((p) => p.access === args.access);\n }\n\n pages.sort((a, b) => b.updatedAt - a.updatedAt);\n\n return pages.slice(0, args.limit ?? 10).map((p) => ({ ...p, id: p._id }));\n },\n});\n\nexport const getPageVersions = query({\n args: { slug: v.string() },\n returns: v.array(hydratedPageValidator),\n handler: async (ctx, args) => {\n const pages = await ctx.db\n .query(\"doc_pages\")\n .withIndex(\"by_slug\", (q) => q.eq(\"slug\", args.slug))\n .collect();\n\n return pages\n .filter((p) => p.version)\n .sort((a, b) => (b.version ?? \"\").localeCompare(a.version ?? \"\"))\n .map((p) => ({ ...p, id: p._id }));\n },\n});\n","/**\n * @module docsConvexSchema\n * @package @geenius/docs-convex\n * @description Declares the docs Convex schema and exports the reusable\n * tables object so consuming apps can merge it into larger schemas.\n */\n\nimport { defineSchema, defineTable } from 'convex/server'\nimport { v } from 'convex/values'\n\n/**\n * Reusable Convex tables for the docs package.\n */\nexport const docsTables = {\n doc_sections: defineTable({\n title: v.string(),\n slug: v.string(),\n parentId: v.optional(v.id('doc_sections')),\n order: v.number(),\n icon: v.optional(v.string()),\n description: v.optional(v.string()),\n access: v.union(v.literal('public'), v.literal('team'), v.literal('admin')),\n createdAt: v.number(),\n })\n .index('by_slug', ['slug'])\n .index('by_parentId', ['parentId'])\n .index('by_order', ['order']),\n\n doc_pages: defineTable({\n title: v.string(),\n slug: v.string(),\n content: v.string(),\n excerpt: v.optional(v.string()),\n sectionId: v.id('doc_sections'),\n order: v.number(),\n author: v.object({ name: v.string(), avatar: v.optional(v.string()) }),\n lastEditedBy: v.optional(\n v.object({ name: v.string(), editedAt: v.string() })\n ),\n version: v.optional(v.string()),\n access: v.union(v.literal('public'), v.literal('team'), v.literal('admin')),\n tags: v.array(v.string()),\n status: v.union(\n v.literal('draft'),\n v.literal('published'),\n v.literal('archived')\n ),\n createdAt: v.number(),\n updatedAt: v.number(),\n wordCount: v.number(),\n readingTime: v.number(),\n viewCount: v.number(),\n })\n .index('by_sectionId', ['sectionId'])\n .index('by_slug', ['slug'])\n .index('by_status', ['status'])\n .index('by_access', ['access']),\n\n doc_search_index: defineTable({\n pageId: v.id('doc_pages'),\n sectionId: v.id('doc_sections'),\n tokens: v.array(v.string()),\n updatedAt: v.number(),\n }).index('by_pageId', ['pageId']),\n}\n\n/**\n * Canonical docs schema composed from the package tables.\n */\nconst docsSchema = defineSchema(docsTables)\n\nexport default docsSchema\n"]}
|