opacacms 0.1.7 → 0.1.8

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 (46) hide show
  1. package/dist/admin/index.js +255 -20
  2. package/dist/admin/webcomponent.js +291 -46
  3. package/dist/cli/index.js +3638 -30
  4. package/dist/client.js +126 -5
  5. package/dist/db/bun-sqlite.js +790 -21
  6. package/dist/db/d1.js +788 -19
  7. package/dist/db/index.js +53 -4
  8. package/dist/db/postgres.js +792 -23
  9. package/dist/db/sqlite.js +788 -19
  10. package/dist/index.js +456 -8
  11. package/dist/runtimes/bun.js +1909 -8
  12. package/dist/runtimes/cloudflare-workers.js +1910 -9
  13. package/dist/runtimes/next.js +1908 -7
  14. package/dist/runtimes/node.js +1909 -8
  15. package/dist/schema/collection.d.ts +3 -7
  16. package/dist/schema/fields/index.d.ts +24 -25
  17. package/dist/schema/global.d.ts +9 -9
  18. package/dist/schema/index.d.ts +30 -4
  19. package/dist/schema/index.js +546 -1
  20. package/dist/server.js +2246 -17
  21. package/dist/storage/index.js +40 -1
  22. package/package.json +1 -1
  23. package/dist/chunk-16vgcf3k.js +0 -88
  24. package/dist/chunk-2yz1nsxs.js +0 -126
  25. package/dist/chunk-5gvbp2qa.js +0 -167
  26. package/dist/chunk-62ev8gnc.js +0 -41
  27. package/dist/chunk-6ew02s0c.js +0 -472
  28. package/dist/chunk-7a9kn0np.js +0 -116
  29. package/dist/chunk-8sqjbsgt.js +0 -42
  30. package/dist/chunk-9kxpbcb1.js +0 -85
  31. package/dist/chunk-cvdd4eqh.js +0 -110
  32. package/dist/chunk-d3ffeqp9.js +0 -87
  33. package/dist/chunk-fa5mg0hr.js +0 -96
  34. package/dist/chunk-j4d50hrx.js +0 -20
  35. package/dist/chunk-jwjk85ze.js +0 -15
  36. package/dist/chunk-m09hahe2.js +0 -250
  37. package/dist/chunk-s8mqwnm1.js +0 -14
  38. package/dist/chunk-srsac177.js +0 -85
  39. package/dist/chunk-v521d72w.js +0 -10
  40. package/dist/chunk-vtvqfhgy.js +0 -2442
  41. package/dist/chunk-xa7rjsn2.js +0 -20
  42. package/dist/chunk-xg35h5a3.js +0 -15
  43. package/dist/chunk-y8hc6nm4.js +0 -17
  44. package/dist/chunk-ybbbqj63.js +0 -130
  45. package/dist/chunk-yr32cp7h.js +0 -1603
  46. package/dist/chunk-zvwb67nd.js +0 -332
