@gscdump/analysis 0.9.1 → 0.10.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 CHANGED
@@ -22,8 +22,6 @@ npm install @gscdump/analysis
22
22
  | `@gscdump/analysis/source` | Portable query sources (`createInMemoryQuerySource`, `createCompositeSource`) + source-backed analyzers. |
23
23
  | `@gscdump/analysis/semantic` | Browser-only semantic analyzers such as content-gap; optional `@huggingface/transformers` peer. |
24
24
  | `@gscdump/analysis/query` | `buildDataQueryPlan` / `buildDataDetailPlan` for the generic query analyzers. |
25
- | `@gscdump/analysis/routing` | Phase-aware D1 ↔ R2 routing helpers. |
26
- | `@gscdump/analysis/rollups` | Pre-baked rollup definitions + rebuild orchestration. |
27
25
 
28
26
  The contract layer (`Analyzer`, `Plan`, `Capability`, `AnalysisParams`, `AnalysisResult`, `AnalysisQuerySource`, `runAnalyzerFromSource`, `createAnalyzerRegistry`, `defineAnalyzer`, period helpers, `createEngineQuerySource`) lives in `@gscdump/engine` under the `/analyzer`, `/analysis-types`, `/period`, `/source`, and `/resolver` subpaths. Most are re-exported from `@gscdump/analysis` for convenience.
29
27
 
@@ -40,11 +38,9 @@ import {
40
38
  analyzeMovers,
41
39
  analyzeOpportunity,
42
40
  analyzeSeasonality,
43
- analyzeStrikingDistance,
44
41
  padTimeseries,
45
42
  } from '@gscdump/analysis'
46
43
 
47
- const striking = analyzeStrikingDistance(keywordRows, { minImpressions: 100 })
48
44
  const movers = analyzeMovers(currentRows, previousRows)
49
45
  const decay = analyzeDecay(currentRows, previousRows)
50
46
  ```
@@ -72,7 +68,7 @@ const result = await runReport(report, {
72
68
  Source adapters compose a GSC client + analyzer in one call:
73
69
 
74
70
  ```ts
75
- import { analyzeMoversFromSource, analyzeStrikingDistanceFromSource } from '@gscdump/analysis'
71
+ import { analyzeMoversFromSource } from '@gscdump/analysis'
76
72
  import { createGscApiQuerySource } from '@gscdump/engine-gsc-api'
77
73
 
78
74
  const source = createGscApiQuerySource({ client, siteUrl })
