@disruptorganic/mcp-google-search-console 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/.env.example +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/dist/auth/index.d.ts +3 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +2 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth/oauth2.d.ts +31 -0
  9. package/dist/auth/oauth2.d.ts.map +1 -0
  10. package/dist/auth/oauth2.js +380 -0
  11. package/dist/auth/oauth2.js.map +1 -0
  12. package/dist/config/index.d.ts +36 -0
  13. package/dist/config/index.d.ts.map +1 -0
  14. package/dist/config/index.js +87 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/gsc/client.d.ts +72 -0
  17. package/dist/gsc/client.d.ts.map +1 -0
  18. package/dist/gsc/client.js +243 -0
  19. package/dist/gsc/client.js.map +1 -0
  20. package/dist/gsc/index.d.ts +3 -0
  21. package/dist/gsc/index.d.ts.map +1 -0
  22. package/dist/gsc/index.js +3 -0
  23. package/dist/gsc/index.js.map +1 -0
  24. package/dist/gsc/properties.d.ts +42 -0
  25. package/dist/gsc/properties.d.ts.map +1 -0
  26. package/dist/gsc/properties.js +393 -0
  27. package/dist/gsc/properties.js.map +1 -0
  28. package/dist/gsc/queries.d.ts +73 -0
  29. package/dist/gsc/queries.d.ts.map +1 -0
  30. package/dist/gsc/queries.js +390 -0
  31. package/dist/gsc/queries.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +186 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/tools/compare-date-ranges.d.ts +83 -0
  37. package/dist/tools/compare-date-ranges.d.ts.map +1 -0
  38. package/dist/tools/compare-date-ranges.js +462 -0
  39. package/dist/tools/compare-date-ranges.js.map +1 -0
  40. package/dist/tools/get-property-info.d.ts +30 -0
  41. package/dist/tools/get-property-info.d.ts.map +1 -0
  42. package/dist/tools/get-property-info.js +174 -0
  43. package/dist/tools/get-property-info.js.map +1 -0
  44. package/dist/tools/get-top-pages.d.ts +103 -0
  45. package/dist/tools/get-top-pages.d.ts.map +1 -0
  46. package/dist/tools/get-top-pages.js +254 -0
  47. package/dist/tools/get-top-pages.js.map +1 -0
  48. package/dist/tools/get-top-queries.d.ts +103 -0
  49. package/dist/tools/get-top-queries.d.ts.map +1 -0
  50. package/dist/tools/get-top-queries.js +254 -0
  51. package/dist/tools/get-top-queries.js.map +1 -0
  52. package/dist/tools/health-check.d.ts +12 -0
  53. package/dist/tools/health-check.d.ts.map +1 -0
  54. package/dist/tools/health-check.js +107 -0
  55. package/dist/tools/health-check.js.map +1 -0
  56. package/dist/tools/index.d.ts +1124 -0
  57. package/dist/tools/index.d.ts.map +1 -0
  58. package/dist/tools/index.js +70 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/list-properties.d.ts +50 -0
  61. package/dist/tools/list-properties.d.ts.map +1 -0
  62. package/dist/tools/list-properties.js +234 -0
  63. package/dist/tools/list-properties.js.map +1 -0
  64. package/dist/tools/query-advanced.d.ts +109 -0
  65. package/dist/tools/query-advanced.d.ts.map +1 -0
  66. package/dist/tools/query-advanced.js +378 -0
  67. package/dist/tools/query-advanced.js.map +1 -0
  68. package/dist/tools/query-by-keyword.d.ts +115 -0
  69. package/dist/tools/query-by-keyword.d.ts.map +1 -0
  70. package/dist/tools/query-by-keyword.js +339 -0
  71. package/dist/tools/query-by-keyword.js.map +1 -0
  72. package/dist/tools/query-by-url.d.ts +116 -0
  73. package/dist/tools/query-by-url.d.ts.map +1 -0
  74. package/dist/tools/query-by-url.js +366 -0
  75. package/dist/tools/query-by-url.js.map +1 -0
  76. package/dist/utils/cache.d.ts +22 -0
  77. package/dist/utils/cache.d.ts.map +1 -0
  78. package/dist/utils/cache.js +75 -0
  79. package/dist/utils/cache.js.map +1 -0
  80. package/dist/utils/index.d.ts +8 -0
  81. package/dist/utils/index.d.ts.map +1 -0
  82. package/dist/utils/index.js +8 -0
  83. package/dist/utils/index.js.map +1 -0
  84. package/dist/utils/logger.d.ts +4 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +15 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/metrics.d.ts +9 -0
  89. package/dist/utils/metrics.d.ts.map +1 -0
  90. package/dist/utils/metrics.js +54 -0
  91. package/dist/utils/metrics.js.map +1 -0
  92. package/dist/utils/rate-limiter.d.ts +24 -0
  93. package/dist/utils/rate-limiter.d.ts.map +1 -0
  94. package/dist/utils/rate-limiter.js +175 -0
  95. package/dist/utils/rate-limiter.js.map +1 -0
  96. package/dist/utils/token-estimator.d.ts +33 -0
  97. package/dist/utils/token-estimator.d.ts.map +1 -0
  98. package/dist/utils/token-estimator.js +226 -0
  99. package/dist/utils/token-estimator.js.map +1 -0
  100. package/dist/utils/types.d.ts +68 -0
  101. package/dist/utils/types.d.ts.map +1 -0
  102. package/dist/utils/types.js +13 -0
  103. package/dist/utils/types.js.map +1 -0
  104. package/dist/utils/validators.d.ts +579 -0
  105. package/dist/utils/validators.d.ts.map +1 -0
  106. package/dist/utils/validators.js +358 -0
  107. package/dist/utils/validators.js.map +1 -0
  108. package/package.json +73 -0
