@constructive-io/graphql-codegen 2.18.0 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The _meta GraphQL query for introspecting PostGraphile schema
|
|
3
|
+
* This query fetches all table metadata including fields, constraints, and relations
|
|
4
|
+
*/
|
|
5
|
+
export const META_QUERY = `
|
|
6
|
+
query Meta {
|
|
7
|
+
_meta {
|
|
8
|
+
tables {
|
|
9
|
+
name
|
|
10
|
+
query {
|
|
11
|
+
all
|
|
12
|
+
create
|
|
13
|
+
delete
|
|
14
|
+
one
|
|
15
|
+
update
|
|
16
|
+
}
|
|
17
|
+
fields {
|
|
18
|
+
name
|
|
19
|
+
type {
|
|
20
|
+
gqlType
|
|
21
|
+
isArray
|
|
22
|
+
modifier
|
|
23
|
+
pgAlias
|
|
24
|
+
pgType
|
|
25
|
+
subtype
|
|
26
|
+
typmod
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
inflection {
|
|
30
|
+
allRows
|
|
31
|
+
allRowsSimple
|
|
32
|
+
conditionType
|
|
33
|
+
connection
|
|
34
|
+
createField
|
|
35
|
+
createInputType
|
|
36
|
+
createPayloadType
|
|
37
|
+
deleteByPrimaryKey
|
|
38
|
+
deletePayloadType
|
|
39
|
+
edge
|
|
40
|
+
edgeField
|
|
41
|
+
enumType
|
|
42
|
+
filterType
|
|
43
|
+
inputType
|
|
44
|
+
orderByType
|
|
45
|
+
patchField
|
|
46
|
+
patchType
|
|
47
|
+
tableFieldName
|
|
48
|
+
tableType
|
|
49
|
+
typeName
|
|
50
|
+
updateByPrimaryKey
|
|
51
|
+
updatePayloadType
|
|
52
|
+
}
|
|
53
|
+
primaryKeyConstraints {
|
|
54
|
+
name
|
|
55
|
+
fields {
|
|
56
|
+
name
|
|
57
|
+
type {
|
|
58
|
+
gqlType
|
|
59
|
+
isArray
|
|
60
|
+
modifier
|
|
61
|
+
pgAlias
|
|
62
|
+
pgType
|
|
63
|
+
subtype
|
|
64
|
+
typmod
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
uniqueConstraints {
|
|
69
|
+
name
|
|
70
|
+
fields {
|
|
71
|
+
name
|
|
72
|
+
type {
|
|
73
|
+
gqlType
|
|
74
|
+
isArray
|
|
75
|
+
modifier
|
|
76
|
+
pgAlias
|
|
77
|
+
pgType
|
|
78
|
+
subtype
|
|
79
|
+
typmod
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
foreignKeyConstraints {
|
|
84
|
+
name
|
|
85
|
+
fields {
|
|
86
|
+
name
|
|
87
|
+
type {
|
|
88
|
+
gqlType
|
|
89
|
+
isArray
|
|
90
|
+
modifier
|
|
91
|
+
pgAlias
|
|
92
|
+
pgType
|
|
93
|
+
subtype
|
|
94
|
+
typmod
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
refFields {
|
|
98
|
+
name
|
|
99
|
+
type {
|
|
100
|
+
gqlType
|
|
101
|
+
isArray
|
|
102
|
+
modifier
|
|
103
|
+
pgAlias
|
|
104
|
+
pgType
|
|
105
|
+
subtype
|
|
106
|
+
typmod
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
refTable {
|
|
110
|
+
name
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
relations {
|
|
114
|
+
belongsTo {
|
|
115
|
+
fieldName
|
|
116
|
+
isUnique
|
|
117
|
+
keys {
|
|
118
|
+
name
|
|
119
|
+
type {
|
|
120
|
+
gqlType
|
|
121
|
+
isArray
|
|
122
|
+
modifier
|
|
123
|
+
pgAlias
|
|
124
|
+
pgType
|
|
125
|
+
subtype
|
|
126
|
+
typmod
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
references {
|
|
130
|
+
name
|
|
131
|
+
}
|
|
132
|
+
type
|
|
133
|
+
}
|
|
134
|
+
hasOne {
|
|
135
|
+
fieldName
|
|
136
|
+
isUnique
|
|
137
|
+
keys {
|
|
138
|
+
name
|
|
139
|
+
type {
|
|
140
|
+
gqlType
|
|
141
|
+
isArray
|
|
142
|
+
modifier
|
|
143
|
+
pgAlias
|
|
144
|
+
pgType
|
|
145
|
+
subtype
|
|
146
|
+
typmod
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
referencedBy {
|
|
150
|
+
name
|
|
151
|
+
}
|
|
152
|
+
type
|
|
153
|
+
}
|
|
154
|
+
hasMany {
|
|
155
|
+
fieldName
|
|
156
|
+
isUnique
|
|
157
|
+
keys {
|
|
158
|
+
name
|
|
159
|
+
type {
|
|
160
|
+
gqlType
|
|
161
|
+
isArray
|
|
162
|
+
modifier
|
|
163
|
+
pgAlias
|
|
164
|
+
pgType
|
|
165
|
+
subtype
|
|
166
|
+
typmod
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
referencedBy {
|
|
170
|
+
name
|
|
171
|
+
}
|
|
172
|
+
type
|
|
173
|
+
}
|
|
174
|
+
manyToMany {
|
|
175
|
+
fieldName
|
|
176
|
+
junctionTable {
|
|
177
|
+
name
|
|
178
|
+
}
|
|
179
|
+
rightTable {
|
|
180
|
+
name
|
|
181
|
+
}
|
|
182
|
+
type
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
`;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Schema Introspection Query
|
|
3
|
+
*
|
|
4
|
+
* Full introspection query that captures all queries, mutations, and types
|
|
5
|
+
* from a GraphQL endpoint via the standard __schema query.
|
|
6
|
+
*/
|
|
7
|
+
import type { IntrospectionQueryResponse } from '../../types/introspection';
|
|
8
|
+
/**
|
|
9
|
+
* Full schema introspection query
|
|
10
|
+
*
|
|
11
|
+
* Captures:
|
|
12
|
+
* - All Query fields with args and return types
|
|
13
|
+
* - All Mutation fields with args and return types
|
|
14
|
+
* - All types (OBJECT, INPUT_OBJECT, ENUM, SCALAR) for resolution
|
|
15
|
+
*
|
|
16
|
+
* Uses a recursive TypeRef fragment to handle deeply nested type wrappers
|
|
17
|
+
* (e.g., [String!]! = NON_NULL(LIST(NON_NULL(SCALAR))))
|
|
18
|
+
*/
|
|
19
|
+
export declare const SCHEMA_INTROSPECTION_QUERY = "\nquery IntrospectSchema {\n __schema {\n queryType {\n name\n }\n mutationType {\n name\n }\n subscriptionType {\n name\n }\n types {\n kind\n name\n description\n fields(includeDeprecated: true) {\n name\n description\n args {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n }\n type {\n ...TypeRef\n }\n isDeprecated\n deprecationReason\n }\n inputFields {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n }\n interfaces {\n name\n }\n enumValues(includeDeprecated: true) {\n name\n description\n isDeprecated\n deprecationReason\n }\n possibleTypes {\n name\n }\n }\n directives {\n name\n description\n locations\n args {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n }\n }\n }\n}\n\nfragment TypeRef on __Type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }\n}\n";
|
|
20
|
+
export type { IntrospectionQueryResponse };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Schema Introspection Query
|
|
3
|
+
*
|
|
4
|
+
* Full introspection query that captures all queries, mutations, and types
|
|
5
|
+
* from a GraphQL endpoint via the standard __schema query.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Full schema introspection query
|
|
9
|
+
*
|
|
10
|
+
* Captures:
|
|
11
|
+
* - All Query fields with args and return types
|
|
12
|
+
* - All Mutation fields with args and return types
|
|
13
|
+
* - All types (OBJECT, INPUT_OBJECT, ENUM, SCALAR) for resolution
|
|
14
|
+
*
|
|
15
|
+
* Uses a recursive TypeRef fragment to handle deeply nested type wrappers
|
|
16
|
+
* (e.g., [String!]! = NON_NULL(LIST(NON_NULL(SCALAR))))
|
|
17
|
+
*/
|
|
18
|
+
export const SCHEMA_INTROSPECTION_QUERY = `
|
|
19
|
+
query IntrospectSchema {
|
|
20
|
+
__schema {
|
|
21
|
+
queryType {
|
|
22
|
+
name
|
|
23
|
+
}
|
|
24
|
+
mutationType {
|
|
25
|
+
name
|
|
26
|
+
}
|
|
27
|
+
subscriptionType {
|
|
28
|
+
name
|
|
29
|
+
}
|
|
30
|
+
types {
|
|
31
|
+
kind
|
|
32
|
+
name
|
|
33
|
+
description
|
|
34
|
+
fields(includeDeprecated: true) {
|
|
35
|
+
name
|
|
36
|
+
description
|
|
37
|
+
args {
|
|
38
|
+
name
|
|
39
|
+
description
|
|
40
|
+
type {
|
|
41
|
+
...TypeRef
|
|
42
|
+
}
|
|
43
|
+
defaultValue
|
|
44
|
+
}
|
|
45
|
+
type {
|
|
46
|
+
...TypeRef
|
|
47
|
+
}
|
|
48
|
+
isDeprecated
|
|
49
|
+
deprecationReason
|
|
50
|
+
}
|
|
51
|
+
inputFields {
|
|
52
|
+
name
|
|
53
|
+
description
|
|
54
|
+
type {
|
|
55
|
+
...TypeRef
|
|
56
|
+
}
|
|
57
|
+
defaultValue
|
|
58
|
+
}
|
|
59
|
+
interfaces {
|
|
60
|
+
name
|
|
61
|
+
}
|
|
62
|
+
enumValues(includeDeprecated: true) {
|
|
63
|
+
name
|
|
64
|
+
description
|
|
65
|
+
isDeprecated
|
|
66
|
+
deprecationReason
|
|
67
|
+
}
|
|
68
|
+
possibleTypes {
|
|
69
|
+
name
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
directives {
|
|
73
|
+
name
|
|
74
|
+
description
|
|
75
|
+
locations
|
|
76
|
+
args {
|
|
77
|
+
name
|
|
78
|
+
description
|
|
79
|
+
type {
|
|
80
|
+
...TypeRef
|
|
81
|
+
}
|
|
82
|
+
defaultValue
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fragment TypeRef on __Type {
|
|
89
|
+
kind
|
|
90
|
+
name
|
|
91
|
+
ofType {
|
|
92
|
+
kind
|
|
93
|
+
name
|
|
94
|
+
ofType {
|
|
95
|
+
kind
|
|
96
|
+
name
|
|
97
|
+
ofType {
|
|
98
|
+
kind
|
|
99
|
+
name
|
|
100
|
+
ofType {
|
|
101
|
+
kind
|
|
102
|
+
name
|
|
103
|
+
ofType {
|
|
104
|
+
kind
|
|
105
|
+
name
|
|
106
|
+
ofType {
|
|
107
|
+
kind
|
|
108
|
+
name
|
|
109
|
+
ofType {
|
|
110
|
+
kind
|
|
111
|
+
name
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
`;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform GraphQL introspection data to clean operation types
|
|
3
|
+
*
|
|
4
|
+
* This module converts raw introspection responses into the CleanOperation
|
|
5
|
+
* format used by code generators.
|
|
6
|
+
*/
|
|
7
|
+
import type { IntrospectionQueryResponse, IntrospectionType } from '../../types/introspection';
|
|
8
|
+
import { unwrapType, getBaseTypeName, isNonNull } from '../../types/introspection';
|
|
9
|
+
import type { CleanOperation, TypeRegistry } from '../../types/schema';
|
|
10
|
+
/**
|
|
11
|
+
* Build a type registry from introspection types
|
|
12
|
+
* Maps type names to their full resolved definitions
|
|
13
|
+
*
|
|
14
|
+
* This is a two-pass process to handle circular references:
|
|
15
|
+
* 1. First pass: Create all type entries with basic info
|
|
16
|
+
* 2. Second pass: Resolve fields with references to other types
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildTypeRegistry(types: IntrospectionType[]): TypeRegistry;
|
|
19
|
+
export interface TransformSchemaResult {
|
|
20
|
+
queries: CleanOperation[];
|
|
21
|
+
mutations: CleanOperation[];
|
|
22
|
+
typeRegistry: TypeRegistry;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Transform introspection response to clean operations
|
|
26
|
+
*/
|
|
27
|
+
export declare function transformSchemaToOperations(response: IntrospectionQueryResponse): TransformSchemaResult;
|
|
28
|
+
/**
|
|
29
|
+
* Filter operations by include/exclude patterns
|
|
30
|
+
* Uses glob-like patterns (supports * wildcard)
|
|
31
|
+
*/
|
|
32
|
+
export declare function filterOperations(operations: CleanOperation[], include?: string[], exclude?: string[]): CleanOperation[];
|
|
33
|
+
/**
|
|
34
|
+
* Get the set of table-related operation names from tables
|
|
35
|
+
* Used to identify which operations are already covered by table generators
|
|
36
|
+
*
|
|
37
|
+
* This includes:
|
|
38
|
+
* - Basic CRUD: all, one, create, update, delete
|
|
39
|
+
* - PostGraphile alternate mutations: updateXByY, deleteXByY (for unique constraints)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getTableOperationNames(tables: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
query?: {
|
|
44
|
+
all: string;
|
|
45
|
+
one: string;
|
|
46
|
+
create: string;
|
|
47
|
+
update: string | null;
|
|
48
|
+
delete: string | null;
|
|
49
|
+
};
|
|
50
|
+
inflection?: {
|
|
51
|
+
tableType: string;
|
|
52
|
+
};
|
|
53
|
+
}>): {
|
|
54
|
+
queries: Set<string>;
|
|
55
|
+
mutations: Set<string>;
|
|
56
|
+
tableTypePatterns: RegExp[];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Check if an operation is a table operation (already handled by table generators)
|
|
60
|
+
*/
|
|
61
|
+
export declare function isTableOperation(operation: CleanOperation, tableOperationNames: {
|
|
62
|
+
queries: Set<string>;
|
|
63
|
+
mutations: Set<string>;
|
|
64
|
+
tableTypePatterns: RegExp[];
|
|
65
|
+
}): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Get only custom operations (not covered by table generators)
|
|
68
|
+
*/
|
|
69
|
+
export declare function getCustomOperations(operations: CleanOperation[], tableOperationNames: {
|
|
70
|
+
queries: Set<string>;
|
|
71
|
+
mutations: Set<string>;
|
|
72
|
+
tableTypePatterns: RegExp[];
|
|
73
|
+
}): CleanOperation[];
|
|
74
|
+
export { unwrapType, getBaseTypeName, isNonNull };
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { unwrapType, getBaseTypeName, isNonNull, } from '../../types/introspection';
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Type Registry Builder
|
|
4
|
+
// ============================================================================
|
|
5
|
+
/**
|
|
6
|
+
* Build a type registry from introspection types
|
|
7
|
+
* Maps type names to their full resolved definitions
|
|
8
|
+
*
|
|
9
|
+
* This is a two-pass process to handle circular references:
|
|
10
|
+
* 1. First pass: Create all type entries with basic info
|
|
11
|
+
* 2. Second pass: Resolve fields with references to other types
|
|
12
|
+
*/
|
|
13
|
+
export function buildTypeRegistry(types) {
|
|
14
|
+
const registry = new Map();
|
|
15
|
+
// First pass: Create all type entries
|
|
16
|
+
for (const type of types) {
|
|
17
|
+
// Skip built-in types that start with __
|
|
18
|
+
if (type.name.startsWith('__'))
|
|
19
|
+
continue;
|
|
20
|
+
const resolvedType = {
|
|
21
|
+
kind: type.kind,
|
|
22
|
+
name: type.name,
|
|
23
|
+
description: type.description ?? undefined,
|
|
24
|
+
};
|
|
25
|
+
// Resolve enum values for ENUM types (no circular refs possible)
|
|
26
|
+
if (type.kind === 'ENUM' && type.enumValues) {
|
|
27
|
+
resolvedType.enumValues = type.enumValues.map((ev) => ev.name);
|
|
28
|
+
}
|
|
29
|
+
registry.set(type.name, resolvedType);
|
|
30
|
+
}
|
|
31
|
+
// Second pass: Resolve fields (now that all types exist in registry)
|
|
32
|
+
for (const type of types) {
|
|
33
|
+
if (type.name.startsWith('__'))
|
|
34
|
+
continue;
|
|
35
|
+
const resolvedType = registry.get(type.name);
|
|
36
|
+
if (!resolvedType)
|
|
37
|
+
continue;
|
|
38
|
+
// Resolve fields for OBJECT types
|
|
39
|
+
if (type.kind === 'OBJECT' && type.fields) {
|
|
40
|
+
resolvedType.fields = type.fields.map((field) => transformFieldToCleanObjectFieldShallow(field));
|
|
41
|
+
}
|
|
42
|
+
// Resolve input fields for INPUT_OBJECT types
|
|
43
|
+
if (type.kind === 'INPUT_OBJECT' && type.inputFields) {
|
|
44
|
+
resolvedType.inputFields = type.inputFields.map((field) => transformInputValueToCleanArgumentShallow(field));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return registry;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Transform field to CleanObjectField without resolving nested types
|
|
51
|
+
* (shallow transformation to avoid circular refs)
|
|
52
|
+
*/
|
|
53
|
+
function transformFieldToCleanObjectFieldShallow(field) {
|
|
54
|
+
return {
|
|
55
|
+
name: field.name,
|
|
56
|
+
type: transformTypeRefShallow(field.type),
|
|
57
|
+
description: field.description ?? undefined,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Transform input value to CleanArgument without resolving nested types
|
|
62
|
+
*/
|
|
63
|
+
function transformInputValueToCleanArgumentShallow(inputValue) {
|
|
64
|
+
return {
|
|
65
|
+
name: inputValue.name,
|
|
66
|
+
type: transformTypeRefShallow(inputValue.type),
|
|
67
|
+
defaultValue: inputValue.defaultValue ?? undefined,
|
|
68
|
+
description: inputValue.description ?? undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Transform TypeRef without resolving nested types
|
|
73
|
+
* Only handles wrappers (LIST, NON_NULL) and stores the type name
|
|
74
|
+
*/
|
|
75
|
+
function transformTypeRefShallow(typeRef) {
|
|
76
|
+
const cleanRef = {
|
|
77
|
+
kind: typeRef.kind,
|
|
78
|
+
name: typeRef.name,
|
|
79
|
+
};
|
|
80
|
+
if (typeRef.ofType) {
|
|
81
|
+
cleanRef.ofType = transformTypeRefShallow(typeRef.ofType);
|
|
82
|
+
}
|
|
83
|
+
return cleanRef;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Transform introspection response to clean operations
|
|
87
|
+
*/
|
|
88
|
+
export function transformSchemaToOperations(response) {
|
|
89
|
+
const { __schema: schema } = response;
|
|
90
|
+
const { types, queryType, mutationType } = schema;
|
|
91
|
+
// Build type registry first
|
|
92
|
+
const typeRegistry = buildTypeRegistry(types);
|
|
93
|
+
// Find Query and Mutation types
|
|
94
|
+
const queryTypeDef = types.find((t) => t.name === queryType.name);
|
|
95
|
+
const mutationTypeDef = mutationType
|
|
96
|
+
? types.find((t) => t.name === mutationType.name)
|
|
97
|
+
: null;
|
|
98
|
+
// Transform queries
|
|
99
|
+
const queries = queryTypeDef?.fields
|
|
100
|
+
? queryTypeDef.fields.map((field) => transformFieldToCleanOperation(field, 'query', types))
|
|
101
|
+
: [];
|
|
102
|
+
// Transform mutations
|
|
103
|
+
const mutations = mutationTypeDef?.fields
|
|
104
|
+
? mutationTypeDef.fields.map((field) => transformFieldToCleanOperation(field, 'mutation', types))
|
|
105
|
+
: [];
|
|
106
|
+
return { queries, mutations, typeRegistry };
|
|
107
|
+
}
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// Field to Operation Transformation
|
|
110
|
+
// ============================================================================
|
|
111
|
+
/**
|
|
112
|
+
* Transform an introspection field to a CleanOperation
|
|
113
|
+
*/
|
|
114
|
+
function transformFieldToCleanOperation(field, kind, types) {
|
|
115
|
+
return {
|
|
116
|
+
name: field.name,
|
|
117
|
+
kind,
|
|
118
|
+
args: field.args.map((arg) => transformInputValueToCleanArgument(arg, types)),
|
|
119
|
+
returnType: transformTypeRefToCleanTypeRef(field.type, types),
|
|
120
|
+
description: field.description ?? undefined,
|
|
121
|
+
isDeprecated: field.isDeprecated,
|
|
122
|
+
deprecationReason: field.deprecationReason ?? undefined,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Transform an input value to CleanArgument
|
|
127
|
+
*/
|
|
128
|
+
function transformInputValueToCleanArgument(inputValue, types) {
|
|
129
|
+
return {
|
|
130
|
+
name: inputValue.name,
|
|
131
|
+
type: transformTypeRefToCleanTypeRef(inputValue.type, types),
|
|
132
|
+
defaultValue: inputValue.defaultValue ?? undefined,
|
|
133
|
+
description: inputValue.description ?? undefined,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// Type Reference Transformation
|
|
138
|
+
// ============================================================================
|
|
139
|
+
/**
|
|
140
|
+
* Transform an introspection TypeRef to CleanTypeRef
|
|
141
|
+
* Recursively handles wrapper types (LIST, NON_NULL)
|
|
142
|
+
*
|
|
143
|
+
* NOTE: We intentionally do NOT resolve nested fields here to avoid
|
|
144
|
+
* infinite recursion from circular type references. Fields are resolved
|
|
145
|
+
* lazily via the TypeRegistry when needed for code generation.
|
|
146
|
+
*/
|
|
147
|
+
function transformTypeRefToCleanTypeRef(typeRef, types) {
|
|
148
|
+
const cleanRef = {
|
|
149
|
+
kind: typeRef.kind,
|
|
150
|
+
name: typeRef.name,
|
|
151
|
+
};
|
|
152
|
+
// Recursively transform ofType for wrappers (LIST, NON_NULL)
|
|
153
|
+
if (typeRef.ofType) {
|
|
154
|
+
cleanRef.ofType = transformTypeRefToCleanTypeRef(typeRef.ofType, types);
|
|
155
|
+
}
|
|
156
|
+
// For named types, only resolve enum values (they don't have circular refs)
|
|
157
|
+
// Fields are NOT resolved here - they're resolved via TypeRegistry during codegen
|
|
158
|
+
if (typeRef.name && !typeRef.ofType) {
|
|
159
|
+
const typeDef = types.find((t) => t.name === typeRef.name);
|
|
160
|
+
if (typeDef) {
|
|
161
|
+
// Add enum values for ENUM types (safe, no recursion)
|
|
162
|
+
if (typeDef.kind === 'ENUM' && typeDef.enumValues) {
|
|
163
|
+
cleanRef.enumValues = typeDef.enumValues.map((ev) => ev.name);
|
|
164
|
+
}
|
|
165
|
+
// NOTE: OBJECT and INPUT_OBJECT fields are resolved via TypeRegistry
|
|
166
|
+
// to avoid circular reference issues
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return cleanRef;
|
|
170
|
+
}
|
|
171
|
+
// ============================================================================
|
|
172
|
+
// Operation Filtering
|
|
173
|
+
// ============================================================================
|
|
174
|
+
/**
|
|
175
|
+
* Filter operations by include/exclude patterns
|
|
176
|
+
* Uses glob-like patterns (supports * wildcard)
|
|
177
|
+
*/
|
|
178
|
+
export function filterOperations(operations, include, exclude) {
|
|
179
|
+
let result = operations;
|
|
180
|
+
if (include && include.length > 0) {
|
|
181
|
+
result = result.filter((op) => matchesPatterns(op.name, include));
|
|
182
|
+
}
|
|
183
|
+
if (exclude && exclude.length > 0) {
|
|
184
|
+
result = result.filter((op) => !matchesPatterns(op.name, exclude));
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if a name matches any of the patterns
|
|
190
|
+
* Supports simple glob patterns with * wildcard
|
|
191
|
+
*/
|
|
192
|
+
function matchesPatterns(name, patterns) {
|
|
193
|
+
return patterns.some((pattern) => {
|
|
194
|
+
if (pattern === '*')
|
|
195
|
+
return true;
|
|
196
|
+
if (pattern.includes('*')) {
|
|
197
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
198
|
+
return regex.test(name);
|
|
199
|
+
}
|
|
200
|
+
return name === pattern;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// Utility Functions
|
|
205
|
+
// ============================================================================
|
|
206
|
+
/**
|
|
207
|
+
* Get the set of table-related operation names from tables
|
|
208
|
+
* Used to identify which operations are already covered by table generators
|
|
209
|
+
*
|
|
210
|
+
* This includes:
|
|
211
|
+
* - Basic CRUD: all, one, create, update, delete
|
|
212
|
+
* - PostGraphile alternate mutations: updateXByY, deleteXByY (for unique constraints)
|
|
213
|
+
*/
|
|
214
|
+
export function getTableOperationNames(tables) {
|
|
215
|
+
const queries = new Set();
|
|
216
|
+
const mutations = new Set();
|
|
217
|
+
const tableTypePatterns = [];
|
|
218
|
+
for (const table of tables) {
|
|
219
|
+
if (table.query) {
|
|
220
|
+
queries.add(table.query.all);
|
|
221
|
+
queries.add(table.query.one);
|
|
222
|
+
mutations.add(table.query.create);
|
|
223
|
+
if (table.query.update)
|
|
224
|
+
mutations.add(table.query.update);
|
|
225
|
+
if (table.query.delete)
|
|
226
|
+
mutations.add(table.query.delete);
|
|
227
|
+
}
|
|
228
|
+
// Create patterns to match alternate CRUD mutations (updateXByY, deleteXByY)
|
|
229
|
+
if (table.inflection?.tableType) {
|
|
230
|
+
const typeName = table.inflection.tableType;
|
|
231
|
+
// Match: update{TypeName}By*, delete{TypeName}By*
|
|
232
|
+
tableTypePatterns.push(new RegExp(`^update${typeName}By`, 'i'));
|
|
233
|
+
tableTypePatterns.push(new RegExp(`^delete${typeName}By`, 'i'));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return { queries, mutations, tableTypePatterns };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if an operation is a table operation (already handled by table generators)
|
|
240
|
+
*/
|
|
241
|
+
export function isTableOperation(operation, tableOperationNames) {
|
|
242
|
+
if (operation.kind === 'query') {
|
|
243
|
+
return tableOperationNames.queries.has(operation.name);
|
|
244
|
+
}
|
|
245
|
+
// Check exact match first
|
|
246
|
+
if (tableOperationNames.mutations.has(operation.name)) {
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
// Check pattern match for alternate CRUD mutations (updateXByY, deleteXByY)
|
|
250
|
+
return tableOperationNames.tableTypePatterns.some((pattern) => pattern.test(operation.name));
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get only custom operations (not covered by table generators)
|
|
254
|
+
*/
|
|
255
|
+
export function getCustomOperations(operations, tableOperationNames) {
|
|
256
|
+
return operations.filter((op) => !isTableOperation(op, tableOperationNames));
|
|
257
|
+
}
|
|
258
|
+
// Re-export utility functions from introspection types
|
|
259
|
+
export { unwrapType, getBaseTypeName, isNonNull };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|