@quickql/server 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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -0
  3. package/dist/core/src/client.d.ts +57 -0
  4. package/dist/core/src/client.d.ts.map +1 -0
  5. package/dist/core/src/client.js +164 -0
  6. package/dist/core/src/client.js.map +1 -0
  7. package/dist/core/src/index.d.ts +13 -0
  8. package/dist/core/src/index.d.ts.map +1 -0
  9. package/dist/core/src/index.js +13 -0
  10. package/dist/core/src/index.js.map +1 -0
  11. package/dist/core/src/types.d.ts +82 -0
  12. package/dist/core/src/types.d.ts.map +1 -0
  13. package/dist/core/src/types.js +12 -0
  14. package/dist/core/src/types.js.map +1 -0
  15. package/dist/server/src/engine.d.ts +55 -0
  16. package/dist/server/src/engine.d.ts.map +1 -0
  17. package/dist/server/src/engine.js +422 -0
  18. package/dist/server/src/engine.js.map +1 -0
  19. package/dist/server/src/errors.d.ts +31 -0
  20. package/dist/server/src/errors.d.ts.map +1 -0
  21. package/dist/server/src/errors.js +73 -0
  22. package/dist/server/src/errors.js.map +1 -0
  23. package/dist/server/src/executor.d.ts +25 -0
  24. package/dist/server/src/executor.d.ts.map +1 -0
  25. package/dist/server/src/executor.js +121 -0
  26. package/dist/server/src/executor.js.map +1 -0
  27. package/dist/server/src/filters.d.ts +10 -0
  28. package/dist/server/src/filters.d.ts.map +1 -0
  29. package/dist/server/src/filters.js +47 -0
  30. package/dist/server/src/filters.js.map +1 -0
  31. package/dist/server/src/handler.d.ts +12 -0
  32. package/dist/server/src/handler.d.ts.map +1 -0
  33. package/dist/server/src/handler.js +138 -0
  34. package/dist/server/src/handler.js.map +1 -0
  35. package/dist/server/src/index.d.ts +25 -0
  36. package/dist/server/src/index.d.ts.map +1 -0
  37. package/dist/server/src/index.js +26 -0
  38. package/dist/server/src/index.js.map +1 -0
  39. package/dist/server/src/parser/parser.d.ts +21 -0
  40. package/dist/server/src/parser/parser.d.ts.map +1 -0
  41. package/dist/server/src/parser/parser.js +99 -0
  42. package/dist/server/src/parser/parser.js.map +1 -0
  43. package/dist/server/src/parser/tokenizer.d.ts +18 -0
  44. package/dist/server/src/parser/tokenizer.d.ts.map +1 -0
  45. package/dist/server/src/parser/tokenizer.js +94 -0
  46. package/dist/server/src/parser/tokenizer.js.map +1 -0
  47. package/dist/server/src/parser/transformer.d.ts +24 -0
  48. package/dist/server/src/parser/transformer.d.ts.map +1 -0
  49. package/dist/server/src/parser/transformer.js +61 -0
  50. package/dist/server/src/parser/transformer.js.map +1 -0
  51. package/dist/server/src/parser/types.d.ts +21 -0
  52. package/dist/server/src/parser/types.d.ts.map +1 -0
  53. package/dist/server/src/parser/types.js +11 -0
  54. package/dist/server/src/parser/types.js.map +1 -0
  55. package/dist/server/src/playground/assets.d.ts +16 -0
  56. package/dist/server/src/playground/assets.d.ts.map +1 -0
  57. package/dist/server/src/playground/assets.js +1113 -0
  58. package/dist/server/src/playground/assets.js.map +1 -0
  59. package/dist/server/src/playground/docs.d.ts +15 -0
  60. package/dist/server/src/playground/docs.d.ts.map +1 -0
  61. package/dist/server/src/playground/docs.js +223 -0
  62. package/dist/server/src/playground/docs.js.map +1 -0
  63. package/dist/server/src/playground/html.d.ts +20 -0
  64. package/dist/server/src/playground/html.d.ts.map +1 -0
  65. package/dist/server/src/playground/html.js +50 -0
  66. package/dist/server/src/playground/html.js.map +1 -0
  67. package/dist/server/src/plugins/index.d.ts +21 -0
  68. package/dist/server/src/plugins/index.d.ts.map +1 -0
  69. package/dist/server/src/plugins/index.js +38 -0
  70. package/dist/server/src/plugins/index.js.map +1 -0
  71. package/dist/server/src/relations.d.ts +22 -0
  72. package/dist/server/src/relations.d.ts.map +1 -0
  73. package/dist/server/src/relations.js +98 -0
  74. package/dist/server/src/relations.js.map +1 -0
  75. package/dist/server/src/resolver/generator.d.ts +25 -0
  76. package/dist/server/src/resolver/generator.d.ts.map +1 -0
  77. package/dist/server/src/resolver/generator.js +65 -0
  78. package/dist/server/src/resolver/generator.js.map +1 -0
  79. package/dist/server/src/resolver/mapper.d.ts +23 -0
  80. package/dist/server/src/resolver/mapper.d.ts.map +1 -0
  81. package/dist/server/src/resolver/mapper.js +96 -0
  82. package/dist/server/src/resolver/mapper.js.map +1 -0
  83. package/dist/server/src/schema/builder.d.ts +21 -0
  84. package/dist/server/src/schema/builder.d.ts.map +1 -0
  85. package/dist/server/src/schema/builder.js +23 -0
  86. package/dist/server/src/schema/builder.js.map +1 -0
  87. package/dist/server/src/schema/types.d.ts +81 -0
  88. package/dist/server/src/schema/types.d.ts.map +1 -0
  89. package/dist/server/src/schema/types.js +11 -0
  90. package/dist/server/src/schema/types.js.map +1 -0
  91. package/dist/server/src/schema/utils.d.ts +16 -0
  92. package/dist/server/src/schema/utils.d.ts.map +1 -0
  93. package/dist/server/src/schema/utils.js +42 -0
  94. package/dist/server/src/schema/utils.js.map +1 -0
  95. package/dist/server/src/security.d.ts +46 -0
  96. package/dist/server/src/security.d.ts.map +1 -0
  97. package/dist/server/src/security.js +189 -0
  98. package/dist/server/src/security.js.map +1 -0
  99. package/dist/server/src/types.d.ts +158 -0
  100. package/dist/server/src/types.d.ts.map +1 -0
  101. package/dist/server/src/types.js +11 -0
  102. package/dist/server/src/types.js.map +1 -0
  103. package/dist/server/src/validator.d.ts +30 -0
  104. package/dist/server/src/validator.d.ts.map +1 -0
  105. package/dist/server/src/validator.js +171 -0
  106. package/dist/server/src/validator.js.map +1 -0
  107. package/package.json +25 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * QuickQL Resolver Generator