@@ -99,9 +95,17 @@ const result = await runAnalyzerFromSource(source, { type: 'striking-distance',
99
95
 
100
96
  ```ts
101
97
  import { analyzeInBrowser } from '@gscdump/analysis'
98
+ // Compose your own narrow registry instead of pulling the kitchen-sink default
99
+ // (which statically imports every SQL analyzer). For demo only:
100
+ import { defaultAnalyzerRegistry } from '@gscdump/analysis/registry'
102
101
  import { createEngine } from '@gscdump/engine-duckdb-wasm'
103
102
 
104
- const result = await analyzeInBrowser(runner, { schema: 'gsc' }, { type: 'striking-distance' })
103
+ const result = await analyzeInBrowser(
104
+ runner,
105
+ { schema: 'gsc' },
106
+ { type: 'striking-distance' },
107
+ defaultAnalyzerRegistry,
108
+ )
105
109
  ```
106
110
 
107
111
  `analyzeInBrowser` wraps any runner with `query(sql, params, signal?)` in an `AnalysisQuerySource` with the `attachedTables` capability and dispatches via `runAnalyzerFromSource`.
@@ -178,10 +182,10 @@ Presets: `last-7d`, `last-28d`, `last-30d`, `last-90d`, `last-180d`, `last-365d`
178
182
 
179
183
  | Surface | Stability |
180
184
  |---|---|
181
- | Row analyzers (`analyzeStrikingDistance`, `analyzeMovers`, ...) | Public |
185
+ | Row analyzers (`analyzeMovers`, `analyzeDecay`, ...) | Public |
182
186
  | Source factories + `analyzeFromSource` | Public |
183
187
  | `Analyzer<P, R>` contract + `createAnalyzerRegistry` (re-exported from `@gscdump/engine/analyzer`) | Public |
184
- | `/source`, `/semantic`, `/query`, `/routing`, `/rollups` subpaths | Public |
188
+ | `/source`, `/semantic`, `/query` subpaths | Public |
185
189
  | Per-analyzer modules under `analysis/src/analyzers/<name>` | Private |
186
190
 
187
191
  ## Related
@@ -1,5 +1,4 @@
1
1
  import * as _$_gscdump_engine_analyzer0 from "@gscdump/engine/analyzer";
2
- import { Analyzer } from "@gscdump/engine/analyzer";
3
2
  import { AnalysisPeriod } from "@gscdump/engine/period";
4
3
  import { BuilderState } from "gscdump/query";
5
4
  import { Row } from "@gscdump/engine/contracts";
@@ -748,5 +747,4 @@ declare function resolveSort<K extends string>(input: {
748
747
  sortBy: K;
749
748
  sortDir: 'asc' | 'desc';
750
749
  };
751
- declare const ROW_ANALYZERS: readonly Analyzer[];
752
- export { type BayesianCtrResult, type BipartitePagerankNode, type BipartitePagerankResult, type BrandResultRow, type BrandSegmentationOptions, type BrandSegmentationResult, type BrandSummary, type CannibalizationCompetitor, type CannibalizationEvent, type CannibalizationOptions, type CannibalizationPage, type CannibalizationResult, type CannibalizationSortMetric, type ChangePointResult, type ChangePointSeriesPoint, type ClusterType, type ClusteringOptions, type ClusteringResult, type ConcentrationInput, type ConcentrationItem, type ConcentrationOptions, type ConcentrationResult, type ConcentrationRiskLevel, type ContentVelocityWeek, type CtrAnomalyResult, type CtrAnomalySeriesPoint, type CtrCurveBucket, type CtrCurveOutlier, type DarkTrafficResult, type DataDetailResult, type DataQueryResult, type DecayInput, type DecayOptions, type DecayResult, type DecaySeriesPoint, type DecaySortMetric, type DeviceGapResult, type IntentAtlasResult, type KeywordBreadthResult, type KeywordCluster, type LongTailResult, type MonthlyData, type MoverData, type MoversInput, type MoversOptions, type MoversResult, type MoversResultRow, type MoversSeriesPoint, type MoversSortMetric, type OpportunityResult, type PaginateInput, type PositionDistributionResult, type PositionVolatilityDay, type PositionVolatilityResult, type QueryMigrationExample, type QueryMigrationResult, ROW_ANALYZERS, type SeasonalityMetric, type SeasonalityOptions, type SeasonalityResult, type StlDecomposeResult, type StlDecomposeSeriesPoint, type StrikingDistanceInputRow, type StrikingDistanceResult, type SurvivalCurvePoint, type SurvivalResult, type TrendCategory, type TrendSeriesPoint, type TrendsResult, type ZeroClickResult, bayesianCtrAnalyzer, bipartitePagerankAnalyzer, brandAnalyzer, cannibalizationAnalyzer, changePointAnalyzer, clampLimit, clampOffset, clusteringAnalyzer, concentrationAnalyzer, contentVelocityAnalyzer, ctrAnomalyAnalyzer, ctrCurveAnalyzer, darkTrafficAnalyzer, dataDetailAnalyzer, dataQueryAnalyzer, datesQueryState, decayAnalyzer, deviceGapAnalyzer, intentAtlasAnalyzer, keywordBreadthAnalyzer, keywordsQueryState, longTailAnalyzer, moversAnalyzer, opportunityAnalyzer, pagesQueryState, paginateClause, paginateInMemory, positionDistributionAnalyzer, positionVolatilityAnalyzer, queryMigrationAnalyzer, resolveSort, seasonalityAnalyzer, stlDecomposeAnalyzer, strikingDistanceAnalyzer, survivalAnalyzer, trendsAnalyzer, zeroClickAnalyzer };
750
+ export { type BayesianCtrResult, type BipartitePagerankNode, type BipartitePagerankResult, type BrandResultRow, type BrandSegmentationOptions, type BrandSegmentationResult, type BrandSummary, type CannibalizationCompetitor, type CannibalizationEvent, type CannibalizationOptions, type CannibalizationPage, type CannibalizationResult, type CannibalizationSortMetric, type ChangePointResult, type ChangePointSeriesPoint, type ClusterType, type ClusteringOptions, type ClusteringResult, type ConcentrationInput, type ConcentrationItem, type ConcentrationOptions, type ConcentrationResult, type ConcentrationRiskLevel, type ContentVelocityWeek, type CtrAnomalyResult, type CtrAnomalySeriesPoint, type CtrCurveBucket, type CtrCurveOutlier, type DarkTrafficResult, type DataDetailResult, type DataQueryResult, type DecayInput, type DecayOptions, type DecayResult, type DecaySeriesPoint, type DecaySortMetric, type DeviceGapResult, type IntentAtlasResult, type KeywordBreadthResult, type KeywordCluster, type LongTailResult, type MonthlyData, type MoverData, type MoversInput, type MoversOptions, type MoversResult, type MoversResultRow, type MoversSeriesPoint, type MoversSortMetric, type OpportunityResult, type PaginateInput, type PositionDistributionResult, type PositionVolatilityDay, type PositionVolatilityResult, type QueryMigrationExample, type QueryMigrationResult, type SeasonalityMetric, type SeasonalityOptions, type SeasonalityResult, type StlDecomposeResult, type StlDecomposeSeriesPoint, type StrikingDistanceInputRow, type StrikingDistanceResult, type SurvivalCurvePoint, type SurvivalResult, type TrendCategory, type TrendSeriesPoint, type TrendsResult, type ZeroClickResult, bayesianCtrAnalyzer, bipartitePagerankAnalyzer, brandAnalyzer, cannibalizationAnalyzer, changePointAnalyzer, clampLimit, clampOffset, clusteringAnalyzer, concentrationAnalyzer, contentVelocityAnalyzer, ctrAnomalyAnalyzer, ctrCurveAnalyzer, darkTrafficAnalyzer, dataDetailAnalyzer, dataQueryAnalyzer, datesQueryState, decayAnalyzer, deviceGapAnalyzer, intentAtlasAnalyzer, keywordBreadthAnalyzer, keywordsQueryState, longTailAnalyzer, moversAnalyzer, opportunityAnalyzer, pagesQueryState, paginateClause, paginateInMemory, positionDistributionAnalyzer, positionVolatilityAnalyzer, queryMigrationAnalyzer, resolveSort, seasonalityAnalyzer, stlDecomposeAnalyzer, strikingDistanceAnalyzer, survivalAnalyzer, trendsAnalyzer, zeroClickAnalyzer };
@@ -1,11 +1,11 @@
1
- import { defineAnalyzer } from "@gscdump/engine/analyzer";
1
+ import { defineAnalyzer, requireAdapter } from "@gscdump/engine/analyzer";
2
2
  import { comparisonOf, defaultEndDate, padTimeseries, periodOf } from "@gscdump/engine/period";
3
3
  import { enumeratePartitions } from "@gscdump/engine/planner";
4
4
  import { METRIC_EXPR } from "@gscdump/engine/sql-fragments";
5
5
  import { num } from "@gscdump/engine/analysis-types";
6
6
  import { between, date, extractDateRange, gsc, page, query } from "gscdump/query";
7
7
  import { MS_PER_DAY, daysAgo, toIsoDate } from "gscdump";
8
- import { buildExtrasQueries, buildTotalsSql, mergeExtras, pgResolverAdapter, resolveComparisonSQL, resolveToSQL, resolveToSQLOptimized } from "@gscdump/engine/resolver";
8
+ import { buildExtrasQueries, buildTotalsSql, mergeExtras, resolveComparisonSQL, resolveToSQL, resolveToSQLOptimized } from "@gscdump/engine/resolver";
9
9
  function num$5(v) {
10
10
  if (typeof v === "number") return v;
11
11
  if (typeof v === "bigint") return Number(v);
@@ -2098,8 +2098,7 @@ function buildDataQueryPlan(params, options) {
2098
2098
  tableKey,
2099
2099
  sql: comparison.sql,
2100
2100
  params: comparison.params,
2101
- extraQueries,
2102
- shape: (rows, _params, resolvedExtras) => shapeDataQuery(rows, resolvedExtras, { hasPrev: true })
2101
+ extraQueries
2103
2102
  };
2104
2103
  }
2105
2104
  const optimized = resolveToSQLOptimized(state, options);
@@ -2107,10 +2106,12 @@ function buildDataQueryPlan(params, options) {
2107
2106
  tableKey,
2108
2107
  sql: optimized.sql,
2109
2108
  params: optimized.params,
2110
- extraQueries,
2111
- shape: (rows, _params, resolvedExtras) => shapeDataQuery(rows, resolvedExtras, { hasPrev: false })
2109
+ extraQueries
2112
2110
  };
2113
2111
  }
2112
+ function shapeDataQueryRows(rows, params, extras) {
2113
+ return shapeDataQuery(rows, extras, { hasPrev: params.qc != null });
2114
+ }
2114
2115
  function buildDataDetailPlan(params, options) {
2115
2116
  const state = requireBuilderState(params.q, "data-detail");
2116
2117
  if (!state.dimensions.includes("date")) throw new Error("data-detail: `date` dimension is required");
@@ -2130,46 +2131,53 @@ function buildDataDetailPlan(params, options) {
2130
2131
  params: previousTotals.params
2131
2132
  });
2132
2133
  }
2133
- const tableKey = options.adapter.inferTable(state.dimensions);
2134
- const { startDate: rangeStart, endDate: rangeEnd } = extractDateRange(state.filter);
2135
2134
  return {
2136
- tableKey,
2135
+ tableKey: options.adapter.inferTable(state.dimensions),
2137
2136
  sql: main.sql,
2138
2137
  params: main.params,
2139
- extraQueries,
2140
- shape: (rows, _params, extras) => {
2141
- const coerced = rows.map(coerceNumericCols);
2142
- const daily = rangeStart && rangeEnd ? padTimeseries(coerced, {
2143
- startDate: rangeStart,
2144
- endDate: rangeEnd
2145
- }) : coerced;
2146
- const totalsRow = extras?.totals?.[0] ?? {};
2147
- const meta = { totals: {
2148
- clicks: Number(totalsRow.clicks ?? 0),
2149
- impressions: Number(totalsRow.impressions ?? 0),
2150
- ctr: Number(totalsRow.ctr ?? 0),
2151
- position: Number(totalsRow.position ?? 0)
2152
- } };
2153
- if (extras?.prevTotals) {
2154
- const previousTotalsRow = extras.prevTotals[0] ?? {};
2155
- meta.previousTotals = {
2156
- clicks: Number(previousTotalsRow.clicks ?? 0),
2157
- impressions: Number(previousTotalsRow.impressions ?? 0),
2158
- ctr: Number(previousTotalsRow.ctr ?? 0),
2159
- position: Number(previousTotalsRow.position ?? 0)
2160
- };
2161
- }
2162
- return {
2163
- results: daily,
2164
- meta
2165
- };
2166
- }
2138
+ extraQueries
2139
+ };
2140
+ }
2141
+ function shapeDataDetailRows(rows, params, extras) {
2142
+ const { startDate: rangeStart, endDate: rangeEnd } = extractDateRange(requireBuilderState(params.q, "data-detail").filter);
2143
+ const coerced = rows.map(coerceNumericCols);
2144
+ const daily = rangeStart && rangeEnd ? padTimeseries(coerced, {
2145
+ startDate: rangeStart,
2146
+ endDate: rangeEnd
2147
+ }) : coerced;
2148
+ const totalsRow = extras?.totals?.[0] ?? {};
2149
+ const meta = { totals: {
2150
+ clicks: Number(totalsRow.clicks ?? 0),
2151
+ impressions: Number(totalsRow.impressions ?? 0),
2152
+ ctr: Number(totalsRow.ctr ?? 0),
2153
+ position: Number(totalsRow.position ?? 0)
2154
+ } };
2155
+ if (extras?.prevTotals) {
2156
+ const previousTotalsRow = extras.prevTotals[0] ?? {};
2157
+ meta.previousTotals = {
2158
+ clicks: Number(previousTotalsRow.clicks ?? 0),
2159
+ impressions: Number(previousTotalsRow.impressions ?? 0),
2160
+ ctr: Number(previousTotalsRow.ctr ?? 0),
2161
+ position: Number(previousTotalsRow.position ?? 0)
2162
+ };
2163
+ }
2164
+ return {
2165
+ results: daily,
2166
+ meta
2167
2167
  };
2168
2168
  }
