@reverso/api 0.1.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.
Files changed (74) hide show
  1. package/README.md +47 -0
  2. package/dist/index.d.ts +41 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +56 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/plugins/auth.d.ts +72 -0
  7. package/dist/plugins/auth.d.ts.map +1 -0
  8. package/dist/plugins/auth.js +173 -0
  9. package/dist/plugins/auth.js.map +1 -0
  10. package/dist/plugins/database.d.ts +19 -0
  11. package/dist/plugins/database.d.ts.map +1 -0
  12. package/dist/plugins/database.js +23 -0
  13. package/dist/plugins/database.js.map +1 -0
  14. package/dist/plugins/index.d.ts +5 -0
  15. package/dist/plugins/index.d.ts.map +1 -0
  16. package/dist/plugins/index.js +5 -0
  17. package/dist/plugins/index.js.map +1 -0
  18. package/dist/routes/auth.d.ts +6 -0
  19. package/dist/routes/auth.d.ts.map +1 -0
  20. package/dist/routes/auth.js +258 -0
  21. package/dist/routes/auth.js.map +1 -0
  22. package/dist/routes/content.d.ts +8 -0
  23. package/dist/routes/content.d.ts.map +1 -0
  24. package/dist/routes/content.js +339 -0
  25. package/dist/routes/content.js.map +1 -0
  26. package/dist/routes/forms.d.ts +8 -0
  27. package/dist/routes/forms.d.ts.map +1 -0
  28. package/dist/routes/forms.js +953 -0
  29. package/dist/routes/forms.js.map +1 -0
  30. package/dist/routes/index.d.ts +19 -0
  31. package/dist/routes/index.d.ts.map +1 -0
  32. package/dist/routes/index.js +31 -0
  33. package/dist/routes/index.js.map +1 -0
  34. package/dist/routes/media.d.ts +8 -0
  35. package/dist/routes/media.d.ts.map +1 -0
  36. package/dist/routes/media.js +400 -0
  37. package/dist/routes/media.js.map +1 -0
  38. package/dist/routes/pages.d.ts +8 -0
  39. package/dist/routes/pages.d.ts.map +1 -0
  40. package/dist/routes/pages.js +220 -0
  41. package/dist/routes/pages.js.map +1 -0
  42. package/dist/routes/redirects.d.ts +8 -0
  43. package/dist/routes/redirects.d.ts.map +1 -0
  44. package/dist/routes/redirects.js +462 -0
  45. package/dist/routes/redirects.js.map +1 -0
  46. package/dist/routes/schema.d.ts +8 -0
  47. package/dist/routes/schema.d.ts.map +1 -0
  48. package/dist/routes/schema.js +151 -0
  49. package/dist/routes/schema.js.map +1 -0
  50. package/dist/routes/sitemap.d.ts +8 -0
  51. package/dist/routes/sitemap.d.ts.map +1 -0
  52. package/dist/routes/sitemap.js +144 -0
  53. package/dist/routes/sitemap.js.map +1 -0
  54. package/dist/server.d.ts +47 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +218 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/types.d.ts +91 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils/index.d.ts +5 -0
  63. package/dist/utils/index.d.ts.map +1 -0
  64. package/dist/utils/index.js +5 -0
  65. package/dist/utils/index.js.map +1 -0
  66. package/dist/utils/security.d.ts +32 -0
  67. package/dist/utils/security.d.ts.map +1 -0
  68. package/dist/utils/security.js +154 -0
  69. package/dist/utils/security.js.map +1 -0
  70. package/dist/validation.d.ts +402 -0
  71. package/dist/validation.d.ts.map +1 -0
  72. package/dist/validation.js +308 -0
  73. package/dist/validation.js.map +1 -0
  74. package/package.json +76 -0
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Input validation schemas using Zod.
3
+ */
4
+ import { z } from 'zod';
5
+ /**
6
+ * Allowed MIME types for file uploads.
7
+ */
8
+ export const ALLOWED_MIME_TYPES = new Set([
9
+ // Images
10
+ 'image/jpeg',
11
+ 'image/png',
12
+ 'image/gif',
13
+ 'image/webp',
14
+ 'image/svg+xml',
15
+ 'image/avif',
16
+ // Documents
17
+ 'application/pdf',
18
+ 'application/msword',
19
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
20
+ 'application/vnd.ms-excel',
21
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
22
+ // Videos
23
+ 'video/mp4',
24
+ 'video/webm',
25
+ 'video/ogg',
26
+ // Audio
27
+ 'audio/mpeg',
28
+ 'audio/wav',
29
+ 'audio/ogg',
30
+ 'audio/webm',
31
+ ]);
32
+ /**
33
+ * Max file size (50MB).
34
+ */
35
+ export const MAX_FILE_SIZE = 50 * 1024 * 1024;
36
+ /**
37
+ * Slug validation regex.
38
+ * Allows lowercase letters, numbers, and hyphens.
39
+ */
40
+ export const SLUG_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
41
+ /**
42
+ * Path validation regex.
43
+ * Allows alphanumeric, dots, underscores, and $ for repeaters.
44
+ */
45
+ export const PATH_REGEX = /^[a-zA-Z0-9_$.]+(?:\.[a-zA-Z0-9_$.]+)*$/;
46
+ /**
47
+ * Locale validation regex.
48
+ * Allows standard locale codes like "en", "en-US", "pt-BR".
49
+ */
50
+ export const LOCALE_REGEX = /^[a-z]{2}(?:-[A-Z]{2})?$|^default$/;
51
+ /**
52
+ * Sanitize filename to prevent path traversal attacks.
53
+ */
54
+ export function sanitizeFilename(filename) {
55
+ // Remove path separators and null bytes
56
+ let sanitized = filename.replace(/[/\\]/g, '').replace(/\0/g, '').replace(/\.\./g, '');
57
+ // Remove leading dots (hidden files)
58
+ sanitized = sanitized.replace(/^\.+/, '');
59
+ // Limit length
60
+ if (sanitized.length > 255) {
61
+ const ext = sanitized.slice(sanitized.lastIndexOf('.'));
62
+ const name = sanitized.slice(0, sanitized.lastIndexOf('.'));
63
+ sanitized = name.slice(0, 255 - ext.length) + ext;
64
+ }
65
+ return sanitized || 'unnamed';
66
+ }
67
+ /**
68
+ * Check if MIME type is allowed.
69
+ */
70
+ export function isAllowedMimeType(mimeType) {
71
+ return ALLOWED_MIME_TYPES.has(mimeType);
72
+ }
73
+ /**
74
+ * Content update body schema.
75
+ */
76
+ export const contentUpdateSchema = z.object({
77
+ value: z.unknown(),
78
+ locale: z.string().regex(LOCALE_REGEX, 'Invalid locale format').optional().default('default'),
79
+ publish: z.boolean().optional(),
80
+ });
81
+ /**
82
+ * Bulk content update schema.
83
+ */
84
+ export const bulkContentUpdateSchema = z.object({
85
+ updates: z
86
+ .array(z.object({
87
+ path: z.string().regex(PATH_REGEX, 'Invalid path format').min(1),
88
+ value: z.unknown(),
89
+ locale: z.string().regex(LOCALE_REGEX).optional(),
90
+ }))
91
+ .min(1, 'At least one update required'),
92
+ });
93
+ /**
94
+ * Schema sync body schema.
95
+ */
96
+ export const schemaSyncSchema = z.object({
97
+ schema: z.object({
98
+ version: z.string(),
99
+ generatedAt: z.string(),
100
+ pages: z.array(z.object({
101
+ slug: z.string().min(1),
102
+ name: z.string().min(1),
103
+ sections: z.array(z.any()),
104
+ fieldCount: z.number().int().min(0),
105
+ sourceFiles: z.array(z.string()),
106
+ })),
107
+ pageCount: z.number().int().min(0),
108
+ totalFields: z.number().int().min(0),
109
+ meta: z.object({
110
+ srcDir: z.string(),
111
+ filesScanned: z.number().int().min(0),
112
+ filesWithMarkers: z.number().int().min(0),
113
+ scanDuration: z.number().min(0),
114
+ }),
115
+ }),
116
+ deleteRemoved: z.boolean().optional().default(true),
117
+ });
118
+ /**
119
+ * Media metadata update schema.
120
+ */
121
+ export const mediaUpdateSchema = z.object({
122
+ alt: z.string().max(500).optional(),
123
+ caption: z.string().max(2000).optional(),
124
+ });
125
+ /**
126
+ * Pagination query schema.
127
+ */
128
+ export const paginationSchema = z.object({
129
+ limit: z
130
+ .string()
131
+ .transform((val) => Number.parseInt(val, 10))
132
+ .pipe(z.number().int().min(1).max(100))
133
+ .optional(),
134
+ offset: z
135
+ .string()
136
+ .transform((val) => Number.parseInt(val, 10))
137
+ .pipe(z.number().int().min(0))
138
+ .optional(),
139
+ });
140
+ /**
141
+ * Media list query schema.
142
+ */
143
+ export const mediaListQuerySchema = paginationSchema.extend({
144
+ type: z.string().optional(),
145
+ });
146
+ /**
147
+ * Path param schema.
148
+ */
149
+ export const pathParamSchema = z.object({
150
+ path: z.string().regex(PATH_REGEX, 'Invalid path format').min(1),
151
+ });
152
+ /**
153
+ * Slug param schema.
154
+ */
155
+ export const slugParamSchema = z.object({
156
+ slug: z.string().regex(SLUG_REGEX, 'Invalid slug format').min(1),
157
+ });
158
+ /**
159
+ * ID param schema.
160
+ */
161
+ export const idParamSchema = z.object({
162
+ id: z.string().min(1),
163
+ });
164
+ /**
165
+ * Locale query schema.
166
+ */
167
+ export const localeQuerySchema = z.object({
168
+ locale: z.string().regex(LOCALE_REGEX).optional().default('default'),
169
+ });
170
+ // ============================================
171
+ // FORMS VALIDATION
172
+ // ============================================
173
+ /**
174
+ * Form status enum.
175
+ */
176
+ export const formStatusSchema = z.enum(['draft', 'published', 'archived']);
177
+ /**
178
+ * Form step schema.
179
+ */
180
+ export const formStepSchema = z.object({
181
+ id: z.string().min(1),
182
+ name: z.string().min(1),
183
+ description: z.string().optional(),
184
+ });
185
+ /**
186
+ * Form settings schema.
187
+ */
188
+ export const formSettingsSchema = z.object({
189
+ submitButtonText: z.string().max(100).optional(),
190
+ successMessage: z.string().max(1000).optional(),
191
+ redirectUrl: z.string().url().optional(),
192
+ });
193
+ /**
194
+ * Form create schema.
195
+ */
196
+ export const formCreateSchema = z.object({
197
+ name: z.string().min(1).max(200),
198
+ slug: z.string().regex(SLUG_REGEX, 'Invalid slug format').min(1).max(100),
199
+ description: z.string().max(1000).optional(),
200
+ status: formStatusSchema.optional(),
201
+ isMultiStep: z.boolean().optional(),
202
+ steps: z.array(formStepSchema).optional(),
203
+ settings: formSettingsSchema.optional(),
204
+ notifyEmails: z.array(z.string().email()).optional(),
205
+ notifyOnSubmission: z.boolean().optional(),
206
+ webhookUrl: z.string().url().optional(),
207
+ webhookSecret: z.string().max(500).optional(),
208
+ webhookEnabled: z.boolean().optional(),
209
+ honeypotEnabled: z.boolean().optional(),
210
+ rateLimitPerMinute: z.number().int().min(1).max(1000).optional(),
211
+ });
212
+ /**
213
+ * Form update schema.
214
+ */
215
+ export const formUpdateSchema = formCreateSchema.partial();
216
+ /**
217
+ * Form field type enum.
218
+ */
219
+ export const formFieldTypeSchema = z.enum([
220
+ 'text',
221
+ 'email',
222
+ 'textarea',
223
+ 'number',
224
+ 'select',
225
+ 'checkbox',
226
+ 'radio',
227
+ 'date',
228
+ 'file',
229
+ 'hidden',
230
+ ]);
231
+ /**
232
+ * Field condition schema.
233
+ */
234
+ export const fieldConditionSchema = z.object({
235
+ field: z.string().min(1),
236
+ operator: z.enum(['equals', 'notEquals', 'contains', 'notContains', 'isEmpty', 'isNotEmpty']),
237
+ value: z.union([z.string(), z.number(), z.boolean()]).optional(),
238
+ });
239
+ /**
240
+ * Field config schema.
241
+ */
242
+ export const fieldConfigSchema = z.object({
243
+ options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),
244
+ accept: z.string().optional(),
245
+ min: z.number().optional(),
246
+ max: z.number().optional(),
247
+ minLength: z.number().int().min(0).optional(),
248
+ maxLength: z.number().int().min(0).optional(),
249
+ pattern: z.string().optional(),
250
+ rows: z.number().int().min(1).optional(),
251
+ multiple: z.boolean().optional(),
252
+ });
253
+ /**
254
+ * Form field create schema.
255
+ */
256
+ export const formFieldCreateSchema = z.object({
257
+ name: z.string().min(1).max(100),
258
+ type: formFieldTypeSchema,
259
+ label: z.string().max(200).optional(),
260
+ placeholder: z.string().max(500).optional(),
261
+ help: z.string().max(500).optional(),
262
+ required: z.boolean().optional(),
263
+ validation: z.string().max(2000).optional(),
264
+ config: fieldConfigSchema.optional(),
265
+ width: z.number().int().min(1).max(12).optional(),
266
+ step: z.number().int().min(1).optional(),
267
+ sortOrder: z.number().int().min(0).optional(),
268
+ condition: fieldConditionSchema.optional(),
269
+ });
270
+ /**
271
+ * Form field update schema.
272
+ */
273
+ export const formFieldUpdateSchema = formFieldCreateSchema.partial();
274
+ /**
275
+ * Form submission create schema (public).
276
+ */
277
+ export const formSubmissionCreateSchema = z.object({
278
+ data: z.record(z.string(), z.unknown()),
279
+ honeypot: z.string().optional(),
280
+ });
281
+ // ============================================
282
+ // REDIRECTS VALIDATION
283
+ // ============================================
284
+ /**
285
+ * Redirect status code enum.
286
+ */
287
+ export const redirectStatusCodeSchema = z.union([
288
+ z.literal(301),
289
+ z.literal(302),
290
+ z.literal(307),
291
+ z.literal(308),
292
+ ]);
293
+ /**
294
+ * Redirect create schema.
295
+ */
296
+ export const redirectCreateSchema = z.object({
297
+ fromPath: z.string().min(1).max(2000).refine((val) => val.startsWith('/'), {
298
+ message: 'fromPath must start with /',
299
+ }),
300
+ toPath: z.string().min(1).max(2000),
301
+ statusCode: redirectStatusCodeSchema.optional(),
302
+ isEnabled: z.boolean().optional(),
303
+ });
304
+ /**
305
+ * Redirect update schema.
306
+ */
307
+ export const redirectUpdateSchema = redirectCreateSchema.partial();
308
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@reverso/api",
3
+ "version": "0.1.0",
4
+ "description": "REST and GraphQL API server for Reverso CMS using Fastify",
5
+ "homepage": "https://reverso.dev/docs/packages/api",
6
+ "bugs": {
7
+ "url": "https://github.com/hogrid/reverso/issues"
8
+ },
9
+ "engines": {
10
+ "node": ">=20.0.0"
11
+ },
12
+ "type": "module",
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.build.json",
27
+ "dev": "tsc -p tsconfig.build.json --watch",
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "biome check src/",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "clean": "rm -rf dist .turbo"
33
+ },
34
+ "dependencies": {
35
+ "@fastify/cookie": "^11.0.2",
36
+ "@fastify/cors": "^11.2.0",
37
+ "@fastify/csrf-protection": "^7.1.0",
38
+ "@fastify/helmet": "^13.0.2",
39
+ "@fastify/multipart": "^9.0.3",
40
+ "@fastify/rate-limit": "^10.2.1",
41
+ "@fastify/static": "^9.0.0",
42
+ "@reverso/core": "workspace:*",
43
+ "@reverso/db": "workspace:*",
44
+ "bcrypt": "^6.0.0",
45
+ "better-auth": "^1.1.14",
46
+ "fastify": "^5.7.2",
47
+ "fastify-plugin": "^5.0.1",
48
+ "mercurius": "^16.0.1",
49
+ "pino-pretty": "^13.0.0",
50
+ "zod": "^4.3.6"
51
+ },
52
+ "devDependencies": {
53
+ "@types/bcrypt": "^6.0.0",
54
+ "@types/node": "^22.10.7",
55
+ "typescript": "^5.7.3",
56
+ "vitest": "^2.1.8"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public"
60
+ },
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/hogrid/reverso.git",
64
+ "directory": "packages/api"
65
+ },
66
+ "keywords": [
67
+ "reverso",
68
+ "cms",
69
+ "api",
70
+ "rest",
71
+ "graphql",
72
+ "fastify"
73
+ ],
74
+ "author": "Emerson Nunes <emerson@hogrid.com>",
75
+ "license": "MIT"
76
+ }