@shahadpichen/docpush 1.0.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/README.md +129 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +116 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.d.ts +4 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +58 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config/index.d.ts +3 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +9 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/loader.d.ts +6 -0
- package/dist/core/config/loader.d.ts.map +1 -0
- package/dist/core/config/loader.js +50 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +134 -0
- package/dist/core/config/schema.d.ts.map +1 -0
- package/dist/core/config/schema.js +106 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/errors.d.ts +45 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +76 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/github/client.d.ts +47 -0
- package/dist/core/github/client.d.ts.map +1 -0
- package/dist/core/github/client.js +159 -0
- package/dist/core/github/client.js.map +1 -0
- package/dist/core/github/index.d.ts +4 -0
- package/dist/core/github/index.d.ts.map +1 -0
- package/dist/core/github/index.js +9 -0
- package/dist/core/github/index.js.map +1 -0
- package/dist/core/github/retry.d.ts +15 -0
- package/dist/core/github/retry.d.ts.map +1 -0
- package/dist/core/github/retry.js +61 -0
- package/dist/core/github/retry.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/react/components/comments-panel.d.ts +14 -0
- package/dist/react/components/comments-panel.d.ts.map +1 -0
- package/dist/react/components/comments-panel.js +62 -0
- package/dist/react/components/comments-panel.js.map +1 -0
- package/dist/react/components/docs-sidebar.d.ts +13 -0
- package/dist/react/components/docs-sidebar.d.ts.map +1 -0
- package/dist/react/components/docs-sidebar.js +70 -0
- package/dist/react/components/docs-sidebar.js.map +1 -0
- package/dist/react/components/drafts-list.d.ts +18 -0
- package/dist/react/components/drafts-list.d.ts.map +1 -0
- package/dist/react/components/drafts-list.js +38 -0
- package/dist/react/components/drafts-list.js.map +1 -0
- package/dist/react/components/markdown-editor.d.ts +8 -0
- package/dist/react/components/markdown-editor.d.ts.map +1 -0
- package/dist/react/components/markdown-editor.js +59 -0
- package/dist/react/components/markdown-editor.js.map +1 -0
- package/dist/react/components/markdown-viewer.d.ts +7 -0
- package/dist/react/components/markdown-viewer.d.ts.map +1 -0
- package/dist/react/components/markdown-viewer.js +58 -0
- package/dist/react/components/markdown-viewer.js.map +1 -0
- package/dist/react/components/search-bar.d.ts +14 -0
- package/dist/react/components/search-bar.d.ts.map +1 -0
- package/dist/react/components/search-bar.js +80 -0
- package/dist/react/components/search-bar.js.map +1 -0
- package/dist/react/components/ui/badge.d.ts +10 -0
- package/dist/react/components/ui/badge.d.ts.map +1 -0
- package/dist/react/components/ui/badge.js +27 -0
- package/dist/react/components/ui/badge.js.map +1 -0
- package/dist/react/components/ui/button.d.ts +12 -0
- package/dist/react/components/ui/button.d.ts.map +1 -0
- package/dist/react/components/ui/button.js +71 -0
- package/dist/react/components/ui/button.js.map +1 -0
- package/dist/react/components/ui/card.d.ts +7 -0
- package/dist/react/components/ui/card.d.ts.map +1 -0
- package/dist/react/components/ui/card.js +52 -0
- package/dist/react/components/ui/card.js.map +1 -0
- package/dist/react/components/ui/input.d.ts +6 -0
- package/dist/react/components/ui/input.d.ts.map +1 -0
- package/dist/react/components/ui/input.js +45 -0
- package/dist/react/components/ui/input.js.map +1 -0
- package/dist/react/components/ui/scroll-area.d.ts +6 -0
- package/dist/react/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/react/components/ui/scroll-area.js +48 -0
- package/dist/react/components/ui/scroll-area.js.map +1 -0
- package/dist/react/components/ui/textarea.d.ts +6 -0
- package/dist/react/components/ui/textarea.d.ts.map +1 -0
- package/dist/react/components/ui/textarea.js +45 -0
- package/dist/react/components/ui/textarea.js.map +1 -0
- package/dist/react/context/docpush-provider.d.ts +17 -0
- package/dist/react/context/docpush-provider.d.ts.map +1 -0
- package/dist/react/context/docpush-provider.js +72 -0
- package/dist/react/context/docpush-provider.js.map +1 -0
- package/dist/react/hooks/use-auth.d.ts +16 -0
- package/dist/react/hooks/use-auth.d.ts.map +1 -0
- package/dist/react/hooks/use-auth.js +72 -0
- package/dist/react/hooks/use-auth.js.map +1 -0
- package/dist/react/hooks/use-comments.d.ts +15 -0
- package/dist/react/hooks/use-comments.d.ts.map +1 -0
- package/dist/react/hooks/use-comments.js +67 -0
- package/dist/react/hooks/use-comments.js.map +1 -0
- package/dist/react/hooks/use-docs.d.ts +13 -0
- package/dist/react/hooks/use-docs.d.ts.map +1 -0
- package/dist/react/hooks/use-docs.js +69 -0
- package/dist/react/hooks/use-docs.js.map +1 -0
- package/dist/react/hooks/use-drafts.d.ts +25 -0
- package/dist/react/hooks/use-drafts.d.ts.map +1 -0
- package/dist/react/hooks/use-drafts.js +99 -0
- package/dist/react/hooks/use-drafts.js.map +1 -0
- package/dist/react/index.d.ts +19 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +52 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/lib/utils.d.ts +3 -0
- package/dist/react/lib/utils.d.ts.map +1 -0
- package/dist/react/lib/utils.js +9 -0
- package/dist/react/lib/utils.js.map +1 -0
- package/dist/server/auth/index.d.ts +18 -0
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +50 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/magic-link.d.ts +10 -0
- package/dist/server/auth/magic-link.d.ts.map +1 -0
- package/dist/server/auth/magic-link.js +94 -0
- package/dist/server/auth/magic-link.js.map +1 -0
- package/dist/server/auth/oauth.d.ts +6 -0
- package/dist/server/auth/oauth.d.ts.map +1 -0
- package/dist/server/auth/oauth.js +90 -0
- package/dist/server/auth/oauth.js.map +1 -0
- package/dist/server/auth/public.d.ts +7 -0
- package/dist/server/auth/public.d.ts.map +1 -0
- package/dist/server/auth/public.js +43 -0
- package/dist/server/auth/public.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +107 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +20 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +49 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/routes/auth.d.ts +3 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +105 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/docs.d.ts +3 -0
- package/dist/server/routes/docs.d.ts.map +1 -0
- package/dist/server/routes/docs.js +58 -0
- package/dist/server/routes/docs.js.map +1 -0
- package/dist/server/routes/drafts.d.ts +3 -0
- package/dist/server/routes/drafts.d.ts.map +1 -0
- package/dist/server/routes/drafts.js +264 -0
- package/dist/server/routes/drafts.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +13 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/storage/index.d.ts +40 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +199 -0
- package/dist/server/storage/index.js.map +1 -0
- package/package.json +109 -0
- package/templates/.env.example +20 -0
- package/templates/docs.config.js +21 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const github_1 = require("../../core/github");
|
|
9
|
+
const auth_1 = require("../middleware/auth");
|
|
10
|
+
const storage_1 = require("../storage");
|
|
11
|
+
const router = express_1.default.Router();
|
|
12
|
+
/**
|
|
13
|
+
* GET /api/drafts
|
|
14
|
+
* List all drafts (optionally filtered by status)
|
|
15
|
+
*/
|
|
16
|
+
router.get('/', auth_1.requireEdit, async (req, res, next) => {
|
|
17
|
+
try {
|
|
18
|
+
const status = req.query.status;
|
|
19
|
+
const drafts = await (0, storage_1.getDrafts)(status);
|
|
20
|
+
res.json({ drafts });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
next(error);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* POST /api/drafts
|
|
28
|
+
* Create a new draft (creates Git branch)
|
|
29
|
+
*/
|
|
30
|
+
router.post('/', auth_1.requireEdit, async (req, res, next) => {
|
|
31
|
+
try {
|
|
32
|
+
const config = req.config;
|
|
33
|
+
const { docPath, title, content } = req.body;
|
|
34
|
+
if (!docPath || !title) {
|
|
35
|
+
return res.status(400).json({ error: 'docPath and title are required' });
|
|
36
|
+
}
|
|
37
|
+
// Generate branch name
|
|
38
|
+
const branchName = `draft/${(0, node_crypto_1.randomUUID)().slice(0, 8)}-${docPath.replace(/[^a-z0-9]/gi, '-')}`;
|
|
39
|
+
// Create GitHub client
|
|
40
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
41
|
+
// Create branch on GitHub
|
|
42
|
+
await github.createDraftBranch(branchName);
|
|
43
|
+
// If content provided, commit it
|
|
44
|
+
if (content) {
|
|
45
|
+
await github.commitFile(branchName, docPath, content, `Draft: ${title}`);
|
|
46
|
+
}
|
|
47
|
+
// Get user info from session
|
|
48
|
+
const user = req.user;
|
|
49
|
+
// Save draft to storage
|
|
50
|
+
const draft = await (0, storage_1.createDraft)({
|
|
51
|
+
docPath,
|
|
52
|
+
branchName,
|
|
53
|
+
title,
|
|
54
|
+
authorId: user?.id || null,
|
|
55
|
+
authorEmail: user?.email || null,
|
|
56
|
+
status: 'pending',
|
|
57
|
+
});
|
|
58
|
+
res.status(201).json({ draft });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
next(error);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* GET /api/drafts/:id
|
|
66
|
+
* Get draft details including content from Git branch
|
|
67
|
+
*/
|
|
68
|
+
router.get('/:id', auth_1.requireEdit, async (req, res, next) => {
|
|
69
|
+
try {
|
|
70
|
+
const config = req.config;
|
|
71
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
72
|
+
if (!draft) {
|
|
73
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
74
|
+
}
|
|
75
|
+
// Get content from Git branch
|
|
76
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
77
|
+
let content = '';
|
|
78
|
+
try {
|
|
79
|
+
content = await github.getFileContent(draft.docPath, draft.branchName);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// File might not exist yet in draft
|
|
83
|
+
}
|
|
84
|
+
// Get comments
|
|
85
|
+
const comments = await (0, storage_1.getComments)(draft.id);
|
|
86
|
+
res.json({ draft, content, comments });
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
next(error);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* PUT /api/drafts/:id
|
|
94
|
+
* Update draft content (commits to Git branch)
|
|
95
|
+
*/
|
|
96
|
+
router.put('/:id', auth_1.requireEdit, async (req, res, next) => {
|
|
97
|
+
try {
|
|
98
|
+
const config = req.config;
|
|
99
|
+
const { content, message } = req.body;
|
|
100
|
+
if (!content) {
|
|
101
|
+
return res.status(400).json({ error: 'content is required' });
|
|
102
|
+
}
|
|
103
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
104
|
+
if (!draft) {
|
|
105
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
106
|
+
}
|
|
107
|
+
if (draft.status !== 'pending') {
|
|
108
|
+
return res.status(400).json({ error: 'Cannot edit non-pending draft' });
|
|
109
|
+
}
|
|
110
|
+
// Commit to Git branch
|
|
111
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
112
|
+
await github.commitFile(draft.branchName, draft.docPath, content, message || `Update: ${draft.title}`);
|
|
113
|
+
// Update timestamp
|
|
114
|
+
const updatedDraft = await (0, storage_1.updateDraft)(draft.id, {});
|
|
115
|
+
res.json({ draft: updatedDraft });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
next(error);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* DELETE /api/drafts/:id
|
|
123
|
+
* Delete a draft (deletes Git branch)
|
|
124
|
+
*/
|
|
125
|
+
router.delete('/:id', auth_1.requireEdit, async (req, res, next) => {
|
|
126
|
+
try {
|
|
127
|
+
const config = req.config;
|
|
128
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
129
|
+
if (!draft) {
|
|
130
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
131
|
+
}
|
|
132
|
+
// Delete Git branch
|
|
133
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
134
|
+
try {
|
|
135
|
+
await github.deleteBranch(draft.branchName);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Branch might already be deleted
|
|
139
|
+
}
|
|
140
|
+
// Delete from storage
|
|
141
|
+
await (0, storage_1.deleteDraft)(draft.id);
|
|
142
|
+
res.json({ success: true });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
next(error);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
/**
|
|
149
|
+
* POST /api/drafts/:id/approve
|
|
150
|
+
* Approve draft (creates PR, merges, deletes branch)
|
|
151
|
+
*/
|
|
152
|
+
router.post('/:id/approve', auth_1.requireAdmin, async (req, res, next) => {
|
|
153
|
+
try {
|
|
154
|
+
const config = req.config;
|
|
155
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
156
|
+
if (!draft) {
|
|
157
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
158
|
+
}
|
|
159
|
+
if (draft.status !== 'pending') {
|
|
160
|
+
return res.status(400).json({ error: 'Draft is not pending' });
|
|
161
|
+
}
|
|
162
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
163
|
+
// Create and merge PR
|
|
164
|
+
const prNumber = await github.createPullRequest(draft.branchName, `Docs: ${draft.title}`, `Approved documentation update for \`${draft.docPath}\``);
|
|
165
|
+
await github.mergePullRequest(prNumber);
|
|
166
|
+
// Delete branch
|
|
167
|
+
await github.deleteBranch(draft.branchName);
|
|
168
|
+
// Update status
|
|
169
|
+
const updatedDraft = await (0, storage_1.updateDraft)(draft.id, { status: 'approved' });
|
|
170
|
+
res.json({ draft: updatedDraft, prNumber });
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
next(error);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
/**
|
|
177
|
+
* POST /api/drafts/:id/reject
|
|
178
|
+
* Reject draft (deletes branch)
|
|
179
|
+
*/
|
|
180
|
+
router.post('/:id/reject', auth_1.requireAdmin, async (req, res, next) => {
|
|
181
|
+
try {
|
|
182
|
+
const config = req.config;
|
|
183
|
+
const { reason } = req.body;
|
|
184
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
185
|
+
if (!draft) {
|
|
186
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
187
|
+
}
|
|
188
|
+
if (draft.status !== 'pending') {
|
|
189
|
+
return res.status(400).json({ error: 'Draft is not pending' });
|
|
190
|
+
}
|
|
191
|
+
// Delete Git branch
|
|
192
|
+
const github = new github_1.GitHubClient(process.env.GITHUB_TOKEN || '', config.github);
|
|
193
|
+
try {
|
|
194
|
+
await github.deleteBranch(draft.branchName);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Branch might already be deleted
|
|
198
|
+
}
|
|
199
|
+
// Add rejection comment if reason provided
|
|
200
|
+
if (reason) {
|
|
201
|
+
const user = req.user;
|
|
202
|
+
await (0, storage_1.addComment)({
|
|
203
|
+
draftId: draft.id,
|
|
204
|
+
userId: user?.id || null,
|
|
205
|
+
userEmail: user?.email || null,
|
|
206
|
+
userName: user?.name || 'Admin',
|
|
207
|
+
content: `Rejected: ${reason}`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Update status
|
|
211
|
+
const updatedDraft = await (0, storage_1.updateDraft)(draft.id, { status: 'rejected' });
|
|
212
|
+
res.json({ draft: updatedDraft });
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
next(error);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
/**
|
|
219
|
+
* GET /api/drafts/:id/comments
|
|
220
|
+
* Get comments for a draft
|
|
221
|
+
*/
|
|
222
|
+
router.get('/:id/comments', auth_1.requireEdit, async (req, res, next) => {
|
|
223
|
+
try {
|
|
224
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
225
|
+
if (!draft) {
|
|
226
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
227
|
+
}
|
|
228
|
+
const comments = await (0, storage_1.getComments)(draft.id);
|
|
229
|
+
res.json({ comments });
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
next(error);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
/**
|
|
236
|
+
* POST /api/drafts/:id/comments
|
|
237
|
+
* Add a comment to a draft
|
|
238
|
+
*/
|
|
239
|
+
router.post('/:id/comments', auth_1.requireEdit, async (req, res, next) => {
|
|
240
|
+
try {
|
|
241
|
+
const { content } = req.body;
|
|
242
|
+
if (!content) {
|
|
243
|
+
return res.status(400).json({ error: 'content is required' });
|
|
244
|
+
}
|
|
245
|
+
const draft = await (0, storage_1.getDraft)(req.params.id);
|
|
246
|
+
if (!draft) {
|
|
247
|
+
return res.status(404).json({ error: 'Draft not found' });
|
|
248
|
+
}
|
|
249
|
+
const user = req.user;
|
|
250
|
+
const comment = await (0, storage_1.addComment)({
|
|
251
|
+
draftId: draft.id,
|
|
252
|
+
userId: user?.id || null,
|
|
253
|
+
userEmail: user?.email || null,
|
|
254
|
+
userName: user?.name || 'Anonymous',
|
|
255
|
+
content,
|
|
256
|
+
});
|
|
257
|
+
res.status(201).json({ comment });
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
next(error);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
exports.default = router;
|
|
264
|
+
//# sourceMappingURL=drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../src/server/routes/drafts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.docsRoutes = exports.draftsRoutes = exports.authRoutes = void 0;
|
|
7
|
+
var auth_1 = require("./auth");
|
|
8
|
+
Object.defineProperty(exports, "authRoutes", { enumerable: true, get: function () { return __importDefault(auth_1).default; } });
|
|
9
|
+
var drafts_1 = require("./drafts");
|
|
10
|
+
Object.defineProperty(exports, "draftsRoutes", { enumerable: true, get: function () { return __importDefault(drafts_1).default; } });
|
|
11
|
+
var docs_1 = require("./docs");
|
|
12
|
+
Object.defineProperty(exports, "docsRoutes", { enumerable: true, get: function () { return __importDefault(docs_1).default; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":";;;;;;AAAA,+BAA+C;AAAtC,mHAAA,OAAO,OAAc;AAC9B,mCAAmD;AAA1C,uHAAA,OAAO,OAAgB;AAChC,+BAA+C;AAAtC,mHAAA,OAAO,OAAc"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface Draft {
|
|
2
|
+
id: string;
|
|
3
|
+
docPath: string;
|
|
4
|
+
branchName: string;
|
|
5
|
+
title: string;
|
|
6
|
+
authorId: string | null;
|
|
7
|
+
authorEmail: string | null;
|
|
8
|
+
status: 'pending' | 'approved' | 'rejected';
|
|
9
|
+
createdAt: number;
|
|
10
|
+
updatedAt: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DraftComment {
|
|
13
|
+
id: string;
|
|
14
|
+
draftId: string;
|
|
15
|
+
userId: string | null;
|
|
16
|
+
userEmail: string | null;
|
|
17
|
+
userName: string | null;
|
|
18
|
+
content: string;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function generateId(): string;
|
|
22
|
+
export declare function now(): number;
|
|
23
|
+
export declare function getDrafts(status?: string): Promise<Draft[]>;
|
|
24
|
+
export declare function getDraft(id: string): Promise<Draft | null>;
|
|
25
|
+
export declare function createDraft(draft: Omit<Draft, 'id' | 'createdAt' | 'updatedAt'>): Promise<Draft>;
|
|
26
|
+
export declare function updateDraft(id: string, updates: Partial<Draft>): Promise<Draft | null>;
|
|
27
|
+
export declare function deleteDraft(id: string): Promise<boolean>;
|
|
28
|
+
export declare function getComments(draftId: string): Promise<DraftComment[]>;
|
|
29
|
+
export declare function addComment(comment: Omit<DraftComment, 'id' | 'createdAt'>): Promise<DraftComment>;
|
|
30
|
+
export declare function createSession(userId: string, email: string, name?: string): Promise<string>;
|
|
31
|
+
export declare function getSession(token: string): Promise<{
|
|
32
|
+
userId: string;
|
|
33
|
+
email: string;
|
|
34
|
+
name?: string;
|
|
35
|
+
} | null>;
|
|
36
|
+
export declare function deleteSession(token: string): Promise<void>;
|
|
37
|
+
export declare function createMagicLink(email: string): Promise<string>;
|
|
38
|
+
export declare function verifyMagicLink(token: string): Promise<string | null>;
|
|
39
|
+
export declare function cleanupExpired(): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwDD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAGD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAMjE;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAGhE;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACnD,OAAO,CAAC,KAAK,CAAC,CAWhB;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAY5F;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU9D;AAGD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAG1E;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,YAAY,CAAC,CAUvB;AAGD,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjG;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAOlE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;AAGD,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa3E;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBpD"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateId = generateId;
|
|
7
|
+
exports.now = now;
|
|
8
|
+
exports.getDrafts = getDrafts;
|
|
9
|
+
exports.getDraft = getDraft;
|
|
10
|
+
exports.createDraft = createDraft;
|
|
11
|
+
exports.updateDraft = updateDraft;
|
|
12
|
+
exports.deleteDraft = deleteDraft;
|
|
13
|
+
exports.getComments = getComments;
|
|
14
|
+
exports.addComment = addComment;
|
|
15
|
+
exports.createSession = createSession;
|
|
16
|
+
exports.getSession = getSession;
|
|
17
|
+
exports.deleteSession = deleteSession;
|
|
18
|
+
exports.createMagicLink = createMagicLink;
|
|
19
|
+
exports.verifyMagicLink = verifyMagicLink;
|
|
20
|
+
exports.cleanupExpired = cleanupExpired;
|
|
21
|
+
const node_crypto_1 = require("node:crypto");
|
|
22
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
23
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
24
|
+
const DATA_DIR = '.docpush';
|
|
25
|
+
const DRAFTS_FILE = 'drafts.json';
|
|
26
|
+
const SESSIONS_FILE = 'sessions.json';
|
|
27
|
+
// Ensure data directory exists
|
|
28
|
+
async function ensureDataDir() {
|
|
29
|
+
const dataDir = node_path_1.default.join(process.cwd(), DATA_DIR);
|
|
30
|
+
await fs_extra_1.default.ensureDir(dataDir);
|
|
31
|
+
return dataDir;
|
|
32
|
+
}
|
|
33
|
+
// Drafts storage
|
|
34
|
+
async function loadDraftsData() {
|
|
35
|
+
const dataDir = await ensureDataDir();
|
|
36
|
+
const filePath = node_path_1.default.join(dataDir, DRAFTS_FILE);
|
|
37
|
+
if (await fs_extra_1.default.pathExists(filePath)) {
|
|
38
|
+
return fs_extra_1.default.readJson(filePath);
|
|
39
|
+
}
|
|
40
|
+
return { drafts: [], comments: [] };
|
|
41
|
+
}
|
|
42
|
+
async function saveDraftsData(data) {
|
|
43
|
+
const dataDir = await ensureDataDir();
|
|
44
|
+
const filePath = node_path_1.default.join(dataDir, DRAFTS_FILE);
|
|
45
|
+
await fs_extra_1.default.writeJson(filePath, data, { spaces: 2 });
|
|
46
|
+
}
|
|
47
|
+
// Sessions storage
|
|
48
|
+
async function loadSessionsData() {
|
|
49
|
+
const dataDir = await ensureDataDir();
|
|
50
|
+
const filePath = node_path_1.default.join(dataDir, SESSIONS_FILE);
|
|
51
|
+
if (await fs_extra_1.default.pathExists(filePath)) {
|
|
52
|
+
return fs_extra_1.default.readJson(filePath);
|
|
53
|
+
}
|
|
54
|
+
return { sessions: {}, magicLinks: {} };
|
|
55
|
+
}
|
|
56
|
+
async function saveSessionsData(data) {
|
|
57
|
+
const dataDir = await ensureDataDir();
|
|
58
|
+
const filePath = node_path_1.default.join(dataDir, SESSIONS_FILE);
|
|
59
|
+
await fs_extra_1.default.writeJson(filePath, data, { spaces: 2 });
|
|
60
|
+
}
|
|
61
|
+
// Helper functions
|
|
62
|
+
function generateId() {
|
|
63
|
+
return (0, node_crypto_1.randomUUID)();
|
|
64
|
+
}
|
|
65
|
+
function now() {
|
|
66
|
+
return Math.floor(Date.now() / 1000);
|
|
67
|
+
}
|
|
68
|
+
// Draft operations
|
|
69
|
+
async function getDrafts(status) {
|
|
70
|
+
const data = await loadDraftsData();
|
|
71
|
+
if (status) {
|
|
72
|
+
return data.drafts.filter((d) => d.status === status);
|
|
73
|
+
}
|
|
74
|
+
return data.drafts;
|
|
75
|
+
}
|
|
76
|
+
async function getDraft(id) {
|
|
77
|
+
const data = await loadDraftsData();
|
|
78
|
+
return data.drafts.find((d) => d.id === id) || null;
|
|
79
|
+
}
|
|
80
|
+
async function createDraft(draft) {
|
|
81
|
+
const data = await loadDraftsData();
|
|
82
|
+
const newDraft = {
|
|
83
|
+
...draft,
|
|
84
|
+
id: generateId(),
|
|
85
|
+
createdAt: now(),
|
|
86
|
+
updatedAt: now(),
|
|
87
|
+
};
|
|
88
|
+
data.drafts.push(newDraft);
|
|
89
|
+
await saveDraftsData(data);
|
|
90
|
+
return newDraft;
|
|
91
|
+
}
|
|
92
|
+
async function updateDraft(id, updates) {
|
|
93
|
+
const data = await loadDraftsData();
|
|
94
|
+
const index = data.drafts.findIndex((d) => d.id === id);
|
|
95
|
+
if (index === -1)
|
|
96
|
+
return null;
|
|
97
|
+
data.drafts[index] = {
|
|
98
|
+
...data.drafts[index],
|
|
99
|
+
...updates,
|
|
100
|
+
updatedAt: now(),
|
|
101
|
+
};
|
|
102
|
+
await saveDraftsData(data);
|
|
103
|
+
return data.drafts[index];
|
|
104
|
+
}
|
|
105
|
+
async function deleteDraft(id) {
|
|
106
|
+
const data = await loadDraftsData();
|
|
107
|
+
const index = data.drafts.findIndex((d) => d.id === id);
|
|
108
|
+
if (index === -1)
|
|
109
|
+
return false;
|
|
110
|
+
data.drafts.splice(index, 1);
|
|
111
|
+
// Also delete comments for this draft
|
|
112
|
+
data.comments = data.comments.filter((c) => c.draftId !== id);
|
|
113
|
+
await saveDraftsData(data);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// Comment operations
|
|
117
|
+
async function getComments(draftId) {
|
|
118
|
+
const data = await loadDraftsData();
|
|
119
|
+
return data.comments.filter((c) => c.draftId === draftId);
|
|
120
|
+
}
|
|
121
|
+
async function addComment(comment) {
|
|
122
|
+
const data = await loadDraftsData();
|
|
123
|
+
const newComment = {
|
|
124
|
+
...comment,
|
|
125
|
+
id: generateId(),
|
|
126
|
+
createdAt: now(),
|
|
127
|
+
};
|
|
128
|
+
data.comments.push(newComment);
|
|
129
|
+
await saveDraftsData(data);
|
|
130
|
+
return newComment;
|
|
131
|
+
}
|
|
132
|
+
// Session operations
|
|
133
|
+
async function createSession(userId, email, name) {
|
|
134
|
+
const data = await loadSessionsData();
|
|
135
|
+
const token = generateId();
|
|
136
|
+
data.sessions[token] = {
|
|
137
|
+
userId,
|
|
138
|
+
email,
|
|
139
|
+
name,
|
|
140
|
+
expiresAt: now() + 86400, // 24 hours
|
|
141
|
+
};
|
|
142
|
+
await saveSessionsData(data);
|
|
143
|
+
return token;
|
|
144
|
+
}
|
|
145
|
+
async function getSession(token) {
|
|
146
|
+
const data = await loadSessionsData();
|
|
147
|
+
const session = data.sessions[token];
|
|
148
|
+
if (!session || session.expiresAt < now()) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return { userId: session.userId, email: session.email, name: session.name };
|
|
152
|
+
}
|
|
153
|
+
async function deleteSession(token) {
|
|
154
|
+
const data = await loadSessionsData();
|
|
155
|
+
delete data.sessions[token];
|
|
156
|
+
await saveSessionsData(data);
|
|
157
|
+
}
|
|
158
|
+
// Magic link operations
|
|
159
|
+
async function createMagicLink(email) {
|
|
160
|
+
const data = await loadSessionsData();
|
|
161
|
+
const token = generateId();
|
|
162
|
+
data.magicLinks[token] = {
|
|
163
|
+
email,
|
|
164
|
+
expiresAt: now() + 900, // 15 minutes
|
|
165
|
+
used: false,
|
|
166
|
+
};
|
|
167
|
+
await saveSessionsData(data);
|
|
168
|
+
return token;
|
|
169
|
+
}
|
|
170
|
+
async function verifyMagicLink(token) {
|
|
171
|
+
const data = await loadSessionsData();
|
|
172
|
+
const link = data.magicLinks[token];
|
|
173
|
+
if (!link || link.used || link.expiresAt < now()) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
// Mark as used
|
|
177
|
+
data.magicLinks[token].used = true;
|
|
178
|
+
await saveSessionsData(data);
|
|
179
|
+
return link.email;
|
|
180
|
+
}
|
|
181
|
+
// Cleanup expired data
|
|
182
|
+
async function cleanupExpired() {
|
|
183
|
+
const sessionsData = await loadSessionsData();
|
|
184
|
+
const currentTime = now();
|
|
185
|
+
// Clean expired sessions
|
|
186
|
+
for (const token of Object.keys(sessionsData.sessions)) {
|
|
187
|
+
if (sessionsData.sessions[token].expiresAt < currentTime) {
|
|
188
|
+
delete sessionsData.sessions[token];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Clean expired magic links
|
|
192
|
+
for (const token of Object.keys(sessionsData.magicLinks)) {
|
|
193
|
+
if (sessionsData.magicLinks[token].expiresAt < currentTime) {
|
|
194
|
+
delete sessionsData.magicLinks[token];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
await saveSessionsData(sessionsData);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":";;;;;AAqFA,gCAEC;AAED,kBAEC;AAGD,8BAMC;AAED,4BAGC;AAED,kCAaC;AAED,kCAYC;AAED,kCAUC;AAGD,kCAGC;AAED,gCAYC;AAGD,sCAWC;AAED,gCASC;AAED,sCAIC;AAGD,0CAUC;AAED,0CAaC;AAGD,wCAmBC;AAvPD,6CAAyC;AACzC,0DAA6B;AAC7B,wDAA0B;AAE1B,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,aAAa,GAAG,eAAe,CAAC;AAmCtC,+BAA+B;AAC/B,KAAK,UAAU,aAAa;IAC1B,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iBAAiB;AACjB,KAAK,UAAU,cAAc;IAC3B,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAgB;IAC5C,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,mBAAmB;AACnB,KAAK,UAAU,gBAAgB;IAC7B,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEnD,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAkB;IAChD,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,mBAAmB;AACnB,SAAgB,UAAU;IACxB,OAAO,IAAA,wBAAU,GAAE,CAAC;AACtB,CAAC;AAED,SAAgB,GAAG;IACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,mBAAmB;AACZ,KAAK,UAAU,SAAS,CAAC,MAAe;IAC7C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,KAAoD;IAEpD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAU;QACtB,GAAG,KAAK;QACR,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,GAAG,EAAE;QAChB,SAAS,EAAE,GAAG,EAAE;KACjB,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU,EAAE,OAAuB;IACnE,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;QACnB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACrB,GAAG,OAAO;QACV,SAAS,EAAE,GAAG,EAAE;KACjB,CAAC;IACF,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7B,sCAAsC;IACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qBAAqB;AACd,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AAC5D,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,OAA+C;IAE/C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,UAAU,GAAiB;QAC/B,GAAG,OAAO;QACV,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,GAAG,EAAE;KACjB,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,qBAAqB;AACd,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,KAAa,EAAE,IAAa;IAC9E,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;QACrB,MAAM;QACN,KAAK;QACL,IAAI;QACJ,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,WAAW;KACtC,CAAC;IACF,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,KAAa;IAEb,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,wBAAwB;AACjB,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG;QACvB,KAAK;QACL,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa;QACrC,IAAI,EAAE,KAAK;KACZ,CAAC;IACF,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe;IACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACnC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,uBAAuB;AAChB,KAAK,UAAU,cAAc;IAClC,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;IAE1B,yBAAyB;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;YACzD,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;YAC3D,OAAO,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACvC,CAAC"}
|