@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Udinmo Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # @quickql/server
2
+
3
+ A high-performance, schema-driven API engine with native relational mapping and enterprise security by **Udinmo Inc.**
4
+
5
+ ## Features
6
+
7
+ - **🚀 Ultra-Fast Relations**: Native $O(N+M)$ relation resolver that eliminates the N+1 problem without DataLoaders.
8
+ - **🔐 Enterprise Security**: Integrated RBAC (Role-Based Access Control), depth limiting, and complexity scoring.
9
+ - **🛠️ Zero-Boilerplate**: Fully automated resolver mapping for Prisma and other standard ORMs.
10
+ - **📦 Multi-Strategy Auth**: Built-in hooks for JWT, API Keys, and custom authentication.
11
+ - **🎨 Supreme Console**: A premium browser IDE for exploring your schema, traversing data relations, and testing queries.
12
+ - **⚡ Atomic Transactions**: Native support for batch mutation transactions at the engine level.
13
+
14
+ ## Getting Started
15
+
16
+ ### Installation
17
+
18
+ ```bash
19
+ npm install @quickql/server
20
+ ```
21
+
22
+ ### Basic Server Initialization
23
+
24
+ ```typescript
25
+ import { createServer } from '@quickql/server';
26
+ import { PrismaClient } from '@prisma/client';
27
+
28
+ const orm = new PrismaClient();
29
+
30
+ const server = createServer({
31
+ orm,
32
+ schema: {
33
+ users: {
34
+ model: 'User',
35
+ fields: ['id', 'email', 'name'],
36
+ relations: {
37
+ posts: { type: 'many', model: 'Post', foreignKey: 'userId' }
38
+ }
39
+ }
40
+ },
41
+ auth: {
42
+ secret: 'udinmo-secret-123'
43
+ },
44
+ rbac: {
45
+ roles: {
46
+ 'admin': { can: ['*'], write: ['*'] },
47
+ 'user': { can: ['users', 'posts'] }
48
+ }
49
+ }
50
+ });
51
+
52
+ // Use it with any HTTP framework (e.g. Express)
53
+ app.post('/quickql', async (req, res) => {
54
+ const result = await server.handleRequest(req.body, { ip: req.ip });
55
+ res.json(result);
56
+ });
57
+ ```
58
+
59
+ ## Advanced Customization
60
+
61
+ ### Directives
62
+ Extend the query language with custom `@tags`:
63
+
64
+ ```typescript
65
+ const server = createServer({
66
+ directives: [
67
+ {
68
+ name: 'upper',
69
+ handler: (results) => results.map(row => ({ ...row, name: row.name?.toUpperCase() }))
70
+ }
71
+ ]
72
+ });
73
+ ```
74
+
75
+ ### Lifecycle Hooks (Plugins)
76
+ Intercept any part of the execution flow:
77
+
78
+ ```typescript
79
+ server.use({
80
+ name: 'audit-plugin',
81
+ onMutation: async (m, ctx) => {
82
+ console.log(`[AUDIT] Created ${m.collection} by ${ctx.user.id}`);
83
+ }
84
+ });
85
+ ```
86
+
87
+ ## License
88
+
89
+ (c) 2024-2026 Udinmo Inc. All rights reserved.
90
+ MIT Licensed — see LICENSE for details.
91
+ Author: [Udinmo Inc.](https://udinmo.com)
@@ -0,0 +1,57 @@
1
+ /**
2
+ * QuickQL Core Client
3
+ *
4
+ * Standard HTTP client for interacting with QuickQL servers across
5
+ * all JavaScript environments. Handles batching, caching, and plugins.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ import { Query, Mutation, QuickQLRequest, QuickQLResponse, QuickQLError } from './types';
12
+ export interface ClientOptions {
13
+ endpoint: string;
14
+ headers?: Record<string, string>;
15
+ timeout?: number;
16
+ retry?: number;
17
+ cacheTTL?: number;
18
+ plugins?: QuickQLPlugin[];
19
+ }
20
+ export type LifecycleHook = 'beforeRequest' | 'afterResponse' | 'onError';
21
+ export interface QuickQLPlugin {
22
+ name: string;
23
+ onBeforeRequest?: (request: QuickQLRequest, context: any) => QuickQLRequest | Promise<QuickQLRequest>;
24
+ onAfterResponse?: (response: QuickQLResponse, context: any) => QuickQLResponse | Promise<QuickQLResponse>;
25
+ onError?: (error: QuickQLError, context: any) => void | Promise<void>;
26
+ }
27
+ /**
28
+ * Universal QuickQL Client for Browser and Node.js
29
+ */
30
+ export declare class QuickQLClient {
31
+ private cache;
32
+ private options;
33
+ constructor(options: ClientOptions);
34
+ /**
35
+ * Main Query operation.
36
+ */
37
+ query<T = any>(query: Query, alias?: string): Promise<QuickQLResponse<T>>;
38
+ /**
39
+ * Main Mutation operation.
40
+ */
41
+ mutation<T = any>(mutation: Mutation, alias?: string): Promise<QuickQLResponse<T>>;
42
+ /**
43
+ * Batch multiple queries and mutations.
44
+ */
45
+ batch(items: (Query | Mutation)[], transaction?: boolean): Promise<QuickQLResponse<any>>;
46
+ /**
47
+ * Low-level execution logic with plugin support.
48
+ */
49
+ private execute;
50
+ private handleError;
51
+ private getCacheKey;
52
+ private getFromCache;
53
+ private setInCache;
54
+ clearCache(): void;
55
+ setHeaders(headers: Record<string, string>): void;
56
+ }
57
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../core/src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAC/D,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,eAAe,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACtG,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1G,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAqD;IAClE,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,EAAE,aAAa;IAelC;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,MAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAoBvF;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAE,MAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAWhG;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAS5F;;OAEG;YACW,OAAO;IAgDrB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,UAAU;IASX,UAAU;IAIV,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGlD"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * QuickQL Core Client
3
+ *
4
+ * Standard HTTP client for interacting with QuickQL servers across
5
+ * all JavaScript environments. Handles batching, caching, and plugins.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ /**
12
+ * Universal QuickQL Client for Browser and Node.js
13
+ */
14
+ export class QuickQLClient {
15
+ cache = new Map();
16
+ options;
17
+ constructor(options) {
18
+ this.options = {
19
+ endpoint: options.endpoint,
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ 'X-QuickQL-Version': '1.0.0',
23
+ ...(options.headers || {})
24
+ },
25
+ timeout: options.timeout || 15000,
26
+ retry: options.retry || 1,
27
+ cacheTTL: options.cacheTTL || 0,
28
+ plugins: options.plugins || []
29
+ };
30
+ }
31
+ /**
32
+ * Main Query operation.
33
+ */
34
+ async query(query, alias = 'data') {
35
+ const key = this.getCacheKey({ query, alias });
36
+ const cached = this.getFromCache(key);
37
+ if (cached)
38
+ return cached;
39
+ try {
40
+ const response = await this.execute({
41
+ queries: { [alias]: query }
42
+ });
43
+ const res = response;
44
+ if (res.data && !res.errors) {
45
+ this.setInCache(key, res);
46
+ }
47
+ return res;
48
+ }
49
+ catch (error) {
50
+ return this.handleError(error);
51
+ }
52
+ }
53
+ /**
54
+ * Main Mutation operation.
55
+ */
56
+ async mutation(mutation, alias = 'data') {
57
+ try {
58
+ const response = await this.execute({
59
+ mutations: { [alias]: mutation }
60
+ });
61
+ return response;
62
+ }
63
+ catch (error) {
64
+ return this.handleError(error);
65
+ }
66
+ }
67
+ /**
68
+ * Batch multiple queries and mutations.
69
+ */
70
+ async batch(items, transaction = false) {
71
+ try {
72
+ const response = await this.execute({ batch: items, transaction });
73
+ return response;
74
+ }
75
+ catch (error) {
76
+ return this.handleError(error);
77
+ }
78
+ }
79
+ /**
80
+ * Low-level execution logic with plugin support.
81
+ */
82
+ async execute(request, retries = this.options.retry) {
83
+ let currentRequest = request;
84
+ // Trigger onBeforeRequest hooks
85
+ for (const plugin of this.options.plugins) {
86
+ if (plugin.onBeforeRequest) {
87
+ currentRequest = await plugin.onBeforeRequest(currentRequest, this);
88
+ }
89
+ }
90
+ const controller = new AbortController();
91
+ const timeoutId = setTimeout(() => controller.abort(), this.options.timeout);
92
+ try {
93
+ const response = await fetch(this.options.endpoint, {
94
+ method: 'POST',
95
+ headers: this.options.headers,
96
+ body: JSON.stringify(currentRequest),
97
+ signal: controller.signal
98
+ });
99
+ clearTimeout(timeoutId);
100
+ if (!response.ok) {
101
+ throw new Error(`QuickQL Client Error: ${response.status} ${response.statusText}`);
102
+ }
103
+ let data = await response.json();
104
+ // Trigger onAfterResponse hooks
105
+ for (const plugin of this.options.plugins) {
106
+ if (plugin.onAfterResponse) {
107
+ data = await plugin.onAfterResponse(data, this);
108
+ }
109
+ }
110
+ return data;
111
+ }
112
+ catch (error) {
113
+ clearTimeout(timeoutId);
114
+ if (retries > 0 && error.name !== 'AbortError') {
115
+ return this.execute(request, retries - 1);
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ handleError(error) {
121
+ const isTimeout = error.name === 'AbortError';
122
+ const quickError = {
123
+ type: isTimeout ? 'NETWORK' : 'INTERNAL',
124
+ message: error.message || 'Unknown QuickQL Client error',
125
+ code: isTimeout ? 'TIMEOUT' : 'CLIENT_EXCEPTION'
126
+ };
127
+ // Trigger plugins
128
+ for (const plugin of this.options.plugins) {
129
+ if (plugin.onError) {
130
+ plugin.onError(quickError, this);
131
+ }
132
+ }
133
+ return {
134
+ data: null,
135
+ errors: [quickError]
136
+ };
137
+ }
138
+ getCacheKey(request) {
139
+ return JSON.stringify(request);
140
+ }
141
+ getFromCache(key) {
142
+ const cached = this.cache.get(key);
143
+ if (cached && cached.expiry > Date.now()) {
144
+ return cached.value;
145
+ }
146
+ this.cache.delete(key);
147
+ return null;
148
+ }
149
+ setInCache(key, value) {
150
+ if (this.options.cacheTTL > 0) {
151
+ this.cache.set(key, {
152
+ value,
153
+ expiry: Date.now() + this.options.cacheTTL
154
+ });
155
+ }
156
+ }
157
+ clearCache() {
158
+ this.cache.clear();
159
+ }
160
+ setHeaders(headers) {
161
+ this.options.headers = { ...this.options.headers, ...headers };
162
+ }
163
+ }
164
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../core/src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwBH;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC1D,OAAO,CAA0B;IAEzC,YAAY,OAAsB;QAChC,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,mBAAmB,EAAE,OAAO;gBAC5B,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;aAC3B;YACD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAU,KAAY,EAAE,QAAgB,MAAM;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAClC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE;aAC5B,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,QAA8B,CAAC;YAC3C,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAU,QAAkB,EAAE,QAAgB,MAAM;QAChE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAClC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE;aACjC,CAAC,CAAC;YACH,OAAO,QAAqC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAA2B,EAAE,WAAW,GAAG,KAAK;QAC1D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACnE,OAAO,QAAuC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;QACzE,IAAI,cAAc,GAAG,OAAO,CAAC;QAE7B,gCAAgC;QAChC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,cAAc,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;gBACpC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEjC,gCAAgC;YAChC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW,CAAU,KAAU;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;QAC9C,MAAM,UAAU,GAAiB;YAC/B,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,8BAA8B;YACxD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;SACjD,CAAC;QAEF,kBAAkB;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,CAAC,UAAU,CAAC;SACrB,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,OAAY;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,KAAU;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBAClB,KAAK;gBACL,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEM,UAAU,CAAC,OAA+B;QAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * QuickQL Core SDK
3
+ *
4
+ * Shared logic and client for the QuickQL ecosystem.
5
+ * Managed by Udinmo Inc.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ export * from './types';
12
+ export * from './client';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * QuickQL Core SDK
3
+ *
4
+ * Shared logic and client for the QuickQL ecosystem.
5
+ * Managed by Udinmo Inc.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ export * from './types';
12
+ export * from './client';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../core/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * QuickQL Core Types
3
+ *
4
+ * Shared type definitions for queries, mutations, and responses.
5
+ * Ensured parity between server and client expectations.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ /**
12
+ * QuickQL Core Types - Refined for Production
13
+ */
14
+ export type Operator = 'eq' | 'ne' | 'gt' | 'lt' | 'in' | 'contains' | 'startsWith' | 'endsWith';
15
+ export type WhereValue = string | number | boolean | Array<string | number | boolean> | null;
16
+ export type WhereCondition = {
17
+ [operator in Operator]?: WhereValue;
18
+ } | WhereValue;
19
+ export type LogicalCondition = {
20
+ AND?: (WhereClause | LogicalCondition)[];
21
+ OR?: (WhereClause | LogicalCondition)[];
22
+ };
23
+ export type WhereClause = {
24
+ [field: string]: WhereCondition | LogicalCondition;
25
+ };
26
+ export type IncludeClause = {
27
+ [relation: string]: Partial<Query>;
28
+ };
29
+ export type OrderDirection = 'asc' | 'desc';
30
+ export type OrderBy = {
31
+ [field: string]: OrderDirection;
32
+ };
33
+ export interface Query {
34
+ from: string;
35
+ select?: string[];
36
+ alias?: string;
37
+ where?: WhereClause | LogicalCondition;
38
+ include?: IncludeClause;
39
+ limit?: number;
40
+ offset?: number;
41
+ orderBy?: OrderBy;
42
+ aggregate?: {
43
+ count?: boolean;
44
+ sum?: string;
45
+ avg?: string;
46
+ max?: string;
47
+ min?: string;
48
+ };
49
+ directives?: Record<string, any>;
50
+ }
51
+ export type MutationType = 'create' | 'update' | 'delete';
52
+ export interface Mutation {
53
+ type: MutationType;
54
+ collection: string;
55
+ data?: Record<string, unknown>;
56
+ where?: WhereClause | LogicalCondition;
57
+ select?: string[];
58
+ }
59
+ export interface QuickQLRequest {
60
+ queries?: Record<string, Query>;
61
+ mutations?: Record<string, Mutation>;
62
+ batch?: (Query | Mutation)[];
63
+ transaction?: boolean;
64
+ }
65
+ export interface QuickQLError {
66
+ type: 'VALIDATION' | 'NETWORK' | 'AUTH' | 'INTERNAL' | 'NOT_FOUND' | 'SECURITY';
67
+ message: string;
68
+ code?: string;
69
+ path?: string[];
70
+ stack?: string;
71
+ }
72
+ export interface QuickQLResponse<T = unknown> {
73
+ data: T | null;
74
+ errors?: QuickQLError[];
75
+ meta?: {
76
+ count?: number;
77
+ total?: number;
78
+ executionTime?: number;
79
+ hints?: string[];
80
+ };
81
+ }
82
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../core/src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * QuickQL Core Types
3
+ *
4
+ * Shared type definitions for queries, mutations, and responses.
5
+ * Ensured parity between server and client expectations.
6
+ *
7
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
8
+ * Author: Udinmo Inc. <engineering@udinmo.com>
9
+ * License: MIT
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../core/src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * QuickQL Server Engine
3
+ *
4
+ * Central orchestration layer for parsing, validating, and executing QuickQL requests.
5
+ *
6
+ * (c) 2024-2026 Udinmo Inc. All rights reserved.
7
+ * Author: Udinmo Inc. <engineering@udinmo.com>
8
+ * License: MIT
9
+ */
10
+ import { QuickQLResponse, QuickQLRequest } from '@quickql/core';
11
+ import { SchemaConfig, ServerOptions, QuickQLPlugin, ServerFeatures } from './types';
12
+ import { SchemaOptions } from './schema/types';
13
+ export interface ExtendedServerOptions extends Partial<ServerOptions> {
14
+ schema?: SchemaConfig;
15
+ orm?: any;
16
+ schemaOptions?: SchemaOptions;
17
+ features?: ServerFeatures;
18
+ }
19
+ export declare class QuickQLServer {
20
+ private options;
21
+ private validator;
22
+ private executor;
23
+ private security;
24
+ private cache;
25
+ private activePlugins;
26
+ constructor(options: ExtendedServerOptions);
27
+ use(plugin: QuickQLPlugin): this;
28
+ getOptions(): Required<ExtendedServerOptions>;
29
+ getSchemaSummary(): {
30
+ name: string;
31
+ fields: string[] | Record<string, any>;
32
+ relations: {
33
+ name: string;
34
+ target: string;
35
+ }[];
36
+ }[];
37
+ private mapRelations;
38
+ /**
39
+ * Main Entry Point with security enforcement and context building.
40
+ */
41
+ handleRequest(requestInput: QuickQLRequest | string, reqCtx?: any): Promise<QuickQLResponse>;
42
+ private processSyntaxMutations;
43
+ private processQuery;
44
+ private processMutation;
45
+ private shouldRunHook;
46
+ private runBeforeQueryHook;
47
+ private runAfterQueryHook;
48
+ private runOnMutationHook;
49
+ private runBeforeMutationHook;
50
+ private runOnErrorHook;
51
+ private generateSmartHints;
52
+ private log;
53
+ }
54
+ export declare function createServer(options: ExtendedServerOptions): QuickQLServer;
55
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAwB,cAAc,EAAE,MAAM,SAAS,CAAC;AAS3G,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAErE,MAAM,WAAW,qBAAsB,SAAQ,OAAO,CAAC,aAAa,CAAC;IACnE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAiE;IAC9E,OAAO,CAAC,aAAa,CAAuB;gBAEhC,OAAO,EAAE,qBAAqB;IA4DnC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAKhC,UAAU,IAAI,QAAQ,CAAC,qBAAqB,CAAC;IAI7C,gBAAgB;;;;;;;;IAQvB,OAAO,CAAC,YAAY;IAapB;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,cAAc,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC;IAkIlG,OAAO,CAAC,sBAAsB;YAehB,YAAY;YAuDZ,eAAe;YAsCf,aAAa;YAKb,kBAAkB;YAWlB,iBAAiB;YAWjB,iBAAiB;YAQjB,qBAAqB;YAWrB,cAAc;IAQ5B,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,GAAG;CAgCZ;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAE1E"}