@@ -1,332 +0,0 @@
1
- // src/validation.ts
2
- import { z } from "zod";
3
- var FieldTypeSchema = z.enum([
4
- "text",
5
- "slug",
6
- "textarea",
7
- "number",
8
- "richtext",
9
- "relationship",
10
- "select",
11
- "radio",
12
- "date",
13
- "boolean",
14
- "json",
15
- "file",
16
- "blocks",
17
- "group",
18
- "row",
19
- "collapsible",
20
- "tabs",
21
- "join",
22
- "array",
23
- "virtual"
24
- ]);
25
- var BaseFieldSchema = z.object({
26
- name: z.string(),
27
- label: z.string().optional(),
28
- required: z.boolean().optional().default(false),
29
- unique: z.boolean().optional().default(false),
30
- localized: z.boolean().optional(),
31
- defaultValue: z.any().optional(),
32
- validate: z.function().optional(),
33
- admin: z.object({
34
- description: z.string().optional(),
35
- condition: z.function().optional(),
36
- hidden: z.boolean().optional(),
37
- readOnly: z.boolean().optional(),
38
- width: z.string().optional(),
39
- style: z.any().optional(),
40
- className: z.string().optional(),
41
- components: z.object({
42
- Field: z.string().optional(),
43
- Cell: z.string().optional()
44
- }).optional()
45
- }).optional()
46
- });
47
- var FieldSchema = z.lazy(() => z.discriminatedUnion("type", [
48
- BaseFieldSchema.extend({ type: z.literal("text") }),
49
- BaseFieldSchema.extend({
50
- type: z.literal("slug"),
51
- from: z.string(),
52
- format: z.function().optional()
53
- }),
54
- BaseFieldSchema.extend({ type: z.literal("textarea") }),
55
- BaseFieldSchema.extend({ type: z.literal("number") }),
56
- BaseFieldSchema.extend({ type: z.literal("date") }),
57
- BaseFieldSchema.extend({
58
- type: z.literal("boolean"),
59
- options: z.object({
60
- display: z.enum(["switch", "toggle", "checkbox", "select"]).optional().default("switch")
61
- }).loose().optional()
62
- }),
63
- BaseFieldSchema.extend({
64
- type: z.literal("richtext"),
65
- options: z.object({
66
- defaultMode: z.enum(["simple", "notion"]).optional()
67
- }).loose().optional()
68
- }),
69
- BaseFieldSchema.extend({
70
- type: z.literal("relationship"),
71
- relationTo: z.string(),
72
- hasMany: z.boolean().optional(),
73
- displayField: z.string().optional(),
74
- references: z.object({
75
- table: z.string(),
76
- column: z.string(),
77
- onDelete: z.enum(["cascade", "set null", "restrict", "no action"]).optional()
78
- }).optional()
79
- }),
80
- BaseFieldSchema.extend({
81
- type: z.literal("select"),
82
- options: z.object({
83
- choices: z.array(z.union([z.string(), z.object({ label: z.string(), value: z.string() })]))
84
- }).loose().optional()
85
- }),
86
- BaseFieldSchema.extend({
87
- type: z.literal("radio"),
88
- options: z.object({
89
- choices: z.array(z.union([z.string(), z.object({ label: z.string(), value: z.string() })]))
90
- }).loose()
91
- }),
92
- BaseFieldSchema.extend({
93
- type: z.literal("file"),
94
- bucket: z.string().optional(),
95
- options: z.object({
96
- allowedmime_types: z.array(z.string()).optional(),
97
- maxFileSize: z.number().optional(),
98
- metaFields: z.array(z.lazy(() => FieldSchema)).optional()
99
- }).loose().optional()
100
- }),
101
- BaseFieldSchema.extend({
102
- type: z.literal("json"),
103
- fields: z.array(z.lazy(() => FieldSchema)).optional()
104
- }),
105
- BaseFieldSchema.extend({
106
- type: z.literal("blocks"),
107
- blocks: z.array(z.object({
108
- slug: z.string(),
109
- fields: z.array(z.lazy(() => FieldSchema)),
110
- label: z.string().optional()
111
- }))
112
- }),
113
- BaseFieldSchema.extend({
114
- type: z.literal("group"),
115
- fields: z.array(z.lazy(() => FieldSchema))
116
- }),
117
- z.object({
118
- name: z.string().optional(),
119
- type: z.literal("row"),
120
- fields: z.array(z.lazy(() => FieldSchema)),
121
- label: z.string().optional()
122
- }),
123
- z.object({
124
- name: z.string().optional(),
125
- type: z.literal("collapsible"),
126
- fields: z.array(z.lazy(() => FieldSchema)),
127
- label: z.string().optional(),
128
- options: z.object({
129
- initiallyCollapsed: z.boolean().optional()
130
- }).loose().optional()
131
- }),
132
- z.object({
133
- name: z.string().optional(),
134
- type: z.literal("tabs"),
135
- tabs: z.array(z.object({
136
- label: z.string(),
137
- fields: z.array(z.lazy(() => FieldSchema))
138
- }))
139
- }),
140
- z.object({
141
- name: z.string().optional().refine((val) => val === undefined, {
142
- message: "Join fields are virtual and should not have a 'name' property. They are mapped dynamically via the API."
143
- }).or(z.string()),
144
- type: z.literal("join"),
145
- collection: z.string(),
146
- on: z.string(),
147
- label: z.string().optional()
148
- }),
149
- BaseFieldSchema.extend({
150
- type: z.literal("array"),
151
- fields: z.array(z.lazy(() => FieldSchema)).optional()
152
- }),
153
- BaseFieldSchema.extend({
154
- type: z.literal("virtual"),
155
- resolve: z.function(),
156
- returnType: z.string().optional()
157
- })
158
- ]));
159
- var AccessConfigSchema = z.object({
160
- read: z.union([z.boolean(), z.function()]).optional(),
161
- create: z.union([z.boolean(), z.function()]).optional(),
162
- update: z.union([z.boolean(), z.function()]).optional(),
163
- delete: z.union([z.boolean(), z.function()]).optional(),
164
- requireApiKey: z.boolean().optional()
165
- });
166
- var CollectionHooksSchema = z.object({
167
- beforeCreate: z.function().optional(),
168
- afterCreate: z.function().optional(),
169
- beforeUpdate: z.function().optional(),
170
- afterUpdate: z.function().optional(),
171
- beforeDelete: z.function().optional(),
172
- afterDelete: z.function().optional()
173
- });
174
- var CollectionSchema = z.object({
175
- slug: z.string(),
176
- label: z.string().optional(),
177
- icon: z.string().optional(),
178
- apiPath: z.string().optional(),
179
- fields: z.array(FieldSchema),
180
- timestamps: z.union([
181
- z.boolean(),
182
- z.object({
183
- createdAt: z.string().optional(),
184
- updatedAt: z.string().optional()
185
- })
186
- ]).optional(),
187
- auth: z.boolean().optional(),
188
- hooks: CollectionHooksSchema.optional(),
189
- access: AccessConfigSchema.optional(),
190
- versions: z.object({
191
- drafts: z.boolean().optional(),
192
- maxRevisions: z.number().optional(),
193
- autosave: z.boolean().optional()
194
- }).optional(),
195
- webhooks: z.array(z.object({
196
- events: z.array(z.string()),
197
- url: z.string(),
198
- headers: z.record(z.string(), z.string()).optional()
199
- })).optional(),
200
- admin: z.union([
201
- z.boolean(),
202
- z.object({
203
- defaultColumns: z.array(z.string()).optional(),
204
- useAsTitle: z.string().optional(),
205
- hidden: z.boolean().optional(),
206
- disableAdmin: z.boolean().optional(),
207
- views: z.array(z.object({
208
- name: z.string(),
209
- filter: z.record(z.string(), z.any()),
210
- defaultColumns: z.array(z.string()).optional()
211
- })).optional(),
212
- bulkActions: z.array(z.object({
213
- label: z.string(),
214
- action: z.function()
215
- })).optional()
216
- })
217
- ]).optional(),
218
- hidden: z.boolean().optional()
219
- });
220
- var GlobalSchema = z.object({
221
- slug: z.string(),
222
- label: z.string().optional(),
223
- icon: z.string().optional(),
224
- fields: z.array(FieldSchema),
225
- timestamps: z.union([
226
- z.boolean(),
227
- z.object({
228
- createdAt: z.string().optional(),
229
- updatedAt: z.string().optional()
230
- })
231
- ]).optional(),
232
- access: AccessConfigSchema.optional()
233
- });
234
- var AdminConfigSchema = z.object({
235
- userCollection: z.string().optional(),
236
- disableAdmin: z.boolean().optional(),
237
- route: z.string().optional()
238
- });
239
- var OpacaAuthConfigSchema = z.object({
240
- strategies: z.object({
241
- emailPassword: z.boolean().optional(),
242
- magicLink: z.object({
243
- enabled: z.boolean(),
244
- sendEmail: z.function()
245
- }).optional()
246
- }).optional(),
247
- socialProviders: z.object({
248
- github: z.object({
249
- clientId: z.string(),
250
- clientSecret: z.string()
251
- }).optional(),
252
- google: z.object({
253
- clientId: z.string(),
254
- clientSecret: z.string()
255
- }).optional()
256
- }).optional(),
257
- session: z.object({
258
- expiresInDays: z.number().optional(),
259
- updateAgeSeconds: z.number().optional()
260
- }).optional(),
261
- features: z.object({
262
- apiKeys: z.object({
263
- enabled: z.boolean()
264
- }).optional(),
265
- mfa: z.object({
266
- enabled: z.boolean(),
267
- issuer: z.string()
268
- }).optional()
269
- }).optional()
270
- });
271
- var ApiConfigSchema = z.object({
272
- maxLimit: z.number().optional(),
273
- rateLimit: z.object({
274
- windowMs: z.number().optional(),
275
- limit: z.number().optional(),
276
- enabled: z.boolean().optional(),
277
- store: z.any().optional(),
278
- provider: z.function().optional(),
279
- keyGenerator: z.function().optional()
280
- }).optional()
281
- });
282
- var OpacaConfigSchema = z.object({
283
- collections: z.array(CollectionSchema),
284
- globals: z.array(GlobalSchema).optional(),
285
- db: z.any(),
286
- storages: z.record(z.string(), z.any()).optional(),
287
- runMigrationsOnStartup: z.boolean().optional(),
288
- admin: AdminConfigSchema.optional(),
289
- serverURL: z.string().optional(),
290
- appName: z.string().optional(),
291
- secret: z.string().optional(),
292
- trustedOrigins: z.union([z.array(z.string()), z.function()]).optional(),
293
- auth: OpacaAuthConfigSchema.optional(),
294
- api: ApiConfigSchema.optional(),
295
- access: z.object({
296
- roles: z.record(z.string(), z.record(z.string(), z.array(z.string()))).optional()
297
- }).optional(),
298
- i18n: z.object({
299
- locales: z.array(z.string()),
300
- defaultLocale: z.string()
301
- }).optional()
302
- });
303
-
304
- // src/config.ts
305
- function recursivelyBuild(obj) {
306
- if (!obj || typeof obj !== "object")
307
- return obj;
308
- if (typeof obj.build === "function") {
309
- return recursivelyBuild(obj.build());
310
- }
311
- if (Array.isArray(obj)) {
312
- return obj.map(recursivelyBuild);
313
- }
314
- if (obj.constructor !== Object) {
315
- return obj;
316
- }
317
- const built = {};
318
- for (const [key, value] of Object.entries(obj)) {
319
- built[key] = recursivelyBuild(value);
320
- }
321
- return built;
322
- }
323
- function defineConfig(config) {
324
- const builtConfig = recursivelyBuild(config);
325
- const result = OpacaConfigSchema.safeParse(builtConfig);
326
- if (!result.success) {
327
- throw new Error(`Invalid OpacaCMS Configuration: ${result.error.message}`);
328
- }
329
- return builtConfig;
330
- }
331
-
332
- export { defineConfig };