@constructive-io/graphql-codegen 2.19.0 → 2.20.1
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 +1818 -113
- package/__tests__/codegen/input-types-generator.test.d.ts +1 -0
- package/__tests__/codegen/input-types-generator.test.js +635 -0
- package/cli/codegen/barrel.d.ts +27 -0
- package/cli/codegen/barrel.js +163 -0
- package/cli/codegen/client.d.ts +4 -0
- package/cli/codegen/client.js +170 -0
- package/cli/codegen/custom-mutations.d.ts +38 -0
- package/cli/codegen/custom-mutations.js +149 -0
- package/cli/codegen/custom-queries.d.ts +38 -0
- package/cli/codegen/custom-queries.js +358 -0
- package/cli/codegen/filters.d.ts +27 -0
- package/cli/codegen/filters.js +357 -0
- package/cli/codegen/gql-ast.d.ts +41 -0
- package/cli/codegen/gql-ast.js +329 -0
- package/cli/codegen/index.d.ts +71 -0
- package/cli/codegen/index.js +147 -0
- package/cli/codegen/mutations.d.ts +30 -0
- package/cli/codegen/mutations.js +410 -0
- package/cli/codegen/orm/barrel.d.ts +18 -0
- package/cli/codegen/orm/barrel.js +48 -0
- package/cli/codegen/orm/client-generator.d.ts +45 -0
- package/cli/codegen/orm/client-generator.js +646 -0
- package/cli/codegen/orm/custom-ops-generator.d.ts +30 -0
- package/cli/codegen/orm/custom-ops-generator.js +350 -0
- package/cli/codegen/orm/index.d.ts +38 -0
- package/cli/codegen/orm/index.js +88 -0
- package/cli/codegen/orm/input-types-generator.d.ts +21 -0
- package/cli/codegen/orm/input-types-generator.js +705 -0
- package/cli/codegen/orm/input-types-generator.test.d.ts +1 -0
- package/cli/codegen/orm/input-types-generator.test.js +75 -0
- package/cli/codegen/orm/model-generator.d.ts +32 -0
- package/cli/codegen/orm/model-generator.js +264 -0
- package/cli/codegen/orm/query-builder.d.ts +161 -0
- package/cli/codegen/orm/query-builder.js +366 -0
- package/cli/codegen/orm/select-types.d.ts +169 -0
- package/cli/codegen/orm/select-types.js +16 -0
- package/cli/codegen/orm/select-types.test.d.ts +11 -0
- package/cli/codegen/orm/select-types.test.js +22 -0
- package/cli/codegen/queries.d.ts +25 -0
- package/cli/codegen/queries.js +438 -0
- package/cli/codegen/scalars.d.ts +12 -0
- package/cli/codegen/scalars.js +71 -0
- package/cli/codegen/schema-gql-ast.d.ts +51 -0
- package/cli/codegen/schema-gql-ast.js +385 -0
- package/cli/codegen/ts-ast.d.ts +122 -0
- package/cli/codegen/ts-ast.js +280 -0
- package/cli/codegen/type-resolver.d.ts +96 -0
- package/cli/codegen/type-resolver.js +246 -0
- package/cli/codegen/types.d.ts +12 -0
- package/cli/codegen/types.js +69 -0
- package/cli/codegen/utils.d.ts +163 -0
- package/cli/codegen/utils.js +326 -0
- package/cli/commands/generate-orm.d.ts +37 -0
- package/cli/commands/generate-orm.js +195 -0
- package/cli/commands/generate.d.ts +39 -0
- package/cli/commands/generate.js +299 -0
- package/cli/commands/index.d.ts +7 -0
- package/cli/commands/index.js +12 -0
- package/cli/commands/init.d.ts +35 -0
- package/cli/commands/init.js +176 -0
- package/cli/index.d.ts +4 -0
- package/cli/index.js +291 -0
- package/cli/introspect/fetch-meta.d.ts +31 -0
- package/cli/introspect/fetch-meta.js +108 -0
- package/cli/introspect/fetch-schema.d.ts +21 -0
- package/cli/introspect/fetch-schema.js +86 -0
- package/cli/introspect/index.d.ts +8 -0
- package/cli/introspect/index.js +16 -0
- package/cli/introspect/meta-query.d.ts +111 -0
- package/cli/introspect/meta-query.js +191 -0
- package/cli/introspect/schema-query.d.ts +20 -0
- package/cli/introspect/schema-query.js +123 -0
- package/cli/introspect/transform-schema.d.ts +74 -0
- package/cli/introspect/transform-schema.js +269 -0
- package/cli/introspect/transform-schema.test.d.ts +1 -0
- package/cli/introspect/transform-schema.test.js +67 -0
- package/cli/introspect/transform.d.ts +21 -0
- package/cli/introspect/transform.js +216 -0
- package/cli/watch/cache.d.ts +45 -0
- package/cli/watch/cache.js +111 -0
- package/cli/watch/debounce.d.ts +19 -0
- package/cli/watch/debounce.js +89 -0
- package/cli/watch/hash.d.ts +17 -0
- package/cli/watch/hash.js +48 -0
- package/cli/watch/index.d.ts +10 -0
- package/cli/watch/index.js +22 -0
- package/cli/watch/orchestrator.d.ts +63 -0
- package/cli/watch/orchestrator.js +228 -0
- package/cli/watch/poller.d.ts +65 -0
- package/cli/watch/poller.js +203 -0
- package/cli/watch/types.d.ts +67 -0
- package/cli/watch/types.js +5 -0
- package/client/error.d.ts +95 -0
- package/client/error.js +255 -0
- package/client/execute.d.ts +57 -0
- package/client/execute.js +124 -0
- package/client/index.d.ts +6 -0
- package/client/index.js +18 -0
- package/client/typed-document.d.ts +31 -0
- package/client/typed-document.js +44 -0
- package/core/ast.d.ts +10 -0
- package/core/ast.js +593 -0
- package/core/custom-ast.d.ts +35 -0
- package/core/custom-ast.js +204 -0
- package/core/index.d.ts +8 -0
- package/core/index.js +33 -0
- package/core/meta-object/convert.d.ts +65 -0
- package/core/meta-object/convert.js +63 -0
- package/core/meta-object/format.json +93 -0
- package/core/meta-object/index.d.ts +2 -0
- package/core/meta-object/index.js +18 -0
- package/core/meta-object/validate.d.ts +9 -0
- package/core/meta-object/validate.js +34 -0
- package/core/query-builder.d.ts +46 -0
- package/core/query-builder.js +412 -0
- package/core/types.d.ts +139 -0
- package/core/types.js +28 -0
- package/esm/__tests__/codegen/input-types-generator.test.d.ts +1 -0
- package/esm/__tests__/codegen/input-types-generator.test.js +633 -0
- package/esm/cli/codegen/barrel.d.ts +27 -0
- package/esm/cli/codegen/barrel.js +156 -0
- package/esm/cli/codegen/client.d.ts +4 -0
- package/esm/cli/codegen/client.js +167 -0
- package/esm/cli/codegen/custom-mutations.d.ts +38 -0
- package/esm/cli/codegen/custom-mutations.js +145 -0
- package/esm/cli/codegen/custom-queries.d.ts +38 -0
- package/esm/cli/codegen/custom-queries.js +354 -0
- package/esm/cli/codegen/filters.d.ts +27 -0
- package/esm/cli/codegen/filters.js +351 -0
- package/esm/cli/codegen/gql-ast.d.ts +41 -0
- package/esm/cli/codegen/gql-ast.js +288 -0
- package/esm/cli/codegen/index.d.ts +71 -0
- package/esm/cli/codegen/index.js +124 -0
- package/esm/cli/codegen/mutations.d.ts +30 -0
- package/esm/cli/codegen/mutations.js +404 -0
- package/esm/cli/codegen/orm/barrel.d.ts +18 -0
- package/esm/cli/codegen/orm/barrel.js +44 -0
- package/esm/cli/codegen/orm/client-generator.d.ts +45 -0
- package/esm/cli/codegen/orm/client-generator.js +640 -0
- package/esm/cli/codegen/orm/custom-ops-generator.d.ts +30 -0
- package/esm/cli/codegen/orm/custom-ops-generator.js +346 -0
- package/esm/cli/codegen/orm/index.d.ts +38 -0
- package/esm/cli/codegen/orm/index.js +75 -0
- package/esm/cli/codegen/orm/input-types-generator.d.ts +21 -0
- package/esm/cli/codegen/orm/input-types-generator.js +700 -0
- package/esm/cli/codegen/orm/input-types-generator.test.d.ts +1 -0
- package/esm/cli/codegen/orm/input-types-generator.test.js +73 -0
- package/esm/cli/codegen/orm/model-generator.d.ts +32 -0
- package/esm/cli/codegen/orm/model-generator.js +260 -0
- package/esm/cli/codegen/orm/query-builder.d.ts +161 -0
- package/esm/cli/codegen/orm/query-builder.js +353 -0
- package/esm/cli/codegen/orm/select-types.d.ts +169 -0
- package/esm/cli/codegen/orm/select-types.js +15 -0
- package/esm/cli/codegen/orm/select-types.test.d.ts +11 -0
- package/esm/cli/codegen/orm/select-types.test.js +21 -0
- package/esm/cli/codegen/queries.d.ts +25 -0
- package/esm/cli/codegen/queries.js +433 -0
- package/esm/cli/codegen/scalars.d.ts +12 -0
- package/esm/cli/codegen/scalars.js +66 -0
- package/esm/cli/codegen/schema-gql-ast.d.ts +51 -0
- package/esm/cli/codegen/schema-gql-ast.js +343 -0
- package/esm/cli/codegen/ts-ast.d.ts +122 -0
- package/esm/cli/codegen/ts-ast.js +260 -0
- package/esm/cli/codegen/type-resolver.d.ts +96 -0
- package/esm/cli/codegen/type-resolver.js +224 -0
- package/esm/cli/codegen/types.d.ts +12 -0
- package/esm/cli/codegen/types.js +65 -0
- package/esm/cli/codegen/utils.d.ts +163 -0
- package/esm/cli/codegen/utils.js +288 -0
- package/esm/cli/commands/generate-orm.d.ts +37 -0
- package/esm/cli/commands/generate-orm.js +192 -0
- package/esm/cli/commands/generate.d.ts +39 -0
- package/esm/cli/commands/generate.js +262 -0
- package/esm/cli/commands/index.d.ts +7 -0
- package/esm/cli/commands/index.js +5 -0
- package/esm/cli/commands/init.d.ts +35 -0
- package/esm/cli/commands/init.js +138 -0
- package/esm/cli/index.d.ts +4 -0
- package/esm/cli/index.js +256 -0
- package/esm/cli/introspect/fetch-meta.d.ts +31 -0
- package/esm/cli/introspect/fetch-meta.js +104 -0
- package/esm/cli/introspect/fetch-schema.d.ts +21 -0
- package/esm/cli/introspect/fetch-schema.js +83 -0
- package/esm/cli/introspect/index.d.ts +8 -0
- package/esm/cli/introspect/index.js +6 -0
- package/esm/cli/introspect/meta-query.d.ts +111 -0
- package/esm/cli/introspect/meta-query.js +188 -0
- package/esm/cli/introspect/schema-query.d.ts +20 -0
- package/esm/cli/introspect/schema-query.js +120 -0
- package/esm/cli/introspect/transform-schema.d.ts +74 -0
- package/esm/cli/introspect/transform-schema.js +259 -0
- package/esm/cli/introspect/transform-schema.test.d.ts +1 -0
- package/esm/cli/introspect/transform-schema.test.js +65 -0
- package/esm/cli/introspect/transform.d.ts +21 -0
- package/esm/cli/introspect/transform.js +210 -0
- package/esm/cli/watch/cache.d.ts +45 -0
- package/esm/cli/watch/cache.js +73 -0
- package/esm/cli/watch/debounce.d.ts +19 -0
- package/esm/cli/watch/debounce.js +85 -0
- package/esm/cli/watch/hash.d.ts +17 -0
- package/esm/cli/watch/hash.js +43 -0
- package/esm/cli/watch/index.d.ts +10 -0
- package/esm/cli/watch/index.js +8 -0
- package/esm/cli/watch/orchestrator.d.ts +63 -0
- package/esm/cli/watch/orchestrator.js +223 -0
- package/esm/cli/watch/poller.d.ts +65 -0
- package/esm/cli/watch/poller.js +198 -0
- package/esm/cli/watch/types.d.ts +67 -0
- package/esm/cli/watch/types.js +4 -0
- package/esm/client/error.d.ts +95 -0
- package/esm/client/error.js +249 -0
- package/esm/client/execute.d.ts +57 -0
- package/esm/client/execute.js +120 -0
- package/esm/client/index.d.ts +6 -0
- package/esm/client/index.js +6 -0
- package/esm/client/typed-document.d.ts +31 -0
- package/esm/client/typed-document.js +40 -0
- package/esm/core/ast.d.ts +10 -0
- package/esm/core/ast.js +549 -0
- package/esm/core/custom-ast.d.ts +35 -0
- package/esm/core/custom-ast.js +161 -0
- package/esm/core/index.d.ts +8 -0
- package/esm/core/index.js +12 -0
- package/esm/core/meta-object/convert.d.ts +65 -0
- package/esm/core/meta-object/convert.js +60 -0
- package/esm/core/meta-object/format.json +93 -0
- package/esm/core/meta-object/index.d.ts +2 -0
- package/esm/core/meta-object/index.js +2 -0
- package/esm/core/meta-object/validate.d.ts +9 -0
- package/esm/core/meta-object/validate.js +28 -0
- package/esm/core/query-builder.d.ts +46 -0
- package/esm/core/query-builder.js +375 -0
- package/esm/core/types.d.ts +139 -0
- package/esm/core/types.js +24 -0
- package/esm/generators/field-selector.d.ts +30 -0
- package/esm/generators/field-selector.js +355 -0
- package/esm/generators/index.d.ts +6 -0
- package/esm/generators/index.js +9 -0
- package/esm/generators/mutations.d.ts +31 -0
- package/esm/generators/mutations.js +197 -0
- package/esm/generators/select.d.ts +50 -0
- package/esm/generators/select.js +636 -0
- package/esm/index.d.ts +12 -0
- package/esm/index.js +17 -3
- package/esm/react/index.d.ts +5 -0
- package/esm/react/index.js +6 -0
- package/esm/types/config.d.ts +199 -0
- package/esm/types/config.js +106 -0
- package/esm/types/index.d.ts +9 -0
- package/esm/types/index.js +4 -0
- package/esm/types/introspection.d.ts +121 -0
- package/esm/types/introspection.js +54 -0
- package/esm/types/mutation.d.ts +45 -0
- package/esm/types/mutation.js +4 -0
- package/esm/types/query.d.ts +82 -0
- package/esm/types/query.js +4 -0
- package/esm/types/schema.d.ts +253 -0
- package/esm/types/schema.js +5 -0
- package/esm/types/selection.d.ts +43 -0
- package/esm/types/selection.js +4 -0
- package/esm/utils/index.d.ts +4 -0
- package/esm/utils/index.js +4 -0
- package/generators/field-selector.d.ts +30 -0
- package/generators/field-selector.js +361 -0
- package/generators/index.d.ts +6 -0
- package/generators/index.js +27 -0
- package/generators/mutations.d.ts +31 -0
- package/generators/mutations.js +235 -0
- package/generators/select.d.ts +50 -0
- package/generators/select.js +679 -0
- package/index.d.ts +12 -3
- package/index.js +19 -3
- package/package.json +59 -38
- package/react/index.d.ts +5 -0
- package/react/index.js +9 -0
- package/types/config.d.ts +199 -0
- package/types/config.js +111 -0
- package/types/index.d.ts +9 -0
- package/types/index.js +10 -0
- package/types/introspection.d.ts +121 -0
- package/types/introspection.js +62 -0
- package/types/mutation.d.ts +45 -0
- package/types/mutation.js +5 -0
- package/types/query.d.ts +82 -0
- package/types/query.js +5 -0
- package/types/schema.d.ts +253 -0
- package/types/schema.js +6 -0
- package/types/selection.d.ts +43 -0
- package/types/selection.js +5 -0
- package/utils/index.d.ts +4 -0
- package/utils/index.js +7 -0
- package/codegen.d.ts +0 -13
- package/codegen.js +0 -293
- package/esm/codegen.js +0 -253
- package/esm/gql.js +0 -939
- package/esm/options.js +0 -27
- package/gql.d.ts +0 -188
- package/gql.js +0 -992
- package/options.d.ts +0 -45
- package/options.js +0 -31
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCustomQueryHook = generateCustomQueryHook;
|
|
4
|
+
exports.generateAllCustomQueryHooks = generateAllCustomQueryHooks;
|
|
5
|
+
const ts_ast_1 = require("./ts-ast");
|
|
6
|
+
const schema_gql_ast_1 = require("./schema-gql-ast");
|
|
7
|
+
const type_resolver_1 = require("./type-resolver");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
/**
|
|
10
|
+
* Generate a custom query hook file
|
|
11
|
+
*/
|
|
12
|
+
function generateCustomQueryHook(options) {
|
|
13
|
+
const { operation, typeRegistry, maxDepth = 2, skipQueryField = true } = options;
|
|
14
|
+
const project = (0, ts_ast_1.createProject)();
|
|
15
|
+
const hookName = (0, type_resolver_1.getOperationHookName)(operation.name, 'query');
|
|
16
|
+
const fileName = (0, type_resolver_1.getOperationFileName)(operation.name, 'query');
|
|
17
|
+
const variablesTypeName = (0, type_resolver_1.getOperationVariablesTypeName)(operation.name, 'query');
|
|
18
|
+
const resultTypeName = (0, type_resolver_1.getOperationResultTypeName)(operation.name, 'query');
|
|
19
|
+
const documentConstName = (0, type_resolver_1.getDocumentConstName)(operation.name, 'query');
|
|
20
|
+
const queryKeyName = (0, type_resolver_1.getQueryKeyName)(operation.name);
|
|
21
|
+
// Generate GraphQL document
|
|
22
|
+
const queryDocument = (0, schema_gql_ast_1.buildCustomQueryString)({
|
|
23
|
+
operation,
|
|
24
|
+
typeRegistry,
|
|
25
|
+
maxDepth,
|
|
26
|
+
skipQueryField,
|
|
27
|
+
});
|
|
28
|
+
const sourceFile = (0, ts_ast_1.createSourceFile)(project, fileName);
|
|
29
|
+
// Add file header
|
|
30
|
+
sourceFile.insertText(0, (0, ts_ast_1.createFileHeader)(`Custom query hook for ${operation.name}`) + '\n\n');
|
|
31
|
+
// Add imports
|
|
32
|
+
sourceFile.addImportDeclarations([
|
|
33
|
+
(0, ts_ast_1.createImport)({
|
|
34
|
+
moduleSpecifier: '@tanstack/react-query',
|
|
35
|
+
namedImports: ['useQuery'],
|
|
36
|
+
typeOnlyNamedImports: ['UseQueryOptions', 'QueryClient'],
|
|
37
|
+
}),
|
|
38
|
+
(0, ts_ast_1.createImport)({
|
|
39
|
+
moduleSpecifier: '../client',
|
|
40
|
+
namedImports: ['execute'],
|
|
41
|
+
typeOnlyNamedImports: ['ExecuteOptions'],
|
|
42
|
+
}),
|
|
43
|
+
]);
|
|
44
|
+
// Add query document constant
|
|
45
|
+
sourceFile.addVariableStatement((0, ts_ast_1.createConst)(documentConstName, '`\n' + queryDocument + '`', {
|
|
46
|
+
docs: ['GraphQL query document'],
|
|
47
|
+
}));
|
|
48
|
+
// Generate variables interface if there are arguments
|
|
49
|
+
if (operation.args.length > 0) {
|
|
50
|
+
const variablesProps = generateVariablesProperties(operation.args);
|
|
51
|
+
sourceFile.addInterface((0, ts_ast_1.createInterface)(variablesTypeName, variablesProps));
|
|
52
|
+
}
|
|
53
|
+
// Generate result interface
|
|
54
|
+
const resultType = (0, type_resolver_1.typeRefToTsType)(operation.returnType);
|
|
55
|
+
const resultProps = [
|
|
56
|
+
{ name: operation.name, type: resultType },
|
|
57
|
+
];
|
|
58
|
+
sourceFile.addInterface((0, ts_ast_1.createInterface)(resultTypeName, resultProps));
|
|
59
|
+
// Query key factory
|
|
60
|
+
if (operation.args.length > 0) {
|
|
61
|
+
sourceFile.addVariableStatement((0, ts_ast_1.createConst)(queryKeyName, `(variables?: ${variablesTypeName}) =>
|
|
62
|
+
['${operation.name}', variables] as const`, { docs: ['Query key factory for caching'] }));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
sourceFile.addVariableStatement((0, ts_ast_1.createConst)(queryKeyName, `() => ['${operation.name}'] as const`, {
|
|
66
|
+
docs: ['Query key factory for caching'],
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
// Generate hook function
|
|
70
|
+
const hookParams = generateHookParameters(operation, variablesTypeName, resultTypeName);
|
|
71
|
+
const hookBody = generateHookBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName);
|
|
72
|
+
const hookDoc = generateHookDoc(operation, hookName);
|
|
73
|
+
sourceFile.addFunction({
|
|
74
|
+
name: hookName,
|
|
75
|
+
isExported: true,
|
|
76
|
+
parameters: hookParams,
|
|
77
|
+
statements: hookBody,
|
|
78
|
+
docs: [{ description: hookDoc }],
|
|
79
|
+
});
|
|
80
|
+
// Add standalone functions section
|
|
81
|
+
sourceFile.addStatements('\n// ============================================================================');
|
|
82
|
+
sourceFile.addStatements('// Standalone Functions (non-React)');
|
|
83
|
+
sourceFile.addStatements('// ============================================================================\n');
|
|
84
|
+
// Generate standalone fetch function
|
|
85
|
+
const fetchFnName = `fetch${(0, utils_1.ucFirst)(operation.name)}Query`;
|
|
86
|
+
const fetchParams = generateFetchParameters(operation, variablesTypeName);
|
|
87
|
+
const fetchBody = generateFetchBody(operation, documentConstName, variablesTypeName, resultTypeName);
|
|
88
|
+
const fetchDoc = generateFetchDoc(operation, fetchFnName);
|
|
89
|
+
sourceFile.addFunction({
|
|
90
|
+
name: fetchFnName,
|
|
91
|
+
isExported: true,
|
|
92
|
+
isAsync: true,
|
|
93
|
+
parameters: fetchParams,
|
|
94
|
+
returnType: `Promise<${resultTypeName}>`,
|
|
95
|
+
statements: fetchBody,
|
|
96
|
+
docs: [{ description: fetchDoc }],
|
|
97
|
+
});
|
|
98
|
+
// Generate prefetch function
|
|
99
|
+
const prefetchFnName = `prefetch${(0, utils_1.ucFirst)(operation.name)}Query`;
|
|
100
|
+
const prefetchParams = generatePrefetchParameters(operation, variablesTypeName);
|
|
101
|
+
const prefetchBody = generatePrefetchBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName);
|
|
102
|
+
const prefetchDoc = generatePrefetchDoc(operation, prefetchFnName);
|
|
103
|
+
sourceFile.addFunction({
|
|
104
|
+
name: prefetchFnName,
|
|
105
|
+
isExported: true,
|
|
106
|
+
isAsync: true,
|
|
107
|
+
parameters: prefetchParams,
|
|
108
|
+
returnType: 'Promise<void>',
|
|
109
|
+
statements: prefetchBody,
|
|
110
|
+
docs: [{ description: prefetchDoc }],
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
fileName,
|
|
114
|
+
content: (0, ts_ast_1.getFormattedOutput)(sourceFile),
|
|
115
|
+
operationName: operation.name,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Helper functions
|
|
120
|
+
// ============================================================================
|
|
121
|
+
/**
|
|
122
|
+
* Generate interface properties from CleanArguments
|
|
123
|
+
*/
|
|
124
|
+
function generateVariablesProperties(args) {
|
|
125
|
+
return args.map((arg) => ({
|
|
126
|
+
name: arg.name,
|
|
127
|
+
type: (0, type_resolver_1.typeRefToTsType)(arg.type),
|
|
128
|
+
optional: !(0, type_resolver_1.isTypeRequired)(arg.type),
|
|
129
|
+
docs: arg.description ? [arg.description] : undefined,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate hook function parameters
|
|
134
|
+
*/
|
|
135
|
+
function generateHookParameters(operation, variablesTypeName, resultTypeName) {
|
|
136
|
+
const params = [];
|
|
137
|
+
// Add variables parameter if there are required args
|
|
138
|
+
const hasRequiredArgs = operation.args.some((arg) => (0, type_resolver_1.isTypeRequired)(arg.type));
|
|
139
|
+
if (operation.args.length > 0) {
|
|
140
|
+
params.push({
|
|
141
|
+
name: 'variables',
|
|
142
|
+
type: variablesTypeName,
|
|
143
|
+
hasQuestionToken: !hasRequiredArgs,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Add options parameter
|
|
147
|
+
params.push({
|
|
148
|
+
name: 'options',
|
|
149
|
+
type: `Omit<UseQueryOptions<${resultTypeName}, Error>, 'queryKey' | 'queryFn'>`,
|
|
150
|
+
hasQuestionToken: true,
|
|
151
|
+
});
|
|
152
|
+
return params;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate hook function body
|
|
156
|
+
*/
|
|
157
|
+
function generateHookBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName) {
|
|
158
|
+
const hasArgs = operation.args.length > 0;
|
|
159
|
+
const hasRequiredArgs = operation.args.some((arg) => (0, type_resolver_1.isTypeRequired)(arg.type));
|
|
160
|
+
if (hasArgs) {
|
|
161
|
+
// With variables
|
|
162
|
+
const enabledCondition = hasRequiredArgs
|
|
163
|
+
? `enabled: !!variables && (options?.enabled !== false),`
|
|
164
|
+
: '';
|
|
165
|
+
return `return useQuery({
|
|
166
|
+
queryKey: ${queryKeyName}(variables),
|
|
167
|
+
queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>(
|
|
168
|
+
${documentConstName},
|
|
169
|
+
variables
|
|
170
|
+
),
|
|
171
|
+
${enabledCondition}
|
|
172
|
+
...options,
|
|
173
|
+
});`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// No variables
|
|
177
|
+
return `return useQuery({
|
|
178
|
+
queryKey: ${queryKeyName}(),
|
|
179
|
+
queryFn: () => execute<${resultTypeName}>(${documentConstName}),
|
|
180
|
+
...options,
|
|
181
|
+
});`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate hook JSDoc documentation
|
|
186
|
+
*/
|
|
187
|
+
function generateHookDoc(operation, hookName) {
|
|
188
|
+
const description = operation.description
|
|
189
|
+
? operation.description
|
|
190
|
+
: `Query hook for ${operation.name}`;
|
|
191
|
+
const hasArgs = operation.args.length > 0;
|
|
192
|
+
let example;
|
|
193
|
+
if (hasArgs) {
|
|
194
|
+
const argNames = operation.args.map((a) => a.name).join(', ');
|
|
195
|
+
example = `
|
|
196
|
+
@example
|
|
197
|
+
\`\`\`tsx
|
|
198
|
+
const { data, isLoading } = ${hookName}({ ${argNames} });
|
|
199
|
+
|
|
200
|
+
if (data?.${operation.name}) {
|
|
201
|
+
console.log(data.${operation.name});
|
|
202
|
+
}
|
|
203
|
+
\`\`\``;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
example = `
|
|
207
|
+
@example
|
|
208
|
+
\`\`\`tsx
|
|
209
|
+
const { data, isLoading } = ${hookName}();
|
|
210
|
+
|
|
211
|
+
if (data?.${operation.name}) {
|
|
212
|
+
console.log(data.${operation.name});
|
|
213
|
+
}
|
|
214
|
+
\`\`\``;
|
|
215
|
+
}
|
|
216
|
+
return description + '\n' + example;
|
|
217
|
+
}
|
|
218
|
+
// ============================================================================
|
|
219
|
+
// Standalone function generators
|
|
220
|
+
// ============================================================================
|
|
221
|
+
/**
|
|
222
|
+
* Generate fetch function parameters
|
|
223
|
+
*/
|
|
224
|
+
function generateFetchParameters(operation, variablesTypeName) {
|
|
225
|
+
const params = [];
|
|
226
|
+
if (operation.args.length > 0) {
|
|
227
|
+
const hasRequiredArgs = operation.args.some((arg) => (0, type_resolver_1.isTypeRequired)(arg.type));
|
|
228
|
+
params.push({
|
|
229
|
+
name: 'variables',
|
|
230
|
+
type: variablesTypeName,
|
|
231
|
+
hasQuestionToken: !hasRequiredArgs,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
params.push({
|
|
235
|
+
name: 'options',
|
|
236
|
+
type: 'ExecuteOptions',
|
|
237
|
+
hasQuestionToken: true,
|
|
238
|
+
});
|
|
239
|
+
return params;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Generate fetch function body
|
|
243
|
+
*/
|
|
244
|
+
function generateFetchBody(operation, documentConstName, variablesTypeName, resultTypeName) {
|
|
245
|
+
if (operation.args.length > 0) {
|
|
246
|
+
return `return execute<${resultTypeName}, ${variablesTypeName}>(
|
|
247
|
+
${documentConstName},
|
|
248
|
+
variables,
|
|
249
|
+
options
|
|
250
|
+
);`;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
return `return execute<${resultTypeName}>(${documentConstName}, undefined, options);`;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Generate fetch function documentation
|
|
258
|
+
*/
|
|
259
|
+
function generateFetchDoc(operation, fnName) {
|
|
260
|
+
const description = `Fetch ${operation.name} without React hooks`;
|
|
261
|
+
if (operation.args.length > 0) {
|
|
262
|
+
const argNames = operation.args.map((a) => a.name).join(', ');
|
|
263
|
+
return `${description}
|
|
264
|
+
|
|
265
|
+
@example
|
|
266
|
+
\`\`\`ts
|
|
267
|
+
const data = await ${fnName}({ ${argNames} });
|
|
268
|
+
\`\`\``;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
return `${description}
|
|
272
|
+
|
|
273
|
+
@example
|
|
274
|
+
\`\`\`ts
|
|
275
|
+
const data = await ${fnName}();
|
|
276
|
+
\`\`\``;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Generate prefetch function parameters
|
|
281
|
+
*/
|
|
282
|
+
function generatePrefetchParameters(operation, variablesTypeName) {
|
|
283
|
+
const params = [
|
|
284
|
+
{ name: 'queryClient', type: 'QueryClient' },
|
|
285
|
+
];
|
|
286
|
+
if (operation.args.length > 0) {
|
|
287
|
+
const hasRequiredArgs = operation.args.some((arg) => (0, type_resolver_1.isTypeRequired)(arg.type));
|
|
288
|
+
params.push({
|
|
289
|
+
name: 'variables',
|
|
290
|
+
type: variablesTypeName,
|
|
291
|
+
hasQuestionToken: !hasRequiredArgs,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
params.push({
|
|
295
|
+
name: 'options',
|
|
296
|
+
type: 'ExecuteOptions',
|
|
297
|
+
hasQuestionToken: true,
|
|
298
|
+
});
|
|
299
|
+
return params;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Generate prefetch function body
|
|
303
|
+
*/
|
|
304
|
+
function generatePrefetchBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName) {
|
|
305
|
+
if (operation.args.length > 0) {
|
|
306
|
+
return `await queryClient.prefetchQuery({
|
|
307
|
+
queryKey: ${queryKeyName}(variables),
|
|
308
|
+
queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>(
|
|
309
|
+
${documentConstName},
|
|
310
|
+
variables,
|
|
311
|
+
options
|
|
312
|
+
),
|
|
313
|
+
});`;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
return `await queryClient.prefetchQuery({
|
|
317
|
+
queryKey: ${queryKeyName}(),
|
|
318
|
+
queryFn: () => execute<${resultTypeName}>(${documentConstName}, undefined, options),
|
|
319
|
+
});`;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Generate prefetch function documentation
|
|
324
|
+
*/
|
|
325
|
+
function generatePrefetchDoc(operation, fnName) {
|
|
326
|
+
const description = `Prefetch ${operation.name} for SSR or cache warming`;
|
|
327
|
+
if (operation.args.length > 0) {
|
|
328
|
+
const argNames = operation.args.map((a) => a.name).join(', ');
|
|
329
|
+
return `${description}
|
|
330
|
+
|
|
331
|
+
@example
|
|
332
|
+
\`\`\`ts
|
|
333
|
+
await ${fnName}(queryClient, { ${argNames} });
|
|
334
|
+
\`\`\``;
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
return `${description}
|
|
338
|
+
|
|
339
|
+
@example
|
|
340
|
+
\`\`\`ts
|
|
341
|
+
await ${fnName}(queryClient);
|
|
342
|
+
\`\`\``;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Generate all custom query hook files
|
|
347
|
+
*/
|
|
348
|
+
function generateAllCustomQueryHooks(options) {
|
|
349
|
+
const { operations, typeRegistry, maxDepth = 2, skipQueryField = true } = options;
|
|
350
|
+
return operations
|
|
351
|
+
.filter((op) => op.kind === 'query')
|
|
352
|
+
.map((operation) => generateCustomQueryHook({
|
|
353
|
+
operation,
|
|
354
|
+
typeRegistry,
|
|
355
|
+
maxDepth,
|
|
356
|
+
skipQueryField,
|
|
357
|
+
}));
|
|
358
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostGraphile filter type generators
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript interfaces for PostGraphile filter types:
|
|
5
|
+
* - Base scalar filters (StringFilter, IntFilter, etc.)
|
|
6
|
+
* - Table-specific filters (CarFilter, UserFilter, etc.)
|
|
7
|
+
* - OrderBy enum types
|
|
8
|
+
*/
|
|
9
|
+
import type { CleanTable } from '../../types/schema';
|
|
10
|
+
/**
|
|
11
|
+
* Generate all base PostGraphile filter types
|
|
12
|
+
* These are shared across all tables
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateBaseFilterTypes(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate filter interface for a specific table
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateTableFilter(table: CleanTable): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate OrderBy type for a specific table
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateTableOrderBy(table: CleanTable): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate inline filter and orderBy types for a query hook file
|
|
25
|
+
* These are embedded directly in the hook file for self-containment
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateInlineFilterTypes(table: CleanTable): string;
|