@intlayer/backend-contract 9.7.3 → 9.8.0-canary.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/dist/cjs/analytics.cjs +59 -0
- package/dist/cjs/analytics.cjs.map +1 -1
- package/dist/cjs/analyticsReport.cjs +301 -0
- package/dist/cjs/analyticsReport.cjs.map +1 -0
- package/dist/esm/analytics.mjs +35 -1
- package/dist/esm/analytics.mjs.map +1 -1
- package/dist/esm/analyticsReport.mjs +276 -0
- package/dist/esm/analyticsReport.mjs.map +1 -0
- package/dist/types/analytics.d.ts +284 -1
- package/dist/types/analytics.d.ts.map +1 -1
- package/dist/types/analyticsReport.d.ts +294 -0
- package/dist/types/analyticsReport.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/cjs/analytics.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_analyticsReport = require("./analyticsReport.cjs");
|
|
2
3
|
const require_defineRoute = require("./defineRoute.cjs");
|
|
3
4
|
const require_responseData = require("./responseData.cjs");
|
|
4
5
|
let zod_mini = require("zod/mini");
|
|
@@ -256,6 +257,39 @@ const analyticsContract = require_defineRoute.defineRouteGroup({
|
|
|
256
257
|
response: { 200: require_responseData.responseDataSchema(experimentResultSchema) }
|
|
257
258
|
}
|
|
258
259
|
}),
|
|
260
|
+
getAnalyticsSchema: require_defineRoute.defineRoute({
|
|
261
|
+
method: "GET",
|
|
262
|
+
path: "/schema",
|
|
263
|
+
summary: "Report dimensions, metrics, their compatibility, retention and experiments",
|
|
264
|
+
schemas: { response: { 200: require_responseData.responseDataSchema(require_analyticsReport.analyticsSchemaInfoSchema) } }
|
|
265
|
+
}),
|
|
266
|
+
runAnalyticsReport: require_defineRoute.defineRoute({
|
|
267
|
+
method: "POST",
|
|
268
|
+
path: "/report",
|
|
269
|
+
summary: "Aggregated report: metrics broken down by dimensions over date ranges",
|
|
270
|
+
schemas: {
|
|
271
|
+
body: require_analyticsReport.analyticsReportRequestSchema,
|
|
272
|
+
response: { 200: require_responseData.responseDataSchema(require_analyticsReport.analyticsReportSchema) }
|
|
273
|
+
}
|
|
274
|
+
}),
|
|
275
|
+
runAnalyticsRealtimeReport: require_defineRoute.defineRoute({
|
|
276
|
+
method: "POST",
|
|
277
|
+
path: "/realtime-report",
|
|
278
|
+
summary: "Aggregated activity of the last minutes (up to one hour)",
|
|
279
|
+
schemas: {
|
|
280
|
+
body: require_analyticsReport.analyticsRealtimeReportRequestSchema,
|
|
281
|
+
response: { 200: require_responseData.responseDataSchema(require_analyticsReport.analyticsReportSchema) }
|
|
282
|
+
}
|
|
283
|
+
}),
|
|
284
|
+
getAnalyticsAnnotations: require_defineRoute.defineRoute({
|
|
285
|
+
method: "GET",
|
|
286
|
+
path: "/annotations",
|
|
287
|
+
summary: "Dated content and traffic events (dictionary edits, repo syncs, new locales, experiments)",
|
|
288
|
+
schemas: {
|
|
289
|
+
querystring: require_analyticsReport.analyticsAnnotationsQuerySchema,
|
|
290
|
+
response: { 200: require_responseData.responseDataSchema(zod_mini.z.array(require_analyticsReport.analyticsAnnotationSchema)) }
|
|
291
|
+
}
|
|
292
|
+
}),
|
|
259
293
|
getPageMetadata: require_defineRoute.defineRoute({
|
|
260
294
|
method: "GET",
|
|
261
295
|
path: "/page-metadata",
|
|
@@ -268,9 +302,34 @@ const analyticsContract = require_defineRoute.defineRouteGroup({
|
|
|
268
302
|
}
|
|
269
303
|
});
|
|
270
304
|
|
|
305
|
+
exports.ANALYTICS_ACTIVE_USERS_RETENTION_DAYS = require_analyticsReport.ANALYTICS_ACTIVE_USERS_RETENTION_DAYS;
|
|
306
|
+
exports.ANALYTICS_ANNOTATION_TYPES = require_analyticsReport.ANALYTICS_ANNOTATION_TYPES;
|
|
307
|
+
exports.ANALYTICS_DIMENSION_DESCRIPTIONS = require_analyticsReport.ANALYTICS_DIMENSION_DESCRIPTIONS;
|
|
308
|
+
exports.ANALYTICS_METRIC_DESCRIPTIONS = require_analyticsReport.ANALYTICS_METRIC_DESCRIPTIONS;
|
|
309
|
+
exports.ANALYTICS_METRIC_DIMENSIONS = require_analyticsReport.ANALYTICS_METRIC_DIMENSIONS;
|
|
310
|
+
exports.ANALYTICS_REALTIME_DIMENSIONS = require_analyticsReport.ANALYTICS_REALTIME_DIMENSIONS;
|
|
311
|
+
exports.ANALYTICS_REALTIME_MAX_MINUTES = require_analyticsReport.ANALYTICS_REALTIME_MAX_MINUTES;
|
|
312
|
+
exports.ANALYTICS_REALTIME_METRICS = require_analyticsReport.ANALYTICS_REALTIME_METRICS;
|
|
313
|
+
exports.ANALYTICS_REPORT_DEFAULT_LIMIT = require_analyticsReport.ANALYTICS_REPORT_DEFAULT_LIMIT;
|
|
314
|
+
exports.ANALYTICS_REPORT_DIMENSIONS = require_analyticsReport.ANALYTICS_REPORT_DIMENSIONS;
|
|
315
|
+
exports.ANALYTICS_REPORT_MAX_DATE_RANGES = require_analyticsReport.ANALYTICS_REPORT_MAX_DATE_RANGES;
|
|
316
|
+
exports.ANALYTICS_REPORT_MAX_LIMIT = require_analyticsReport.ANALYTICS_REPORT_MAX_LIMIT;
|
|
317
|
+
exports.ANALYTICS_REPORT_METRICS = require_analyticsReport.ANALYTICS_REPORT_METRICS;
|
|
318
|
+
exports.ANALYTICS_TIME_DIMENSIONS = require_analyticsReport.ANALYTICS_TIME_DIMENSIONS;
|
|
271
319
|
exports.PAGE_FLOW_ENTRANCE = PAGE_FLOW_ENTRANCE;
|
|
320
|
+
exports.analyticsAnnotationSchema = require_analyticsReport.analyticsAnnotationSchema;
|
|
321
|
+
exports.analyticsAnnotationsQuerySchema = require_analyticsReport.analyticsAnnotationsQuerySchema;
|
|
272
322
|
exports.analyticsContract = analyticsContract;
|
|
323
|
+
exports.analyticsDateRangeSchema = require_analyticsReport.analyticsDateRangeSchema;
|
|
324
|
+
exports.analyticsDimensionFilterSchema = require_analyticsReport.analyticsDimensionFilterSchema;
|
|
273
325
|
exports.analyticsEventTypeSchema = analyticsEventTypeSchema;
|
|
326
|
+
exports.analyticsMetricFilterSchema = require_analyticsReport.analyticsMetricFilterSchema;
|
|
327
|
+
exports.analyticsOrderBySchema = require_analyticsReport.analyticsOrderBySchema;
|
|
328
|
+
exports.analyticsRealtimeReportRequestSchema = require_analyticsReport.analyticsRealtimeReportRequestSchema;
|
|
329
|
+
exports.analyticsReportRequestSchema = require_analyticsReport.analyticsReportRequestSchema;
|
|
330
|
+
exports.analyticsReportRowSchema = require_analyticsReport.analyticsReportRowSchema;
|
|
331
|
+
exports.analyticsReportSchema = require_analyticsReport.analyticsReportSchema;
|
|
332
|
+
exports.analyticsSchemaInfoSchema = require_analyticsReport.analyticsSchemaInfoSchema;
|
|
274
333
|
exports.audienceGranularitySchema = audienceGranularitySchema;
|
|
275
334
|
exports.audienceRangeSchema = audienceRangeSchema;
|
|
276
335
|
exports.audienceSeriesPointSchema = audienceSeriesPointSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.cjs","names":["z","defineRouteGroup","defineRoute","responseDataSchema"],"sources":["../../src/analytics.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n} from './defineRoute';\nimport { type ResponseData, responseDataSchema } from './responseData';\n\n/** Kind of analytics event sent by the SDK. */\nexport const analyticsEventTypeSchema = z.enum([\n 'page_view',\n 'content_exposure',\n 'conversion',\n]);\n\n/** One event as sent by the SDK (batched). */\nexport const incomingAnalyticsEventSchema = z.looseObject({\n type: analyticsEventTypeSchema,\n /** Client timestamp (epoch ms). */\n t: z.number(),\n locale: z.string(),\n url: z.string(),\n ref: z.optional(z.string()),\n dictionaryKey: z.optional(z.string()),\n keyPath: z.optional(z.string()),\n nodeType: z.optional(z.string()),\n variant: z.optional(z.string()),\n count: z.optional(z.number()),\n experimentKey: z.optional(z.string()),\n goal: z.optional(z.string()),\n value: z.optional(z.number()),\n});\n\n/**\n * Time windows of the audience report. `live` covers the sessions active in the\n * last 30 minutes, bucketed per minute.\n */\nexport const audienceRangeSchema = z.enum([\n 'live',\n '1h',\n '24h',\n '7d',\n '30d',\n '90d',\n '6mo',\n '1y',\n '3y',\n]);\n\nexport const audienceGranularitySchema = z.enum([\n 'minute',\n 'hour',\n 'day',\n 'week',\n 'month',\n]);\n\nexport const audienceSeriesPointSchema = z.object({\n /** ISO bucket start. */\n bucket: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\nconst audienceBreakdownRowSchema = z.object({\n key: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\n/** A session active in the `live` window, placed on the map. */\nexport const liveVisitorSchema = z.object({\n /** Opaque, non-reversible visitor id (prefix of the hashed session). */\n visitorId: z.string(),\n /** ISO country code, `ZZ` when unknown. */\n country: z.string(),\n /** City reported by the CDN, when available. */\n city: z.optional(z.string()),\n /** City-level latitude (rounded to ~1 km), when available. */\n latitude: z.optional(z.number()),\n /** City-level longitude (rounded to ~1 km), when available. */\n longitude: z.optional(z.number()),\n /** Locale the visitor is browsing in. */\n locale: z.optional(z.string()),\n /** Page of the visitor's latest activity. */\n currentUrl: z.string(),\n /** Pages the visitor was active on during the window. */\n pageCount: z.number(),\n /** Page views during the window. */\n views: z.number(),\n /** ISO date of the visitor's first activity in the window. */\n firstSeenAt: z.string(),\n /** ISO date of the visitor's latest activity. */\n lastSeenAt: z.string(),\n /** Minutes (`YYYY-MM-DDTHH:mm`, UTC) the visitor was active in, oldest first. */\n activeMinutes: z.array(z.string()),\n});\n\n/** One step of a live visitor's journey, oldest first. */\nexport const liveVisitorFlowStepSchema = z.object({\n url: z.string(),\n locale: z.optional(z.string()),\n /** ISO date the visitor reached the page. */\n firstSeenAt: z.string(),\n /** ISO date of the visitor's latest activity on the page. */\n lastSeenAt: z.string(),\n views: z.number(),\n});\n\n/**\n * Page journey of one live visitor over the `live` window. `visitor` is `null`\n * once the session has left the window (not an error: it simply went quiet).\n */\nexport const liveVisitorFlowSchema = z.object({\n visitor: z.nullable(liveVisitorSchema),\n steps: z.array(liveVisitorFlowStepSchema),\n});\n\n/**\n * Pseudo-page a session starts from. Used as the flow's starting page, the\n * next step lists the landing pages.\n */\nexport const PAGE_FLOW_ENTRANCE = '(entrance)';\n\n/** One page of a flow step; `url` is `null` for the \"other pages\" bucket. */\nexport const pageFlowNodeSchema = z.object({\n url: z.nullable(z.string()),\n /** Average navigations reaching this page at this step. */\n value: z.number(),\n /** Part of `value` that left the site from this page (`null` if unknown). */\n exits: z.nullable(z.number()),\n});\n\n/** Average navigations from a page of one step to a page of the next. */\nexport const pageFlowLinkSchema = z.object({\n /** Step of the source page; the target is on `fromStep + 1`. */\n fromStep: z.number(),\n fromUrl: z.nullable(z.string()),\n toUrl: z.nullable(z.string()),\n value: z.number(),\n});\n\n/** Averaged navigation flow starting from one page. */\nexport const pageFlowSchema = z.object({\n startUrl: z.string(),\n range: audienceRangeSchema,\n /** Pages per step, the starting page alone on step 0. */\n steps: z.array(z.array(pageFlowNodeSchema)),\n links: z.array(pageFlowLinkSchema),\n});\n\nexport const audienceStatsSchema = z.object({\n usersToday: z.number(),\n usersLast7Days: z.number(),\n usersInRange: z.number(),\n viewsInRange: z.number(),\n range: audienceRangeSchema,\n rangeHours: z.number(),\n granularity: audienceGranularitySchema,\n series: z.array(audienceSeriesPointSchema),\n byLocale: z.array(audienceBreakdownRowSchema),\n byCountry: z.array(audienceBreakdownRowSchema),\n byPage: z.array(audienceBreakdownRowSchema),\n /** Active sessions with their location — `live` range only. */\n liveVisitors: z.optional(z.array(liveVisitorSchema)),\n /** First UTC day with collected data (`YYYY-MM-DD`), `null` before any. */\n dataSince: z.nullable(z.string()),\n});\n\nconst analyticsOverviewRowSchema = z.object({\n url: z.string(),\n locale: z.string(),\n views: z.number(),\n});\n\nconst contentStatRowSchema = z.object({\n dictionaryKey: z.string(),\n keyPath: z.string(),\n locale: z.string(),\n exposures: z.number(),\n});\n\nconst experimentResultSchema = z.object({\n experimentKey: z.string(),\n variants: z.array(\n z.object({\n variant: z.string(),\n exposures: z.number(),\n conversions: z.number(),\n conversionRate: z.number(),\n })\n ),\n pValue: z.nullable(z.number()),\n winner: z.nullable(z.string()),\n});\n\nconst pageMetadataSchema = z.object({\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n});\n\n/** REST contract of the `/api/analytics` routes. */\nexport const analyticsContract = defineRouteGroup({\n prefix: '/api/analytics',\n tag: 'Analytics',\n routes: {\n ingestAnalyticsEvents: defineRoute({\n method: 'POST',\n path: '/events',\n summary: 'Ingest SDK events (public browser token, rate limited)',\n schemas: {\n /** Sent as `text/plain` JSON by `navigator.sendBeacon`. */\n body: z.looseObject({\n /** Token from `POST /api/public/token` (`analytics:ingest`). */\n token: z.optional(z.string()),\n /** @deprecated Superseded by `token`; still accepted. */\n clientId: z.optional(z.string()),\n sessionId: z.string(),\n sdkVersion: z.string(),\n events: z.array(incomingAnalyticsEventSchema),\n }),\n response: {\n 200: responseDataSchema(z.object({ accepted: z.number() })),\n },\n },\n }),\n getAnalyticsOverview: defineRoute({\n method: 'GET',\n path: '/overview',\n summary: 'Page views per page and locale',\n schemas: {\n response: {\n 200: responseDataSchema(z.array(analyticsOverviewRowSchema)),\n },\n },\n }),\n getAnalyticsAudience: defineRoute({\n method: 'GET',\n path: '/audience',\n summary: 'Audience report over a time window',\n schemas: {\n querystring: z.object({\n range: z.optional(z.string()),\n /** Legacy: converted to the closest range. */\n days: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(audienceStatsSchema) },\n },\n }),\n getLiveVisitorFlow: defineRoute({\n method: 'GET',\n path: '/audience/live/visitors/:visitorId',\n summary: 'Page journey of a visitor active in the last 30 minutes',\n schemas: {\n params: z.object({\n visitorId: z.string().check(z.regex(/^[a-f0-9]{16}$/)),\n }),\n response: { 200: responseDataSchema(liveVisitorFlowSchema) },\n },\n }),\n getPageFlow: defineRoute({\n method: 'GET',\n path: '/page-flow',\n summary: 'Average page-to-page navigation flow from a starting page',\n schemas: {\n querystring: z.object({\n range: z.optional(z.string()),\n /** Starting page pathname; defaults to `/`. */\n startUrl: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(pageFlowSchema) },\n },\n }),\n getContentStats: defineRoute({\n method: 'GET',\n path: '/content-stats',\n summary: 'Content exposures per dictionary key path and locale',\n schemas: {\n response: { 200: responseDataSchema(z.array(contentStatRowSchema)) },\n },\n }),\n getExperimentResults: defineRoute({\n method: 'GET',\n path: '/experiments/:experimentKey',\n summary: 'A/B test results of an experiment',\n schemas: {\n params: z.object({ experimentKey: z.string().check(z.minLength(1)) }),\n response: { 200: responseDataSchema(experimentResultSchema) },\n },\n }),\n getPageMetadata: defineRoute({\n method: 'GET',\n path: '/page-metadata',\n summary: 'Title and description of a page of the project',\n schemas: {\n querystring: z.object({ url: z.optional(z.string()) }),\n response: { 200: responseDataSchema(pageMetadataSchema) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/analytics` group, by name. */\nexport type AnalyticsRoutes = (typeof analyticsContract)['routes'];\n\nexport type AnalyticsEventType = z.output<typeof analyticsEventTypeSchema>;\nexport type IncomingAnalyticsEvent = z.output<\n typeof incomingAnalyticsEventSchema\n>;\nexport type AudienceRange = z.output<typeof audienceRangeSchema>;\nexport type AudienceGranularity = z.output<typeof audienceGranularitySchema>;\nexport type AudienceSeriesPoint = z.output<typeof audienceSeriesPointSchema>;\nexport type AudienceBreakdownRow = z.output<typeof audienceBreakdownRowSchema>;\nexport type AudienceStats = z.output<typeof audienceStatsSchema>;\nexport type LiveVisitor = z.output<typeof liveVisitorSchema>;\nexport type LiveVisitorFlowStep = z.output<typeof liveVisitorFlowStepSchema>;\nexport type LiveVisitorFlow = z.output<typeof liveVisitorFlowSchema>;\nexport type PageFlowNode = z.output<typeof pageFlowNodeSchema>;\nexport type PageFlowLink = z.output<typeof pageFlowLinkSchema>;\nexport type PageFlow = z.output<typeof pageFlowSchema>;\nexport type AnalyticsOverviewRow = z.output<typeof analyticsOverviewRowSchema>;\nexport type ContentStatRow = z.output<typeof contentStatRowSchema>;\nexport type ExperimentResult = z.output<typeof experimentResultSchema>;\nexport type PageMetadata = z.output<typeof pageMetadataSchema>;\n\nexport type IngestAnalyticsBody = RouteBodyInput<\n AnalyticsRoutes['ingestAnalyticsEvents']\n>;\nexport type IngestAnalyticsResult = ResponseData<{ accepted: number }>;\nexport type GetAnalyticsOverviewResult = ResponseData<AnalyticsOverviewRow[]>;\nexport type GetContentStatsResult = ResponseData<ContentStatRow[]>;\nexport type GetExperimentResultsResult = ResponseData<ExperimentResult>;\nexport type GetAudienceResult = ResponseData<AudienceStats>;\nexport type GetLiveVisitorFlowResult = ResponseData<LiveVisitorFlow>;\nexport type GetPageFlowResult = ResponseData<PageFlow>;\nexport type GetPageMetadataResult = ResponseData<PageMetadata>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analytics.cjs","names":["z","defineRouteGroup","defineRoute","responseDataSchema","analyticsSchemaInfoSchema","analyticsReportRequestSchema","analyticsReportSchema","analyticsRealtimeReportRequestSchema","analyticsAnnotationsQuerySchema","analyticsAnnotationSchema"],"sources":["../../src/analytics.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport {\n type AnalyticsAnnotation,\n type AnalyticsReport,\n type AnalyticsSchemaInfo,\n analyticsAnnotationSchema,\n analyticsAnnotationsQuerySchema,\n analyticsRealtimeReportRequestSchema,\n analyticsReportRequestSchema,\n analyticsReportSchema,\n analyticsSchemaInfoSchema,\n} from './analyticsReport';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n} from './defineRoute';\nimport { type ResponseData, responseDataSchema } from './responseData';\n\nexport * from './analyticsReport';\n\n/** Kind of analytics event sent by the SDK. */\nexport const analyticsEventTypeSchema = z.enum([\n 'page_view',\n 'content_exposure',\n 'conversion',\n]);\n\n/** One event as sent by the SDK (batched). */\nexport const incomingAnalyticsEventSchema = z.looseObject({\n type: analyticsEventTypeSchema,\n /** Client timestamp (epoch ms). */\n t: z.number(),\n locale: z.string(),\n url: z.string(),\n ref: z.optional(z.string()),\n dictionaryKey: z.optional(z.string()),\n keyPath: z.optional(z.string()),\n nodeType: z.optional(z.string()),\n variant: z.optional(z.string()),\n count: z.optional(z.number()),\n experimentKey: z.optional(z.string()),\n goal: z.optional(z.string()),\n value: z.optional(z.number()),\n});\n\n/**\n * Time windows of the audience report. `live` covers the sessions active in the\n * last 30 minutes, bucketed per minute.\n */\nexport const audienceRangeSchema = z.enum([\n 'live',\n '1h',\n '24h',\n '7d',\n '30d',\n '90d',\n '6mo',\n '1y',\n '3y',\n]);\n\nexport const audienceGranularitySchema = z.enum([\n 'minute',\n 'hour',\n 'day',\n 'week',\n 'month',\n]);\n\nexport const audienceSeriesPointSchema = z.object({\n /** ISO bucket start. */\n bucket: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\nconst audienceBreakdownRowSchema = z.object({\n key: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\n/** A session active in the `live` window, placed on the map. */\nexport const liveVisitorSchema = z.object({\n /** Opaque, non-reversible visitor id (prefix of the hashed session). */\n visitorId: z.string(),\n /** ISO country code, `ZZ` when unknown. */\n country: z.string(),\n /** City reported by the CDN, when available. */\n city: z.optional(z.string()),\n /** City-level latitude (rounded to ~1 km), when available. */\n latitude: z.optional(z.number()),\n /** City-level longitude (rounded to ~1 km), when available. */\n longitude: z.optional(z.number()),\n /** Locale the visitor is browsing in. */\n locale: z.optional(z.string()),\n /** Page of the visitor's latest activity. */\n currentUrl: z.string(),\n /** Pages the visitor was active on during the window. */\n pageCount: z.number(),\n /** Page views during the window. */\n views: z.number(),\n /** ISO date of the visitor's first activity in the window. */\n firstSeenAt: z.string(),\n /** ISO date of the visitor's latest activity. */\n lastSeenAt: z.string(),\n /** Minutes (`YYYY-MM-DDTHH:mm`, UTC) the visitor was active in, oldest first. */\n activeMinutes: z.array(z.string()),\n});\n\n/** One step of a live visitor's journey, oldest first. */\nexport const liveVisitorFlowStepSchema = z.object({\n url: z.string(),\n locale: z.optional(z.string()),\n /** ISO date the visitor reached the page. */\n firstSeenAt: z.string(),\n /** ISO date of the visitor's latest activity on the page. */\n lastSeenAt: z.string(),\n views: z.number(),\n});\n\n/**\n * Page journey of one live visitor over the `live` window. `visitor` is `null`\n * once the session has left the window (not an error: it simply went quiet).\n */\nexport const liveVisitorFlowSchema = z.object({\n visitor: z.nullable(liveVisitorSchema),\n steps: z.array(liveVisitorFlowStepSchema),\n});\n\n/**\n * Pseudo-page a session starts from. Used as the flow's starting page, the\n * next step lists the landing pages.\n */\nexport const PAGE_FLOW_ENTRANCE = '(entrance)';\n\n/** One page of a flow step; `url` is `null` for the \"other pages\" bucket. */\nexport const pageFlowNodeSchema = z.object({\n url: z.nullable(z.string()),\n /** Average navigations reaching this page at this step. */\n value: z.number(),\n /** Part of `value` that left the site from this page (`null` if unknown). */\n exits: z.nullable(z.number()),\n});\n\n/** Average navigations from a page of one step to a page of the next. */\nexport const pageFlowLinkSchema = z.object({\n /** Step of the source page; the target is on `fromStep + 1`. */\n fromStep: z.number(),\n fromUrl: z.nullable(z.string()),\n toUrl: z.nullable(z.string()),\n value: z.number(),\n});\n\n/** Averaged navigation flow starting from one page. */\nexport const pageFlowSchema = z.object({\n startUrl: z.string(),\n range: audienceRangeSchema,\n /** Pages per step, the starting page alone on step 0. */\n steps: z.array(z.array(pageFlowNodeSchema)),\n links: z.array(pageFlowLinkSchema),\n});\n\nexport const audienceStatsSchema = z.object({\n usersToday: z.number(),\n usersLast7Days: z.number(),\n usersInRange: z.number(),\n viewsInRange: z.number(),\n range: audienceRangeSchema,\n rangeHours: z.number(),\n granularity: audienceGranularitySchema,\n series: z.array(audienceSeriesPointSchema),\n byLocale: z.array(audienceBreakdownRowSchema),\n byCountry: z.array(audienceBreakdownRowSchema),\n byPage: z.array(audienceBreakdownRowSchema),\n /** Active sessions with their location — `live` range only. */\n liveVisitors: z.optional(z.array(liveVisitorSchema)),\n /** First UTC day with collected data (`YYYY-MM-DD`), `null` before any. */\n dataSince: z.nullable(z.string()),\n});\n\nconst analyticsOverviewRowSchema = z.object({\n url: z.string(),\n locale: z.string(),\n views: z.number(),\n});\n\nconst contentStatRowSchema = z.object({\n dictionaryKey: z.string(),\n keyPath: z.string(),\n locale: z.string(),\n exposures: z.number(),\n});\n\nconst experimentResultSchema = z.object({\n experimentKey: z.string(),\n variants: z.array(\n z.object({\n variant: z.string(),\n exposures: z.number(),\n conversions: z.number(),\n conversionRate: z.number(),\n })\n ),\n pValue: z.nullable(z.number()),\n winner: z.nullable(z.string()),\n});\n\nconst pageMetadataSchema = z.object({\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n});\n\n/** REST contract of the `/api/analytics` routes. */\nexport const analyticsContract = defineRouteGroup({\n prefix: '/api/analytics',\n tag: 'Analytics',\n routes: {\n ingestAnalyticsEvents: defineRoute({\n method: 'POST',\n path: '/events',\n summary: 'Ingest SDK events (public browser token, rate limited)',\n schemas: {\n /** Sent as `text/plain` JSON by `navigator.sendBeacon`. */\n body: z.looseObject({\n /** Token from `POST /api/public/token` (`analytics:ingest`). */\n token: z.optional(z.string()),\n /** @deprecated Superseded by `token`; still accepted. */\n clientId: z.optional(z.string()),\n sessionId: z.string(),\n sdkVersion: z.string(),\n events: z.array(incomingAnalyticsEventSchema),\n }),\n response: {\n 200: responseDataSchema(z.object({ accepted: z.number() })),\n },\n },\n }),\n getAnalyticsOverview: defineRoute({\n method: 'GET',\n path: '/overview',\n summary: 'Page views per page and locale',\n schemas: {\n response: {\n 200: responseDataSchema(z.array(analyticsOverviewRowSchema)),\n },\n },\n }),\n getAnalyticsAudience: defineRoute({\n method: 'GET',\n path: '/audience',\n summary: 'Audience report over a time window',\n schemas: {\n querystring: z.object({\n range: z.optional(z.string()),\n /** Legacy: converted to the closest range. */\n days: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(audienceStatsSchema) },\n },\n }),\n getLiveVisitorFlow: defineRoute({\n method: 'GET',\n path: '/audience/live/visitors/:visitorId',\n summary: 'Page journey of a visitor active in the last 30 minutes',\n schemas: {\n params: z.object({\n visitorId: z.string().check(z.regex(/^[a-f0-9]{16}$/)),\n }),\n response: { 200: responseDataSchema(liveVisitorFlowSchema) },\n },\n }),\n getPageFlow: defineRoute({\n method: 'GET',\n path: '/page-flow',\n summary: 'Average page-to-page navigation flow from a starting page',\n schemas: {\n querystring: z.object({\n range: z.optional(z.string()),\n /** Starting page pathname; defaults to `/`. */\n startUrl: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(pageFlowSchema) },\n },\n }),\n getContentStats: defineRoute({\n method: 'GET',\n path: '/content-stats',\n summary: 'Content exposures per dictionary key path and locale',\n schemas: {\n response: { 200: responseDataSchema(z.array(contentStatRowSchema)) },\n },\n }),\n getExperimentResults: defineRoute({\n method: 'GET',\n path: '/experiments/:experimentKey',\n summary: 'A/B test results of an experiment',\n schemas: {\n params: z.object({ experimentKey: z.string().check(z.minLength(1)) }),\n response: { 200: responseDataSchema(experimentResultSchema) },\n },\n }),\n getAnalyticsSchema: defineRoute({\n method: 'GET',\n path: '/schema',\n summary:\n 'Report dimensions, metrics, their compatibility, retention and experiments',\n schemas: {\n response: { 200: responseDataSchema(analyticsSchemaInfoSchema) },\n },\n }),\n runAnalyticsReport: defineRoute({\n method: 'POST',\n path: '/report',\n summary:\n 'Aggregated report: metrics broken down by dimensions over date ranges',\n schemas: {\n body: analyticsReportRequestSchema,\n response: { 200: responseDataSchema(analyticsReportSchema) },\n },\n }),\n runAnalyticsRealtimeReport: defineRoute({\n method: 'POST',\n path: '/realtime-report',\n summary: 'Aggregated activity of the last minutes (up to one hour)',\n schemas: {\n body: analyticsRealtimeReportRequestSchema,\n response: { 200: responseDataSchema(analyticsReportSchema) },\n },\n }),\n getAnalyticsAnnotations: defineRoute({\n method: 'GET',\n path: '/annotations',\n summary:\n 'Dated content and traffic events (dictionary edits, repo syncs, new locales, experiments)',\n schemas: {\n querystring: analyticsAnnotationsQuerySchema,\n response: {\n 200: responseDataSchema(z.array(analyticsAnnotationSchema)),\n },\n },\n }),\n getPageMetadata: defineRoute({\n method: 'GET',\n path: '/page-metadata',\n summary: 'Title and description of a page of the project',\n schemas: {\n querystring: z.object({ url: z.optional(z.string()) }),\n response: { 200: responseDataSchema(pageMetadataSchema) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/analytics` group, by name. */\nexport type AnalyticsRoutes = (typeof analyticsContract)['routes'];\n\nexport type AnalyticsEventType = z.output<typeof analyticsEventTypeSchema>;\nexport type IncomingAnalyticsEvent = z.output<\n typeof incomingAnalyticsEventSchema\n>;\nexport type AudienceRange = z.output<typeof audienceRangeSchema>;\nexport type AudienceGranularity = z.output<typeof audienceGranularitySchema>;\nexport type AudienceSeriesPoint = z.output<typeof audienceSeriesPointSchema>;\nexport type AudienceBreakdownRow = z.output<typeof audienceBreakdownRowSchema>;\nexport type AudienceStats = z.output<typeof audienceStatsSchema>;\nexport type LiveVisitor = z.output<typeof liveVisitorSchema>;\nexport type LiveVisitorFlowStep = z.output<typeof liveVisitorFlowStepSchema>;\nexport type LiveVisitorFlow = z.output<typeof liveVisitorFlowSchema>;\nexport type PageFlowNode = z.output<typeof pageFlowNodeSchema>;\nexport type PageFlowLink = z.output<typeof pageFlowLinkSchema>;\nexport type PageFlow = z.output<typeof pageFlowSchema>;\nexport type AnalyticsOverviewRow = z.output<typeof analyticsOverviewRowSchema>;\nexport type ContentStatRow = z.output<typeof contentStatRowSchema>;\nexport type ExperimentResult = z.output<typeof experimentResultSchema>;\nexport type PageMetadata = z.output<typeof pageMetadataSchema>;\n\nexport type IngestAnalyticsBody = RouteBodyInput<\n AnalyticsRoutes['ingestAnalyticsEvents']\n>;\nexport type IngestAnalyticsResult = ResponseData<{ accepted: number }>;\nexport type GetAnalyticsOverviewResult = ResponseData<AnalyticsOverviewRow[]>;\nexport type GetContentStatsResult = ResponseData<ContentStatRow[]>;\nexport type GetExperimentResultsResult = ResponseData<ExperimentResult>;\nexport type GetAudienceResult = ResponseData<AudienceStats>;\nexport type GetLiveVisitorFlowResult = ResponseData<LiveVisitorFlow>;\nexport type GetPageFlowResult = ResponseData<PageFlow>;\nexport type GetPageMetadataResult = ResponseData<PageMetadata>;\nexport type GetAnalyticsSchemaResult = ResponseData<AnalyticsSchemaInfo>;\nexport type RunAnalyticsReportResult = ResponseData<AnalyticsReport>;\nexport type GetAnalyticsAnnotationsResult = ResponseData<AnalyticsAnnotation[]>;\nexport type RunAnalyticsReportBody = RouteBodyInput<\n AnalyticsRoutes['runAnalyticsReport']\n>;\nexport type RunAnalyticsRealtimeReportBody = RouteBodyInput<\n AnalyticsRoutes['runAnalyticsRealtimeReport']\n>;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let zod_mini = require("zod/mini");
|
|
3
|
+
|
|
4
|
+
// src/analyticsReport.ts
|
|
5
|
+
/**
|
|
6
|
+
* Report dimensions. Time dimensions are labelled `YYYY-MM-DD` (`date`),
|
|
7
|
+
* `YYYY-Www` (`week`, ISO week) and `YYYY-MM` (`month`), all in UTC.
|
|
8
|
+
*/
|
|
9
|
+
const ANALYTICS_REPORT_DIMENSIONS = [
|
|
10
|
+
"date",
|
|
11
|
+
"week",
|
|
12
|
+
"month",
|
|
13
|
+
"locale",
|
|
14
|
+
"pagePath",
|
|
15
|
+
"country",
|
|
16
|
+
"dictionaryKey",
|
|
17
|
+
"keyPath",
|
|
18
|
+
"contentType",
|
|
19
|
+
"variant",
|
|
20
|
+
"experimentKey",
|
|
21
|
+
"goal"
|
|
22
|
+
];
|
|
23
|
+
const ANALYTICS_REPORT_METRICS = [
|
|
24
|
+
"pageViews",
|
|
25
|
+
"activeUsers",
|
|
26
|
+
"entrances",
|
|
27
|
+
"contentExposures",
|
|
28
|
+
"conversions",
|
|
29
|
+
"conversionValue"
|
|
30
|
+
];
|
|
31
|
+
/** Dimensions that bucket time; they cannot be used in dimension filters. */
|
|
32
|
+
const ANALYTICS_TIME_DIMENSIONS = [
|
|
33
|
+
"date",
|
|
34
|
+
"week",
|
|
35
|
+
"month"
|
|
36
|
+
];
|
|
37
|
+
const TIME_DIMENSIONS = ANALYTICS_TIME_DIMENSIONS;
|
|
38
|
+
/**
|
|
39
|
+
* Dimensions each metric can be broken down by. The data is stored
|
|
40
|
+
* pre-aggregated per event type, so a dimension a metric was not recorded with
|
|
41
|
+
* cannot be applied to it (ex: visitors are not attributed per page).
|
|
42
|
+
*/
|
|
43
|
+
const ANALYTICS_METRIC_DIMENSIONS = {
|
|
44
|
+
pageViews: [
|
|
45
|
+
...TIME_DIMENSIONS,
|
|
46
|
+
"locale",
|
|
47
|
+
"pagePath"
|
|
48
|
+
],
|
|
49
|
+
activeUsers: [
|
|
50
|
+
...TIME_DIMENSIONS,
|
|
51
|
+
"locale",
|
|
52
|
+
"country"
|
|
53
|
+
],
|
|
54
|
+
entrances: [...TIME_DIMENSIONS, "pagePath"],
|
|
55
|
+
contentExposures: [
|
|
56
|
+
...TIME_DIMENSIONS,
|
|
57
|
+
"locale",
|
|
58
|
+
"dictionaryKey",
|
|
59
|
+
"keyPath",
|
|
60
|
+
"contentType",
|
|
61
|
+
"variant",
|
|
62
|
+
"experimentKey"
|
|
63
|
+
],
|
|
64
|
+
conversions: [
|
|
65
|
+
...TIME_DIMENSIONS,
|
|
66
|
+
"locale",
|
|
67
|
+
"variant",
|
|
68
|
+
"experimentKey",
|
|
69
|
+
"goal"
|
|
70
|
+
],
|
|
71
|
+
conversionValue: [
|
|
72
|
+
...TIME_DIMENSIONS,
|
|
73
|
+
"locale",
|
|
74
|
+
"variant",
|
|
75
|
+
"experimentKey",
|
|
76
|
+
"goal"
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
const ANALYTICS_DIMENSION_DESCRIPTIONS = {
|
|
80
|
+
date: "UTC day, `YYYY-MM-DD`.",
|
|
81
|
+
week: "ISO week, `YYYY-Www` (weeks start on Monday, UTC).",
|
|
82
|
+
month: "Month, `YYYY-MM` (UTC).",
|
|
83
|
+
locale: "Locale the content was displayed in (ex: `fr`, `en-GB`).",
|
|
84
|
+
pagePath: "Page pathname, including any locale prefix (`/fr/pricing`). For `entrances`, the landing page.",
|
|
85
|
+
country: "ISO 3166-1 alpha-2 visitor country, `ZZ` when unknown.",
|
|
86
|
+
dictionaryKey: "Intlayer dictionary key of the displayed content.",
|
|
87
|
+
keyPath: "Path of the displayed field inside its dictionary.",
|
|
88
|
+
contentType: "Intlayer node type of the displayed field (translation, enumeration, markdown…).",
|
|
89
|
+
variant: "A/B variant shown.",
|
|
90
|
+
experimentKey: "A/B experiment key.",
|
|
91
|
+
goal: "Conversion goal name."
|
|
92
|
+
};
|
|
93
|
+
const ANALYTICS_METRIC_DESCRIPTIONS = {
|
|
94
|
+
pageViews: "Page views.",
|
|
95
|
+
activeUsers: "Distinct anonymous visitor sessions (not additive across rows: a visitor seen in two locales counts in both). Kept 400 days.",
|
|
96
|
+
entrances: "Sessions that started on the page (landing pages).",
|
|
97
|
+
contentExposures: "Times a content field was displayed.",
|
|
98
|
+
conversions: "Conversion events.",
|
|
99
|
+
conversionValue: "Sum of the numeric value attached to conversions."
|
|
100
|
+
};
|
|
101
|
+
const ANALYTICS_REALTIME_DIMENSIONS = [
|
|
102
|
+
"minute",
|
|
103
|
+
"pagePath",
|
|
104
|
+
"locale",
|
|
105
|
+
"country"
|
|
106
|
+
];
|
|
107
|
+
const ANALYTICS_REALTIME_METRICS = ["activeUsers", "pageViews"];
|
|
108
|
+
/** Retention of the realtime activity, in minutes. */
|
|
109
|
+
const ANALYTICS_REALTIME_MAX_MINUTES = 60;
|
|
110
|
+
/** Retention of the distinct visitor markers behind `activeUsers`, in days. */
|
|
111
|
+
const ANALYTICS_ACTIVE_USERS_RETENTION_DAYS = 400;
|
|
112
|
+
/** Default and maximum number of rows a report returns. */
|
|
113
|
+
const ANALYTICS_REPORT_DEFAULT_LIMIT = 100;
|
|
114
|
+
const ANALYTICS_REPORT_MAX_LIMIT = 1e4;
|
|
115
|
+
/** Maximum date ranges compared in one report. */
|
|
116
|
+
const ANALYTICS_REPORT_MAX_DATE_RANGES = 4;
|
|
117
|
+
/**
|
|
118
|
+
* Date of a report range: `YYYY-MM-DD`, `today`, `yesterday` or `NdaysAgo`
|
|
119
|
+
* (ex: `30daysAgo`). Days are UTC.
|
|
120
|
+
*/
|
|
121
|
+
const relativeDateSchema = zod_mini.z.string().check(zod_mini.z.regex(/^(\d{4}-\d{2}-\d{2}|today|yesterday|\d+daysAgo)$/, "Expected YYYY-MM-DD, today, yesterday or NdaysAgo"));
|
|
122
|
+
const analyticsDateRangeSchema = zod_mini.z.object({
|
|
123
|
+
startDate: relativeDateSchema,
|
|
124
|
+
endDate: relativeDateSchema,
|
|
125
|
+
/** Label of the range in the rows (`dateRange` column) when comparing. */
|
|
126
|
+
name: zod_mini.z.optional(zod_mini.z.string().check(zod_mini.z.maxLength(64)))
|
|
127
|
+
});
|
|
128
|
+
const dimensionFilterOperatorSchema = zod_mini.z.enum([
|
|
129
|
+
"exact",
|
|
130
|
+
"contains",
|
|
131
|
+
"beginsWith",
|
|
132
|
+
"endsWith",
|
|
133
|
+
"inList"
|
|
134
|
+
]);
|
|
135
|
+
const analyticsDimensionFilterSchema = zod_mini.z.object({
|
|
136
|
+
dimension: zod_mini.z.enum(ANALYTICS_REPORT_DIMENSIONS),
|
|
137
|
+
operator: dimensionFilterOperatorSchema,
|
|
138
|
+
/** Compared value (every operator but `inList`). */
|
|
139
|
+
value: zod_mini.z.optional(zod_mini.z.string().check(zod_mini.z.maxLength(512))),
|
|
140
|
+
/** Accepted values (`inList`). */
|
|
141
|
+
values: zod_mini.z.optional(zod_mini.z.array(zod_mini.z.string().check(zod_mini.z.maxLength(512))).check(zod_mini.z.maxLength(100))),
|
|
142
|
+
/** Defaults to `false`. */
|
|
143
|
+
caseSensitive: zod_mini.z.optional(zod_mini.z.boolean()),
|
|
144
|
+
/** Keeps the rows that do NOT match. */
|
|
145
|
+
not: zod_mini.z.optional(zod_mini.z.boolean())
|
|
146
|
+
});
|
|
147
|
+
const metricFilterOperatorSchema = zod_mini.z.enum([
|
|
148
|
+
"equal",
|
|
149
|
+
"greaterThan",
|
|
150
|
+
"greaterThanOrEqual",
|
|
151
|
+
"lessThan",
|
|
152
|
+
"lessThanOrEqual",
|
|
153
|
+
"between"
|
|
154
|
+
]);
|
|
155
|
+
const analyticsMetricFilterSchema = zod_mini.z.object({
|
|
156
|
+
metric: zod_mini.z.enum(ANALYTICS_REPORT_METRICS),
|
|
157
|
+
operator: metricFilterOperatorSchema,
|
|
158
|
+
value: zod_mini.z.number(),
|
|
159
|
+
/** Upper bound (inclusive) of `between`. */
|
|
160
|
+
toValue: zod_mini.z.optional(zod_mini.z.number())
|
|
161
|
+
});
|
|
162
|
+
const analyticsOrderBySchema = zod_mini.z.object({
|
|
163
|
+
/** A requested dimension or metric, or `dateRange`. */
|
|
164
|
+
field: zod_mini.z.string(),
|
|
165
|
+
/** Descending order. Defaults to `true` for metrics, `false` otherwise. */
|
|
166
|
+
desc: zod_mini.z.optional(zod_mini.z.boolean())
|
|
167
|
+
});
|
|
168
|
+
const analyticsReportRequestSchema = zod_mini.z.object({
|
|
169
|
+
dateRanges: zod_mini.z.array(analyticsDateRangeSchema).check(zod_mini.z.minLength(1), zod_mini.z.maxLength(4)),
|
|
170
|
+
dimensions: zod_mini.z._default(zod_mini.z.array(zod_mini.z.enum(ANALYTICS_REPORT_DIMENSIONS)).check(zod_mini.z.maxLength(4)), []),
|
|
171
|
+
metrics: zod_mini.z.array(zod_mini.z.enum(ANALYTICS_REPORT_METRICS)).check(zod_mini.z.minLength(1), zod_mini.z.maxLength(ANALYTICS_REPORT_METRICS.length)),
|
|
172
|
+
dimensionFilters: zod_mini.z.optional(zod_mini.z.array(analyticsDimensionFilterSchema).check(zod_mini.z.maxLength(10))),
|
|
173
|
+
metricFilters: zod_mini.z.optional(zod_mini.z.array(analyticsMetricFilterSchema).check(zod_mini.z.maxLength(10))),
|
|
174
|
+
orderBys: zod_mini.z.optional(zod_mini.z.array(analyticsOrderBySchema).check(zod_mini.z.maxLength(4))),
|
|
175
|
+
limit: zod_mini.z.optional(zod_mini.z.number().check(zod_mini.z.int(), zod_mini.z.minimum(1), zod_mini.z.maximum(ANALYTICS_REPORT_MAX_LIMIT))),
|
|
176
|
+
offset: zod_mini.z.optional(zod_mini.z.number().check(zod_mini.z.int(), zod_mini.z.minimum(0)))
|
|
177
|
+
});
|
|
178
|
+
const analyticsRealtimeReportRequestSchema = zod_mini.z.object({
|
|
179
|
+
dimensions: zod_mini.z._default(zod_mini.z.array(zod_mini.z.enum(ANALYTICS_REALTIME_DIMENSIONS)).check(zod_mini.z.maxLength(3)), []),
|
|
180
|
+
metrics: zod_mini.z.array(zod_mini.z.enum(ANALYTICS_REALTIME_METRICS)).check(zod_mini.z.minLength(1), zod_mini.z.maxLength(ANALYTICS_REALTIME_METRICS.length)),
|
|
181
|
+
/** Window, in minutes before now. Defaults to 30. */
|
|
182
|
+
minutesAgo: zod_mini.z.optional(zod_mini.z.number().check(zod_mini.z.int(), zod_mini.z.minimum(1), zod_mini.z.maximum(60))),
|
|
183
|
+
dimensionFilters: zod_mini.z.optional(zod_mini.z.array(zod_mini.z.object({
|
|
184
|
+
dimension: zod_mini.z.enum(ANALYTICS_REALTIME_DIMENSIONS),
|
|
185
|
+
operator: dimensionFilterOperatorSchema,
|
|
186
|
+
value: zod_mini.z.optional(zod_mini.z.string().check(zod_mini.z.maxLength(512))),
|
|
187
|
+
values: zod_mini.z.optional(zod_mini.z.array(zod_mini.z.string().check(zod_mini.z.maxLength(512))).check(zod_mini.z.maxLength(100))),
|
|
188
|
+
caseSensitive: zod_mini.z.optional(zod_mini.z.boolean()),
|
|
189
|
+
not: zod_mini.z.optional(zod_mini.z.boolean())
|
|
190
|
+
})).check(zod_mini.z.maxLength(10))),
|
|
191
|
+
limit: zod_mini.z.optional(zod_mini.z.number().check(zod_mini.z.int(), zod_mini.z.minimum(1), zod_mini.z.maximum(ANALYTICS_REPORT_MAX_LIMIT)))
|
|
192
|
+
});
|
|
193
|
+
/** A report row: dimension values (strings) and metric values (numbers). */
|
|
194
|
+
const analyticsReportRowSchema = zod_mini.z.record(zod_mini.z.string(), zod_mini.z.union([zod_mini.z.string(), zod_mini.z.number()]));
|
|
195
|
+
const analyticsReportSchema = zod_mini.z.object({
|
|
196
|
+
dimensions: zod_mini.z.array(zod_mini.z.string()),
|
|
197
|
+
metrics: zod_mini.z.array(zod_mini.z.string()),
|
|
198
|
+
/** Resolved ranges (absolute UTC days), in request order. */
|
|
199
|
+
dateRanges: zod_mini.z.array(zod_mini.z.object({
|
|
200
|
+
name: zod_mini.z.string(),
|
|
201
|
+
startDate: zod_mini.z.string(),
|
|
202
|
+
endDate: zod_mini.z.string()
|
|
203
|
+
})),
|
|
204
|
+
rows: zod_mini.z.array(analyticsReportRowSchema),
|
|
205
|
+
/** Rows matching the filters, before `offset` / `limit`. */
|
|
206
|
+
rowCount: zod_mini.z.number(),
|
|
207
|
+
/** Per date range totals, ignoring `metricFilters`. */
|
|
208
|
+
totals: zod_mini.z.array(analyticsReportRowSchema),
|
|
209
|
+
metadata: zod_mini.z.object({
|
|
210
|
+
timeZone: zod_mini.z.literal("UTC"),
|
|
211
|
+
/** First UTC day with collected data, `null` before any. */
|
|
212
|
+
dataSince: zod_mini.z.nullable(zod_mini.z.string()),
|
|
213
|
+
/** Rows were left out by `limit` / `offset`. */
|
|
214
|
+
truncated: zod_mini.z.boolean(),
|
|
215
|
+
/** Caveats the reader should know about (retention, sampling…). */
|
|
216
|
+
warnings: zod_mini.z.array(zod_mini.z.string())
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
const analyticsSchemaInfoSchema = zod_mini.z.object({
|
|
220
|
+
timeZone: zod_mini.z.literal("UTC"),
|
|
221
|
+
dataSince: zod_mini.z.nullable(zod_mini.z.string()),
|
|
222
|
+
/** Locales configured on the project. */
|
|
223
|
+
locales: zod_mini.z.array(zod_mini.z.string()),
|
|
224
|
+
retention: zod_mini.z.object({
|
|
225
|
+
activeUsersDays: zod_mini.z.number(),
|
|
226
|
+
realtimeMinutes: zod_mini.z.number()
|
|
227
|
+
}),
|
|
228
|
+
dimensions: zod_mini.z.array(zod_mini.z.object({
|
|
229
|
+
name: zod_mini.z.string(),
|
|
230
|
+
description: zod_mini.z.string()
|
|
231
|
+
})),
|
|
232
|
+
metrics: zod_mini.z.array(zod_mini.z.object({
|
|
233
|
+
name: zod_mini.z.string(),
|
|
234
|
+
description: zod_mini.z.string(),
|
|
235
|
+
compatibleDimensions: zod_mini.z.array(zod_mini.z.string())
|
|
236
|
+
})),
|
|
237
|
+
realtime: zod_mini.z.object({
|
|
238
|
+
dimensions: zod_mini.z.array(zod_mini.z.string()),
|
|
239
|
+
metrics: zod_mini.z.array(zod_mini.z.string())
|
|
240
|
+
}),
|
|
241
|
+
/** Experiments with collected data, with the goals converted on. */
|
|
242
|
+
experiments: zod_mini.z.array(zod_mini.z.object({
|
|
243
|
+
experimentKey: zod_mini.z.string(),
|
|
244
|
+
variants: zod_mini.z.array(zod_mini.z.string()),
|
|
245
|
+
goals: zod_mini.z.array(zod_mini.z.string()),
|
|
246
|
+
firstSeen: zod_mini.z.string()
|
|
247
|
+
}))
|
|
248
|
+
});
|
|
249
|
+
const ANALYTICS_ANNOTATION_TYPES = [
|
|
250
|
+
"dictionary_created",
|
|
251
|
+
"content_version_created",
|
|
252
|
+
"dictionary_updated",
|
|
253
|
+
"source_synced",
|
|
254
|
+
"locale_first_traffic",
|
|
255
|
+
"experiment_started"
|
|
256
|
+
];
|
|
257
|
+
const analyticsAnnotationSchema = zod_mini.z.object({
|
|
258
|
+
/** ISO date-time, or the UTC day for traffic-derived annotations. */
|
|
259
|
+
date: zod_mini.z.string(),
|
|
260
|
+
type: zod_mini.z.enum(ANALYTICS_ANNOTATION_TYPES),
|
|
261
|
+
title: zod_mini.z.string(),
|
|
262
|
+
dictionaryKey: zod_mini.z.optional(zod_mini.z.string()),
|
|
263
|
+
locale: zod_mini.z.optional(zod_mini.z.string()),
|
|
264
|
+
experimentKey: zod_mini.z.optional(zod_mini.z.string()),
|
|
265
|
+
/** Link to the commit / pull request (`source_synced`). */
|
|
266
|
+
url: zod_mini.z.optional(zod_mini.z.string())
|
|
267
|
+
});
|
|
268
|
+
const analyticsAnnotationsQuerySchema = zod_mini.z.object({
|
|
269
|
+
/** `YYYY-MM-DD`, `today`, `yesterday` or `NdaysAgo`. Defaults to 90daysAgo. */
|
|
270
|
+
startDate: zod_mini.z.optional(relativeDateSchema),
|
|
271
|
+
endDate: zod_mini.z.optional(relativeDateSchema),
|
|
272
|
+
types: zod_mini.z.optional(zod_mini.z.string()),
|
|
273
|
+
limit: zod_mini.z.optional(zod_mini.z.string())
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
exports.ANALYTICS_ACTIVE_USERS_RETENTION_DAYS = ANALYTICS_ACTIVE_USERS_RETENTION_DAYS;
|
|
277
|
+
exports.ANALYTICS_ANNOTATION_TYPES = ANALYTICS_ANNOTATION_TYPES;
|
|
278
|
+
exports.ANALYTICS_DIMENSION_DESCRIPTIONS = ANALYTICS_DIMENSION_DESCRIPTIONS;
|
|
279
|
+
exports.ANALYTICS_METRIC_DESCRIPTIONS = ANALYTICS_METRIC_DESCRIPTIONS;
|
|
280
|
+
exports.ANALYTICS_METRIC_DIMENSIONS = ANALYTICS_METRIC_DIMENSIONS;
|
|
281
|
+
exports.ANALYTICS_REALTIME_DIMENSIONS = ANALYTICS_REALTIME_DIMENSIONS;
|
|
282
|
+
exports.ANALYTICS_REALTIME_MAX_MINUTES = ANALYTICS_REALTIME_MAX_MINUTES;
|
|
283
|
+
exports.ANALYTICS_REALTIME_METRICS = ANALYTICS_REALTIME_METRICS;
|
|
284
|
+
exports.ANALYTICS_REPORT_DEFAULT_LIMIT = ANALYTICS_REPORT_DEFAULT_LIMIT;
|
|
285
|
+
exports.ANALYTICS_REPORT_DIMENSIONS = ANALYTICS_REPORT_DIMENSIONS;
|
|
286
|
+
exports.ANALYTICS_REPORT_MAX_DATE_RANGES = ANALYTICS_REPORT_MAX_DATE_RANGES;
|
|
287
|
+
exports.ANALYTICS_REPORT_MAX_LIMIT = ANALYTICS_REPORT_MAX_LIMIT;
|
|
288
|
+
exports.ANALYTICS_REPORT_METRICS = ANALYTICS_REPORT_METRICS;
|
|
289
|
+
exports.ANALYTICS_TIME_DIMENSIONS = ANALYTICS_TIME_DIMENSIONS;
|
|
290
|
+
exports.analyticsAnnotationSchema = analyticsAnnotationSchema;
|
|
291
|
+
exports.analyticsAnnotationsQuerySchema = analyticsAnnotationsQuerySchema;
|
|
292
|
+
exports.analyticsDateRangeSchema = analyticsDateRangeSchema;
|
|
293
|
+
exports.analyticsDimensionFilterSchema = analyticsDimensionFilterSchema;
|
|
294
|
+
exports.analyticsMetricFilterSchema = analyticsMetricFilterSchema;
|
|
295
|
+
exports.analyticsOrderBySchema = analyticsOrderBySchema;
|
|
296
|
+
exports.analyticsRealtimeReportRequestSchema = analyticsRealtimeReportRequestSchema;
|
|
297
|
+
exports.analyticsReportRequestSchema = analyticsReportRequestSchema;
|
|
298
|
+
exports.analyticsReportRowSchema = analyticsReportRowSchema;
|
|
299
|
+
exports.analyticsReportSchema = analyticsReportSchema;
|
|
300
|
+
exports.analyticsSchemaInfoSchema = analyticsSchemaInfoSchema;
|
|
301
|
+
//# sourceMappingURL=analyticsReport.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyticsReport.cjs","names":["z"],"sources":["../../src/analyticsReport.ts"],"sourcesContent":["import { z } from 'zod/mini';\n\n/**\n * Report dimensions. Time dimensions are labelled `YYYY-MM-DD` (`date`),\n * `YYYY-Www` (`week`, ISO week) and `YYYY-MM` (`month`), all in UTC.\n */\nexport const ANALYTICS_REPORT_DIMENSIONS = [\n 'date',\n 'week',\n 'month',\n 'locale',\n 'pagePath',\n 'country',\n 'dictionaryKey',\n 'keyPath',\n 'contentType',\n 'variant',\n 'experimentKey',\n 'goal',\n] as const;\n\nexport const ANALYTICS_REPORT_METRICS = [\n 'pageViews',\n 'activeUsers',\n 'entrances',\n 'contentExposures',\n 'conversions',\n 'conversionValue',\n] as const;\n\nexport type AnalyticsReportDimension =\n (typeof ANALYTICS_REPORT_DIMENSIONS)[number];\nexport type AnalyticsReportMetric = (typeof ANALYTICS_REPORT_METRICS)[number];\n\n/** Dimensions that bucket time; they cannot be used in dimension filters. */\nexport const ANALYTICS_TIME_DIMENSIONS = [\n 'date',\n 'week',\n 'month',\n] as const satisfies readonly AnalyticsReportDimension[];\n\nconst TIME_DIMENSIONS = ANALYTICS_TIME_DIMENSIONS;\n\n/**\n * Dimensions each metric can be broken down by. The data is stored\n * pre-aggregated per event type, so a dimension a metric was not recorded with\n * cannot be applied to it (ex: visitors are not attributed per page).\n */\nexport const ANALYTICS_METRIC_DIMENSIONS = {\n pageViews: [...TIME_DIMENSIONS, 'locale', 'pagePath'],\n activeUsers: [...TIME_DIMENSIONS, 'locale', 'country'],\n entrances: [...TIME_DIMENSIONS, 'pagePath'],\n contentExposures: [\n ...TIME_DIMENSIONS,\n 'locale',\n 'dictionaryKey',\n 'keyPath',\n 'contentType',\n 'variant',\n 'experimentKey',\n ],\n conversions: [\n ...TIME_DIMENSIONS,\n 'locale',\n 'variant',\n 'experimentKey',\n 'goal',\n ],\n conversionValue: [\n ...TIME_DIMENSIONS,\n 'locale',\n 'variant',\n 'experimentKey',\n 'goal',\n ],\n} as const satisfies Record<\n AnalyticsReportMetric,\n readonly AnalyticsReportDimension[]\n>;\n\nexport const ANALYTICS_DIMENSION_DESCRIPTIONS: Record<\n AnalyticsReportDimension,\n string\n> = {\n date: 'UTC day, `YYYY-MM-DD`.',\n week: 'ISO week, `YYYY-Www` (weeks start on Monday, UTC).',\n month: 'Month, `YYYY-MM` (UTC).',\n locale: 'Locale the content was displayed in (ex: `fr`, `en-GB`).',\n pagePath:\n 'Page pathname, including any locale prefix (`/fr/pricing`). For `entrances`, the landing page.',\n country: 'ISO 3166-1 alpha-2 visitor country, `ZZ` when unknown.',\n dictionaryKey: 'Intlayer dictionary key of the displayed content.',\n keyPath: 'Path of the displayed field inside its dictionary.',\n contentType:\n 'Intlayer node type of the displayed field (translation, enumeration, markdown…).',\n variant: 'A/B variant shown.',\n experimentKey: 'A/B experiment key.',\n goal: 'Conversion goal name.',\n};\n\nexport const ANALYTICS_METRIC_DESCRIPTIONS: Record<\n AnalyticsReportMetric,\n string\n> = {\n pageViews: 'Page views.',\n activeUsers:\n 'Distinct anonymous visitor sessions (not additive across rows: a visitor seen in two locales counts in both). Kept 400 days.',\n entrances: 'Sessions that started on the page (landing pages).',\n contentExposures: 'Times a content field was displayed.',\n conversions: 'Conversion events.',\n conversionValue: 'Sum of the numeric value attached to conversions.',\n};\n\nexport const ANALYTICS_REALTIME_DIMENSIONS = [\n 'minute',\n 'pagePath',\n 'locale',\n 'country',\n] as const;\n\nexport const ANALYTICS_REALTIME_METRICS = ['activeUsers', 'pageViews'] as const;\n\nexport type AnalyticsRealtimeDimension =\n (typeof ANALYTICS_REALTIME_DIMENSIONS)[number];\nexport type AnalyticsRealtimeMetric =\n (typeof ANALYTICS_REALTIME_METRICS)[number];\n\n/** Retention of the realtime activity, in minutes. */\nexport const ANALYTICS_REALTIME_MAX_MINUTES = 60;\n/** Retention of the distinct visitor markers behind `activeUsers`, in days. */\nexport const ANALYTICS_ACTIVE_USERS_RETENTION_DAYS = 400;\n/** Default and maximum number of rows a report returns. */\nexport const ANALYTICS_REPORT_DEFAULT_LIMIT = 100;\nexport const ANALYTICS_REPORT_MAX_LIMIT = 10_000;\n/** Maximum date ranges compared in one report. */\nexport const ANALYTICS_REPORT_MAX_DATE_RANGES = 4;\n\n/**\n * Date of a report range: `YYYY-MM-DD`, `today`, `yesterday` or `NdaysAgo`\n * (ex: `30daysAgo`). Days are UTC.\n */\nconst relativeDateSchema = z\n .string()\n .check(\n z.regex(\n /^(\\d{4}-\\d{2}-\\d{2}|today|yesterday|\\d+daysAgo)$/,\n 'Expected YYYY-MM-DD, today, yesterday or NdaysAgo'\n )\n );\n\nexport const analyticsDateRangeSchema = z.object({\n startDate: relativeDateSchema,\n endDate: relativeDateSchema,\n /** Label of the range in the rows (`dateRange` column) when comparing. */\n name: z.optional(z.string().check(z.maxLength(64))),\n});\n\nconst dimensionFilterOperatorSchema = z.enum([\n 'exact',\n 'contains',\n 'beginsWith',\n 'endsWith',\n 'inList',\n]);\n\nexport const analyticsDimensionFilterSchema = z.object({\n dimension: z.enum(ANALYTICS_REPORT_DIMENSIONS),\n operator: dimensionFilterOperatorSchema,\n /** Compared value (every operator but `inList`). */\n value: z.optional(z.string().check(z.maxLength(512))),\n /** Accepted values (`inList`). */\n values: z.optional(\n z.array(z.string().check(z.maxLength(512))).check(z.maxLength(100))\n ),\n /** Defaults to `false`. */\n caseSensitive: z.optional(z.boolean()),\n /** Keeps the rows that do NOT match. */\n not: z.optional(z.boolean()),\n});\n\nconst metricFilterOperatorSchema = z.enum([\n 'equal',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n]);\n\nexport const analyticsMetricFilterSchema = z.object({\n metric: z.enum(ANALYTICS_REPORT_METRICS),\n operator: metricFilterOperatorSchema,\n value: z.number(),\n /** Upper bound (inclusive) of `between`. */\n toValue: z.optional(z.number()),\n});\n\nexport const analyticsOrderBySchema = z.object({\n /** A requested dimension or metric, or `dateRange`. */\n field: z.string(),\n /** Descending order. Defaults to `true` for metrics, `false` otherwise. */\n desc: z.optional(z.boolean()),\n});\n\nexport const analyticsReportRequestSchema = z.object({\n dateRanges: z\n .array(analyticsDateRangeSchema)\n .check(z.minLength(1), z.maxLength(ANALYTICS_REPORT_MAX_DATE_RANGES)),\n dimensions: z._default(\n z.array(z.enum(ANALYTICS_REPORT_DIMENSIONS)).check(z.maxLength(4)),\n []\n ),\n metrics: z\n .array(z.enum(ANALYTICS_REPORT_METRICS))\n .check(z.minLength(1), z.maxLength(ANALYTICS_REPORT_METRICS.length)),\n dimensionFilters: z.optional(\n z.array(analyticsDimensionFilterSchema).check(z.maxLength(10))\n ),\n metricFilters: z.optional(\n z.array(analyticsMetricFilterSchema).check(z.maxLength(10))\n ),\n orderBys: z.optional(z.array(analyticsOrderBySchema).check(z.maxLength(4))),\n limit: z.optional(\n z\n .number()\n .check(z.int(), z.minimum(1), z.maximum(ANALYTICS_REPORT_MAX_LIMIT))\n ),\n offset: z.optional(z.number().check(z.int(), z.minimum(0))),\n});\n\nexport const analyticsRealtimeReportRequestSchema = z.object({\n dimensions: z._default(\n z.array(z.enum(ANALYTICS_REALTIME_DIMENSIONS)).check(z.maxLength(3)),\n []\n ),\n metrics: z\n .array(z.enum(ANALYTICS_REALTIME_METRICS))\n .check(z.minLength(1), z.maxLength(ANALYTICS_REALTIME_METRICS.length)),\n /** Window, in minutes before now. Defaults to 30. */\n minutesAgo: z.optional(\n z\n .number()\n .check(z.int(), z.minimum(1), z.maximum(ANALYTICS_REALTIME_MAX_MINUTES))\n ),\n dimensionFilters: z.optional(\n z\n .array(\n z.object({\n dimension: z.enum(ANALYTICS_REALTIME_DIMENSIONS),\n operator: dimensionFilterOperatorSchema,\n value: z.optional(z.string().check(z.maxLength(512))),\n values: z.optional(\n z.array(z.string().check(z.maxLength(512))).check(z.maxLength(100))\n ),\n caseSensitive: z.optional(z.boolean()),\n not: z.optional(z.boolean()),\n })\n )\n .check(z.maxLength(10))\n ),\n limit: z.optional(\n z\n .number()\n .check(z.int(), z.minimum(1), z.maximum(ANALYTICS_REPORT_MAX_LIMIT))\n ),\n});\n\n/** A report row: dimension values (strings) and metric values (numbers). */\nexport const analyticsReportRowSchema = z.record(\n z.string(),\n z.union([z.string(), z.number()])\n);\n\nexport const analyticsReportSchema = z.object({\n dimensions: z.array(z.string()),\n metrics: z.array(z.string()),\n /** Resolved ranges (absolute UTC days), in request order. */\n dateRanges: z.array(\n z.object({ name: z.string(), startDate: z.string(), endDate: z.string() })\n ),\n rows: z.array(analyticsReportRowSchema),\n /** Rows matching the filters, before `offset` / `limit`. */\n rowCount: z.number(),\n /** Per date range totals, ignoring `metricFilters`. */\n totals: z.array(analyticsReportRowSchema),\n metadata: z.object({\n timeZone: z.literal('UTC'),\n /** First UTC day with collected data, `null` before any. */\n dataSince: z.nullable(z.string()),\n /** Rows were left out by `limit` / `offset`. */\n truncated: z.boolean(),\n /** Caveats the reader should know about (retention, sampling…). */\n warnings: z.array(z.string()),\n }),\n});\n\nexport const analyticsSchemaInfoSchema = z.object({\n timeZone: z.literal('UTC'),\n dataSince: z.nullable(z.string()),\n /** Locales configured on the project. */\n locales: z.array(z.string()),\n retention: z.object({\n activeUsersDays: z.number(),\n realtimeMinutes: z.number(),\n }),\n dimensions: z.array(z.object({ name: z.string(), description: z.string() })),\n metrics: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n compatibleDimensions: z.array(z.string()),\n })\n ),\n realtime: z.object({\n dimensions: z.array(z.string()),\n metrics: z.array(z.string()),\n }),\n /** Experiments with collected data, with the goals converted on. */\n experiments: z.array(\n z.object({\n experimentKey: z.string(),\n variants: z.array(z.string()),\n goals: z.array(z.string()),\n firstSeen: z.string(),\n })\n ),\n});\n\nexport const ANALYTICS_ANNOTATION_TYPES = [\n 'dictionary_created',\n 'content_version_created',\n 'dictionary_updated',\n 'source_synced',\n 'locale_first_traffic',\n 'experiment_started',\n] as const;\n\nexport const analyticsAnnotationSchema = z.object({\n /** ISO date-time, or the UTC day for traffic-derived annotations. */\n date: z.string(),\n type: z.enum(ANALYTICS_ANNOTATION_TYPES),\n title: z.string(),\n dictionaryKey: z.optional(z.string()),\n locale: z.optional(z.string()),\n experimentKey: z.optional(z.string()),\n /** Link to the commit / pull request (`source_synced`). */\n url: z.optional(z.string()),\n});\n\nexport const analyticsAnnotationsQuerySchema = z.object({\n /** `YYYY-MM-DD`, `today`, `yesterday` or `NdaysAgo`. Defaults to 90daysAgo. */\n startDate: z.optional(relativeDateSchema),\n endDate: z.optional(relativeDateSchema),\n types: z.optional(z.string()),\n limit: z.optional(z.string()),\n});\n\nexport type AnalyticsDateRange = z.output<typeof analyticsDateRangeSchema>;\nexport type AnalyticsDimensionFilter = z.output<\n typeof analyticsDimensionFilterSchema\n>;\nexport type AnalyticsMetricFilter = z.output<\n typeof analyticsMetricFilterSchema\n>;\nexport type AnalyticsOrderBy = z.output<typeof analyticsOrderBySchema>;\nexport type AnalyticsReportRequest = z.input<\n typeof analyticsReportRequestSchema\n>;\nexport type AnalyticsRealtimeReportRequest = z.input<\n typeof analyticsRealtimeReportRequestSchema\n>;\nexport type AnalyticsReportRow = z.output<typeof analyticsReportRowSchema>;\nexport type AnalyticsReport = z.output<typeof analyticsReportSchema>;\nexport type AnalyticsSchemaInfo = z.output<typeof analyticsSchemaInfoSchema>;\nexport type AnalyticsAnnotationType =\n (typeof ANALYTICS_ANNOTATION_TYPES)[number];\nexport type AnalyticsAnnotation = z.output<typeof analyticsAnnotationSchema>;\nexport type AnalyticsAnnotationsQuery = z.output<\n typeof analyticsAnnotationsQuerySchema\n>;\n"],"mappings":"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"}
|
package/dist/esm/analytics.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ANALYTICS_ACTIVE_USERS_RETENTION_DAYS, ANALYTICS_ANNOTATION_TYPES, ANALYTICS_DIMENSION_DESCRIPTIONS, ANALYTICS_METRIC_DESCRIPTIONS, ANALYTICS_METRIC_DIMENSIONS, ANALYTICS_REALTIME_DIMENSIONS, ANALYTICS_REALTIME_MAX_MINUTES, ANALYTICS_REALTIME_METRICS, ANALYTICS_REPORT_DEFAULT_LIMIT, ANALYTICS_REPORT_DIMENSIONS, ANALYTICS_REPORT_MAX_DATE_RANGES, ANALYTICS_REPORT_MAX_LIMIT, ANALYTICS_REPORT_METRICS, ANALYTICS_TIME_DIMENSIONS, analyticsAnnotationSchema, analyticsAnnotationsQuerySchema, analyticsDateRangeSchema, analyticsDimensionFilterSchema, analyticsMetricFilterSchema, analyticsOrderBySchema, analyticsRealtimeReportRequestSchema, analyticsReportRequestSchema, analyticsReportRowSchema, analyticsReportSchema, analyticsSchemaInfoSchema } from "./analyticsReport.mjs";
|
|
1
2
|
import { defineRoute, defineRouteGroup } from "./defineRoute.mjs";
|
|
2
3
|
import { responseDataSchema } from "./responseData.mjs";
|
|
3
4
|
import { z } from "zod/mini";
|
|
@@ -255,6 +256,39 @@ const analyticsContract = defineRouteGroup({
|
|
|
255
256
|
response: { 200: responseDataSchema(experimentResultSchema) }
|
|
256
257
|
}
|
|
257
258
|
}),
|
|
259
|
+
getAnalyticsSchema: defineRoute({
|
|
260
|
+
method: "GET",
|
|
261
|
+
path: "/schema",
|
|
262
|
+
summary: "Report dimensions, metrics, their compatibility, retention and experiments",
|
|
263
|
+
schemas: { response: { 200: responseDataSchema(analyticsSchemaInfoSchema) } }
|
|
264
|
+
}),
|
|
265
|
+
runAnalyticsReport: defineRoute({
|
|
266
|
+
method: "POST",
|
|
267
|
+
path: "/report",
|
|
268
|
+
summary: "Aggregated report: metrics broken down by dimensions over date ranges",
|
|
269
|
+
schemas: {
|
|
270
|
+
body: analyticsReportRequestSchema,
|
|
271
|
+
response: { 200: responseDataSchema(analyticsReportSchema) }
|
|
272
|
+
}
|
|
273
|
+
}),
|
|
274
|
+
runAnalyticsRealtimeReport: defineRoute({
|
|
275
|
+
method: "POST",
|
|
276
|
+
path: "/realtime-report",
|
|
277
|
+
summary: "Aggregated activity of the last minutes (up to one hour)",
|
|
278
|
+
schemas: {
|
|
279
|
+
body: analyticsRealtimeReportRequestSchema,
|
|
280
|
+
response: { 200: responseDataSchema(analyticsReportSchema) }
|
|
281
|
+
}
|
|
282
|
+
}),
|
|
283
|
+
getAnalyticsAnnotations: defineRoute({
|
|
284
|
+
method: "GET",
|
|
285
|
+
path: "/annotations",
|
|
286
|
+
summary: "Dated content and traffic events (dictionary edits, repo syncs, new locales, experiments)",
|
|
287
|
+
schemas: {
|
|
288
|
+
querystring: analyticsAnnotationsQuerySchema,
|
|
289
|
+
response: { 200: responseDataSchema(z.array(analyticsAnnotationSchema)) }
|
|
290
|
+
}
|
|
291
|
+
}),
|
|
258
292
|
getPageMetadata: defineRoute({
|
|
259
293
|
method: "GET",
|
|
260
294
|
path: "/page-metadata",
|
|
@@ -267,5 +301,5 @@ const analyticsContract = defineRouteGroup({
|
|
|
267
301
|
}
|
|
268
302
|
});
|
|
269
303
|
|
|
270
|
-
export { PAGE_FLOW_ENTRANCE, analyticsContract, analyticsEventTypeSchema, audienceGranularitySchema, audienceRangeSchema, audienceSeriesPointSchema, audienceStatsSchema, incomingAnalyticsEventSchema, liveVisitorFlowSchema, liveVisitorFlowStepSchema, liveVisitorSchema, pageFlowLinkSchema, pageFlowNodeSchema, pageFlowSchema };
|
|
304
|
+
export { ANALYTICS_ACTIVE_USERS_RETENTION_DAYS, ANALYTICS_ANNOTATION_TYPES, ANALYTICS_DIMENSION_DESCRIPTIONS, ANALYTICS_METRIC_DESCRIPTIONS, ANALYTICS_METRIC_DIMENSIONS, ANALYTICS_REALTIME_DIMENSIONS, ANALYTICS_REALTIME_MAX_MINUTES, ANALYTICS_REALTIME_METRICS, ANALYTICS_REPORT_DEFAULT_LIMIT, ANALYTICS_REPORT_DIMENSIONS, ANALYTICS_REPORT_MAX_DATE_RANGES, ANALYTICS_REPORT_MAX_LIMIT, ANALYTICS_REPORT_METRICS, ANALYTICS_TIME_DIMENSIONS, PAGE_FLOW_ENTRANCE, analyticsAnnotationSchema, analyticsAnnotationsQuerySchema, analyticsContract, analyticsDateRangeSchema, analyticsDimensionFilterSchema, analyticsEventTypeSchema, analyticsMetricFilterSchema, analyticsOrderBySchema, analyticsRealtimeReportRequestSchema, analyticsReportRequestSchema, analyticsReportRowSchema, analyticsReportSchema, analyticsSchemaInfoSchema, audienceGranularitySchema, audienceRangeSchema, audienceSeriesPointSchema, audienceStatsSchema, incomingAnalyticsEventSchema, liveVisitorFlowSchema, liveVisitorFlowStepSchema, liveVisitorSchema, pageFlowLinkSchema, pageFlowNodeSchema, pageFlowSchema };
|
|
271
305
|
//# sourceMappingURL=analytics.mjs.map
|