@useairfoil/producer-google-analytics 0.0.0-stage → 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.mjs","names":["ConnectorLayer","GoogleAnalyticsConnector.layerConfig","TelemetryLayer","GoogleAnalyticsConnector.GoogleAnalyticsConnector","GoogleAnalyticsConnector.layerConfig","GoogleAnalyticsConnector.GoogleAnalyticsConnector","packageJson.version"],"sources":["../package.json","../src/tables.ts","../src/create-table.ts","../src/demo/shared.ts","../src/demo/reports.ts","../src/demo/index.ts","../src/sandbox.ts","../src/start.ts","../src/main.ts"],"sourcesContent":["","import type { Schema } from \"effect\";\n\nimport {\n DailyOverviewSchema,\n DeviceSchema,\n EcommerceItemSchema,\n EventSchema,\n LandingPageSchema,\n LocationSchema,\n PageSchema,\n TrafficSourceSchema,\n UserAcquisitionSchema,\n} from \"./schemas/reports\";\n\nexport const tableSchemas: Readonly<Record<string, Schema.Top>> = {\n daily_overview: DailyOverviewSchema,\n traffic_sources: TrafficSourceSchema,\n user_acquisition: UserAcquisitionSchema,\n pages: PageSchema,\n landing_pages: LandingPageSchema,\n events: EventSchema,\n locations: LocationSchema,\n devices: DeviceSchema,\n ecommerce_items: EcommerceItemSchema,\n};\n","import { ConnectorApp } from \"@useairfoil/connector-kit\";\n\nimport { tableSchemas } from \"./tables\";\n\nexport const createTableCommand = ConnectorApp.makeCreateTableCommand(tableSchemas);\n","import { Duration } from \"effect\";\n\nimport type {\n DailyOverview,\n Device,\n EcommerceItem,\n Event,\n LandingPage,\n Location,\n Page,\n TrafficSource,\n UserAcquisition,\n} from \"../schemas/reports\";\n\nexport const day = Duration.toMillis(Duration.days(1));\nexport const propertyId = \"123456789\";\nexport const host = \"shop.acme.example.com\";\nexport const currency = \"USD\";\n\n// [source, medium, campaign, channel group, share of sessions]\nexport const sources = [\n [\"google\", \"organic\", \"(organic)\", \"Organic Search\", 34],\n [\"(direct)\", \"(none)\", \"(direct)\", \"Direct\", 22],\n [\"google\", \"cpc\", \"brand_search\", \"Paid Search\", 14],\n [\"facebook\", \"paid_social\", \"fall_sale\", \"Paid Social\", 9],\n [\"newsletter\", \"email\", \"weekly_digest\", \"Email\", 8],\n [\"bing\", \"organic\", \"(organic)\", \"Organic Search\", 5],\n [\"instagram.com\", \"referral\", \"(referral)\", \"Organic Social\", 5],\n [\"partner.example.com\", \"referral\", \"(referral)\", \"Referral\", 3],\n] as const;\n\nexport const pages = [\n [\"/\", \"Acme - Everyday goods\", 30],\n [\"/collections/new\", \"New arrivals - Acme\", 14],\n [\"/collections/sale\", \"Sale - Acme\", 12],\n [\"/products/classic-tee\", \"Classic Tee - Acme\", 9],\n [\"/products/everyday-hoodie\", \"Everyday Hoodie - Acme\", 8],\n [\"/products/water-bottle\", \"Insulated Water Bottle - Acme\", 6],\n [\"/cart\", \"Your cart - Acme\", 8],\n [\"/checkout\", \"Checkout - Acme\", 5],\n [\"/blog/how-we-source-cotton\", \"How we source our cotton - Acme\", 4],\n [\"/pages/shipping\", \"Shipping - Acme\", 4],\n] as const;\n\nexport const locations = [\n [\"United States\", \"California\", \"Los Angeles\", 14],\n [\"United States\", \"New York\", \"New York\", 12],\n [\"United States\", \"Texas\", \"Austin\", 7],\n [\"United States\", \"Illinois\", \"Chicago\", 6],\n [\"United Kingdom\", \"England\", \"London\", 9],\n [\"Canada\", \"Ontario\", \"Toronto\", 6],\n [\"Germany\", \"Berlin\", \"Berlin\", 5],\n [\"Australia\", \"New South Wales\", \"Sydney\", 4],\n [\"United States\", \"(not set)\", \"(not set)\", 3],\n] as const;\n\nexport const devices = [\n [\"mobile\", \"web\", \"iOS\", \"Safari\", 30],\n [\"mobile\", \"web\", \"Android\", \"Chrome\", 22],\n [\"desktop\", \"web\", \"Windows\", \"Chrome\", 18],\n [\"desktop\", \"web\", \"Macintosh\", \"Chrome\", 12],\n [\"desktop\", \"web\", \"Macintosh\", \"Safari\", 10],\n [\"tablet\", \"web\", \"iOS\", \"Safari\", 5],\n [\"desktop\", \"web\", \"Windows\", \"Edge\", 3],\n] as const;\n\nexport const items = [\n [\"SKU-TEE\", \"Classic Cotton Tee\", \"Apparel\", 28],\n [\"SKU-HOODIE\", \"Everyday Hoodie\", \"Apparel\", 64],\n [\"SKU-SHIRT\", \"Linen Button Shirt\", \"Apparel\", 72],\n [\"SKU-BEANIE\", \"Wool Beanie\", \"Accessories\", 26],\n [\"SKU-TOTE\", \"Canvas Tote Bag\", \"Accessories\", 22],\n [\"SKU-MUG\", \"Stoneware Mug\", \"Home\", 18],\n [\"SKU-BOTTLE\", \"Insulated Water Bottle\", \"Home\", 32],\n] as const;\n\n/** Splits a total by weights into whole numbers that add up to it. */\nexport const split = (total: number, weights: ReadonlyArray<number>) => {\n const sum = weights.reduce((a, b) => a + b, 0);\n const parts = weights.map((weight) => Math.floor((total * weight) / sum));\n parts[0] = (parts[0] ?? 0) + total - parts.reduce((a, b) => a + b, 0);\n\n return parts;\n};\n\nexport const money = (value: number) => Math.round(value * 100) / 100;\n\nexport type Rows = {\n readonly daily_overview: Array<DailyOverview>;\n readonly traffic_sources: Array<TrafficSource>;\n readonly user_acquisition: Array<UserAcquisition>;\n readonly pages: Array<Page>;\n readonly landing_pages: Array<LandingPage>;\n readonly events: Array<Event>;\n readonly locations: Array<Location>;\n readonly devices: Array<Device>;\n readonly ecommerce_items: Array<EcommerceItem>;\n};\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport { DateTime } from \"effect\";\n\nimport {\n currency,\n day,\n devices,\n host,\n items,\n locations,\n money,\n pages,\n propertyId,\n type Rows,\n sources,\n split,\n} from \"./shared\";\n\n/** One group is one day of reports, counting back from yesterday. */\nexport const dayRows = (index: number, { faker, now }: Demo.DemoContext): Rows => {\n const date = DateTime.formatIsoDateUtc(\n DateTime.fromDateUnsafe(new Date(now.getTime() - (index + 1) * day)),\n );\n\n const id = (...dimensions: ReadonlyArray<string>) =>\n JSON.stringify([propertyId, date, ...dimensions]);\n\n const base = { version: now, property_id: propertyId, date };\n\n // Traffic grows over time and dips at the weekend.\n const weekday = new Date(`${date}T00:00:00Z`).getUTCDay();\n const weekend = weekday === 0 || weekday === 6 ? 0.75 : 1;\n const growth = Math.max(0.4, 1 - index / 900);\n\n const sessions = Math.round(\n 4200 * weekend * growth * faker.number.float({ min: 0.85, max: 1.15 }),\n );\n\n const engaged = Math.round(sessions * faker.number.float({ min: 0.55, max: 0.68 }));\n const activeUsers = Math.round(sessions * 0.78);\n const newUsers = Math.round(activeUsers * faker.number.float({ min: 0.42, max: 0.55 }));\n const views = Math.round(sessions * faker.number.float({ min: 3.2, max: 4.4 }));\n const purchases = Math.round(sessions * faker.number.float({ min: 0.018, max: 0.028 }));\n const revenue = money(purchases * faker.number.float({ min: 58, max: 74 }));\n const engagement = money(engaged * faker.number.float({ min: 95, max: 140 }));\n\n const bySource = split(\n sessions,\n sources.map((source) => source[4]),\n );\n\n const byNewSource = split(\n newUsers,\n sources.map((source) => source[4]),\n );\n\n const purchasesBySource = split(\n purchases,\n sources.map((source) => source[4]),\n );\n\n const share = (part: number, whole: number) => (whole === 0 ? 0 : part / whole);\n\n const eventCounts: ReadonlyArray<readonly [string, number, number]> = [\n [\"page_view\", views, activeUsers],\n [\"session_start\", sessions, activeUsers],\n [\"first_visit\", newUsers, newUsers],\n [\"user_engagement\", engaged * 3, Math.round(activeUsers * 0.7)],\n [\"scroll\", Math.round(views * 0.45), Math.round(activeUsers * 0.5)],\n [\"view_item\", Math.round(views * 0.3), Math.round(activeUsers * 0.4)],\n [\"add_to_cart\", Math.round(sessions * 0.08), Math.round(activeUsers * 0.07)],\n [\"begin_checkout\", Math.round(sessions * 0.04), Math.round(activeUsers * 0.035)],\n [\"purchase\", purchases, purchases],\n ];\n\n // Cheaper items sell more units.\n const itemUnits = split(\n purchases + Math.round(purchases * 0.4),\n items.map((item) => 10 - item[3] / 10),\n );\n\n const viewsByPage = split(\n views,\n pages.map((page) => page[2]),\n );\n\n const sessionsByLanding = split(sessions, [42, 16, 14, 10, 10, 8]);\n\n const sessionsByLocation = split(\n sessions,\n locations.map((location) => location[3]),\n );\n\n const sessionsByDevice = split(\n sessions,\n devices.map((device) => device[4]),\n );\n\n return {\n daily_overview: [\n {\n id: id(),\n ...base,\n active_users: BigInt(activeUsers),\n new_users: BigInt(newUsers),\n total_users: BigInt(Math.round(activeUsers * 1.08)),\n sessions: BigInt(sessions),\n engaged_sessions: BigInt(engaged),\n screen_page_views: BigInt(views),\n event_count: BigInt(eventCounts.reduce((sum, [, count]) => sum + count, 0)),\n key_events: purchases,\n total_revenue: revenue,\n user_engagement_duration: engagement,\n currency_code: currency,\n },\n ],\n traffic_sources: sources.map(([source, medium, campaign, channel], s) => {\n const part = bySource[s] ?? 0;\n\n return {\n id: id(source, medium, campaign, channel),\n ...base,\n session_source: source,\n session_medium: medium,\n session_campaign_name: campaign,\n session_default_channel_group: channel,\n sessions: BigInt(part),\n engaged_sessions: BigInt(Math.round(part * share(engaged, sessions))),\n active_users: BigInt(Math.round(part * share(activeUsers, sessions))),\n new_users: BigInt(Math.round(part * share(newUsers, sessions))),\n screen_page_views: BigInt(Math.round(part * share(views, sessions))),\n event_count: BigInt(Math.round(part * share(views, sessions) * 2.6)),\n key_events: purchasesBySource[s] ?? 0,\n total_revenue: money(revenue * share(purchasesBySource[s] ?? 0, purchases)),\n user_engagement_duration: money(engagement * share(part, sessions)),\n currency_code: currency,\n };\n }),\n user_acquisition: sources.map(([source, medium, campaign, channel], s) => ({\n id: id(source, medium, campaign, channel),\n ...base,\n first_user_source: source,\n first_user_medium: medium,\n first_user_campaign_name: campaign,\n first_user_default_channel_group: channel,\n new_users: BigInt(byNewSource[s] ?? 0),\n active_users: BigInt(Math.round((byNewSource[s] ?? 0) * 1.6)),\n sessions: BigInt(Math.round((byNewSource[s] ?? 0) * 1.9)),\n engaged_sessions: BigInt(Math.round((byNewSource[s] ?? 0) * 1.1)),\n key_events: Math.round((purchasesBySource[s] ?? 0) * 0.4),\n total_revenue: money(revenue * 0.4 * share(purchasesBySource[s] ?? 0, purchases)),\n currency_code: currency,\n })),\n pages: pages.map(([path, title, weight], p) => {\n const part = viewsByPage[p] ?? 0;\n\n return {\n id: id(host, path, title),\n ...base,\n host_name: host,\n page_path: path,\n page_title: title,\n screen_page_views: BigInt(part),\n active_users: BigInt(Math.round(part * 0.62)),\n event_count: BigInt(Math.round(part * 2.4)),\n key_events: path === \"/checkout\" ? purchases : 0,\n user_engagement_duration: money(engagement * (weight / 100)),\n };\n }),\n landing_pages: pages.slice(0, 6).map(([path], l) => {\n const part = sessionsByLanding[l] ?? 0;\n\n return {\n id: id(path),\n ...base,\n landing_page: path,\n sessions: BigInt(part),\n engaged_sessions: BigInt(Math.round(part * share(engaged, sessions))),\n active_users: BigInt(Math.round(part * 0.8)),\n new_users: BigInt(Math.round(part * share(newUsers, sessions))),\n key_events: Math.round(purchases * share(part, sessions)),\n total_revenue: money(revenue * share(part, sessions)),\n currency_code: currency,\n };\n }),\n events: eventCounts.map(([name, count, users]) => ({\n id: id(name),\n ...base,\n event_name: name,\n event_count: BigInt(count),\n total_users: BigInt(users),\n event_value: name === \"purchase\" ? revenue : 0,\n key_events: name === \"purchase\" ? purchases : 0,\n })),\n locations: locations.map(([country, region, city], l) => {\n const part = sessionsByLocation[l] ?? 0;\n\n return {\n id: id(country, region, city),\n ...base,\n country,\n region,\n city,\n active_users: BigInt(Math.round(part * 0.78)),\n new_users: BigInt(Math.round(part * share(newUsers, sessions))),\n sessions: BigInt(part),\n engaged_sessions: BigInt(Math.round(part * share(engaged, sessions))),\n key_events: Math.round(purchases * share(part, sessions)),\n total_revenue: money(revenue * share(part, sessions)),\n currency_code: currency,\n };\n }),\n devices: devices.map(([category, platform, os, browser], d) => {\n const part = sessionsByDevice[d] ?? 0;\n\n return {\n id: id(category, platform, os, browser),\n ...base,\n device_category: category,\n platform,\n operating_system: os,\n browser,\n active_users: BigInt(Math.round(part * 0.78)),\n new_users: BigInt(Math.round(part * share(newUsers, sessions))),\n sessions: BigInt(part),\n engaged_sessions: BigInt(Math.round(part * share(engaged, sessions))),\n screen_page_views: BigInt(Math.round(part * share(views, sessions))),\n key_events: Math.round(purchases * share(part, sessions)),\n };\n }),\n ecommerce_items: items.map(([itemId, name, category, price], i) => {\n const bought = itemUnits[i] ?? 0;\n const added = Math.round(bought * faker.number.float({ min: 3, max: 5 }));\n\n return {\n id: id(itemId, name, \"Acme\", category),\n ...base,\n item_id: itemId,\n item_name: name,\n item_brand: \"Acme\",\n item_category: category,\n items_viewed: BigInt(Math.round(added * faker.number.float({ min: 6, max: 9 }))),\n items_added_to_cart: BigInt(added),\n items_purchased: BigInt(bought),\n item_revenue: money(bought * price),\n currency_code: currency,\n };\n }),\n };\n};\n","import { ConnectorApp, Demo, RuntimeConfig } from \"@useairfoil/connector-kit\";\nimport { Command } from \"effect/cli\";\n\nimport {\n DailyOverviewSchema,\n DeviceSchema,\n EcommerceItemSchema,\n EventSchema,\n LandingPageSchema,\n LocationSchema,\n PageSchema,\n TrafficSourceSchema,\n UserAcquisitionSchema,\n} from \"../schemas/reports\";\nimport { dayRows } from \"./reports\";\n\nexport const demo = Demo.define({\n name: \"producer-google-analytics\",\n setup: { tables: [], rows: () => ({}) },\n group: {\n tables: [\n Demo.table({ name: \"daily_overview\", rowSchema: DailyOverviewSchema, version: \"version\" }),\n Demo.table({ name: \"traffic_sources\", rowSchema: TrafficSourceSchema, version: \"version\" }),\n Demo.table({\n name: \"user_acquisition\",\n rowSchema: UserAcquisitionSchema,\n version: \"version\",\n }),\n Demo.table({ name: \"pages\", rowSchema: PageSchema, version: \"version\" }),\n Demo.table({ name: \"landing_pages\", rowSchema: LandingPageSchema, version: \"version\" }),\n Demo.table({ name: \"events\", rowSchema: EventSchema, version: \"version\" }),\n Demo.table({ name: \"locations\", rowSchema: LocationSchema, version: \"version\" }),\n Demo.table({ name: \"devices\", rowSchema: DeviceSchema, version: \"version\" }),\n Demo.table({ name: \"ecommerce_items\", rowSchema: EcommerceItemSchema, version: \"version\" }),\n ],\n rows: dayRows,\n // Two years of days, the same as the default GA_START_DATE.\n count: 730,\n },\n});\n\nexport const demoCommand = ConnectorApp.makeDemoCommand(demo).pipe(\n Command.provide(RuntimeConfig.layerHosted()),\n);\n","import {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Effect, Layer, Logger } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { GoogleAnalyticsConnector } from \"./index\";\n\nconst ConnectorLayer = GoogleAnalyticsConnector.layerConfig(\n GoogleAnalyticsConnector.GoogleAnalyticsConfigDef.config,\n);\n\nconst TelemetryLayer = Layer.mergeAll(Telemetry.layerOtlp(), Telemetry.layerMetricsConsoleDump());\n\nexport const sandboxCommand = Command.make(\"sandbox\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* GoogleAnalyticsConnector.GoogleAnalyticsConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port });\n }).pipe(\n Effect.annotateLogs({ component: \"google-analytics\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStore.layerMemory,\n Ingestor.layerConsole,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n ),\n).pipe(Command.withDescription(\"Run the connector locally and log ingested data\"));\n","import { PgClient } from \"@effect/sql-pg\";\nimport {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Config, Effect, Layer, Logger, Schema } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { GoogleAnalyticsConnector } from \"./index\";\n\nconst ConnectorLayer = GoogleAnalyticsConnector.layerConfig(\n GoogleAnalyticsConnector.GoogleAnalyticsConfigDef.config,\n);\nconst TelemetryLayer = Telemetry.layerOtlp();\nconst PostgresLayer = PgClient.layerConfig({\n url: Config.schema(\n Schema.Redacted(Schema.NonEmptyString),\n RuntimeConfig.PlatformRuntimeKey.postgresConnectionString,\n ),\n maxConnections: Config.succeed(2),\n connectTimeout: Config.succeed(\"5 seconds\"),\n applicationName: Config.succeed(\"airfoil-producer-google-analytics\"),\n});\nconst StateStoreLayer = StateStore.layerSql().pipe(Layer.provide(PostgresLayer));\n\nexport const startCommand = Command.make(\"start\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* GoogleAnalyticsConnector.GoogleAnalyticsConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port }).pipe(\n Effect.provide(Ingestor.layerWingsConfig(entrypoint)),\n );\n }).pipe(\n Effect.annotateLogs({ component: \"google-analytics\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStoreLayer,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n Effect.provide(RuntimeConfig.layerHosted()),\n ),\n).pipe(Command.withDescription(\"Run the production connector against Wings\"));\n","#!/usr/bin/env node\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { Effect, Layer } from \"effect\";\nimport { Command } from \"effect/cli\";\nimport { FetchHttpClient } from \"effect/http\";\n\nimport packageJson from \"../package.json\";\nimport { createTableCommand } from \"./create-table\";\nimport { demoCommand } from \"./demo\";\nimport { sandboxCommand } from \"./sandbox\";\nimport { startCommand } from \"./start\";\n\nconst BootstrapLayer = Layer.mergeAll(FetchHttpClient.layer, NodeServices.layer);\n\nconst program = Command.make(\"producer-google-analytics\", {}, () => Effect.void).pipe(\n Command.withSubcommands([startCommand, sandboxCommand, createTableCommand, demoCommand]),\n);\n\nconst cli = Command.run(program, { version: packageJson.version });\n\nNodeRuntime.runMain(cli.pipe(Effect.provide(BootstrapLayer), Effect.scoped));\n"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import * as Manifest from "@useairfoil/connector-kit/manifest";
2
+ //#region src/manifest.d.ts
3
+ export declare const GoogleAnalyticsConfigDef: Manifest.ConnectorConfigDef<{
4
+ readonly propertyId: Manifest.ConfigField<string>;
5
+ readonly clientEmail: Manifest.ConfigField<string>;
6
+ readonly privateKey: Manifest.ConfigField<import("effect/Redacted").Redacted<string>>;
7
+ readonly startDate: Manifest.ConfigField<import("effect/Option").Option<string>>;
8
+ readonly lookbackDays: Manifest.ConfigField<number>;
9
+ }>;
10
+ export type GoogleAnalyticsConfig = Manifest.ConfigValuesOf<typeof GoogleAnalyticsConfigDef>;
11
+ export declare const manifest: {
12
+ readonly name: "producer-google-analytics";
13
+ readonly title: "Google Analytics";
14
+ readonly config: readonly Manifest.ConfigFieldSpec[];
15
+ readonly resources: readonly [{
16
+ readonly name: "daily_overview";
17
+ readonly capabilities: readonly ["backfill", "changes"];
18
+ }, {
19
+ readonly name: "traffic_sources";
20
+ readonly capabilities: readonly ["backfill", "changes"];
21
+ }, {
22
+ readonly name: "user_acquisition";
23
+ readonly capabilities: readonly ["backfill", "changes"];
24
+ }, {
25
+ readonly name: "pages";
26
+ readonly capabilities: readonly ["backfill", "changes"];
27
+ }, {
28
+ readonly name: "landing_pages";
29
+ readonly capabilities: readonly ["backfill", "changes"];
30
+ }, {
31
+ readonly name: "events";
32
+ readonly capabilities: readonly ["backfill", "changes"];
33
+ }, {
34
+ readonly name: "locations";
35
+ readonly capabilities: readonly ["backfill", "changes"];
36
+ }, {
37
+ readonly name: "devices";
38
+ readonly capabilities: readonly ["backfill", "changes"];
39
+ }, {
40
+ readonly name: "ecommerce_items";
41
+ readonly capabilities: readonly ["backfill", "changes"];
42
+ }];
43
+ };
44
+ //#endregion
45
+ //# sourceMappingURL=manifest.d.mts.map
@@ -0,0 +1,75 @@
1
+ import * as Manifest from "@useairfoil/connector-kit/manifest";
2
+ //#region src/manifest.ts
3
+ const GoogleAnalyticsConfigDef = Manifest.defineConfig({
4
+ propertyId: Manifest.string({
5
+ runtimeKey: "GA_PROPERTY_ID",
6
+ description: "Numeric ID of the GA4 property, from Admin > Property details."
7
+ }),
8
+ clientEmail: Manifest.string({
9
+ runtimeKey: "GA_CLIENT_EMAIL",
10
+ description: "`client_email` from the service account's JSON key."
11
+ }),
12
+ privateKey: Manifest.secret({
13
+ runtimeKey: "GA_PRIVATE_KEY",
14
+ description: "`private_key` from the service account's JSON key."
15
+ }),
16
+ startDate: Manifest.optional(Manifest.string({
17
+ runtimeKey: "GA_START_DATE",
18
+ description: "First day to backfill, as YYYY-MM-DD. Defaults to 2 years back."
19
+ })),
20
+ lookbackDays: Manifest.number({
21
+ runtimeKey: "GA_LOOKBACK_DAYS",
22
+ description: "Days read again on each run, since Google keeps updating recent data.",
23
+ integer: true,
24
+ minimum: 1,
25
+ default: 14
26
+ })
27
+ });
28
+ const capabilities = ["backfill", "changes"];
29
+ const manifest = Manifest.define({
30
+ name: "producer-google-analytics",
31
+ title: "Google Analytics",
32
+ config: GoogleAnalyticsConfigDef.spec,
33
+ resources: [
34
+ {
35
+ name: "daily_overview",
36
+ capabilities
37
+ },
38
+ {
39
+ name: "traffic_sources",
40
+ capabilities
41
+ },
42
+ {
43
+ name: "user_acquisition",
44
+ capabilities
45
+ },
46
+ {
47
+ name: "pages",
48
+ capabilities
49
+ },
50
+ {
51
+ name: "landing_pages",
52
+ capabilities
53
+ },
54
+ {
55
+ name: "events",
56
+ capabilities
57
+ },
58
+ {
59
+ name: "locations",
60
+ capabilities
61
+ },
62
+ {
63
+ name: "devices",
64
+ capabilities
65
+ },
66
+ {
67
+ name: "ecommerce_items",
68
+ capabilities
69
+ }
70
+ ]
71
+ });
72
+ //#endregion
73
+ export { GoogleAnalyticsConfigDef, manifest };
74
+
75
+ //# sourceMappingURL=manifest.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.mjs","names":[],"sources":["../src/manifest.ts"],"sourcesContent":["import * as Manifest from \"@useairfoil/connector-kit/manifest\";\n\nexport const GoogleAnalyticsConfigDef = Manifest.defineConfig({\n propertyId: Manifest.string({\n runtimeKey: \"GA_PROPERTY_ID\",\n description: \"Numeric ID of the GA4 property, from Admin > Property details.\",\n }),\n clientEmail: Manifest.string({\n runtimeKey: \"GA_CLIENT_EMAIL\",\n description: \"`client_email` from the service account's JSON key.\",\n }),\n privateKey: Manifest.secret({\n runtimeKey: \"GA_PRIVATE_KEY\",\n description: \"`private_key` from the service account's JSON key.\",\n }),\n startDate: Manifest.optional(\n Manifest.string({\n runtimeKey: \"GA_START_DATE\",\n description: \"First day to backfill, as YYYY-MM-DD. Defaults to 2 years back.\",\n }),\n ),\n lookbackDays: Manifest.number({\n runtimeKey: \"GA_LOOKBACK_DAYS\",\n description: \"Days read again on each run, since Google keeps updating recent data.\",\n integer: true,\n minimum: 1,\n default: 14,\n }),\n});\n\nexport type GoogleAnalyticsConfig = Manifest.ConfigValuesOf<typeof GoogleAnalyticsConfigDef>;\n\nconst capabilities = [\"backfill\", \"changes\"] as const;\n\nexport const manifest = Manifest.define({\n name: \"producer-google-analytics\",\n title: \"Google Analytics\",\n config: GoogleAnalyticsConfigDef.spec,\n resources: [\n { name: \"daily_overview\", capabilities },\n { name: \"traffic_sources\", capabilities },\n { name: \"user_acquisition\", capabilities },\n { name: \"pages\", capabilities },\n { name: \"landing_pages\", capabilities },\n { name: \"events\", capabilities },\n { name: \"locations\", capabilities },\n { name: \"devices\", capabilities },\n { name: \"ecommerce_items\", capabilities },\n ],\n});\n"],"mappings":";;AAEA,MAAa,2BAA2B,SAAS,aAAa;CAC5D,YAAY,SAAS,OAAO;EAC1B,YAAY;EACZ,aAAa;CACf,CAAC;CACD,aAAa,SAAS,OAAO;EAC3B,YAAY;EACZ,aAAa;CACf,CAAC;CACD,YAAY,SAAS,OAAO;EAC1B,YAAY;EACZ,aAAa;CACf,CAAC;CACD,WAAW,SAAS,SAClB,SAAS,OAAO;EACd,YAAY;EACZ,aAAa;CACf,CAAC,CACH;CACA,cAAc,SAAS,OAAO;EAC5B,YAAY;EACZ,aAAa;EACb,SAAS;EACT,SAAS;EACT,SAAS;CACX,CAAC;AACH,CAAC;AAID,MAAM,eAAe,CAAC,YAAY,SAAS;AAE3C,MAAa,WAAW,SAAS,OAAO;CACtC,MAAM;CACN,OAAO;CACP,QAAQ,yBAAyB;CACjC,WAAW;EACT;GAAE,MAAM;GAAkB;EAAa;EACvC;GAAE,MAAM;GAAmB;EAAa;EACxC;GAAE,MAAM;GAAoB;EAAa;EACzC;GAAE,MAAM;GAAS;EAAa;EAC9B;GAAE,MAAM;GAAiB;EAAa;EACtC;GAAE,MAAM;GAAU;EAAa;EAC/B;GAAE,MAAM;GAAa;EAAa;EAClC;GAAE,MAAM;GAAW;EAAa;EAChC;GAAE,MAAM;GAAmB;EAAa;CAC1C;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll as t };