3
+ *
4
+ * Automated resolver generation for ORM-backed collections (Prisma, etc.),
5
+ * bridging the gap between QuickQL queries and native database operations.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ import { PrismaMapper } from './mapper';
12
+ export class ResolverGenerator {
13
+ /**
14
+ * Generates a single Prisma-backed resolver for a given collection.
15
+ * Handles findMany and findUnique operations.
16
+ */
17
+ static generateResolver(collection) {
18
+ if (collection.resolver)
19
+ return collection.resolver;
20
+ return async (query, ctx) => {
21
+ const { model } = collection;
22
+ const prismaModel = ctx.orm[model.charAt(0).toLowerCase() + model.slice(1)];
23
+ if (!prismaModel) {
24
+ throw new Error(`Prisma model '${model}' not found in the provided ORM client.`);
25
+ }
26
+ // Convert QuickQL to Prisma findMany format
27
+ const prismaArgs = PrismaMapper.mapQuery(query);
28
+ // Automatic findUnique vs findMany logic:
29
+ // If 'id' is in where and it's an 'eq' operator, we would use findUnique.
30
+ // But standard Prisma findMany with 'where' covers it for QuickQL's array-first return.
31
+ return await prismaModel.findMany(prismaArgs);
32
+ };
33
+ }
34
+ /**
35
+ * Generates an automatic Prisma mutation resolver for a collection.
36
+ * Supports create, update, and delete actions.
37
+ */
38
+ static generateMutationResolver(collection) {
39
+ if (collection.mutationResolver)
40
+ return collection.mutationResolver;
41
+ return async (mutation, ctx) => {
42
+ const { model } = collection;
43
+ const prismaModel = ctx.orm[model.charAt(0).toLowerCase() + model.slice(1)];
44
+ if (!prismaModel) {
45
+ throw new Error(`Prisma model '${model}' for mutation not found.`);
46
+ }
47
+ const prismaArgs = {};
48
+ // Auto-extract where clause from mutation
49
+ if (mutation.where) {
50
+ prismaArgs.where = PrismaMapper.mapQuery({ from: model, where: mutation.where }).where;
51
+ }
52
+ // Auto-extract and map fields to Prisma data format
53
+ if (mutation.data) {
54
+ prismaArgs.data = mutation.data;
55
+ }
56
+ switch (mutation.type) {
57
+ case 'create': return await prismaModel.create(prismaArgs);
58
+ case 'update': return await prismaModel.update(prismaArgs);
59
+ case 'delete': return await prismaModel.delete(prismaArgs);
60
+ default: throw new Error(`Mutation type '${mutation.type}' not natively supported for auto-generation.`);
61
+ }
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/resolver/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,OAAO,iBAAiB;IAC5B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,UAAgC;QACtD,IAAI,UAAU,CAAC,QAAQ;YAAE,OAAO,UAAU,CAAC,QAAQ,CAAC;QAEpD,OAAO,KAAK,EAAE,KAAY,EAAE,GAAyB,EAAE,EAAE;YACvD,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;YAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,yCAAyC,CAAC,CAAC;YACnF,CAAC;YAED,4CAA4C;YAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEhD,0CAA0C;YAC1C,0EAA0E;YAC1E,wFAAwF;YACxF,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,UAAgC;QAC9D,IAAI,UAAU,CAAC,gBAAgB;YAAE,OAAO,UAAU,CAAC,gBAAgB,CAAC;QAEpE,OAAO,KAAK,EAAE,QAAkB,EAAE,GAAyB,EAAE,EAAE;YAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;YAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,2BAA2B,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,UAAU,GAAwB,EAAE,CAAC;YAE3C,0CAA0C;YAC1C,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,UAAU,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAS,CAAC,CAAC,KAAK,CAAC;YAChG,CAAC;YAED,oDAAoD;YACpD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAClC,CAAC;YAED,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtB,KAAK,QAAQ,CAAC,CAAC,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC3D,KAAK,QAAQ,CAAC,CAAC,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC3D,KAAK,QAAQ,CAAC,CAAC,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC3D,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,IAAI,+CAA+C,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * QuickQL Prisma Mapper
3
+ *
4
+ * Logic for translating abstract QuickQL queries and filters into native
5
+ * Prisma objects (where, select, include, take, skip, orderBy).
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ import { Query } from '@quickql/core';
12
+ export declare class PrismaMapper {
13
+ /**
14
+ * Maps a standard QuickQL Query object into a valid Prisma findMany/findUnique argument.
15
+ */
16
+ static mapQuery(query: Query): Record<string, any>;
17
+ /**
18
+ * Automatically converts QuickQL filters into Prisma's native where object format.
19
+ * Handles AND/OR and all QuickQL operators (gt, lt, in, contains, etc).
20
+ */
21
+ private static mapWhere;
22
+ }
23
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../../src/resolver/mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAA2C,MAAM,eAAe,CAAC;AAE/E,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyClD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;CA6CxB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * QuickQL Prisma Mapper
3
+ *
4
+ * Logic for translating abstract QuickQL queries and filters into native
5
+ * Prisma objects (where, select, include, take, skip, orderBy).
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ export class PrismaMapper {
12
+ /**
13
+ * Maps a standard QuickQL Query object into a valid Prisma findMany/findUnique argument.
14
+ */
15
+ static mapQuery(query) {
16
+ const prismaQuery = {};
17
+ // 1. SELECT and INCLUDE normalization
18
+ if (query.select || query.include) {
19
+ prismaQuery.select = {};
20
+ // Map select array to Prisma { field: true }
21
+ if (query.select) {
22
+ query.select.forEach(field => {
23
+ prismaQuery.select[field] = true;
24
+ });
25
+ }
26
+ // Map include to nested select
27
+ if (query.include) {
28
+ Object.entries(query.include).forEach(([relation, nested]) => {
29
+ prismaQuery.select[relation] = this.mapQuery(nested);
30
+ });
31
+ }
32
+ }
33
+ // 2. WHERE clause mapping
34
+ if (query.where) {
35
+ prismaQuery.where = this.mapWhere(query.where);
36
+ }
37
+ // 3. Pagination
38
+ if (query.limit)
39
+ prismaQuery.take = query.limit;
40
+ if (query.offset)
41
+ prismaQuery.skip = query.offset;
42
+ // 4. Ordering
43
+ if (query.orderBy) {
44
+ prismaQuery.orderBy = Object.entries(query.orderBy).map(([field, dir]) => ({
45
+ [field]: dir
46
+ }));
47
+ }
48
+ return prismaQuery;
49
+ }
50
+ /**
51
+ * Automatically converts QuickQL filters into Prisma's native where object format.
52
+ * Handles AND/OR and all QuickQL operators (gt, lt, in, contains, etc).
53
+ */
54
+ static mapWhere(where) {
55
+ const prismaWhere = {};
56
+ if ('AND' in where && Array.isArray(where.AND)) {
57
+ prismaWhere.AND = where.AND.filter(sub => typeof sub === 'object').map(sub => this.mapWhere(sub));
58
+ return prismaWhere;
59
+ }
60
+ if ('OR' in where && Array.isArray(where.OR)) {
61
+ prismaWhere.OR = where.OR.filter(sub => typeof sub === 'object').map(sub => this.mapWhere(sub));
62
+ return prismaWhere;
63
+ }
64
+ // Default field-level filters
65
+ Object.entries(where).forEach(([rawField, condition]) => {
66
+ // 1. Handle flat syntax (e.g., age_gt: 18)
67
+ const opMatch = rawField.match(/^(.+)_(eq|ne|gt|lt|in|contains|startsWith|endsWith)$/);
68
+ let field = rawField;
69
+ let finalCondition = condition;
70
+ if (opMatch) {
71
+ field = opMatch[1];
72
+ const op = opMatch[2];
73
+ finalCondition = { [op]: condition };
74
+ }
75
+ if (typeof finalCondition !== 'object' || finalCondition === null || Array.isArray(finalCondition)) {
76
+ prismaWhere[field] = finalCondition;
77
+ return;
78
+ }
79
+ // Map QuickQL operators to Prisma operators
80
+ const prismaCondition = {};
81
+ Object.entries(finalCondition).forEach(([op, val]) => {
82
+ if (op === 'eq')
83
+ prismaWhere[field] = val;
84
+ else if (op === 'ne')
85
+ prismaCondition.not = val;
86
+ else
87
+ prismaCondition[op] = val;
88
+ });
89
+ if (Object.keys(prismaCondition).length > 0) {
90
+ prismaWhere[field] = { ...prismaWhere[field], ...prismaCondition };
91
+ }
92
+ });
93
+ return prismaWhere;
94
+ }
95
+ }
96
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../../src/resolver/mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * QuickQL Schema Builder
3
+ *
4
+ * Helper utilities for defining collections and schemas in a clean, code-first manner.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ import { SchemaOptions, CollectionDefinition } from './types';
11
+ /**
12
+ * Clean Schema Builder for QuickQL (Code-First)
13
+ */
14
+ export declare function createSchema(options: SchemaOptions): SchemaOptions;
15
+ /**
16
+ * Utility to define individual collections with full type inference.
17
+ */
18
+ export declare function defineCollection(config: CollectionDefinition): CollectionDefinition;
19
+ export { createServer } from '../engine';
20
+ export type { ExtendedServerOptions } from '../engine';
21
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../src/schema/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiB,aAAa,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB,CAEnF;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * QuickQL Schema Builder
3
+ *
4
+ * Helper utilities for defining collections and schemas in a clean, code-first manner.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ /**
11
+ * Clean Schema Builder for QuickQL (Code-First)
12
+ */
13
+ export function createSchema(options) {
14
+ return options;
15
+ }
16
+ /**
17
+ * Utility to define individual collections with full type inference.
18
+ */
19
+ export function defineCollection(config) {
20
+ return config;
21
+ }
22
+ export { createServer } from '../engine';
23
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../src/schema/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA4B;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * QuickQL Schema Types
3
+ *
4
+ * Data structures and interfaces for defining collections, fields, and relations.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ import { Query, Mutation } from '@quickql/core';
11
+ export type FieldType = 'string' | 'number' | 'boolean' | 'datetime' | 'json';
12
+ export interface FieldDefinition {
13
+ type: FieldType;
14
+ primary?: boolean;
15
+ required?: boolean;
16
+ unique?: boolean;
17
+ /**
18
+ * Private fields are never returned in results unless explicitly allowed.
19
+ */
20
+ private?: boolean;
21
+ /**
22
+ * Field-level authorization rule.
23
+ */
24
+ auth?: (ctx: any) => boolean | Promise<boolean>;
25
+ /**
26
+ * Field-level roles (RBAC).
27
+ */
28
+ roles?: string[];
29
+ }
30
+ export interface RelationDefinition {
31
+ type: 'one' | 'many';
32
+ model: string;
33
+ foreignKey: string;
34
+ localKey?: string;
35
+ /**
36
+ * Relation-level authorization rule.
37
+ */
38
+ auth?: (ctx: any) => boolean | Promise<boolean>;
39
+ }
40
+ export interface CollectionDefinition {
41
+ model: string;
42
+ fields: Record<string, FieldDefinition | FieldType>;
43
+ relations?: Record<string, RelationDefinition>;
44
+ /**
45
+ * Collection-level authorization rule.
46
+ */
47
+ auth?: (ctx: any) => boolean | Promise<boolean>;
48
+ /**
49
+ * Collection-level roles (RBAC).
50
+ */
51
+ roles?: string[];
52
+ /**
53
+ * Pre-defined security policies (e.g. 'owner-only', 'public').
54
+ */
55
+ policy?: 'public' | 'private' | 'authenticated' | 'owner-only';
56
+ resolver?: (query: Query, ctx: any) => Promise<any[]>;
57
+ mutationResolver?: (mutation: Mutation, ctx: any) => Promise<any>;
58
+ }
59
+ export type QuickQLSchema = Record<string, CollectionDefinition>;
60
+ export interface CustomMutation {
61
+ args?: Record<string, FieldType>;
62
+ resolve: (args: any, ctx: any) => Promise<any>;
63
+ /**
64
+ * Mutation-level authorization rule.
65
+ */
66
+ auth?: (ctx: any) => boolean | Promise<boolean>;
67
+ /**
68
+ * Roles allowed to execute this mutation.
69
+ */
70
+ roles?: string[];
71
+ }
72
+ export interface SchemaOptions {
73
+ collections: QuickQLSchema;
74
+ mutations?: Record<string, CustomMutation>;
75
+ }
76
+ export interface QuickQLServerContext {
77
+ orm: any;
78
+ user?: any;
79
+ [key: string]: any;
80
+ }
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/schema/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C;;OAEG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC;IAE/D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACnE;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C;;OAEG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * QuickQL Schema Types
3
+ *
4
+ * Data structures and interfaces for defining collections, fields, and relations.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/schema/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * QuickQL Schema Utilities
3
+ *
4
+ * Collection of utility functions for schema reflection, prisma model mapping,
5
+ * and automated boilerplate generation.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ import { CollectionDefinition } from './types';
12
+ /**
13
+ * Generates a QuickQL Schema definition from a Prisma or compatible ORM model.
14
+ */
15
+ export declare function generateSchemaFromModel(model: any): CollectionDefinition;
16
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/schema/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,oBAAoB,EAAa,MAAM,SAAS,CAAC;AAE1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,GAAG,oBAAoB,CAkBxE"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * QuickQL Schema Utilities
3
+ *
4
+ * Collection of utility functions for schema reflection, prisma model mapping,
5
+ * and automated boilerplate generation.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ /**
12
+ * Generates a QuickQL Schema definition from a Prisma or compatible ORM model.
13
+ */
14
+ export function generateSchemaFromModel(model) {
15
+ const fields = {};
16
+ // Heuristic based on Prisma properties
17
+ if (model.fields) {
18
+ model.fields.forEach((f) => {
19
+ fields[f.name] = {
20
+ type: mapType(f.type),
21
+ required: f.isRequired,
22
+ private: f.isId && f.name === 'password'
23
+ };
24
+ });
25
+ }
26
+ return {
27
+ model: model.name,
28
+ fields
29
+ };
30
+ }
31
+ function mapType(type) {
32
+ switch (type.toLowerCase()) {
33
+ case 'string': return 'string';
34
+ case 'int':
35
+ case 'float':
36
+ case 'decimal': return 'number';
37
+ case 'boolean': return 'boolean';
38
+ case 'datetime': return 'datetime';
39
+ default: return 'string';
40
+ }
41
+ }
42
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/schema/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAU;IAChD,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,uCAAuC;IACvC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YAC5B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrB,QAAQ,EAAE,CAAC,CAAC,UAAU;gBACtB,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;aAC3C,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IACzB,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC/B,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC;QAChC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,UAAU,CAAC,CAAC,OAAO,UAAiB,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC7B,CAAC;AACL,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * QuickQL Security Engine
3
+ *
4
+ * Enforces authentication, authorization (RBAC), complexity limits, and rate limiting.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ import { Query } from '@quickql/core';
11
+ import { CollectionDefinition, QuickQLServerContext } from './schema/types';
12
+ import { RBACConfig, AuthConfig } from './types';
13
+ export declare class SecurityEngine {
14
+ private options;
15
+ private schemaSnapshot?;
16
+ private rateLimitMap;
17
+ constructor(options: {
18
+ maxDepth: number;
19
+ rateLimit?: number;
20
+ maxComplexity?: number;
21
+ rbac?: RBACConfig;
22
+ auth?: AuthConfig;
23
+ }, schemaSnapshot?: any | undefined);
24
+ /**
25
+ * Enforces strict query depth limiting for security.
26
+ */
27
+ validateDepth(query: Query, currentDepth?: number): void;
28
+ private calculateComplexity;
29
+ /**
30
+ * Verifies if the current context is authorized to access the collection or mutation.
31
+ */
32
+ validateAuth(name: string, definition: CollectionDefinition | any, ctx: QuickQLServerContext, isMutation?: boolean): Promise<void>;
33
+ /**
34
+ * Filters the results to remove fields marked as 'private' or failing field-level auth.
35
+ */
36
+ filterResults(collection: CollectionDefinition, data: any[], ctx: QuickQLServerContext): Promise<any[]>;
37
+ /**
38
+ * Simple Memory-based Rate Limiter.
39
+ */
40
+ checkRateLimit(key: string): void;
41
+ /**
42
+ * Basic input sanitization.
43
+ */
44
+ sanitize(input: any): any;
45
+ }
46
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAY,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,cAAc;IAIvB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,cAAc,CAAC;IAVzB,OAAO,CAAC,YAAY,CAA2D;gBAGrE,OAAO,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB,EACO,cAAc,CAAC,EAAE,GAAG,YAAA;IAG9B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,SAAI,GAAG,IAAI;IAkBnD,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,GAAG,GAAG,EACtC,GAAG,EAAE,oBAAoB,EACzB,UAAU,UAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IAuDhB;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,oBAAoB,EAChC,IAAI,EAAE,GAAG,EAAE,EACX,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,GAAG,EAAE,CAAC;IAmDjB;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAqBjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAmB1B"}