@cedarjs/gqlorm 2.6.1-next.104
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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/cjs/generator/graphqlGenerator.d.ts +24 -0
- package/dist/cjs/generator/graphqlGenerator.d.ts.map +1 -0
- package/dist/cjs/generator/graphqlGenerator.js +421 -0
- package/dist/cjs/live/types.d.ts +262 -0
- package/dist/cjs/live/types.d.ts.map +1 -0
- package/dist/cjs/live/types.js +16 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/parser/queryParser.d.ts +27 -0
- package/dist/cjs/parser/queryParser.d.ts.map +1 -0
- package/dist/cjs/parser/queryParser.js +338 -0
- package/dist/cjs/queryBuilder.d.ts +106 -0
- package/dist/cjs/queryBuilder.d.ts.map +1 -0
- package/dist/cjs/queryBuilder.js +225 -0
- package/dist/cjs/react/useLiveQuery.d.ts +12 -0
- package/dist/cjs/react/useLiveQuery.d.ts.map +1 -0
- package/dist/cjs/react/useLiveQuery.js +62 -0
- package/dist/cjs/types/ast.d.ts +80 -0
- package/dist/cjs/types/ast.d.ts.map +1 -0
- package/dist/cjs/types/ast.js +16 -0
- package/dist/cjs/types/orm.d.ts +157 -0
- package/dist/cjs/types/orm.d.ts.map +1 -0
- package/dist/cjs/types/orm.js +16 -0
- package/dist/cjs/types/orm_for_testing.d.ts +44 -0
- package/dist/cjs/types/orm_for_testing.d.ts.map +1 -0
- package/dist/cjs/types/orm_for_testing.js +16 -0
- package/dist/cjs/types/schema.d.ts +4 -0
- package/dist/cjs/types/schema.d.ts.map +1 -0
- package/dist/cjs/types/schema.js +16 -0
- package/dist/cjs/types/typeUtils.d.ts +10 -0
- package/dist/cjs/types/typeUtils.d.ts.map +1 -0
- package/dist/cjs/types/typeUtils.js +65 -0
- package/dist/generator/graphqlGenerator.d.ts +24 -0
- package/dist/generator/graphqlGenerator.d.ts.map +1 -0
- package/dist/generator/graphqlGenerator.js +399 -0
- package/dist/live/types.d.ts +262 -0
- package/dist/live/types.d.ts.map +1 -0
- package/dist/live/types.js +0 -0
- package/dist/parser/queryParser.d.ts +27 -0
- package/dist/parser/queryParser.d.ts.map +1 -0
- package/dist/parser/queryParser.js +312 -0
- package/dist/queryBuilder.d.ts +106 -0
- package/dist/queryBuilder.d.ts.map +1 -0
- package/dist/queryBuilder.js +196 -0
- package/dist/react/useLiveQuery.d.ts +12 -0
- package/dist/react/useLiveQuery.d.ts.map +1 -0
- package/dist/react/useLiveQuery.js +38 -0
- package/dist/types/ast.d.ts +80 -0
- package/dist/types/ast.d.ts.map +1 -0
- package/dist/types/ast.js +0 -0
- package/dist/types/orm.d.ts +157 -0
- package/dist/types/orm.d.ts.map +1 -0
- package/dist/types/orm.js +0 -0
- package/dist/types/orm_for_testing.d.ts +44 -0
- package/dist/types/orm_for_testing.d.ts.map +1 -0
- package/dist/types/orm_for_testing.js +0 -0
- package/dist/types/schema.d.ts +4 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +0 -0
- package/dist/types/typeUtils.d.ts +10 -0
- package/dist/types/typeUtils.d.ts.map +1 -0
- package/dist/types/typeUtils.js +34 -0
- package/package.json +163 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main query builder entry point that combines parsing and generation
|
|
3
|
+
* This is the primary API that users will interact with
|
|
4
|
+
*/
|
|
5
|
+
import { GraphQLGenerateError } from './generator/graphqlGenerator.js';
|
|
6
|
+
import type { GraphQLQuery } from './generator/graphqlGenerator.js';
|
|
7
|
+
import { QueryParseError } from './parser/queryParser.js';
|
|
8
|
+
import type { QueryAST, QueryOperation } from './types/ast.js';
|
|
9
|
+
import { type FindFirstArgs, type FindManyArgs, type FindUniqueArgs, type FrameworkDbClient, type QueryFunction } from './types/orm.js';
|
|
10
|
+
import type { ModelSchema } from './types/schema.js';
|
|
11
|
+
export declare class QueryBuilderError extends Error {
|
|
12
|
+
cause?: Error | undefined;
|
|
13
|
+
constructor(message: string, cause?: Error | undefined);
|
|
14
|
+
}
|
|
15
|
+
type GenericQueryArgs = FindManyArgs<unknown> | FindUniqueArgs<unknown> | FindFirstArgs<unknown>;
|
|
16
|
+
export interface QueryBuilderOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Whether to validate queries against schema (future feature)
|
|
19
|
+
*/
|
|
20
|
+
readonly validateSchema?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Whether to optimize queries (future feature)
|
|
23
|
+
*/
|
|
24
|
+
readonly optimizeQueries?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Custom field name mappings (future feature)
|
|
27
|
+
*/
|
|
28
|
+
fieldMappings?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Whether to automatically add @live directive to queries
|
|
31
|
+
* @default false
|
|
32
|
+
*/
|
|
33
|
+
readonly enableLiveQueries?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether to force @live directive on all queries (overrides
|
|
36
|
+
* enableLiveQueries)
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
readonly forceLiveQueries?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Model schema defining scalar fields for each model
|
|
42
|
+
*/
|
|
43
|
+
readonly schema?: ModelSchema;
|
|
44
|
+
}
|
|
45
|
+
export declare class QueryBuilder {
|
|
46
|
+
#private;
|
|
47
|
+
constructor(options?: QueryBuilderOptions);
|
|
48
|
+
/**
|
|
49
|
+
* Build GraphQL query from ORM-style query
|
|
50
|
+
*/
|
|
51
|
+
build(model: string, operation: QueryOperation, args?: GenericQueryArgs, options?: {
|
|
52
|
+
isLive?: boolean;
|
|
53
|
+
}): GraphQLQuery;
|
|
54
|
+
/**
|
|
55
|
+
* Build GraphQL query from a query function (used with useLiveQuery)
|
|
56
|
+
*/
|
|
57
|
+
buildFromFunction<T, TDb extends object = FrameworkDbClient>(queryFn: QueryFunction<T, TDb>, options?: {
|
|
58
|
+
isLive?: boolean;
|
|
59
|
+
}): GraphQLQuery;
|
|
60
|
+
/**
|
|
61
|
+
* Capture query details from a query function using a proxy
|
|
62
|
+
*/
|
|
63
|
+
private captureQuery;
|
|
64
|
+
/**
|
|
65
|
+
* Create a proxy database client that captures method calls
|
|
66
|
+
*/
|
|
67
|
+
private createProxyDatabase;
|
|
68
|
+
/**
|
|
69
|
+
* Create a proxy model delegate that captures method calls
|
|
70
|
+
*/
|
|
71
|
+
private createModelDelegate;
|
|
72
|
+
/**
|
|
73
|
+
* Parse AST from query (exposed for advanced usage)
|
|
74
|
+
*/
|
|
75
|
+
parseAST(model: string, operation: QueryOperation, args?: GenericQueryArgs): QueryAST;
|
|
76
|
+
/**
|
|
77
|
+
* Generate GraphQL from AST (exposed for advanced usage)
|
|
78
|
+
*/
|
|
79
|
+
generateGraphQL(ast: QueryAST): GraphQLQuery;
|
|
80
|
+
/**
|
|
81
|
+
* Get query builder options
|
|
82
|
+
*/
|
|
83
|
+
getOptions(): QueryBuilderOptions;
|
|
84
|
+
/**
|
|
85
|
+
* Update query builder options
|
|
86
|
+
*/
|
|
87
|
+
updateOptions(newOptions: Partial<QueryBuilderOptions>): void;
|
|
88
|
+
}
|
|
89
|
+
export declare const queryBuilder: QueryBuilder;
|
|
90
|
+
export declare function buildQuery(model: string, operation: QueryOperation, args?: GenericQueryArgs, options?: {
|
|
91
|
+
isLive?: boolean;
|
|
92
|
+
}): GraphQLQuery;
|
|
93
|
+
export declare function buildQueryFromFunction<T, TDb extends object = FrameworkDbClient>(queryFn: QueryFunction<T, TDb>, options?: {
|
|
94
|
+
isLive?: boolean;
|
|
95
|
+
}): GraphQLQuery;
|
|
96
|
+
/**
|
|
97
|
+
* Build a live GraphQL query from ORM-style query (convenience function)
|
|
98
|
+
*/
|
|
99
|
+
export declare function buildLiveQuery(model: string, operation: QueryOperation, args?: GenericQueryArgs): GraphQLQuery;
|
|
100
|
+
/**
|
|
101
|
+
* Build a live GraphQL query from a query function (convenience function)
|
|
102
|
+
*/
|
|
103
|
+
export declare function buildLiveQueryFromFunction<T, TDb extends object = FrameworkDbClient>(queryFn: QueryFunction<T, TDb>): GraphQLQuery;
|
|
104
|
+
export { GraphQLGenerateError, QueryParseError };
|
|
105
|
+
export type { GraphQLQuery, QueryAST, QueryOperation, ModelSchema };
|
|
106
|
+
//# sourceMappingURL=queryBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilder.d.ts","sourceRoot":"","sources":["../../src/queryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var queryBuilder_exports = {};
|
|
20
|
+
__export(queryBuilder_exports, {
|
|
21
|
+
GraphQLGenerateError: () => import_graphqlGenerator.GraphQLGenerateError,
|
|
22
|
+
QueryBuilder: () => QueryBuilder,
|
|
23
|
+
QueryBuilderError: () => QueryBuilderError,
|
|
24
|
+
QueryParseError: () => import_queryParser.QueryParseError,
|
|
25
|
+
buildLiveQuery: () => buildLiveQuery,
|
|
26
|
+
buildLiveQueryFromFunction: () => buildLiveQueryFromFunction,
|
|
27
|
+
buildQuery: () => buildQuery,
|
|
28
|
+
buildQueryFromFunction: () => buildQueryFromFunction,
|
|
29
|
+
queryBuilder: () => queryBuilder
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(queryBuilder_exports);
|
|
32
|
+
var import_graphqlGenerator = require("./generator/graphqlGenerator.js");
|
|
33
|
+
var import_queryParser = require("./parser/queryParser.js");
|
|
34
|
+
class QueryBuilderError extends Error {
|
|
35
|
+
constructor(message, cause) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.cause = cause;
|
|
38
|
+
this.name = "QueryBuilderError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
class QueryBuilder {
|
|
42
|
+
#parser = new import_queryParser.QueryParser();
|
|
43
|
+
#generator;
|
|
44
|
+
#options;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.#options = structuredClone(options);
|
|
47
|
+
this.#generator = new import_graphqlGenerator.GraphQLGenerator(options.schema);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build GraphQL query from ORM-style query
|
|
51
|
+
*/
|
|
52
|
+
build(model, operation, args, options) {
|
|
53
|
+
try {
|
|
54
|
+
const ast = this.#parser.parseQuery(model, operation, args);
|
|
55
|
+
const isLive = this.#shouldUseLiveQuery(options?.isLive);
|
|
56
|
+
if (isLive) {
|
|
57
|
+
ast.isLive = true;
|
|
58
|
+
}
|
|
59
|
+
this.#parser.validateAST(ast);
|
|
60
|
+
const graphqlQuery = this.#generator.generate(ast);
|
|
61
|
+
return graphqlQuery;
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error instanceof import_queryParser.QueryParseError || error instanceof import_graphqlGenerator.GraphQLGenerateError) {
|
|
64
|
+
throw new QueryBuilderError(
|
|
65
|
+
`Failed to build query: ${error.message}`,
|
|
66
|
+
error
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
buildFromFunction(queryFn, options) {
|
|
73
|
+
const capturedQuery = this.captureQuery(queryFn);
|
|
74
|
+
if (!capturedQuery) {
|
|
75
|
+
throw new QueryBuilderError(
|
|
76
|
+
"No query was captured from the provided function"
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return this.build(
|
|
80
|
+
capturedQuery.model,
|
|
81
|
+
capturedQuery.operation,
|
|
82
|
+
capturedQuery.args,
|
|
83
|
+
options
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Capture query details from a query function using a proxy
|
|
88
|
+
*/
|
|
89
|
+
captureQuery(queryFn) {
|
|
90
|
+
let capturedQuery = null;
|
|
91
|
+
const proxyDb = this.createProxyDatabase((model, operation, args) => {
|
|
92
|
+
capturedQuery = { model, operation, args };
|
|
93
|
+
return {};
|
|
94
|
+
});
|
|
95
|
+
try {
|
|
96
|
+
queryFn(proxyDb);
|
|
97
|
+
return capturedQuery;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
const e = error instanceof Error ? error : new Error(String(error));
|
|
100
|
+
throw new QueryBuilderError("Failed to capture query from function", e);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a proxy database client that captures method calls
|
|
105
|
+
*/
|
|
106
|
+
createProxyDatabase(onQuery) {
|
|
107
|
+
const proxyTarget = {};
|
|
108
|
+
return new Proxy(proxyTarget, {
|
|
109
|
+
get: (_, modelName) => {
|
|
110
|
+
if (typeof modelName !== "string") {
|
|
111
|
+
return void 0;
|
|
112
|
+
}
|
|
113
|
+
return this.createModelDelegate(modelName, onQuery);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a proxy model delegate that captures method calls
|
|
119
|
+
*/
|
|
120
|
+
createModelDelegate(model, onQuery) {
|
|
121
|
+
return {
|
|
122
|
+
findMany: (args) => {
|
|
123
|
+
onQuery(model, "findMany", args);
|
|
124
|
+
return Promise.resolve([]);
|
|
125
|
+
},
|
|
126
|
+
findUnique: (args) => {
|
|
127
|
+
onQuery(model, "findUnique", args);
|
|
128
|
+
return Promise.resolve(null);
|
|
129
|
+
},
|
|
130
|
+
findFirst: (args) => {
|
|
131
|
+
onQuery(model, "findFirst", args);
|
|
132
|
+
return Promise.resolve(null);
|
|
133
|
+
},
|
|
134
|
+
findUniqueOrThrow: (args) => {
|
|
135
|
+
onQuery(model, "findUniqueOrThrow", args);
|
|
136
|
+
return Promise.resolve(void 0);
|
|
137
|
+
},
|
|
138
|
+
findFirstOrThrow: (args) => {
|
|
139
|
+
onQuery(model, "findFirstOrThrow", args);
|
|
140
|
+
return Promise.resolve(void 0);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Parse AST from query (exposed for advanced usage)
|
|
146
|
+
*/
|
|
147
|
+
parseAST(model, operation, args) {
|
|
148
|
+
try {
|
|
149
|
+
return this.#parser.parseQuery(model, operation, args);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
if (error instanceof import_queryParser.QueryParseError) {
|
|
152
|
+
throw new QueryBuilderError(
|
|
153
|
+
`Failed to parse query: ${error.message}`,
|
|
154
|
+
error
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generate GraphQL from AST (exposed for advanced usage)
|
|
162
|
+
*/
|
|
163
|
+
generateGraphQL(ast) {
|
|
164
|
+
try {
|
|
165
|
+
return this.#generator.generate(ast);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (error instanceof import_graphqlGenerator.GraphQLGenerateError) {
|
|
168
|
+
throw new QueryBuilderError(
|
|
169
|
+
`Failed to generate GraphQL: ${error.message}`,
|
|
170
|
+
error
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get query builder options
|
|
178
|
+
*/
|
|
179
|
+
getOptions() {
|
|
180
|
+
return structuredClone(this.#options);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Update query builder options
|
|
184
|
+
*/
|
|
185
|
+
updateOptions(newOptions) {
|
|
186
|
+
this.#options = { ...this.#options, ...newOptions };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Determine if a query should use @live directive
|
|
190
|
+
*/
|
|
191
|
+
#shouldUseLiveQuery(explicitIsLive) {
|
|
192
|
+
if (explicitIsLive !== void 0) {
|
|
193
|
+
return explicitIsLive;
|
|
194
|
+
}
|
|
195
|
+
if (this.#options.forceLiveQueries) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
return this.#options.enableLiveQueries || false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const queryBuilder = new QueryBuilder();
|
|
202
|
+
function buildQuery(model, operation, args, options) {
|
|
203
|
+
return queryBuilder.build(model, operation, args, options);
|
|
204
|
+
}
|
|
205
|
+
function buildQueryFromFunction(queryFn, options) {
|
|
206
|
+
return queryBuilder.buildFromFunction(queryFn, options);
|
|
207
|
+
}
|
|
208
|
+
function buildLiveQuery(model, operation, args) {
|
|
209
|
+
return queryBuilder.build(model, operation, args, { isLive: true });
|
|
210
|
+
}
|
|
211
|
+
function buildLiveQueryFromFunction(queryFn) {
|
|
212
|
+
return queryBuilder.buildFromFunction(queryFn, { isLive: true });
|
|
213
|
+
}
|
|
214
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
215
|
+
0 && (module.exports = {
|
|
216
|
+
GraphQLGenerateError,
|
|
217
|
+
QueryBuilder,
|
|
218
|
+
QueryBuilderError,
|
|
219
|
+
QueryParseError,
|
|
220
|
+
buildLiveQuery,
|
|
221
|
+
buildLiveQueryFromFunction,
|
|
222
|
+
buildQuery,
|
|
223
|
+
buildQueryFromFunction,
|
|
224
|
+
queryBuilder
|
|
225
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for live data fetching using GraphQL queries with `@live`
|
|
3
|
+
* generated from Prisma-like query functions.
|
|
4
|
+
*/
|
|
5
|
+
import { useQuery as cedarUseQuery } from '@cedarjs/web';
|
|
6
|
+
import type { FrameworkDbClient, QueryFunction } from '../types/orm.js';
|
|
7
|
+
export type UseLiveQueryOptions = Omit<NonNullable<Parameters<typeof cedarUseQuery>[1]>, 'variables'>;
|
|
8
|
+
export type UseLiveQueryResult<T> = Omit<ReturnType<typeof cedarUseQuery>, 'data'> & {
|
|
9
|
+
data: T | undefined;
|
|
10
|
+
};
|
|
11
|
+
export declare function useLiveQuery<T, TDb extends object = FrameworkDbClient>(queryFn: QueryFunction<T, TDb>, options?: UseLiveQueryOptions): UseLiveQueryResult<T>;
|
|
12
|
+
//# sourceMappingURL=useLiveQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveQuery.d.ts","sourceRoot":"","sources":["../../../src/react/useLiveQuery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,cAAc,CAAA;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAKvE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,WAAW,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAChD,WAAW,CACZ,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,IAAI,CACtC,UAAU,CAAC,OAAO,aAAa,CAAC,EAChC,MAAM,CACP,GAAG;IACF,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;CACpB,CAAA;AAYD,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,SAAS,MAAM,GAAG,iBAAiB,EACpE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,kBAAkB,CAAC,CAAC,CAAC,CA4BvB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var useLiveQuery_exports = {};
|
|
20
|
+
__export(useLiveQuery_exports, {
|
|
21
|
+
useLiveQuery: () => useLiveQuery
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(useLiveQuery_exports);
|
|
24
|
+
var import_react = require("react");
|
|
25
|
+
var import_graphql = require("graphql");
|
|
26
|
+
var import_web = require("@cedarjs/web");
|
|
27
|
+
var import_queryBuilder = require("../queryBuilder.js");
|
|
28
|
+
function extractRootFieldData(payload) {
|
|
29
|
+
if (!payload) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
return Object.values(payload)[0];
|
|
33
|
+
}
|
|
34
|
+
function useLiveQuery(queryFn, options) {
|
|
35
|
+
const { query, variables } = (0, import_react.useMemo)(() => {
|
|
36
|
+
try {
|
|
37
|
+
const graphqlQuery = import_queryBuilder.queryBuilder.buildFromFunction(queryFn, {
|
|
38
|
+
isLive: true
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
query: graphqlQuery.query,
|
|
42
|
+
variables: graphqlQuery.variables ?? {}
|
|
43
|
+
};
|
|
44
|
+
} catch (error) {
|
|
45
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
46
|
+
throw new Error(`Failed to build GraphQL query: ${errorMsg}`);
|
|
47
|
+
}
|
|
48
|
+
}, [queryFn]);
|
|
49
|
+
const document = (0, import_react.useMemo)(() => (0, import_graphql.parse)(query), [query]);
|
|
50
|
+
const queryResult = (0, import_web.useQuery)(document, {
|
|
51
|
+
...options ?? {},
|
|
52
|
+
variables
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
...queryResult,
|
|
56
|
+
data: extractRootFieldData(queryResult.data)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
60
|
+
0 && (module.exports = {
|
|
61
|
+
useLiveQuery
|
|
62
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract Syntax Tree (AST) types for representing parsed ORM queries
|
|
3
|
+
* These types form the intermediate representation between ORM syntax and
|
|
4
|
+
* GraphQL queries
|
|
5
|
+
*/
|
|
6
|
+
export interface ASTNode {
|
|
7
|
+
type: string;
|
|
8
|
+
}
|
|
9
|
+
export type QueryOperation = 'findMany' | 'findUnique' | 'findFirst' | 'findUniqueOrThrow' | 'findFirstOrThrow';
|
|
10
|
+
export interface QueryAST extends ASTNode {
|
|
11
|
+
type: 'Query';
|
|
12
|
+
model: string;
|
|
13
|
+
operation: QueryOperation;
|
|
14
|
+
args?: QueryArgsAST;
|
|
15
|
+
isLive?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface QueryArgsAST extends ASTNode {
|
|
18
|
+
type: 'QueryArgs';
|
|
19
|
+
where?: WhereAST;
|
|
20
|
+
select?: SelectAST;
|
|
21
|
+
include?: IncludeAST;
|
|
22
|
+
orderBy?: OrderByAST;
|
|
23
|
+
take?: number;
|
|
24
|
+
skip?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface WhereAST extends ASTNode {
|
|
27
|
+
type: 'Where';
|
|
28
|
+
conditions: WhereCondition[];
|
|
29
|
+
}
|
|
30
|
+
export type WhereCondition = FieldCondition | LogicalCondition | RelationCondition;
|
|
31
|
+
export interface FieldCondition extends ASTNode {
|
|
32
|
+
type: 'FieldCondition';
|
|
33
|
+
field: string;
|
|
34
|
+
operator: ComparisonOperator;
|
|
35
|
+
value: any;
|
|
36
|
+
}
|
|
37
|
+
export interface LogicalCondition extends ASTNode {
|
|
38
|
+
type: 'LogicalCondition';
|
|
39
|
+
operator: LogicalOperator;
|
|
40
|
+
conditions: WhereCondition[];
|
|
41
|
+
}
|
|
42
|
+
export interface RelationCondition extends ASTNode {
|
|
43
|
+
type: 'RelationCondition';
|
|
44
|
+
relation: string;
|
|
45
|
+
condition: WhereAST;
|
|
46
|
+
}
|
|
47
|
+
export type ComparisonOperator = 'equals' | 'not' | 'in' | 'notIn' | 'lt' | 'lte' | 'gt' | 'gte' | 'contains' | 'startsWith' | 'endsWith' | 'isNull' | 'isNotNull';
|
|
48
|
+
export type LogicalOperator = 'AND' | 'OR' | 'NOT';
|
|
49
|
+
export interface SelectAST extends ASTNode {
|
|
50
|
+
type: 'Select';
|
|
51
|
+
fields: FieldSelection[];
|
|
52
|
+
}
|
|
53
|
+
export interface FieldSelection extends ASTNode {
|
|
54
|
+
type: 'FieldSelection';
|
|
55
|
+
field: string;
|
|
56
|
+
selected: boolean;
|
|
57
|
+
nested?: SelectAST | IncludeAST;
|
|
58
|
+
}
|
|
59
|
+
export interface IncludeAST extends ASTNode {
|
|
60
|
+
type: 'Include';
|
|
61
|
+
relations: RelationInclusion[];
|
|
62
|
+
}
|
|
63
|
+
export interface RelationInclusion extends ASTNode {
|
|
64
|
+
type: 'RelationInclusion';
|
|
65
|
+
relation: string;
|
|
66
|
+
included: boolean;
|
|
67
|
+
nested?: IncludeAST;
|
|
68
|
+
args?: QueryArgsAST;
|
|
69
|
+
}
|
|
70
|
+
export interface OrderByAST extends ASTNode {
|
|
71
|
+
type: 'OrderBy';
|
|
72
|
+
fields: OrderByField[];
|
|
73
|
+
}
|
|
74
|
+
export interface OrderByField extends ASTNode {
|
|
75
|
+
type: 'OrderByField';
|
|
76
|
+
field: string;
|
|
77
|
+
direction: 'asc' | 'desc';
|
|
78
|
+
}
|
|
79
|
+
export type ASTNodeType = QueryAST | QueryArgsAST | WhereAST | SelectAST | IncludeAST | OrderByAST | FieldCondition | LogicalCondition | RelationCondition | FieldSelection | RelationInclusion | OrderByField;
|
|
80
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../../src/types/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var ast_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(ast_exports);
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORM query interface types that define the Prisma-like API surface
|
|
3
|
+
* These types represent the input format that users will write
|
|
4
|
+
*/
|
|
5
|
+
export type Scalar = string | number | boolean | Date | null;
|
|
6
|
+
export interface StringFilter {
|
|
7
|
+
equals?: string;
|
|
8
|
+
not?: string | StringFilter;
|
|
9
|
+
in?: string[];
|
|
10
|
+
notIn?: string[];
|
|
11
|
+
lt?: string;
|
|
12
|
+
lte?: string;
|
|
13
|
+
gt?: string;
|
|
14
|
+
gte?: string;
|
|
15
|
+
contains?: string;
|
|
16
|
+
startsWith?: string;
|
|
17
|
+
endsWith?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface NumberFilter {
|
|
20
|
+
equals?: number;
|
|
21
|
+
not?: number | NumberFilter;
|
|
22
|
+
in?: number[];
|
|
23
|
+
notIn?: number[];
|
|
24
|
+
lt?: number;
|
|
25
|
+
lte?: number;
|
|
26
|
+
gt?: number;
|
|
27
|
+
gte?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface BooleanFilter {
|
|
30
|
+
equals?: boolean;
|
|
31
|
+
not?: boolean | BooleanFilter;
|
|
32
|
+
}
|
|
33
|
+
export interface DateFilter {
|
|
34
|
+
equals?: Date;
|
|
35
|
+
not?: Date | DateFilter;
|
|
36
|
+
in?: Date[];
|
|
37
|
+
notIn?: Date[];
|
|
38
|
+
lt?: Date;
|
|
39
|
+
lte?: Date;
|
|
40
|
+
gt?: Date;
|
|
41
|
+
gte?: Date;
|
|
42
|
+
}
|
|
43
|
+
export type Filter<T> = T extends string ? string | StringFilter : T extends number ? number | NumberFilter : T extends boolean ? boolean | BooleanFilter : T extends Date ? Date | DateFilter : T extends null ? null : never;
|
|
44
|
+
export interface LogicalOperators<T> {
|
|
45
|
+
AND?: T[];
|
|
46
|
+
OR?: T[];
|
|
47
|
+
NOT?: T;
|
|
48
|
+
}
|
|
49
|
+
export type WhereInput<T> = {
|
|
50
|
+
[K in keyof T]?: Filter<T[K]>;
|
|
51
|
+
} & LogicalOperators<WhereInput<T>>;
|
|
52
|
+
export type FlexibleWhereInput = {
|
|
53
|
+
[key: string]: any;
|
|
54
|
+
AND?: FlexibleWhereInput[];
|
|
55
|
+
OR?: FlexibleWhereInput[];
|
|
56
|
+
NOT?: FlexibleWhereInput;
|
|
57
|
+
};
|
|
58
|
+
export type AnyWhereInput<T = any> = T extends Record<string, any> ? WhereInput<T> : FlexibleWhereInput;
|
|
59
|
+
export type SortOrder = 'asc' | 'desc';
|
|
60
|
+
export type OrderByInput<T> = {
|
|
61
|
+
[K in keyof T]?: SortOrder;
|
|
62
|
+
};
|
|
63
|
+
export type SelectInput<T> = {
|
|
64
|
+
[K in keyof T]?: boolean;
|
|
65
|
+
};
|
|
66
|
+
export type IncludeInput<T = any> = {
|
|
67
|
+
[K in keyof T]?: boolean | {
|
|
68
|
+
select?: SelectInput<any>;
|
|
69
|
+
include?: IncludeInput<any>;
|
|
70
|
+
where?: AnyWhereInput<any>;
|
|
71
|
+
orderBy?: OrderByInput<any>;
|
|
72
|
+
take?: number;
|
|
73
|
+
skip?: number;
|
|
74
|
+
};
|
|
75
|
+
} & {
|
|
76
|
+
[key: string]: boolean | {
|
|
77
|
+
select?: SelectInput<any>;
|
|
78
|
+
include?: IncludeInput<any>;
|
|
79
|
+
where?: AnyWhereInput<any>;
|
|
80
|
+
orderBy?: OrderByInput<any>;
|
|
81
|
+
take?: number;
|
|
82
|
+
skip?: number;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export interface BaseQueryArgs<T = any> {
|
|
86
|
+
where?: AnyWhereInput<T>;
|
|
87
|
+
select?: SelectInput<T>;
|
|
88
|
+
include?: IncludeInput<T>;
|
|
89
|
+
orderBy?: OrderByInput<T> | OrderByInput<T>[];
|
|
90
|
+
}
|
|
91
|
+
export interface FindManyArgs<T> extends BaseQueryArgs<T> {
|
|
92
|
+
take?: number;
|
|
93
|
+
skip?: number;
|
|
94
|
+
}
|
|
95
|
+
export interface FindUniqueArgs<T> {
|
|
96
|
+
where: WhereUniqueInput<T>;
|
|
97
|
+
select?: SelectInput<T>;
|
|
98
|
+
include?: IncludeInput<T>;
|
|
99
|
+
}
|
|
100
|
+
export type FindFirstArgs<T> = BaseQueryArgs<T>;
|
|
101
|
+
export type WhereUniqueInput<T> = {
|
|
102
|
+
[K in keyof T]?: T[K];
|
|
103
|
+
};
|
|
104
|
+
export interface ModelDelegate<T = any> {
|
|
105
|
+
findMany(args?: FindManyArgs<T>): Promise<T[]>;
|
|
106
|
+
findUnique(args: FindUniqueArgs<T>): Promise<T | null>;
|
|
107
|
+
findFirst(args?: FindFirstArgs<T>): Promise<T | null>;
|
|
108
|
+
findUniqueOrThrow(args: FindUniqueArgs<T>): Promise<T>;
|
|
109
|
+
findFirstOrThrow(args?: FindFirstArgs<T>): Promise<T>;
|
|
110
|
+
}
|
|
111
|
+
export interface DatabaseClient {
|
|
112
|
+
[modelName: string]: ModelDelegate<any>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Framework-level type map that can be module-augmented by Cedar generated
|
|
116
|
+
* types. This lets Cedar inject `typeof db` without users writing wrappers.
|
|
117
|
+
*
|
|
118
|
+
* Example augmentation:
|
|
119
|
+
* declare module '@cedarjs/gqlorm/types/orm' {
|
|
120
|
+
* interface GqlormTypeMap {
|
|
121
|
+
* db: typeof db
|
|
122
|
+
* }
|
|
123
|
+
* }
|
|
124
|
+
*/
|
|
125
|
+
export interface GqlormTypeMap {
|
|
126
|
+
}
|
|
127
|
+
type DefaultDbClient = GqlormTypeMap extends {
|
|
128
|
+
db: infer TDb;
|
|
129
|
+
} ? TDb : DatabaseClient;
|
|
130
|
+
type ModelDelegatePropertyName<TDb> = {
|
|
131
|
+
[K in keyof TDb]-?: K extends string ? K extends `$${string}` ? never : TDb[K] extends ModelDelegate<any> ? K : never : never;
|
|
132
|
+
}[keyof TDb];
|
|
133
|
+
export type ModelDelegatesOnly<TDb> = [ModelDelegatePropertyName<TDb>] extends [
|
|
134
|
+
never
|
|
135
|
+
] ? DatabaseClient : Pick<TDb, ModelDelegatePropertyName<TDb>>;
|
|
136
|
+
export type FrameworkDbClient = ModelDelegatesOnly<DefaultDbClient>;
|
|
137
|
+
export interface QueryContext<TDb extends object = FrameworkDbClient> {
|
|
138
|
+
db: TDb;
|
|
139
|
+
}
|
|
140
|
+
export type QueryFunction<T, TDb extends object = FrameworkDbClient> = (db: TDb) => Promise<T> | T;
|
|
141
|
+
export interface QueryResult<T> {
|
|
142
|
+
data: T;
|
|
143
|
+
loading: boolean;
|
|
144
|
+
error?: Error;
|
|
145
|
+
}
|
|
146
|
+
export interface PaginatedResult<T> {
|
|
147
|
+
data: T[];
|
|
148
|
+
pageInfo: {
|
|
149
|
+
hasNextPage: boolean;
|
|
150
|
+
hasPreviousPage: boolean;
|
|
151
|
+
startCursor?: string;
|
|
152
|
+
endCursor?: string;
|
|
153
|
+
};
|
|
154
|
+
totalCount?: number;
|
|
155
|
+
}
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=orm.d.ts.map
|