@pothos/plugin-drizzle 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/README.md +784 -221
  3. package/dts/connection-helpers.d.ts +18 -8
  4. package/dts/connection-helpers.d.ts.map +1 -1
  5. package/dts/drizzle-field-builder.d.ts +4 -11
  6. package/dts/drizzle-field-builder.d.ts.map +1 -1
  7. package/dts/global-types.d.ts.map +1 -1
  8. package/dts/index.d.ts.map +1 -1
  9. package/dts/model-loader.d.ts +18 -17
  10. package/dts/model-loader.d.ts.map +1 -1
  11. package/dts/types.d.ts +81 -20
  12. package/dts/types.d.ts.map +1 -1
  13. package/dts/utils/adapter.d.ts +39 -0
  14. package/dts/utils/adapter.d.ts.map +1 -0
  15. package/dts/utils/await-selections.d.ts +12 -0
  16. package/dts/utils/await-selections.d.ts.map +1 -0
  17. package/dts/utils/config.d.ts +23 -3
  18. package/dts/utils/config.d.ts.map +1 -1
  19. package/dts/utils/cursors.d.ts +6 -6
  20. package/dts/utils/cursors.d.ts.map +1 -1
  21. package/dts/utils/map-query.d.ts +22 -21
  22. package/dts/utils/map-query.d.ts.map +1 -1
  23. package/dts/utils/path-info.d.ts +13 -0
  24. package/dts/utils/path-info.d.ts.map +1 -0
  25. package/dts/utils/relation-filter.d.ts +48 -0
  26. package/dts/utils/relation-filter.d.ts.map +1 -0
  27. package/dts/utils/selections.d.ts +2 -21
  28. package/dts/utils/selections.d.ts.map +1 -1
  29. package/esm/connection-helpers.d.ts +18 -8
  30. package/esm/connection-helpers.d.ts.map +1 -1
  31. package/esm/connection-helpers.js +52 -19
  32. package/esm/connection-helpers.js.map +1 -1
  33. package/esm/drizzle-field-builder.d.ts +4 -11
  34. package/esm/drizzle-field-builder.d.ts.map +1 -1
  35. package/esm/drizzle-field-builder.js +138 -96
  36. package/esm/drizzle-field-builder.js.map +1 -1
  37. package/esm/field-builder.js +61 -47
  38. package/esm/field-builder.js.map +1 -1
  39. package/esm/global-types.d.ts.map +1 -1
  40. package/esm/index.d.ts.map +1 -1
  41. package/esm/index.js +37 -61
  42. package/esm/index.js.map +1 -1
  43. package/esm/model-loader.d.ts +18 -17
  44. package/esm/model-loader.d.ts.map +1 -1
  45. package/esm/model-loader.js +76 -45
  46. package/esm/model-loader.js.map +1 -1
  47. package/esm/schema-builder.js +40 -149
  48. package/esm/schema-builder.js.map +1 -1
  49. package/esm/types.d.ts +81 -20
  50. package/esm/types.d.ts.map +1 -1
  51. package/esm/types.js +1 -0
  52. package/esm/types.js.map +1 -1
  53. package/esm/utils/adapter.d.ts +39 -0
  54. package/esm/utils/adapter.d.ts.map +1 -0
  55. package/esm/utils/adapter.js +137 -0
  56. package/esm/utils/adapter.js.map +1 -0
  57. package/esm/utils/await-selections.d.ts +12 -0
  58. package/esm/utils/await-selections.d.ts.map +1 -0
  59. package/esm/utils/await-selections.js +19 -0
  60. package/esm/utils/await-selections.js.map +1 -0
  61. package/esm/utils/config.d.ts +23 -3
  62. package/esm/utils/config.d.ts.map +1 -1
  63. package/esm/utils/config.js +1 -4
  64. package/esm/utils/config.js.map +1 -1
  65. package/esm/utils/cursors.d.ts +6 -6
  66. package/esm/utils/cursors.d.ts.map +1 -1
  67. package/esm/utils/cursors.js +55 -90
  68. package/esm/utils/cursors.js.map +1 -1
  69. package/esm/utils/map-query.d.ts +22 -21
  70. package/esm/utils/map-query.d.ts.map +1 -1
  71. package/esm/utils/map-query.js +40 -336
  72. package/esm/utils/map-query.js.map +1 -1
  73. package/esm/utils/path-info.d.ts +13 -0
  74. package/esm/utils/path-info.d.ts.map +1 -0
  75. package/esm/utils/path-info.js +37 -0
  76. package/esm/utils/path-info.js.map +1 -0
  77. package/esm/utils/relation-filter.d.ts +48 -0
  78. package/esm/utils/relation-filter.d.ts.map +1 -0
  79. package/esm/utils/relation-filter.js +92 -0
  80. package/esm/utils/relation-filter.js.map +1 -0
  81. package/esm/utils/selections.d.ts +2 -21
  82. package/esm/utils/selections.d.ts.map +1 -1
  83. package/esm/utils/selections.js +1 -133
  84. package/esm/utils/selections.js.map +1 -1
  85. package/lib/connection-helpers.js +51 -18
  86. package/lib/connection-helpers.js.map +1 -1
  87. package/lib/drizzle-field-builder.js +136 -94
  88. package/lib/drizzle-field-builder.js.map +1 -1
  89. package/lib/field-builder.js +58 -44
  90. package/lib/field-builder.js.map +1 -1
  91. package/lib/index.js +36 -60
  92. package/lib/index.js.map +1 -1
  93. package/lib/model-loader.js +76 -45
  94. package/lib/model-loader.js.map +1 -1
  95. package/lib/schema-builder.js +40 -149
  96. package/lib/schema-builder.js.map +1 -1
  97. package/lib/types.js +4 -0
  98. package/lib/types.js.map +1 -1
  99. package/lib/utils/adapter.js +147 -0
  100. package/lib/utils/adapter.js.map +1 -0
  101. package/lib/utils/await-selections.js +20 -0
  102. package/lib/utils/await-selections.js.map +1 -0
  103. package/lib/utils/config.js +1 -4
  104. package/lib/utils/config.js.map +1 -1
  105. package/lib/utils/cursors.js +47 -88
  106. package/lib/utils/cursors.js.map +1 -1
  107. package/lib/utils/map-query.js +28 -341
  108. package/lib/utils/map-query.js.map +1 -1
  109. package/lib/utils/path-info.js +39 -0
  110. package/lib/utils/path-info.js.map +1 -0
  111. package/lib/utils/relation-filter.js +91 -0
  112. package/lib/utils/relation-filter.js.map +1 -0
  113. package/lib/utils/selections.js +3 -158
  114. package/lib/utils/selections.js.map +1 -1
  115. package/package.json +8 -6
  116. package/src/connection-helpers.ts +167 -53
  117. package/src/drizzle-field-builder.ts +296 -176
  118. package/src/field-builder.ts +110 -77
  119. package/src/global-types.ts +0 -32
  120. package/src/index.ts +42 -68
  121. package/src/model-loader.ts +110 -71
  122. package/src/schema-builder.ts +76 -169
  123. package/src/types.ts +176 -44
  124. package/src/utils/adapter.ts +197 -0
  125. package/src/utils/await-selections.ts +31 -0
  126. package/src/utils/config.ts +1 -5
  127. package/src/utils/cursors.ts +53 -81
  128. package/src/utils/map-query.ts +51 -708
  129. package/src/utils/path-info.ts +40 -0
  130. package/src/utils/relation-filter.ts +185 -0
  131. package/src/utils/selections.ts +2 -207
  132. package/dts/utils/deep-equal.d.ts +0 -2
  133. package/dts/utils/deep-equal.d.ts.map +0 -1
  134. package/dts/utils/drizzle-graphql.d.ts +0 -2
  135. package/dts/utils/drizzle-graphql.d.ts.map +0 -1
  136. package/dts/utils/loader-map.d.ts +0 -11
  137. package/dts/utils/loader-map.d.ts.map +0 -1
  138. package/dts/utils/usage.d.ts +0 -5
  139. package/dts/utils/usage.d.ts.map +0 -1
  140. package/esm/utils/deep-equal.d.ts +0 -2
  141. package/esm/utils/deep-equal.d.ts.map +0 -1
  142. package/esm/utils/deep-equal.js +0 -45
  143. package/esm/utils/deep-equal.js.map +0 -1
  144. package/esm/utils/drizzle-graphql.d.ts +0 -2
  145. package/esm/utils/drizzle-graphql.d.ts.map +0 -1
  146. package/esm/utils/drizzle-graphql.js +0 -232
  147. package/esm/utils/drizzle-graphql.js.map +0 -1
  148. package/esm/utils/loader-map.d.ts +0 -11
  149. package/esm/utils/loader-map.d.ts.map +0 -1
  150. package/esm/utils/loader-map.js +0 -35
  151. package/esm/utils/loader-map.js.map +0 -1
  152. package/esm/utils/usage.d.ts +0 -5
  153. package/esm/utils/usage.d.ts.map +0 -1
  154. package/esm/utils/usage.js +0 -59
  155. package/esm/utils/usage.js.map +0 -1
  156. package/lib/utils/deep-equal.js +0 -55
  157. package/lib/utils/deep-equal.js.map +0 -1
  158. package/lib/utils/drizzle-graphql.js +0 -236
  159. package/lib/utils/drizzle-graphql.js.map +0 -1
  160. package/lib/utils/loader-map.js +0 -56
  161. package/lib/utils/loader-map.js.map +0 -1
  162. package/lib/utils/usage.js +0 -83
  163. package/lib/utils/usage.js.map +0 -1
  164. package/src/utils/deep-equal.ts +0 -57
  165. package/src/utils/drizzle-graphql.ts +0 -274
  166. package/src/utils/loader-map.ts +0 -49
  167. package/src/utils/usage.ts +0 -62
