@gyxer-studio/schema 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.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # @gyxer-studio/schema
2
+
3
+ Zod-based schema types and validation for Gyxer Studio projects.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @gyxer-studio/schema
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { validateProject, parseProjectJson } from '@gyxer-studio/schema';
15
+ import type { GyxerProject, Entity, Field, Relation } from '@gyxer-studio/schema';
16
+
17
+ // Validate a project object
18
+ const result = validateProject({
19
+ name: 'my-app',
20
+ entities: [
21
+ {
22
+ name: 'User',
23
+ fields: [
24
+ { name: 'email', type: 'string', required: true, unique: true },
25
+ { name: 'name', type: 'string', required: true },
26
+ ],
27
+ },
28
+ ],
29
+ });
30
+
31
+ if (result.success) {
32
+ console.log(result.data); // fully typed GyxerProject
33
+ } else {
34
+ console.error(result.errors);
35
+ }
36
+
37
+ // Parse from JSON string
38
+ const jsonResult = parseProjectJson(fs.readFileSync('my-app.json', 'utf-8'));
39
+ ```
40
+
41
+ ## Field Types
42
+
43
+ | Type | TypeScript | Prisma |
44
+ |------|-----------|--------|
45
+ | `string` | `string` | `String` |
46
+ | `text` | `string` | `String` |
47
+ | `int` | `number` | `Int` |
48
+ | `float` | `number` | `Float` |
49
+ | `boolean` | `boolean` | `Boolean` |
50
+ | `datetime` | `Date` | `DateTime` |
51
+ | `enum` | `enum` | `enum` |
52
+
53
+ ## Relation Types
54
+
55
+ | Type | Description |
56
+ |------|-------------|
57
+ | `one-to-one` | e.g. User has one Profile |
58
+ | `one-to-many` | e.g. User has many Posts |
59
+ | `many-to-many` | e.g. Post has many Tags |
60
+
61
+ ## Part of [Gyxer Studio](https://github.com/Gyxer513/gyxer-studio)
62
+
63
+ MIT License
@@ -0,0 +1,5 @@
1
+ export { FieldType, RelationType, OnDeleteAction, FieldSchema, RelationSchema, EntitySchema, ModuleName, ModuleConfigSchema, DatabaseType, ProjectSettingsSchema, GyxerProjectSchema, } from './types.js';
2
+ export type { Field, Relation, Entity, ModuleConfig, ProjectSettings, GyxerProject, } from './types.js';
3
+ export { validateProject, parseProjectJson } from './validators.js';
4
+ export type { ValidationResult, ValidationError } from './validators.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,KAAK,EACL,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // Types & Zod schemas
2
+ export { FieldType, RelationType, OnDeleteAction, FieldSchema, RelationSchema, EntitySchema, ModuleName, ModuleConfigSchema, DatabaseType, ProjectSettingsSchema, GyxerProjectSchema, } from './types.js';
3
+ // Validators
4
+ export { validateProject, parseProjectJson } from './validators.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAYpB,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,445 @@
1
+ import { z } from 'zod';
2
+ export declare const FieldType: z.ZodEnum<["string", "int", "float", "boolean", "datetime", "enum", "json", "text", "uuid"]>;
3
+ export type FieldType = z.infer<typeof FieldType>;
4
+ export declare const RelationType: z.ZodEnum<["one-to-one", "one-to-many", "many-to-many"]>;
5
+ export type RelationType = z.infer<typeof RelationType>;
6
+ export declare const OnDeleteAction: z.ZodEnum<["CASCADE", "SET_NULL", "RESTRICT", "NO_ACTION"]>;
7
+ export type OnDeleteAction = z.infer<typeof OnDeleteAction>;
8
+ export declare const FieldSchema: z.ZodObject<{
9
+ name: z.ZodString;
10
+ type: z.ZodEnum<["string", "int", "float", "boolean", "datetime", "enum", "json", "text", "uuid"]>;
11
+ required: z.ZodDefault<z.ZodBoolean>;
12
+ unique: z.ZodDefault<z.ZodBoolean>;
13
+ index: z.ZodDefault<z.ZodBoolean>;
14
+ default: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
15
+ enumValues: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ description: z.ZodOptional<z.ZodString>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
19
+ name: string;
20
+ required: boolean;
21
+ unique: boolean;
22
+ index: boolean;
23
+ default?: string | number | boolean | null | undefined;
24
+ enumValues?: string[] | undefined;
25
+ description?: string | undefined;
26
+ }, {
27
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
28
+ name: string;
29
+ required?: boolean | undefined;
30
+ unique?: boolean | undefined;
31
+ index?: boolean | undefined;
32
+ default?: string | number | boolean | null | undefined;
33
+ enumValues?: string[] | undefined;
34
+ description?: string | undefined;
35
+ }>;
36
+ export type Field = z.infer<typeof FieldSchema>;
37
+ export declare const RelationSchema: z.ZodObject<{
38
+ name: z.ZodString;
39
+ type: z.ZodEnum<["one-to-one", "one-to-many", "many-to-many"]>;
40
+ target: z.ZodString;
41
+ foreignKey: z.ZodOptional<z.ZodString>;
42
+ onDelete: z.ZodDefault<z.ZodEnum<["CASCADE", "SET_NULL", "RESTRICT", "NO_ACTION"]>>;
43
+ description: z.ZodOptional<z.ZodString>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ type: "one-to-one" | "one-to-many" | "many-to-many";
46
+ name: string;
47
+ target: string;
48
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
49
+ description?: string | undefined;
50
+ foreignKey?: string | undefined;
51
+ }, {
52
+ type: "one-to-one" | "one-to-many" | "many-to-many";
53
+ name: string;
54
+ target: string;
55
+ description?: string | undefined;
56
+ foreignKey?: string | undefined;
57
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
58
+ }>;
59
+ export type Relation = z.infer<typeof RelationSchema>;
60
+ export declare const EntitySchema: z.ZodObject<{
61
+ name: z.ZodString;
62
+ description: z.ZodOptional<z.ZodString>;
63
+ fields: z.ZodArray<z.ZodObject<{
64
+ name: z.ZodString;
65
+ type: z.ZodEnum<["string", "int", "float", "boolean", "datetime", "enum", "json", "text", "uuid"]>;
66
+ required: z.ZodDefault<z.ZodBoolean>;
67
+ unique: z.ZodDefault<z.ZodBoolean>;
68
+ index: z.ZodDefault<z.ZodBoolean>;
69
+ default: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
70
+ enumValues: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
71
+ description: z.ZodOptional<z.ZodString>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
74
+ name: string;
75
+ required: boolean;
76
+ unique: boolean;
77
+ index: boolean;
78
+ default?: string | number | boolean | null | undefined;
79
+ enumValues?: string[] | undefined;
80
+ description?: string | undefined;
81
+ }, {
82
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
83
+ name: string;
84
+ required?: boolean | undefined;
85
+ unique?: boolean | undefined;
86
+ index?: boolean | undefined;
87
+ default?: string | number | boolean | null | undefined;
88
+ enumValues?: string[] | undefined;
89
+ description?: string | undefined;
90
+ }>, "many">;
91
+ relations: z.ZodDefault<z.ZodArray<z.ZodObject<{
92
+ name: z.ZodString;
93
+ type: z.ZodEnum<["one-to-one", "one-to-many", "many-to-many"]>;
94
+ target: z.ZodString;
95
+ foreignKey: z.ZodOptional<z.ZodString>;
96
+ onDelete: z.ZodDefault<z.ZodEnum<["CASCADE", "SET_NULL", "RESTRICT", "NO_ACTION"]>>;
97
+ description: z.ZodOptional<z.ZodString>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ type: "one-to-one" | "one-to-many" | "many-to-many";
100
+ name: string;
101
+ target: string;
102
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
103
+ description?: string | undefined;
104
+ foreignKey?: string | undefined;
105
+ }, {
106
+ type: "one-to-one" | "one-to-many" | "many-to-many";
107
+ name: string;
108
+ target: string;
109
+ description?: string | undefined;
110
+ foreignKey?: string | undefined;
111
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
112
+ }>, "many">>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ name: string;
115
+ fields: {
116
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
117
+ name: string;
118
+ required: boolean;
119
+ unique: boolean;
120
+ index: boolean;
121
+ default?: string | number | boolean | null | undefined;
122
+ enumValues?: string[] | undefined;
123
+ description?: string | undefined;
124
+ }[];
125
+ relations: {
126
+ type: "one-to-one" | "one-to-many" | "many-to-many";
127
+ name: string;
128
+ target: string;
129
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
130
+ description?: string | undefined;
131
+ foreignKey?: string | undefined;
132
+ }[];
133
+ description?: string | undefined;
134
+ }, {
135
+ name: string;
136
+ fields: {
137
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
138
+ name: string;
139
+ required?: boolean | undefined;
140
+ unique?: boolean | undefined;
141
+ index?: boolean | undefined;
142
+ default?: string | number | boolean | null | undefined;
143
+ enumValues?: string[] | undefined;
144
+ description?: string | undefined;
145
+ }[];
146
+ description?: string | undefined;
147
+ relations?: {
148
+ type: "one-to-one" | "one-to-many" | "many-to-many";
149
+ name: string;
150
+ target: string;
151
+ description?: string | undefined;
152
+ foreignKey?: string | undefined;
153
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
154
+ }[] | undefined;
155
+ }>;
156
+ export type Entity = z.infer<typeof EntitySchema>;
157
+ export declare const ModuleName: z.ZodEnum<["auth-jwt", "auth-oauth", "auth-keycloak", "file-storage", "queues", "search", "cache", "websockets"]>;
158
+ export type ModuleName = z.infer<typeof ModuleName>;
159
+ export declare const ModuleConfigSchema: z.ZodObject<{
160
+ name: z.ZodEnum<["auth-jwt", "auth-oauth", "auth-keycloak", "file-storage", "queues", "search", "cache", "websockets"]>;
161
+ enabled: z.ZodDefault<z.ZodBoolean>;
162
+ options: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
163
+ }, "strip", z.ZodTypeAny, {
164
+ options: Record<string, unknown>;
165
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
166
+ enabled: boolean;
167
+ }, {
168
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
169
+ options?: Record<string, unknown> | undefined;
170
+ enabled?: boolean | undefined;
171
+ }>;
172
+ export type ModuleConfig = z.infer<typeof ModuleConfigSchema>;
173
+ export declare const DatabaseType: z.ZodEnum<["postgresql", "mysql", "sqlite"]>;
174
+ export type DatabaseType = z.infer<typeof DatabaseType>;
175
+ export declare const ProjectSettingsSchema: z.ZodObject<{
176
+ port: z.ZodDefault<z.ZodNumber>;
177
+ database: z.ZodDefault<z.ZodEnum<["postgresql", "mysql", "sqlite"]>>;
178
+ databaseUrl: z.ZodDefault<z.ZodString>;
179
+ enableSwagger: z.ZodDefault<z.ZodBoolean>;
180
+ enableCors: z.ZodDefault<z.ZodBoolean>;
181
+ enableHelmet: z.ZodDefault<z.ZodBoolean>;
182
+ enableRateLimit: z.ZodDefault<z.ZodBoolean>;
183
+ rateLimitTtl: z.ZodDefault<z.ZodNumber>;
184
+ rateLimitMax: z.ZodDefault<z.ZodNumber>;
185
+ docker: z.ZodDefault<z.ZodBoolean>;
186
+ }, "strip", z.ZodTypeAny, {
187
+ port: number;
188
+ database: "postgresql" | "mysql" | "sqlite";
189
+ databaseUrl: string;
190
+ enableSwagger: boolean;
191
+ enableCors: boolean;
192
+ enableHelmet: boolean;
193
+ enableRateLimit: boolean;
194
+ rateLimitTtl: number;
195
+ rateLimitMax: number;
196
+ docker: boolean;
197
+ }, {
198
+ port?: number | undefined;
199
+ database?: "postgresql" | "mysql" | "sqlite" | undefined;
200
+ databaseUrl?: string | undefined;
201
+ enableSwagger?: boolean | undefined;
202
+ enableCors?: boolean | undefined;
203
+ enableHelmet?: boolean | undefined;
204
+ enableRateLimit?: boolean | undefined;
205
+ rateLimitTtl?: number | undefined;
206
+ rateLimitMax?: number | undefined;
207
+ docker?: boolean | undefined;
208
+ }>;
209
+ export type ProjectSettings = z.infer<typeof ProjectSettingsSchema>;
210
+ export declare const GyxerProjectSchema: z.ZodObject<{
211
+ name: z.ZodString;
212
+ version: z.ZodDefault<z.ZodString>;
213
+ description: z.ZodDefault<z.ZodString>;
214
+ entities: z.ZodArray<z.ZodObject<{
215
+ name: z.ZodString;
216
+ description: z.ZodOptional<z.ZodString>;
217
+ fields: z.ZodArray<z.ZodObject<{
218
+ name: z.ZodString;
219
+ type: z.ZodEnum<["string", "int", "float", "boolean", "datetime", "enum", "json", "text", "uuid"]>;
220
+ required: z.ZodDefault<z.ZodBoolean>;
221
+ unique: z.ZodDefault<z.ZodBoolean>;
222
+ index: z.ZodDefault<z.ZodBoolean>;
223
+ default: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
224
+ enumValues: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
225
+ description: z.ZodOptional<z.ZodString>;
226
+ }, "strip", z.ZodTypeAny, {
227
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
228
+ name: string;
229
+ required: boolean;
230
+ unique: boolean;
231
+ index: boolean;
232
+ default?: string | number | boolean | null | undefined;
233
+ enumValues?: string[] | undefined;
234
+ description?: string | undefined;
235
+ }, {
236
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
237
+ name: string;
238
+ required?: boolean | undefined;
239
+ unique?: boolean | undefined;
240
+ index?: boolean | undefined;
241
+ default?: string | number | boolean | null | undefined;
242
+ enumValues?: string[] | undefined;
243
+ description?: string | undefined;
244
+ }>, "many">;
245
+ relations: z.ZodDefault<z.ZodArray<z.ZodObject<{
246
+ name: z.ZodString;
247
+ type: z.ZodEnum<["one-to-one", "one-to-many", "many-to-many"]>;
248
+ target: z.ZodString;
249
+ foreignKey: z.ZodOptional<z.ZodString>;
250
+ onDelete: z.ZodDefault<z.ZodEnum<["CASCADE", "SET_NULL", "RESTRICT", "NO_ACTION"]>>;
251
+ description: z.ZodOptional<z.ZodString>;
252
+ }, "strip", z.ZodTypeAny, {
253
+ type: "one-to-one" | "one-to-many" | "many-to-many";
254
+ name: string;
255
+ target: string;
256
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
257
+ description?: string | undefined;
258
+ foreignKey?: string | undefined;
259
+ }, {
260
+ type: "one-to-one" | "one-to-many" | "many-to-many";
261
+ name: string;
262
+ target: string;
263
+ description?: string | undefined;
264
+ foreignKey?: string | undefined;
265
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
266
+ }>, "many">>;
267
+ }, "strip", z.ZodTypeAny, {
268
+ name: string;
269
+ fields: {
270
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
271
+ name: string;
272
+ required: boolean;
273
+ unique: boolean;
274
+ index: boolean;
275
+ default?: string | number | boolean | null | undefined;
276
+ enumValues?: string[] | undefined;
277
+ description?: string | undefined;
278
+ }[];
279
+ relations: {
280
+ type: "one-to-one" | "one-to-many" | "many-to-many";
281
+ name: string;
282
+ target: string;
283
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
284
+ description?: string | undefined;
285
+ foreignKey?: string | undefined;
286
+ }[];
287
+ description?: string | undefined;
288
+ }, {
289
+ name: string;
290
+ fields: {
291
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
292
+ name: string;
293
+ required?: boolean | undefined;
294
+ unique?: boolean | undefined;
295
+ index?: boolean | undefined;
296
+ default?: string | number | boolean | null | undefined;
297
+ enumValues?: string[] | undefined;
298
+ description?: string | undefined;
299
+ }[];
300
+ description?: string | undefined;
301
+ relations?: {
302
+ type: "one-to-one" | "one-to-many" | "many-to-many";
303
+ name: string;
304
+ target: string;
305
+ description?: string | undefined;
306
+ foreignKey?: string | undefined;
307
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
308
+ }[] | undefined;
309
+ }>, "many">;
310
+ modules: z.ZodDefault<z.ZodArray<z.ZodObject<{
311
+ name: z.ZodEnum<["auth-jwt", "auth-oauth", "auth-keycloak", "file-storage", "queues", "search", "cache", "websockets"]>;
312
+ enabled: z.ZodDefault<z.ZodBoolean>;
313
+ options: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
314
+ }, "strip", z.ZodTypeAny, {
315
+ options: Record<string, unknown>;
316
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
317
+ enabled: boolean;
318
+ }, {
319
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
320
+ options?: Record<string, unknown> | undefined;
321
+ enabled?: boolean | undefined;
322
+ }>, "many">>;
323
+ settings: z.ZodDefault<z.ZodObject<{
324
+ port: z.ZodDefault<z.ZodNumber>;
325
+ database: z.ZodDefault<z.ZodEnum<["postgresql", "mysql", "sqlite"]>>;
326
+ databaseUrl: z.ZodDefault<z.ZodString>;
327
+ enableSwagger: z.ZodDefault<z.ZodBoolean>;
328
+ enableCors: z.ZodDefault<z.ZodBoolean>;
329
+ enableHelmet: z.ZodDefault<z.ZodBoolean>;
330
+ enableRateLimit: z.ZodDefault<z.ZodBoolean>;
331
+ rateLimitTtl: z.ZodDefault<z.ZodNumber>;
332
+ rateLimitMax: z.ZodDefault<z.ZodNumber>;
333
+ docker: z.ZodDefault<z.ZodBoolean>;
334
+ }, "strip", z.ZodTypeAny, {
335
+ port: number;
336
+ database: "postgresql" | "mysql" | "sqlite";
337
+ databaseUrl: string;
338
+ enableSwagger: boolean;
339
+ enableCors: boolean;
340
+ enableHelmet: boolean;
341
+ enableRateLimit: boolean;
342
+ rateLimitTtl: number;
343
+ rateLimitMax: number;
344
+ docker: boolean;
345
+ }, {
346
+ port?: number | undefined;
347
+ database?: "postgresql" | "mysql" | "sqlite" | undefined;
348
+ databaseUrl?: string | undefined;
349
+ enableSwagger?: boolean | undefined;
350
+ enableCors?: boolean | undefined;
351
+ enableHelmet?: boolean | undefined;
352
+ enableRateLimit?: boolean | undefined;
353
+ rateLimitTtl?: number | undefined;
354
+ rateLimitMax?: number | undefined;
355
+ docker?: boolean | undefined;
356
+ }>>;
357
+ }, "strip", z.ZodTypeAny, {
358
+ name: string;
359
+ description: string;
360
+ version: string;
361
+ entities: {
362
+ name: string;
363
+ fields: {
364
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
365
+ name: string;
366
+ required: boolean;
367
+ unique: boolean;
368
+ index: boolean;
369
+ default?: string | number | boolean | null | undefined;
370
+ enumValues?: string[] | undefined;
371
+ description?: string | undefined;
372
+ }[];
373
+ relations: {
374
+ type: "one-to-one" | "one-to-many" | "many-to-many";
375
+ name: string;
376
+ target: string;
377
+ onDelete: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION";
378
+ description?: string | undefined;
379
+ foreignKey?: string | undefined;
380
+ }[];
381
+ description?: string | undefined;
382
+ }[];
383
+ modules: {
384
+ options: Record<string, unknown>;
385
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
386
+ enabled: boolean;
387
+ }[];
388
+ settings: {
389
+ port: number;
390
+ database: "postgresql" | "mysql" | "sqlite";
391
+ databaseUrl: string;
392
+ enableSwagger: boolean;
393
+ enableCors: boolean;
394
+ enableHelmet: boolean;
395
+ enableRateLimit: boolean;
396
+ rateLimitTtl: number;
397
+ rateLimitMax: number;
398
+ docker: boolean;
399
+ };
400
+ }, {
401
+ name: string;
402
+ entities: {
403
+ name: string;
404
+ fields: {
405
+ type: "string" | "boolean" | "int" | "float" | "datetime" | "enum" | "json" | "text" | "uuid";
406
+ name: string;
407
+ required?: boolean | undefined;
408
+ unique?: boolean | undefined;
409
+ index?: boolean | undefined;
410
+ default?: string | number | boolean | null | undefined;
411
+ enumValues?: string[] | undefined;
412
+ description?: string | undefined;
413
+ }[];
414
+ description?: string | undefined;
415
+ relations?: {
416
+ type: "one-to-one" | "one-to-many" | "many-to-many";
417
+ name: string;
418
+ target: string;
419
+ description?: string | undefined;
420
+ foreignKey?: string | undefined;
421
+ onDelete?: "CASCADE" | "SET_NULL" | "RESTRICT" | "NO_ACTION" | undefined;
422
+ }[] | undefined;
423
+ }[];
424
+ description?: string | undefined;
425
+ version?: string | undefined;
426
+ modules?: {
427
+ name: "auth-jwt" | "auth-oauth" | "auth-keycloak" | "file-storage" | "queues" | "search" | "cache" | "websockets";
428
+ options?: Record<string, unknown> | undefined;
429
+ enabled?: boolean | undefined;
430
+ }[] | undefined;
431
+ settings?: {
432
+ port?: number | undefined;
433
+ database?: "postgresql" | "mysql" | "sqlite" | undefined;
434
+ databaseUrl?: string | undefined;
435
+ enableSwagger?: boolean | undefined;
436
+ enableCors?: boolean | undefined;
437
+ enableHelmet?: boolean | undefined;
438
+ enableRateLimit?: boolean | undefined;
439
+ rateLimitTtl?: number | undefined;
440
+ rateLimitMax?: number | undefined;
441
+ docker?: boolean | undefined;
442
+ } | undefined;
443
+ }>;
444
+ export type GyxerProject = z.infer<typeof GyxerProjectSchema>;
445
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,SAAS,8FAUpB,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAIlD,eAAO,MAAM,YAAY,0DAAwD,CAAC;AAClF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,cAAc,6DAA2D,CAAC;AACvF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAI5D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYtB,CAAC;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAIhD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAOzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAItD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD,eAAO,MAAM,UAAU,mHASrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,eAAO,MAAM,YAAY,8CAA4C,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAIpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,92 @@
1
+ import { z } from 'zod';
2
+ // ─── Field Types ──────────────────────────────────────────────
3
+ export const FieldType = z.enum([
4
+ 'string',
5
+ 'int',
6
+ 'float',
7
+ 'boolean',
8
+ 'datetime',
9
+ 'enum',
10
+ 'json',
11
+ 'text',
12
+ 'uuid',
13
+ ]);
14
+ // ─── Relation Types ───────────────────────────────────────────
15
+ export const RelationType = z.enum(['one-to-one', 'one-to-many', 'many-to-many']);
16
+ export const OnDeleteAction = z.enum(['CASCADE', 'SET_NULL', 'RESTRICT', 'NO_ACTION']);
17
+ // ─── Field ────────────────────────────────────────────────────
18
+ export const FieldSchema = z.object({
19
+ name: z
20
+ .string()
21
+ .min(1)
22
+ .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, 'Field name must be a valid identifier'),
23
+ type: FieldType,
24
+ required: z.boolean().default(true),
25
+ unique: z.boolean().default(false),
26
+ index: z.boolean().default(false),
27
+ default: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),
28
+ enumValues: z.array(z.string()).optional(),
29
+ description: z.string().optional(),
30
+ });
31
+ // ─── Relation ─────────────────────────────────────────────────
32
+ export const RelationSchema = z.object({
33
+ name: z.string().min(1),
34
+ type: RelationType,
35
+ target: z.string().min(1),
36
+ foreignKey: z.string().optional(),
37
+ onDelete: OnDeleteAction.default('CASCADE'),
38
+ description: z.string().optional(),
39
+ });
40
+ // ─── Entity ───────────────────────────────────────────────────
41
+ export const EntitySchema = z.object({
42
+ name: z
43
+ .string()
44
+ .min(1)
45
+ .regex(/^[A-Z][a-zA-Z0-9]*$/, 'Entity name must be PascalCase'),
46
+ description: z.string().optional(),
47
+ fields: z.array(FieldSchema).min(1, 'Entity must have at least one field'),
48
+ relations: z.array(RelationSchema).default([]),
49
+ });
50
+ // ─── Module Config ────────────────────────────────────────────
51
+ export const ModuleName = z.enum([
52
+ 'auth-jwt',
53
+ 'auth-oauth',
54
+ 'auth-keycloak',
55
+ 'file-storage',
56
+ 'queues',
57
+ 'search',
58
+ 'cache',
59
+ 'websockets',
60
+ ]);
61
+ export const ModuleConfigSchema = z.object({
62
+ name: ModuleName,
63
+ enabled: z.boolean().default(true),
64
+ options: z.record(z.unknown()).default({}),
65
+ });
66
+ // ─── Project Settings ─────────────────────────────────────────
67
+ export const DatabaseType = z.enum(['postgresql', 'mysql', 'sqlite']);
68
+ export const ProjectSettingsSchema = z.object({
69
+ port: z.number().int().min(1).max(65535).default(3000),
70
+ database: DatabaseType.default('postgresql'),
71
+ databaseUrl: z.string().default('postgresql://postgres:postgres@localhost:5432/app'),
72
+ enableSwagger: z.boolean().default(true),
73
+ enableCors: z.boolean().default(true),
74
+ enableHelmet: z.boolean().default(true),
75
+ enableRateLimit: z.boolean().default(true),
76
+ rateLimitTtl: z.number().default(60),
77
+ rateLimitMax: z.number().default(100),
78
+ docker: z.boolean().default(true),
79
+ });
80
+ // ─── Gyxer Project (root schema) ─────────────────────────────
81
+ export const GyxerProjectSchema = z.object({
82
+ name: z
83
+ .string()
84
+ .min(1)
85
+ .regex(/^[a-z][a-z0-9-]*$/, 'Project name must be kebab-case'),
86
+ version: z.string().default('0.1.0'),
87
+ description: z.string().default(''),
88
+ entities: z.array(EntitySchema).min(1, 'Project must have at least one entity'),
89
+ modules: z.array(ModuleConfigSchema).default([]),
90
+ settings: ProjectSettingsSchema.default({}),
91
+ });
92
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type GyxerProject } from './types.js';
2
+ export interface ValidationResult {
3
+ success: boolean;
4
+ data?: GyxerProject;
5
+ errors?: ValidationError[];
6
+ }
7
+ export interface ValidationError {
8
+ path: string;
9
+ message: string;
10
+ }
11
+ /**
12
+ * Parse and validate a raw object as a GyxerProject.
13
+ * Returns parsed data with defaults applied, or validation errors.
14
+ */
15
+ export declare function validateProject(raw: unknown): ValidationResult;
16
+ /**
17
+ * Parse a JSON string into a GyxerProject.
18
+ */
19
+ export declare function parseProjectJson(json: string): ValidationResult;
20
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAGnE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAuB9D;AAqDD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAU/D"}
@@ -0,0 +1,90 @@
1
+ import { GyxerProjectSchema } from './types.js';
2
+ import { ZodError } from 'zod';
3
+ /**
4
+ * Parse and validate a raw object as a GyxerProject.
5
+ * Returns parsed data with defaults applied, or validation errors.
6
+ */
7
+ export function validateProject(raw) {
8
+ try {
9
+ const data = GyxerProjectSchema.parse(raw);
10
+ // Cross-field validations
11
+ const errors = crossValidate(data);
12
+ if (errors.length > 0) {
13
+ return { success: false, errors };
14
+ }
15
+ return { success: true, data };
16
+ }
17
+ catch (err) {
18
+ if (err instanceof ZodError) {
19
+ return {
20
+ success: false,
21
+ errors: err.issues.map((issue) => ({
22
+ path: issue.path.join('.'),
23
+ message: issue.message,
24
+ })),
25
+ };
26
+ }
27
+ throw err;
28
+ }
29
+ }
30
+ /**
31
+ * Cross-field validations that Zod can't express alone.
32
+ */
33
+ function crossValidate(project) {
34
+ const errors = [];
35
+ const entityNames = new Set();
36
+ for (const entity of project.entities) {
37
+ // Unique entity names
38
+ if (entityNames.has(entity.name)) {
39
+ errors.push({
40
+ path: `entities`,
41
+ message: `Duplicate entity name: "${entity.name}"`,
42
+ });
43
+ }
44
+ entityNames.add(entity.name);
45
+ // Unique field names within entity
46
+ const fieldNames = new Set();
47
+ for (const field of entity.fields) {
48
+ if (fieldNames.has(field.name)) {
49
+ errors.push({
50
+ path: `entities.${entity.name}.fields`,
51
+ message: `Duplicate field name: "${field.name}" in entity "${entity.name}"`,
52
+ });
53
+ }
54
+ fieldNames.add(field.name);
55
+ // Enum fields must have enumValues
56
+ if (field.type === 'enum' && (!field.enumValues || field.enumValues.length === 0)) {
57
+ errors.push({
58
+ path: `entities.${entity.name}.fields.${field.name}`,
59
+ message: `Enum field "${field.name}" must have enumValues`,
60
+ });
61
+ }
62
+ }
63
+ // Relations must reference existing entities
64
+ for (const relation of entity.relations) {
65
+ if (!project.entities.some((e) => e.name === relation.target)) {
66
+ errors.push({
67
+ path: `entities.${entity.name}.relations.${relation.name}`,
68
+ message: `Relation "${relation.name}" targets unknown entity "${relation.target}"`,
69
+ });
70
+ }
71
+ }
72
+ }
73
+ return errors;
74
+ }
75
+ /**
76
+ * Parse a JSON string into a GyxerProject.
77
+ */
78
+ export function parseProjectJson(json) {
79
+ try {
80
+ const raw = JSON.parse(json);
81
+ return validateProject(raw);
82
+ }
83
+ catch {
84
+ return {
85
+ success: false,
86
+ errors: [{ path: '', message: 'Invalid JSON' }],
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@gyxer-studio/schema",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Gyxer project schema types and validation",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "gyxer",
24
+ "schema",
25
+ "nestjs",
26
+ "codegen",
27
+ "backend",
28
+ "validation",
29
+ "zod"
30
+ ],
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/Gyxer513/gyxer-studio.git",
34
+ "directory": "packages/schema"
35
+ },
36
+ "homepage": "https://github.com/Gyxer513/gyxer-studio#readme",
37
+ "bugs": {
38
+ "url": "https://github.com/Gyxer513/gyxer-studio/issues"
39
+ },
40
+ "engines": {
41
+ "node": ">=20.0.0"
42
+ },
43
+ "dependencies": {
44
+ "zod": "^3.24.0"
45
+ },
46
+ "devDependencies": {
47
+ "typescript": "^5.7.0"
48
+ },
49
+ "license": "MIT"
50
+ }