2169
2169
  const dataDetailAnalyzer = defineAnalyzer({
2170
2170
  id: "data-detail",
2171
- buildSql(params) {
2172
- const plan = buildDataDetailPlan(params, { adapter: pgResolverAdapter });
2171
+ sqlRequires: [
2172
+ "executeSql",
2173
+ "attachedTables",
2174
+ "adapter"
2175
+ ],
2176
+ buildSql(params, ctx) {
2177
+ const plan = buildDataDetailPlan(params, {
2178
+ adapter: requireAdapter(ctx, "data-detail"),
2179
+ siteId: ctx.siteId
2180
+ });
2173
2181
  return {
2174
2182
  sql: plan.sql,
2175
2183
  params: plan.params,
@@ -2177,13 +2185,11 @@ const dataDetailAnalyzer = defineAnalyzer({
2177
2185
  table: plan.tableKey,
2178
2186
  partitions: []
2179
2187
  },
2180
- requiresAttachedTables: true,
2181
2188
  extraQueries: plan.extraQueries
2182
2189
  };
2183
2190
  },
2184
2191
  reduceSql(rows, params, ctx) {
2185
- const arr = Array.isArray(rows) ? rows : [];
2186
- const { results, meta } = buildDataDetailPlan(params, { adapter: pgResolverAdapter }).shape(arr, params, ctx.extras);
2192
+ const { results, meta } = shapeDataDetailRows(Array.isArray(rows) ? rows : [], params, ctx.extras);
2187
2193
  return {
2188
2194
  results,
2189
2195
  meta
@@ -2192,8 +2198,16 @@ const dataDetailAnalyzer = defineAnalyzer({
2192
2198
  });
2193
2199
  const dataQueryAnalyzer = defineAnalyzer({
2194
2200
  id: "data-query",
2195
- buildSql(params) {
2196
- const plan = buildDataQueryPlan(params, { adapter: pgResolverAdapter });
2201
+ sqlRequires: [
2202
+ "executeSql",
2203
+ "attachedTables",
2204
+ "adapter"
2205
+ ],
2206
+ buildSql(params, ctx) {
2207
+ const plan = buildDataQueryPlan(params, {
2208
+ adapter: requireAdapter(ctx, "data-query"),
2209
+ siteId: ctx.siteId
2210
+ });
2197
2211
  return {
2198
2212
  sql: plan.sql,
2199
2213
  params: plan.params,
@@ -2201,13 +2215,11 @@ const dataQueryAnalyzer = defineAnalyzer({
2201
2215
  table: plan.tableKey,
2202
2216
  partitions: []
2203
2217
  },
2204
- requiresAttachedTables: true,
2205
2218
  extraQueries: plan.extraQueries
2206
2219
  };
2207
2220
  },
2208
2221
  reduceSql(rows, params, ctx) {
2209
- const arr = Array.isArray(rows) ? rows : [];
2210
- const { results, meta } = buildDataQueryPlan(params, { adapter: pgResolverAdapter }).shape(arr, params, ctx.extras);
2222
+ const { results, meta } = shapeDataQueryRows(Array.isArray(rows) ? rows : [], params, ctx.extras);
2211
2223
  return {
2212
2224
  results,
2213
2225
  meta
@@ -4148,37 +4160,39 @@ const stlDecomposeAnalyzer = defineAnalyzer({
4148
4160
  }
4149
4161
  });
4150
4162
  const DEFAULT_ROW_LIMIT$1 = 25e3;
4163
+ function filterStrikingDistance(rows, options = {}) {
4164
+ const minPosition = options.minPosition ?? 4;
4165
+ const maxPosition = options.maxPosition ?? 20;
4166
+ const minImpressions = options.minImpressions ?? 100;
4167
+ const maxCtr = options.maxCtr ?? .05;
4168
+ const results = [];
4169
+ for (const row of rows) {
4170
+ const position = num(row.position);
4171
+ const impressions = num(row.impressions);
4172
+ const ctr = num(row.ctr);
4173
+ const clicks = num(row.clicks);
4174
+ if (position < minPosition || position > maxPosition) continue;
4175
+ if (impressions < minImpressions) continue;
4176
+ if (ctr > maxCtr) continue;
4177
+ results.push({
4178
+ keyword: String(row.query ?? ""),
4179
+ page: row.page == null ? null : String(row.page),
4180
+ clicks,
4181
+ impressions,
4182
+ ctr,
4183
+ position,
4184
+ potentialClicks: Math.round(impressions * .15)
4185
+ });
4186
+ }
4187
+ return results;
4188
+ }
4151
4189
  const strikingDistanceAnalyzer = defineAnalyzer({
4152
4190
  id: "striking-distance",
4153
4191
  reduce(rows, params) {
4154
- const arr = Array.isArray(rows) ? rows : [];
4155
- const minPosition = params.minPosition ?? 4;
4156
- const maxPosition = params.maxPosition ?? 20;
4157
- const minImpressions = params.minImpressions ?? 100;
4158
- const maxCtr = params.maxCtr ?? .05;
4159
- const limit = params.limit ?? 1e3;
4160
- const results = [];
4161
- for (const row of arr) {
4162
- const position = num(row.position);
4163
- const impressions = num(row.impressions);
4164
- const ctr = num(row.ctr);
4165
- const clicks = num(row.clicks);
4166
- if (position < minPosition || position > maxPosition) continue;
4167
- if (impressions < minImpressions) continue;
4168
- if (ctr > maxCtr) continue;
4169
- results.push({
4170
- keyword: String(row.query ?? ""),
4171
- page: row.page == null ? null : String(row.page),
4172
- clicks,
4173
- impressions,
4174
- ctr,
4175
- position,
4176
- potentialClicks: Math.round(impressions * .15)
4177
- });
4178
- }
4192
+ const results = filterStrikingDistance(Array.isArray(rows) ? rows : [], params);
4179
4193
  results.sort((a, b) => b.potentialClicks - a.potentialClicks);
4180
4194
  const paged = paginateInMemory(results, {
4181
- limit,
4195
+ limit: params.limit ?? 1e3,
4182
4196
  offset: params.offset
4183
4197
  });
4184
4198
  return {
@@ -4695,16 +4709,4 @@ const zeroClickAnalyzer = defineAnalyzer({
4695
4709
  };
4696
4710
  }
4697
4711
  });
4698
- const ROW_ANALYZERS = [
4699
- strikingDistanceAnalyzer.rows,
4700
- opportunityAnalyzer.rows,
4701
- brandAnalyzer.rows,
4702
- concentrationAnalyzer.rows,
4703
- clusteringAnalyzer.rows,
4704
- seasonalityAnalyzer.rows,
4705
- moversAnalyzer.rows,
4706
- decayAnalyzer.rows,
4707
- cannibalizationAnalyzer.rows,
4708
- zeroClickAnalyzer.rows
4709
- ];
4710
- export { ROW_ANALYZERS, bayesianCtrAnalyzer, bipartitePagerankAnalyzer, brandAnalyzer, cannibalizationAnalyzer, changePointAnalyzer, clampLimit, clampOffset, clusteringAnalyzer, concentrationAnalyzer, contentVelocityAnalyzer, ctrAnomalyAnalyzer, ctrCurveAnalyzer, darkTrafficAnalyzer, dataDetailAnalyzer, dataQueryAnalyzer, datesQueryState, decayAnalyzer, deviceGapAnalyzer, intentAtlasAnalyzer, keywordBreadthAnalyzer, keywordsQueryState, longTailAnalyzer, moversAnalyzer, opportunityAnalyzer, pagesQueryState, paginateClause, paginateInMemory, positionDistributionAnalyzer, positionVolatilityAnalyzer, queryMigrationAnalyzer, resolveSort, seasonalityAnalyzer, stlDecomposeAnalyzer, strikingDistanceAnalyzer, survivalAnalyzer, trendsAnalyzer, zeroClickAnalyzer };
4712
+ export { bayesianCtrAnalyzer, bipartitePagerankAnalyzer, brandAnalyzer, cannibalizationAnalyzer, changePointAnalyzer, clampLimit, clampOffset, clusteringAnalyzer, concentrationAnalyzer, contentVelocityAnalyzer, ctrAnomalyAnalyzer, ctrCurveAnalyzer, darkTrafficAnalyzer, dataDetailAnalyzer, dataQueryAnalyzer, datesQueryState, decayAnalyzer, deviceGapAnalyzer, intentAtlasAnalyzer, keywordBreadthAnalyzer, keywordsQueryState, longTailAnalyzer, moversAnalyzer, opportunityAnalyzer, pagesQueryState, paginateClause, paginateInMemory, positionDistributionAnalyzer, positionVolatilityAnalyzer, queryMigrationAnalyzer, resolveSort, seasonalityAnalyzer, stlDecomposeAnalyzer, strikingDistanceAnalyzer, survivalAnalyzer, trendsAnalyzer, zeroClickAnalyzer };
@@ -1,9 +1,9 @@
1
1
  import * as _$_gscdump_engine_analyzer0 from "@gscdump/engine/analyzer";
2
2
  /**
3
- * Default analyzer registry built from every in-tree analyzer: row analyzers
4
- * plus DuckDB SQL analyzers. Convenience for callers who don't care about
5
- * bundle size; edge / browser consumers should compose their own narrower
6
- * registry via `createAnalyzerRegistry`.
3
+ * Default analyzer registry built from every in-tree analyzer. Convenience
4
+ * for callers who don't care about bundle size; edge / browser consumers
5
+ * should compose their own narrower registry via `createAnalyzerRegistry`
6
+ * with the flat `ROW_ANALYZERS` / `SQL_ANALYZERS` arrays.
7
7
  */
8
8
  declare const defaultAnalyzerRegistry: _$_gscdump_engine_analyzer0.AnalyzerRegistry;
9
9
  export { defaultAnalyzerRegistry };