@@ -1,341 +1,45 @@
1
- import { getMappedArgumentValues, PothosValidationError } from '@pothos/core';
2
- import { GraphQLIncludeDirective, GraphQLSkipDirective, getDirectiveValues, getNamedType, isInterfaceType, isListType, isObjectType, Kind } from 'graphql';
3
- import { setLoaderMappings } from './loader-map.js';
4
- import { createState, mergeSelection, selectionCompatible, selectionToQuery } from './selections.js';
5
- import { wrapWithUsageCheck } from './usage.js';
6
- function addTypeSelectionsForField(config, type, context, info, state, selection, indirectPath, deferred, segments = []) {
7
- var _type_extensions;
8
- if (selection.name.value.startsWith('__')) {
9
- return;
10
- }
11
- const { pothosDrizzleSelect, pothosIndirectInclude } = (_type_extensions = type.extensions) !== null && _type_extensions !== void 0 ? _type_extensions : {};
12
- if (!!(pothosIndirectInclude === null || pothosIndirectInclude === void 0 ? void 0 : pothosIndirectInclude.path) && pothosIndirectInclude.path.length > 0 || !!(pothosIndirectInclude === null || pothosIndirectInclude === void 0 ? void 0 : pothosIndirectInclude.paths) && pothosIndirectInclude.paths.length === 0) {
13
- var _pothosIndirectInclude_paths;
14
- resolveIndirectIncludePaths(type, info, selection, [], (_pothosIndirectInclude_paths = pothosIndirectInclude.paths) !== null && _pothosIndirectInclude_paths !== void 0 ? _pothosIndirectInclude_paths : [
15
- pothosIndirectInclude.path
16
- ], indirectPath, (resolvedType, field, path)=>{
17
- addTypeSelectionsForField(config, resolvedType, context, info, state, field, path, deferred, segments);
18
- }, deferred);
19
- } else if (pothosIndirectInclude) {
20
- addTypeSelectionsForField(config, info.schema.getType(pothosIndirectInclude.getType()), context, info, state, selection, indirectPath, deferred, segments);
21
- return;
22
- }
23
- if (!(isObjectType(type) || isInterfaceType(type))) {
24
- return;
25
- }
26
- if (pothosDrizzleSelect) {
27
- mergeSelection(config, state, pothosDrizzleSelect === true ? true : {
28
- ...pothosDrizzleSelect
29
- });
30
- }
31
- if (selection.selectionSet && (!deferred || !state.skipDeferredFragments)) {
32
- addNestedSelections(config, type, context, info, state, selection.selectionSet, indirectPath, segments);
33
- }
34
- }
35
- function resolveIndirectIncludePaths(type, info, selection, pathPrefix, includePaths, path, resolve, deferred) {
36
- for (const includePath of includePaths){
37
- if (pathPrefix.length > 0) {
38
- resolveIndirectInclude(type, info, selection, [
39
- ...pathPrefix,
40
- ...includePath
41
- ], path, resolve, deferred);
42
- } else {
43
- resolveIndirectInclude(type, info, selection, includePath, path, resolve, deferred);
44
- }
45
- }
46
- }
47
- function resolveIndirectInclude(type, info, selection, includePath, path, resolve, deferred = false) {
48
- if (includePath.length === 0) {
49
- resolve(type, selection, path, deferred);
50
- return;
51
- }
52
- const [include, ...rest] = includePath;
53
- if (!selection.selectionSet || !include) {
54
- return;
55
- }
56
- for (const sel of selection.selectionSet.selections){
57
- switch(sel.kind){
58
- case Kind.FIELD:
59
- if (!fieldSkipped(info, sel) && sel.name.value === include.name && (isObjectType(type) || isInterfaceType(type))) {
60
- var _ref;
61
- var _sel_alias;
62
- const returnType = getNamedType(type.getFields()[sel.name.value].type);
63
- resolveIndirectInclude(returnType, info, sel, rest, [
64
- ...path,
65
- (_ref = (_sel_alias = sel.alias) === null || _sel_alias === void 0 ? void 0 : _sel_alias.value) !== null && _ref !== void 0 ? _ref : sel.name.value
66
- ], resolve, deferred);
67
- }
68
- continue;
69
- case Kind.FRAGMENT_SPREAD:
70
- if (!include.type || info.fragments[sel.name.value].typeCondition.name.value === include.type) {
71
- resolveIndirectInclude(include.type ? info.schema.getType(include.type) : type, info, info.fragments[sel.name.value], includePath, path, resolve, deferred || isDeferredFragment(sel, info));
72
- }
73
- continue;
74
- case Kind.INLINE_FRAGMENT:
75
- if (!sel.typeCondition || !include.type || sel.typeCondition.name.value === include.type) {
76
- resolveIndirectInclude(sel.typeCondition ? info.schema.getType(sel.typeCondition.name.value) : type, info, sel, includePath, path, resolve, deferred || isDeferredFragment(sel, info));
77
- }
78
- continue;
79
- default:
80
- throw new PothosValidationError(`Unsupported selection kind ${selection.kind}`);
81
- }
82
- }
83
- }
84
- function addNestedSelections(config, type, context, info, state, selections, indirectPath, segments = []) {
85
- let parentType = type;
86
- for (const selection of selections.selections){
87
- switch(selection.kind){
88
- case Kind.FIELD:
89
- addFieldSelection(config, type, context, info, state, selection, indirectPath, segments);
90
- continue;
91
- case Kind.FRAGMENT_SPREAD:
92
- var _parentType_extensions;
93
- if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
94
- continue;
95
- }
96
- parentType = info.schema.getType(info.fragments[selection.name.value].typeCondition.name.value);
97
- if (isObjectType(type) ? parentType.name !== type.name : ((_parentType_extensions = parentType.extensions) === null || _parentType_extensions === void 0 ? void 0 : _parentType_extensions.pothosDrizzleModel) !== type.extensions.pothosDrizzleModel) {
98
- continue;
99
- }
100
- addNestedSelections(config, parentType, context, info, state, info.fragments[selection.name.value].selectionSet, indirectPath, segments);
101
- continue;
102
- case Kind.INLINE_FRAGMENT:
103
- var _parentType_extensions1;
104
- if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
105
- continue;
106
- }
107
- parentType = selection.typeCondition ? info.schema.getType(selection.typeCondition.name.value) : type;
108
- if (isObjectType(type) ? parentType.name !== type.name : ((_parentType_extensions1 = parentType.extensions) === null || _parentType_extensions1 === void 0 ? void 0 : _parentType_extensions1.pothosDrizzleModel) !== type.extensions.pothosDrizzleModel) {
109
- continue;
110
- }
111
- addNestedSelections(config, parentType, context, info, state, selection.selectionSet, indirectPath, segments);
112
- continue;
113
- default:
114
- throw new PothosValidationError(`Unsupported selection kind ${selection.kind}`);
115
- }
116
- }
117
- }
118
- function addFieldSelection(config, type, context, info, state, selection, indirectPath, segments = []) {
119
- var _ref;
120
- var _selection_alias, _field_extensions;
121
- if (selection.name.value.startsWith('__') || fieldSkipped(info, selection)) {
122
- return;
123
- }
124
- const field = type.getFields()[selection.name.value];
125
- if (!field) {
126
- throw new PothosValidationError(`Unknown field ${selection.name.value} on ${type.name}`);
127
- }
128
- const allSegments = [
129
- ...segments,
130
- {
131
- field: selection.name.value,
132
- alias: (_ref = (_selection_alias = selection.alias) === null || _selection_alias === void 0 ? void 0 : _selection_alias.value) !== null && _ref !== void 0 ? _ref : selection.name.value,
133
- parentType: type.name,
134
- isList: isListType(field.type) || isListType(getNamedType(field.type))
135
- }
136
- ];
137
- const fieldSelect = (_field_extensions = field.extensions) === null || _field_extensions === void 0 ? void 0 : _field_extensions.pothosDrizzleSelect;
138
- let fieldSelectionMap;
139
- let mappings = {};
140
- if (typeof fieldSelect === 'function') {
141
- const pathInfo = {
142
- path: allSegments.map((s)=>`${s.parentType}.${s.field}`),
143
- segments: allSegments
144
- };
145
- const args = getMappedArgumentValues(field, selection, context, info);
146
- fieldSelectionMap = fieldSelect(args, context, (rawQuery, indirectInclude, expectedType)=>{
147
- const returnType = getNamedType(field.type);
148
- const query = typeof rawQuery === 'function' ? rawQuery(args, context) : rawQuery;
149
- const normalizedIndirectInclude = Array.isArray(indirectInclude) ? normalizeInclude(indirectInclude, getIndirectType(returnType, info), expectedType ? getNamedType(info.schema.getType(expectedType)) : undefined) : indirectInclude;
150
- const fieldState = createStateForSelection(config, info, normalizedIndirectInclude ? info.schema.getType(normalizedIndirectInclude.getType()) : returnType, state);
151
- if (typeof query === 'object' && Object.keys(query).length > 0) {
152
- mergeSelection(config, fieldState, {
153
- columns: {},
154
- ...query
155
- });
156
- }
157
- if (!!(normalizedIndirectInclude === null || normalizedIndirectInclude === void 0 ? void 0 : normalizedIndirectInclude.path) && normalizedIndirectInclude.path.length > 0 || !!(normalizedIndirectInclude === null || normalizedIndirectInclude === void 0 ? void 0 : normalizedIndirectInclude.paths) && normalizedIndirectInclude.paths.length > 0) {
158
- var _ref, _normalizedIndirectInclude_paths;
159
- var _returnType_extensions_pothosIndirectInclude, _returnType_extensions;
160
- resolveIndirectIncludePaths(returnType, info, selection, (_ref = (_returnType_extensions = returnType.extensions) === null || _returnType_extensions === void 0 ? void 0 : (_returnType_extensions_pothosIndirectInclude = _returnType_extensions.pothosIndirectInclude) === null || _returnType_extensions_pothosIndirectInclude === void 0 ? void 0 : _returnType_extensions_pothosIndirectInclude.path) !== null && _ref !== void 0 ? _ref : [], (_normalizedIndirectInclude_paths = normalizedIndirectInclude.paths) !== null && _normalizedIndirectInclude_paths !== void 0 ? _normalizedIndirectInclude_paths : [
161
- normalizedIndirectInclude.path
162
- ], [], (resolvedType, resolvedField, path, deferred)=>{
163
- addTypeSelectionsForField(config, resolvedType, context, info, fieldState, resolvedField, path, deferred, allSegments);
164
- });
165
- }
166
- addTypeSelectionsForField(config, returnType, context, info, fieldState, selection, [], undefined, allSegments);
167
- mappings = fieldState.mappings;
168
- return selectionToQuery(config, fieldState);
169
- }, (path)=>{
170
- const returnType = getNamedType(field.type);
171
- let node = null;
172
- resolveIndirectInclude(returnType, info, selection, path.map((name)=>({
173
- name
174
- })), [], (_, resolvedField)=>{
175
- node = resolvedField;
176
- });
177
- return node;
178
- }, pathInfo);
179
- } else {
180
- fieldSelectionMap = fieldSelect;
181
- }
182
- if (fieldSelect && selectionCompatible(state, fieldSelectionMap, true)) {
183
- var _ref1;
184
- var _selection_alias1;
185
- mergeSelection(config, state, fieldSelectionMap);
186
- state.mappings = mergeMappings(state.mappings, {
187
- [(_ref1 = (_selection_alias1 = selection.alias) === null || _selection_alias1 === void 0 ? void 0 : _selection_alias1.value) !== null && _ref1 !== void 0 ? _ref1 : selection.name.value]: {
188
- field: selection.name.value,
189
- type: type.name,
190
- mappings,
191
- indirectPath
192
- }
193
- });
194
- }
195
- }
196
- function mergeMappings(existing, incoming) {
197
- const result = {
198
- ...existing
199
- };
200
- for (const [key, value] of Object.entries(incoming)){
201
- if (result[key]) {
202
- result[key] = {
203
- ...result[key],
204
- mappings: mergeMappings(result[key].mappings, value.mappings)
205
- };
206
- } else {
207
- result[key] = value;
208
- }
209
- }
210
- return result;
211
- }
212
- export function queryFromInfo({ withUsageCheck, ...options }) {
213
- const state = stateFromInfo(options);
214
- setLoaderMappings(options.context, options.info, state.mappings);
215
- const query = selectionToQuery(options.config, state);
216
- return withUsageCheck ? wrapWithUsageCheck(query) : query;
217
- }
218
- export function stateFromInfo({ config, context, info, typeName, select, path = [], paths = [] }) {
219
- const returnType = getNamedType(info.returnType);
220
- const type = typeName ? info.schema.getTypeMap()[typeName] : returnType;
221
- const initialSelection = select ? {
1
+ import { isThenable } from '@pothos/core';
2
+ import { Plan } from '@pothos/selection-mapper';
3
+ import { drizzleAdapter } from './adapter.js';
4
+ export function queryFromInfo({ config, select, ...options }) {
5
+ const plan = Plan.fromInfo(drizzleAdapter(config), {
6
+ ...options,
7
+ // A `select` without `columns` merges as "no columns yet", not "every column".
8
+ initial: select ? {
9
+ columns: {},
10
+ ...select
11
+ } : undefined
12
+ });
13
+ if (!plan) {
14
+ // Nothing is planned under the paths: the caller gets its own selection back untouched.
15
+ return select !== null && select !== void 0 ? select : {};
16
+ }
17
+ return isThenable(plan) ? plan.then((settled)=>settled.query()) : plan.query();
18
+ }
19
+ /**
20
+ * The plan for the field `info` resolves (or `typeName`), nothing recorded: a promise while a
21
+ * select beneath the field is async, undefined when `paths` are given and nothing is selected
22
+ * under them. The model loader's, and the first step of a `drizzleField` resolve, whose
23
+ * merges are recorded so the resolver's `query()` selection can come first.
24
+ */ export function planFromInfo({ config, ...options }) {
25
+ return Plan.fromInfo(drizzleAdapter(config), options);
26
+ }
27
+ /**
28
+ * The query for a plan `planFromInfo` returned, settled: the caller's `select` first, the walked
29
+ * plan after it, the mappings recorded, and the query serialized. This is how the `query()`
30
+ * builder handed to a `drizzleField` or `drizzleConnection` resolver stays synchronous once a
31
+ * selection beneath the field is async, with the precedence of `queryFromInfo`: a relation the
32
+ * document also plans with other arguments loads on its own.
33
+ */ export function queryFromPlan(plan, select) {
34
+ if (!plan) {
35
+ // Nothing is selected under the paths: the caller gets its own selection back.
36
+ return select !== null && select !== void 0 ? select : {};
37
+ }
38
+ // A `select` without `columns` merges as "no columns yet", not "every column".
39
+ return plan.query(select ? {
222
40
  columns: {},
223
41
  ...select
224
- } : undefined;
225
- let state;
226
- if (path.length > 0 || paths.length > 0) {
227
- var _returnType_extensions, _ref;
228
- const { pothosIndirectInclude } = (_returnType_extensions = returnType.extensions) !== null && _returnType_extensions !== void 0 ? _returnType_extensions : {};
229
- resolveIndirectInclude(returnType, info, info.fieldNodes[0], (_ref = pothosIndirectInclude === null || pothosIndirectInclude === void 0 ? void 0 : pothosIndirectInclude.path) !== null && _ref !== void 0 ? _ref : [], [], (indirectType, indirectField, subPath, deferred)=>{
230
- resolveIndirectIncludePaths(indirectType, info, indirectField, [], paths.length > 0 ? paths.map((p)=>p.map((n)=>typeof n === 'string' ? {
231
- name: n
232
- } : n)) : [
233
- path.map((n)=>typeof n === 'string' ? {
234
- name: n
235
- } : n)
236
- ], subPath, (resolvedType, resolvedField, nested, deferred)=>{
237
- state = createStateForSelection(config, info, resolvedType, undefined, initialSelection);
238
- addTypeSelectionsForField(config, typeName ? type : resolvedType, context, info, state, resolvedField, nested, deferred);
239
- }, deferred);
240
- });
241
- } else {
242
- var _ref1;
243
- var _rootFieldNode_alias;
244
- state = createStateForSelection(config, info, type, undefined, initialSelection);
245
- // Create initial segment for the root query field
246
- const rootFieldNode = info.fieldNodes[0];
247
- const rootField = info.parentType.getFields()[rootFieldNode.name.value];
248
- const initialSegments = rootField ? [
249
- {
250
- field: rootFieldNode.name.value,
251
- alias: (_ref1 = (_rootFieldNode_alias = rootFieldNode.alias) === null || _rootFieldNode_alias === void 0 ? void 0 : _rootFieldNode_alias.value) !== null && _ref1 !== void 0 ? _ref1 : rootFieldNode.name.value,
252
- parentType: info.parentType.name,
253
- isList: isListType(rootField.type) || isListType(getNamedType(rootField.type))
254
- }
255
- ] : [];
256
- addTypeSelectionsForField(config, type, context, info, state, info.fieldNodes[0], [], undefined, initialSegments);
257
- }
258
- if (!state) {
259
- state = createStateForSelection(config, info, type, undefined, initialSelection);
260
- }
261
- return state;
262
- }
263
- export function selectionStateFromInfo(config, context, info, typeName) {
264
- const type = typeName ? info.schema.getTypeMap()[typeName] : info.parentType;
265
- const state = createStateForSelection(config, info, type);
266
- if (!(isObjectType(type) || isInterfaceType(type))) {
267
- throw new PothosValidationError('Drizzle plugin can only resolve selections for object and interface types');
268
- }
269
- addFieldSelection(config, type, context, info, state, info.fieldNodes[0], []);
270
- return state;
271
- }
272
- function createStateForSelection(config, info, type, parent, initialSelections) {
273
- var _targetType_extensions, _ref;
274
- const targetType = getIndirectType(type, info);
275
- const { pothosDrizzleTable } = (_targetType_extensions = targetType.extensions) !== null && _targetType_extensions !== void 0 ? _targetType_extensions : {};
276
- if (!pothosDrizzleTable) {
277
- throw new PothosValidationError(`Expected ${targetType.name} to have a table config`);
278
- }
279
- const state = createState(pothosDrizzleTable, (_ref = parent === null || parent === void 0 ? void 0 : parent.skipDeferredFragments) !== null && _ref !== void 0 ? _ref : config.skipDeferredFragments, parent);
280
- if (initialSelections) {
281
- mergeSelection(config, state, initialSelections);
282
- }
283
- return state;
284
- }
285
- export function getIndirectType(type, info) {
286
- var _targetType_extensions;
287
- let targetType = type;
288
- while((_targetType_extensions = targetType.extensions) === null || _targetType_extensions === void 0 ? void 0 : _targetType_extensions.pothosIndirectInclude){
289
- targetType = info.schema.getType(targetType.extensions.pothosIndirectInclude.getType());
290
- }
291
- return targetType;
292
- }
293
- export function normalizeInclude(path, type, expectedType) {
294
- let currentType = path.length > 0 ? type : expectedType !== null && expectedType !== void 0 ? expectedType : type;
295
- const normalized = [];
296
- if (!(isObjectType(currentType) || isInterfaceType(currentType))) {
297
- throw new PothosValidationError(`Expected ${currentType} to be an Object type`);
298
- }
299
- for (const fieldName of path){
300
- const field = currentType.getFields()[fieldName];
301
- if (!field) {
302
- throw new PothosValidationError(`Expected ${currentType} to have a field ${fieldName}`);
303
- }
304
- currentType = getNamedType(field.type);
305
- if (!(isObjectType(currentType) || isInterfaceType(currentType))) {
306
- throw new PothosValidationError(`Expected ${currentType} to be an Object or Interface type`);
307
- }
308
- normalized.push({
309
- name: fieldName,
310
- type: currentType.name
311
- });
312
- }
313
- return {
314
- getType: ()=>{
315
- var _ref;
316
- return (_ref = expectedType === null || expectedType === void 0 ? void 0 : expectedType.name) !== null && _ref !== void 0 ? _ref : normalized.length > 0 ? normalized[normalized.length - 1].type : type.name;
317
- },
318
- path: normalized
319
- };
320
- }
321
- function fieldSkipped(info, selection) {
322
- const skip = getDirectiveValues(GraphQLSkipDirective, selection, info.variableValues);
323
- if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) {
324
- return true;
325
- }
326
- const include = getDirectiveValues(GraphQLIncludeDirective, selection, info.variableValues);
327
- if ((include === null || include === void 0 ? void 0 : include.if) === false) {
328
- return true;
329
- }
330
- return false;
331
- }
332
- function isDeferredFragment(node, info) {
333
- const deferDirective = info.schema.getDirective('defer');
334
- if (!deferDirective) {
335
- return false;
336
- }
337
- const defer = getDirectiveValues(deferDirective, node, info.variableValues);
338
- return !!defer && defer.if !== false;
42
+ } : undefined);
339
43
  }