@@ -0,0 +1,339 @@
1
+ import { z } from 'zod';
2
+ import { listProperties, matchProperty, generatePropertyMatchError } from '../gsc/properties.js';
3
+ import { queryMultipleKeywords } from '../gsc/queries.js';
4
+ import { chunkResults } from '../utils/token-estimator.js';
5
+ import { validateDateRangeStrict, validateDimensions } from '../utils/validators.js';
6
+ import { logger } from '../utils/logger.js';
7
+ export const QueryByKeywordSchema = z.object({
8
+ property: z.string()
9
+ .min(1, 'Property identifier is required')
10
+ .describe('Property identifier from list_properties (e.g., "sc-domain:example.com")'),
11
+ keywords: z.array(z.string().min(1, 'Keyword cannot be empty'))
12
+ .min(1, 'At least one keyword is required')
13
+ .max(50, 'Maximum 50 keywords allowed per request')
14
+ .describe('Array of keyword strings to query (1-50 keywords)'),
15
+ startDate: z.string()
16
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Start date must be in ISO 8601 format (YYYY-MM-DD)')
17
+ .describe('Start date in ISO 8601 format (YYYY-MM-DD)'),
18
+ endDate: z.string()
19
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'End date must be in ISO 8601 format (YYYY-MM-DD)')
20
+ .describe('End date in ISO 8601 format (YYYY-MM-DD)'),
21
+ searchType: z.enum(['web', 'image', 'video', 'news', 'discover', 'googleNews'])
22
+ .optional()
23
+ .default('web')
24
+ .describe('Search type filter (default: web)'),
25
+ dimensions: z.array(z.enum(['page', 'device', 'country', 'searchAppearance', 'date']))
26
+ .optional()
27
+ .describe('Additional dimensions beyond query (max 2 additional for total of 3)'),
28
+ deviceType: z.enum(['desktop', 'mobile', 'tablet'])
29
+ .optional()
30
+ .describe('Filter by device type'),
31
+ country: z.string()
32
+ .length(3, 'Country code must be 3 letters')
33
+ .regex(/^[a-z]{3}$/, 'Country code must be 3 lowercase letters (ISO 3166-1 alpha-3)')
34
+ .optional()
35
+ .describe('Filter by country code (e.g., "usa", "gbr")'),
36
+ offset: z.number()
37
+ .int('Offset must be an integer')
38
+ .min(0, 'Offset must be non-negative')
39
+ .optional()
40
+ .default(0)
41
+ .describe('Pagination offset for chunked responses (default: 0)'),
42
+ limit: z.number()
43
+ .int('Limit must be an integer')
44
+ .min(1, 'Limit must be at least 1')
45
+ .max(25000, 'Limit cannot exceed 25,000 (GSC API limit)')
46
+ .optional()
47
+ .describe('Max rows per chunk (auto-calculated if not provided)'),
48
+ });
49
+ export const queryByKeywordTool = {
50
+ name: 'query_by_keyword',
51
+ description: 'Retrieves search performance data for one or more keywords/queries from Google Search Console. Returns clicks, impressions, CTR, average position, and ranking URLs for each keyword. Supports filtering by date range, search type (web/image/video/news), device, and country. Automatically chunks large results under 20k tokens with pagination. IMPORTANT: Use list_properties first to get the correct property identifier.',
52
+ inputSchema: {
53
+ type: 'object',
54
+ properties: {
55
+ property: {
56
+ type: 'string',
57
+ description: 'Property identifier from list_properties (e.g., "sc-domain:example.com")',
58
+ },
59
+ keywords: {
60
+ type: 'array',
61
+ items: { type: 'string' },
62
+ description: 'Array of keyword strings to query (1-50 keywords)',
63
+ minItems: 1,
64
+ maxItems: 50,
65
+ },
66
+ startDate: {
67
+ type: 'string',
68
+ description: 'Start date in ISO 8601 format (YYYY-MM-DD)',
69
+ pattern: '^\\d{4}-\\d{2}-\\d{2}$',
70
+ },
71
+ endDate: {
72
+ type: 'string',
73
+ description: 'End date in ISO 8601 format (YYYY-MM-DD)',
74
+ pattern: '^\\d{4}-\\d{2}-\\d{2}$',
75
+ },
76
+ searchType: {
77
+ type: 'string',
78
+ enum: ['web', 'image', 'video', 'news', 'discover', 'googleNews'],
79
+ description: 'Search type filter (default: web)',
80
+ default: 'web',
81
+ },
82
+ dimensions: {
83
+ type: 'array',
84
+ items: {
85
+ type: 'string',
86
+ enum: ['page', 'device', 'country', 'searchAppearance', 'date'],
87
+ },
88
+ description: 'Additional dimensions beyond query (max 2 additional for total of 3)',
89
+ },
90
+ deviceType: {
91
+ type: 'string',
92
+ enum: ['desktop', 'mobile', 'tablet'],
93
+ description: 'Filter by device type',
94
+ },
95
+ country: {
96
+ type: 'string',
97
+ description: 'Filter by country code (e.g., "usa", "gbr")',
98
+ pattern: '^[a-z]{3}$',
99
+ },
100
+ offset: {
101
+ type: 'number',
102
+ description: 'Pagination offset for chunked responses (default: 0)',
103
+ default: 0,
104
+ minimum: 0,
105
+ },
106
+ limit: {
107
+ type: 'number',
108
+ description: 'Max rows per chunk (auto-calculated if not provided)',
109
+ minimum: 1,
110
+ maximum: 25000,
111
+ },
112
+ },
113
+ required: ['property', 'keywords', 'startDate', 'endDate'],
114
+ },
115
+ };
116
+ function formatResultRow(keys, dimensions, clicks, impressions, ctr, position) {
117
+ const row = {};
118
+ dimensions.forEach((dim, index) => {
119
+ row[dim] = keys[index] || '';
120
+ });
121
+ row.clicks = clicks;
122
+ row.impressions = impressions;
123
+ row.ctr = parseFloat((ctr * 100).toFixed(2));
124
+ row.position = parseFloat(position.toFixed(1));
125
+ return row;
126
+ }
127
+ export async function handleQueryByKeyword(params, client) {
128
+ try {
129
+ logger.info('Handling query_by_keyword request', {
130
+ propertyInput: params.property,
131
+ keywordCount: params.keywords?.length,
132
+ dateRange: params.startDate && params.endDate ? `${params.startDate} to ${params.endDate}` : 'not provided',
133
+ });
134
+ const validationResult = QueryByKeywordSchema.safeParse(params);
135
+ if (!validationResult.success) {
136
+ const errorMessages = validationResult.error.issues.map(issue => {
137
+ const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
138
+ return `${path}${issue.message}`;
139
+ }).join('; ');
140
+ logger.error('Input validation failed', {
141
+ errors: errorMessages,
142
+ params,
143
+ });
144
+ return {
145
+ content: [{
146
+ type: 'text',
147
+ text: JSON.stringify({
148
+ error: 'Input validation failed',
149
+ details: errorMessages,
150
+ }, null, 2),
151
+ }],
152
+ isError: true,
153
+ };
154
+ }
155
+ const validated = validationResult.data;
156
+ try {
157
+ validateDateRangeStrict(validated.startDate, validated.endDate);
158
+ }
159
+ catch (error) {
160
+ const errorMessage = error instanceof Error ? error.message : String(error);
161
+ logger.error('Date range validation failed', {
162
+ startDate: validated.startDate,
163
+ endDate: validated.endDate,
164
+ error: errorMessage,
165
+ });
166
+ return {
167
+ content: [{
168
+ type: 'text',
169
+ text: JSON.stringify({
170
+ error: 'Invalid date range',
171
+ details: errorMessage,
172
+ }, null, 2),
173
+ }],
174
+ isError: true,
175
+ };
176
+ }
177
+ const allDimensions = ['query', ...(validated.dimensions || [])];
178
+ try {
179
+ validateDimensions(allDimensions, 3);
180
+ }
181
+ catch (error) {
182
+ const errorMessage = error instanceof Error ? error.message : String(error);
183
+ logger.error('Dimension validation failed', {
184
+ dimensions: allDimensions,
185
+ error: errorMessage,
186
+ });
187
+ return {
188
+ content: [{
189
+ type: 'text',
190
+ text: JSON.stringify({
191
+ error: 'Too many dimensions',
192
+ details: errorMessage,
193
+ }, null, 2),
194
+ }],
195
+ isError: true,
196
+ };
197
+ }
198
+ logger.debug('Fetching available properties');
199
+ const availableProperties = await listProperties(client);
200
+ if (availableProperties.length === 0) {
201
+ logger.warn('No properties found for this account');
202
+ return {
203
+ content: [{
204
+ type: 'text',
205
+ text: JSON.stringify({
206
+ error: 'No properties found',
207
+ details: 'No Google Search Console properties are accessible with this account. Please verify your account has access to at least one property.',
208
+ }, null, 2),
209
+ }],
210
+ isError: true,
211
+ };
212
+ }
213
+ const matchResult = matchProperty(validated.property, availableProperties);
214
+ if (!matchResult.matched) {
215
+ const errorMessage = generatePropertyMatchError(matchResult, availableProperties);
216
+ logger.error('Property matching failed', {
217
+ searchInput: validated.property,
218
+ matchType: matchResult.matchType,
219
+ alternativeCount: matchResult.alternatives?.length || 0,
220
+ });
221
+ return {
222
+ content: [{
223
+ type: 'text',
224
+ text: JSON.stringify({
225
+ error: 'Property not found or ambiguous',
226
+ details: errorMessage,
227
+ }, null, 2),
228
+ }],
229
+ isError: true,
230
+ };
231
+ }
232
+ const matchedProperty = matchResult.matched;
233
+ logger.info('Property matched successfully', {
234
+ searchInput: validated.property,
235
+ matched: matchedProperty.propertyUrl,
236
+ matchType: matchResult.matchType,
237
+ });
238
+ const additionalFilters = [];
239
+ if (validated.deviceType) {
240
+ additionalFilters.push({
241
+ dimension: 'device',
242
+ operator: 'equals',
243
+ expression: validated.deviceType,
244
+ });
245
+ }
246
+ if (validated.country) {
247
+ additionalFilters.push({
248
+ dimension: 'country',
249
+ operator: 'equals',
250
+ expression: validated.country.toLowerCase(),
251
+ });
252
+ }
253
+ logger.info('Executing multi-keyword query', {
254
+ property: matchedProperty.propertyUrl,
255
+ keywordCount: validated.keywords.length,
256
+ dateRange: `${validated.startDate} to ${validated.endDate}`,
257
+ dimensions: allDimensions,
258
+ searchType: validated.searchType,
259
+ });
260
+ const rateLimiter = client.getRateLimiter();
261
+ const aggregatedResults = await queryMultipleKeywords(client, matchedProperty.propertyUrl, validated.keywords, {
262
+ startDate: validated.startDate,
263
+ endDate: validated.endDate,
264
+ dimensions: allDimensions,
265
+ searchType: validated.searchType,
266
+ rowLimit: 25000,
267
+ startRow: 0,
268
+ }, rateLimiter);
269
+ logger.info('Multi-keyword query completed', {
270
+ totalRows: aggregatedResults.totalRows,
271
+ successful: aggregatedResults.queryCounts.successful,
272
+ failed: aggregatedResults.queryCounts.failed,
273
+ });
274
+ const formattedResults = aggregatedResults.rows.map(row => formatResultRow(row.keys, allDimensions, row.clicks, row.impressions, row.ctr, row.position));
275
+ const chunked = chunkResults(formattedResults, validated.offset, validated.limit);
276
+ logger.info('Results chunked', {
277
+ totalRows: formattedResults.length,
278
+ offset: validated.offset,
279
+ limit: chunked.pagination.limit,
280
+ currentChunk: chunked.pagination.current_chunk,
281
+ totalChunks: chunked.pagination.total_chunks,
282
+ hasMore: chunked.pagination.has_more,
283
+ });
284
+ const response = {
285
+ property: matchedProperty.propertyUrl,
286
+ keywords: validated.keywords,
287
+ dateRange: {
288
+ start: validated.startDate,
289
+ end: validated.endDate,
290
+ },
291
+ filters: {
292
+ searchType: validated.searchType,
293
+ deviceType: validated.deviceType,
294
+ country: validated.country,
295
+ },
296
+ results: chunked.results,
297
+ pagination: chunked.pagination,
298
+ metadata: {
299
+ queryCounts: aggregatedResults.queryCounts,
300
+ errors: aggregatedResults.errors?.map(err => ({
301
+ keyword: err.identifier,
302
+ error: err.error,
303
+ })),
304
+ },
305
+ };
306
+ logger.info('Query by keyword completed successfully', {
307
+ property: matchedProperty.propertyUrl,
308
+ keywordCount: validated.keywords.length,
309
+ resultsReturned: chunked.results.length,
310
+ hasMore: chunked.pagination.has_more,
311
+ });
312
+ return {
313
+ content: [{
314
+ type: 'text',
315
+ text: JSON.stringify(response, null, 2),
316
+ }],
317
+ };
318
+ }
319
+ catch (error) {
320
+ const errorMessage = error instanceof Error ? error.message : String(error);
321
+ const errorStack = error instanceof Error ? error.stack : undefined;
322
+ logger.error('Query by keyword handler failed', {
323
+ error: errorMessage,
324
+ stack: errorStack,
325
+ params,
326
+ });
327
+ return {
328
+ content: [{
329
+ type: 'text',
330
+ text: JSON.stringify({
331
+ error: 'Query execution failed',
332
+ details: errorMessage,
333
+ }, null, 2),
334
+ }],
335
+ isError: true,
336
+ };
337
+ }
338
+ }
339
+ //# sourceMappingURL=query-by-keyword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-by-keyword.js","sourceRoot":"","sources":["../../src/tools/query-by-keyword.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { z } from 'zod';
2
+ import { GSCClient } from '../gsc/client.js';
3
+ export interface ToolResponse {
4
+ content: Array<{
5
+ type: 'text';
6
+ text: string;
7
+ }>;
8
+ isError?: boolean;
9
+ }
10
+ export declare const QueryByUrlSchema: z.ZodObject<{
11
+ property: z.ZodString;
12
+ urls: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
13
+ startDate: z.ZodString;
14
+ endDate: z.ZodString;
15
+ searchType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["web", "image", "video", "news", "discover", "googleNews"]>>>;
16
+ dimensions: z.ZodOptional<z.ZodArray<z.ZodEnum<["query", "device", "country", "searchAppearance", "date"]>, "many">>;
17
+ deviceType: z.ZodOptional<z.ZodEnum<["desktop", "mobile", "tablet"]>>;
18
+ country: z.ZodOptional<z.ZodString>;
19
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
20
+ limit: z.ZodOptional<z.ZodNumber>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ startDate: string;
23
+ endDate: string;
24
+ searchType: "web" | "image" | "video" | "news" | "discover" | "googleNews";
25
+ property: string;
26
+ offset: number;
27
+ urls: string[];
28
+ dimensions?: ("query" | "country" | "device" | "searchAppearance" | "date")[] | undefined;
29
+ limit?: number | undefined;
30
+ deviceType?: "desktop" | "mobile" | "tablet" | undefined;
31
+ country?: string | undefined;
32
+ }, {
33
+ startDate: string;
34
+ endDate: string;
35
+ property: string;
36
+ urls: string[];
37
+ dimensions?: ("query" | "country" | "device" | "searchAppearance" | "date")[] | undefined;
38
+ searchType?: "web" | "image" | "video" | "news" | "discover" | "googleNews" | undefined;
39
+ limit?: number | undefined;
40
+ deviceType?: "desktop" | "mobile" | "tablet" | undefined;
41
+ country?: string | undefined;
42
+ offset?: number | undefined;
43
+ }>;
44
+ export type QueryByUrlParams = z.infer<typeof QueryByUrlSchema>;
45
+ export declare const queryByUrlTool: {
46
+ name: string;
47
+ description: string;
48
+ inputSchema: {
49
+ type: string;
50
+ properties: {
51
+ property: {
52
+ type: string;
53
+ description: string;
54
+ };
55
+ urls: {
56
+ type: string;
57
+ items: {
58
+ type: string;
59
+ format: string;
60
+ };
61
+ description: string;
62
+ minItems: number;
63
+ maxItems: number;
64
+ };
65
+ startDate: {
66
+ type: string;
67
+ description: string;
68
+ pattern: string;
69
+ };
70
+ endDate: {
71
+ type: string;
72
+ description: string;
73
+ pattern: string;
74
+ };
75
+ searchType: {
76
+ type: string;
77
+ enum: string[];
78
+ description: string;
79
+ default: string;
80
+ };
81
+ dimensions: {
82
+ type: string;
83
+ items: {
84
+ type: string;
85
+ enum: string[];
86
+ };
87
+ description: string;
88
+ };
89
+ deviceType: {
90
+ type: string;
91
+ enum: string[];
92
+ description: string;
93
+ };
94
+ country: {
95
+ type: string;
96
+ description: string;
97
+ pattern: string;
98
+ };
99
+ offset: {
100
+ type: string;
101
+ description: string;
102
+ default: number;
103
+ minimum: number;
104
+ };
105
+ limit: {
106
+ type: string;
107
+ description: string;
108
+ minimum: number;
109
+ maximum: number;
110
+ };
111
+ };
112
+ required: string[];
113
+ };
114
+ };
115
+ export declare function handleQueryByUrl(params: any, client: GSCClient): Promise<ToolResponse>;
116
+ //# sourceMappingURL=query-by-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-by-url.d.ts","sourceRoot":"","sources":["../../src/tools/query-by-url.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAc7C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqD3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAchE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkE1B,CAAC;AA4GF,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,YAAY,CAAC,CA2TvB"}