340
44
 
341
45
  //# sourceMappingURL=map-query.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/map-query.ts"],"names":["getMappedArgumentValues","PothosValidationError","GraphQLIncludeDirective","GraphQLSkipDirective","getDirectiveValues","getNamedType","isInterfaceType","isListType","isObjectType","Kind","setLoaderMappings","createState","mergeSelection","selectionCompatible","selectionToQuery","wrapWithUsageCheck","addTypeSelectionsForField","config","type","context","info","state","selection","indirectPath","deferred","segments","name","value","startsWith","pothosDrizzleSelect","pothosIndirectInclude","extensions","path","length","paths","resolveIndirectIncludePaths","resolvedType","field","schema","getType","selectionSet","skipDeferredFragments","addNestedSelections","pathPrefix","includePaths","resolve","includePath","resolveIndirectInclude","include","rest","sel","selections","kind","FIELD","fieldSkipped","returnType","getFields","alias","FRAGMENT_SPREAD","fragments","typeCondition","isDeferredFragment","INLINE_FRAGMENT","parentType","addFieldSelection","pothosDrizzleModel","allSegments","isList","fieldSelect","fieldSelectionMap","mappings","pathInfo","map","s","args","rawQuery","indirectInclude","expectedType","query","normalizedIndirectInclude","Array","isArray","normalizeInclude","getIndirectType","undefined","fieldState","createStateForSelection","Object","keys","columns","resolvedField","node","_","mergeMappings","existing","incoming","result","key","entries","queryFromInfo","withUsageCheck","options","stateFromInfo","typeName","select","getTypeMap","initialSelection","fieldNodes","indirectType","indirectField","subPath","p","n","nested","rootFieldNode","rootField","initialSegments","selectionStateFromInfo","parent","initialSelections","targetType","pothosDrizzleTable","currentType","normalized","fieldName","push","skip","variableValues","if","deferDirective","getDirective","defer"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/map-query.ts"],"names":["isThenable","Plan","drizzleAdapter","queryFromInfo","config","select","options","plan","fromInfo","initial","columns","undefined","then","settled","query","planFromInfo","queryFromPlan"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAA2BC,IAAI,QAAQ,2BAA2B;AAElE,SAA2BC,cAAc,QAAQ,eAAe;AAchE,OAAO,SAASC,cAAsC,EACpDC,MAAM,EACNC,MAAM,EACN,GAAGC,SACqB;IACxB,MAAMC,OAAON,KAAKO,QAAQ,CAACN,eAAeE,SAAS;QACjD,GAAGE,OAAO;QACV,+EAA+E;QAC/EG,SAASJ,SAAS;YAAEK,SAAS,CAAC;YAAG,GAAGL,MAAM;QAAC,IAAIM;IACjD;IAEA,IAAI,CAACJ,MAAM;QACT,wFAAwF;QACxF,OAAQF,mBAAAA,oBAAAA,SAAU,CAAC;IACrB;IAEA,OACEL,WAAWO,QAAQA,KAAKK,IAAI,CAAC,CAACC,UAAY,AAACA,QAAwBC,KAAK,MAAMP,KAAKO,KAAK;AAE5F;AAEA;;;;;CAKC,GACD,OAAO,SAASC,aAAa,EAC3BX,MAAM,EACN,GAAGE,SACgD;IACnD,OAAOL,KAAKO,QAAQ,CAACN,eAAeE,SAASE;AAC/C;AAEA;;;;;;CAMC,GACD,OAAO,SAASU,cACdT,IAA6B,EAC7BF,MAAU;IAEV,IAAI,CAACE,MAAM;QACT,+EAA+E;QAC/E,OAAQF,mBAAAA,oBAAAA,SAAU,CAAC;IACrB;IAEA,+EAA+E;IAC/E,OAAOE,KAAKO,KAAK,CAACT,SAAS;QAAEK,SAAS,CAAC;QAAG,GAAGL,MAAM;IAAC,IAAIM;AAC1D"}
@@ -0,0 +1,13 @@
1
+ import type { Position } from '@pothos/selection-mapper';
2
+ import type { PathInfo } from '../types.js';
3
+ /**
4
+ * The public `PathInfo` of a position: `path` as `Type.field` from the field the query was
5
+ * planned for down to the field being planned, and one segment per step with the alias the
6
+ * document used and whether the field is a list.
7
+ *
8
+ * The walker hands out positions, which are links rather than paths; this is the only place the
9
+ * chain is walked, and it is walked only when a `query` callback or a `select` function actually
10
+ * wants one. A field whose query is a plain object never builds either array.
11
+ */
12
+ export declare function pathInfoFor(position: Position | undefined): PathInfo | undefined;
13
+ //# sourceMappingURL=path-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-info.d.ts","sourceRoot":"","sources":["../../src/utils/path-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAqBhF"}
@@ -0,0 +1,37 @@
1
+ import { isListType, isNonNullType } from 'graphql';
2
+ /**
3
+ * The public `PathInfo` of a position: `path` as `Type.field` from the field the query was
4
+ * planned for down to the field being planned, and one segment per step with the alias the
5
+ * document used and whether the field is a list.
6
+ *
7
+ * The walker hands out positions, which are links rather than paths; this is the only place the
8
+ * chain is walked, and it is walked only when a `query` callback or a `select` function actually
9
+ * wants one. A field whose query is a plain object never builds either array.
10
+ */ export function pathInfoFor(position) {
11
+ if (!position) {
12
+ return undefined;
13
+ }
14
+ const path = [];
15
+ const segments = [];
16
+ for(let at = position; at; at = at.parent){
17
+ var _ref;
18
+ var _at_node_alias;
19
+ const field = at.node.name.value;
20
+ path.push(`${at.type.name}.${field}`);
21
+ segments.push({
22
+ field,
23
+ alias: (_ref = (_at_node_alias = at.node.alias) === null || _at_node_alias === void 0 ? void 0 : _at_node_alias.value) !== null && _ref !== void 0 ? _ref : field,
24
+ parentType: at.type.name,
25
+ isList: isListField(at.field.type)
26
+ });
27
+ }
28
+ return {
29
+ path: path.reverse(),
30
+ segments: segments.reverse()
31
+ };
32
+ }
33
+ /** A list field, whether or not the list itself is non-null (`[Post!]!`). */ function isListField(type) {
34
+ return isListType(type) || isNonNullType(type) && isListType(type.ofType);
35
+ }
36
+
37
+ //# sourceMappingURL=path-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/path-info.ts"],"names":["isListType","isNonNullType","pathInfoFor","position","undefined","path","segments","at","parent","field","node","name","value","push","type","alias","parentType","isList","isListField","reverse","ofType"],"mappings":"AACA,SAAiCA,UAAU,EAAEC,aAAa,QAAQ,UAAU;AAG5E;;;;;;;;CAQC,GACD,OAAO,SAASC,YAAYC,QAA8B;IACxD,IAAI,CAACA,UAAU;QACb,OAAOC;IACT;IAEA,MAAMC,OAAiB,EAAE;IACzB,MAAMC,WAA4B,EAAE;IAEpC,IAAK,IAAIC,KAA2BJ,UAAUI,IAAIA,KAAKA,GAAGC,MAAM,CAAE;;YAMvDD;QALT,MAAME,QAAQF,GAAGG,IAAI,CAACC,IAAI,CAACC,KAAK;QAEhCP,KAAKQ,IAAI,CAAC,GAAGN,GAAGO,IAAI,CAACH,IAAI,CAAC,CAAC,EAAEF,OAAO;QACpCH,SAASO,IAAI,CAAC;YACZJ;YACAM,KAAK,WAAER,iBAAAA,GAAGG,IAAI,CAACK,KAAK,cAAbR,qCAAAA,eAAeK,KAAK,uCAAIH;YAC/BO,YAAYT,GAAGO,IAAI,CAACH,IAAI;YACxBM,QAAQC,YAAYX,GAAGE,KAAK,CAACK,IAAI;QACnC;IACF;IAEA,OAAO;QAAET,MAAMA,KAAKc,OAAO;QAAIb,UAAUA,SAASa,OAAO;IAAG;AAC9D;AAEA,2EAA2E,GAC3E,SAASD,YAAYJ,IAAuB;IAC1C,OAAOd,WAAWc,SAAUb,cAAca,SAASd,WAAWc,KAAKM,MAAM;AAC3E"}
@@ -0,0 +1,48 @@
1
+ import { type Column, type Relation, type SQL, type Table } from 'drizzle-orm';
2
+ import type { DrizzleClient } from '../types.js';
3
+ /** The public client's SQL construction capability. */
4
+ export type RelationQueryBuilder = Pick<DrizzleClient, 'select'>;
5
+ export interface RelationFilter {
6
+ /**
7
+ * A predicate over the target table alone, for the places where only the target table is in
8
+ * scope: a `where` handed to a user `select`, or a count that selects from the target table.
9
+ * SQLite many-to-many relations with a non-null unique target key project identities through
10
+ * Drizzle's join. Other cases use an `exists` over the junction.
11
+ */
12
+ filter: SQL;
13
+ /**
14
+ * Counts the rows the relation yields, as an expression for the surrounding query to select.
15
+ * A many-to-many relation joins the junction table in, so the count matches the rows the
16
+ * relational query builder returns for the same relation, junction duplicates included.
17
+ *
18
+ * `where` is the predicate the page query was given, and it goes ahead of the relation's own
19
+ * predicate because that is the order the relational query builder combines the two in. The
20
+ * count then repeats the page query's `where` verbatim, minus the limit and keyset clauses.
21
+ */
22
+ countRows: (where?: SQL) => SQL<number>;
23
+ /**
24
+ * Counts the distinct target rows the relation reaches, for the callers that count a related
25
+ * row once however many junction rows lead to it. `key` identifies a target row, so it has to
26
+ * be a single column the database guarantees is unique and non-null.
27
+ *
28
+ * This counts off the junction rather than counting the target table filtered by `filter`,
29
+ * which says the same thing the long way round: the join reads the junction rows the parent
30
+ * reaches and stops, where the filter reads the same rows and then looks every key it found
31
+ * back up in the target table.
32
+ */
33
+ countDistinctRows: (key: Column, where?: SQL) => SQL<number>;
34
+ }
35
+ /**
36
+ * The parent-to-child SQL for one relation, built by drizzle so the plugin agrees with the
37
+ * relational query builder on what "related" means: `through` (many-to-many), the relation's own
38
+ * `where`, and a reversed relation's inherited `where` all come from drizzle rather than from a
39
+ * join reassembled here out of source and target columns.
40
+ *
41
+ * Both the join and its restrictions come from `relationToSQL`, including when the target is
42
+ * aliased for the identity lookup. No junction columns or comparisons are reconstructed here.
43
+ *
44
+ * `parentTable` is the parent as it appears in the surrounding query, so the aliased table when
45
+ * the query builder aliased it.
46
+ */
47
+ export declare function buildRelationFilter(client: RelationQueryBuilder, relation: Relation, parentTable: Table, targetKey?: Column[]): RelationFilter;
48
+ //# sourceMappingURL=relation-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-filter.d.ts","sourceRoot":"","sources":["../../src/utils/relation-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EAOX,KAAK,QAAQ,EAEb,KAAK,GAAG,EAGR,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,MAAM,EAAE,GAAG,CAAC;IACZ;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;;;;;OASG;IACH,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,KAAK,EAClB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,cAAc,CA+ChB"}
@@ -0,0 +1,92 @@
1
+ import { aliasedTable, aliasedTableColumn, and, count, countDistinct, exists, getTableName, inArray, is, relationToSQL, sql } from 'drizzle-orm';
2
+ import { SQLiteTable } from 'drizzle-orm/sqlite-core';
3
+ // `select 1`, for an `exists` that only has to find a row.
4
+ const one = {
5
+ one: sql`1`
6
+ };
7
+ /**
8
+ * The parent-to-child SQL for one relation, built by drizzle so the plugin agrees with the
9
+ * relational query builder on what "related" means: `through` (many-to-many), the relation's own
10
+ * `where`, and a reversed relation's inherited `where` all come from drizzle rather than from a
11
+ * join reassembled here out of source and target columns.
12
+ *
13
+ * Both the join and its restrictions come from `relationToSQL`, including when the target is
14
+ * aliased for the identity lookup. No junction columns or comparisons are reconstructed here.
15
+ *
16
+ * `parentTable` is the parent as it appears in the surrounding query, so the aliased table when
17
+ * the query builder aliased it.
18
+ */ export function buildRelationFilter(client, relation, parentTable, targetKey) {
19
+ const targetTable = relation.targetTable;
20
+ const throughTable = relation.throughTable;
21
+ // `filter` correlates the parent to the target, or to the junction table when there is one, in
22
+ // which case `joinCondition` is what carries the junction the rest of the way to the target.
23
+ const { filter, joinCondition } = relationToSQL(relation, parentTable, targetTable, throughTable);
24
+ if (!throughTable || !joinCondition) {
25
+ // Without a junction table every related row is a distinct target row, so the two counts are
26
+ // the same query.
27
+ const countRows = (where)=>countOf(client.select(countStar()).from(targetTable).where(and(where, filter)));
28
+ return {
29
+ filter,
30
+ countRows,
31
+ countDistinctRows: (_key, where)=>countRows(where)
32
+ };
33
+ }
34
+ const relatedRows = (aggregate, where)=>countOf(client.select(aggregate).from(targetTable).innerJoin(throughTable, joinCondition).where(and(where, filter)));
35
+ return {
36
+ // SQLite needs the identity lookup to avoid target scans. PostgreSQL can plan EXISTS as
37
+ // a semijoin; projecting identities adds a target join its planner may not eliminate.
38
+ filter: (targetKey === null || targetKey === void 0 ? void 0 : targetKey.length) && is(targetTable, SQLiteTable) ? targetIdentityInRelation(client, relation, parentTable, targetTable, throughTable, targetKey) : exists(client.select(one).from(throughTable).where(and(filter, joinCondition))),
39
+ countRows: (where)=>relatedRows(countStar(), where),
40
+ countDistinctRows: (key, where)=>relatedRows({
41
+ count: countDistinct(key)
42
+ }, where)
43
+ };
44
+ }
45
+ /**
46
+ * Project a non-null unique target key through the original relation join, then compare that
47
+ * key with itself. Comparing the target key directly with a junction column would change
48
+ * SQLite's collation precedence. Keeping the join also handles composite relation keys and
49
+ * excludes null junction keys without special truth-table guards.
50
+ *
51
+ * `key` must be a database-enforced unique constraint whose columns are all NOT NULL. That
52
+ * makes membership identify exactly one target row and keeps negation two-valued. SQLite can
53
+ * allow nulls even in primary keys, so callers must check notNull, not just primary.
54
+ *
55
+ * Build object restrictions and RAW callbacks against the inner target alias. Static RAW SQL
56
+ * is passed through by Drizzle: references to the outer target can still force a target scan.
57
+ * A RAW callback must use its supplied table to benefit from the identity lookup.
58
+ */ function targetIdentityInRelation(client, relation, parentTable, targetTable, throughTable, key) {
59
+ const names = new Set([
60
+ parentTable,
61
+ targetTable,
62
+ throughTable
63
+ ].map(getTableName));
64
+ let alias = '_pothos_related';
65
+ while(names.has(alias)){
66
+ alias += '_';
67
+ }
68
+ const matchedTable = aliasedTable(targetTable, alias);
69
+ const { filter, joinCondition } = relationToSQL(relation, parentTable, matchedTable, throughTable);
70
+ const fields = Object.fromEntries(key.map((column, i)=>[
71
+ String(i),
72
+ sql`${aliasedTableColumn(column, alias)}`
73
+ ]));
74
+ const columns = key.map((column)=>sql`${column}`);
75
+ const identity = columns.length === 1 ? columns[0] : sql`(${sql.join(columns, sql`, `)})`;
76
+ return inArray(identity, client.select(fields).from(throughTable).innerJoin(matchedTable, joinCondition).where(filter));
77
+ }
78
+ // A fresh `count(*)` each time: `mapWith` mutates the `SQL` it is called on, so a shared one
79
+ // would be re-decoded by every query that selected it.
80
+ function countStar() {
81
+ return {
82
+ count: count()
83
+ };
84
+ }
85
+ // The count as a value the surrounding query can select. `count()` carries drizzle's `Number`
86
+ // decoder, but a `select` built around it decodes as the row it returns, so the mapping is
87
+ // restored here and the count comes back as a number on every dialect.
88
+ function countOf(rows) {
89
+ return sql`${rows.getSQL()}`.mapWith(Number);
90
+ }
91
+
92
+ //# sourceMappingURL=relation-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/relation-filter.ts"],"names":["aliasedTable","aliasedTableColumn","and","count","countDistinct","exists","getTableName","inArray","is","relationToSQL","sql","SQLiteTable","one","buildRelationFilter","client","relation","parentTable","targetKey","targetTable","throughTable","filter","joinCondition","countRows","where","countOf","select","countStar","from","countDistinctRows","_key","relatedRows","aggregate","innerJoin","length","targetIdentityInRelation","key","names","Set","map","alias","has","matchedTable","fields","Object","fromEntries","column","i","String","columns","identity","join","rows","getSQL","mapWith","Number"],"mappings":"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"}