@memberjunction/connector-ga4 0.2.0 → 0.2.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.
package/dist/GA4Rows.d.ts CHANGED
@@ -13,6 +13,12 @@ import type { GA4Row } from './GA4Report.js';
13
13
  export declare const MAX_EXTERNAL_ID_LENGTH = 700;
14
14
  /** GA4's sentinel for rows collapsed together once a dimension exceeds its cardinality limit. */
15
15
  export declare const OTHER_ROW_SENTINEL = "(other)";
16
+ /**
17
+ * GA4's own literal for a dimension that has no value on a row. Used to fill empty primary-key
18
+ * components — see `projectRow`. This is the vendor's spelling, not ours, so a consumer joining
19
+ * these rows to anything else in GA4 sees the same token they would in the GA4 UI.
20
+ */
21
+ export declare const GA4_UNSET_DIMENSION = "(not set)";
16
22
  /**
17
23
  * Build the `ExternalID` from the declared key values.
18
24
  *
package/dist/GA4Rows.js CHANGED
@@ -18,6 +18,12 @@ import { createHash } from 'node:crypto';
18
18
  export const MAX_EXTERNAL_ID_LENGTH = 700;
19
19
  /** GA4's sentinel for rows collapsed together once a dimension exceeds its cardinality limit. */
20
20
  export const OTHER_ROW_SENTINEL = '(other)';
21
+ /**
22
+ * GA4's own literal for a dimension that has no value on a row. Used to fill empty primary-key
23
+ * components — see `projectRow`. This is the vendor's spelling, not ours, so a consumer joining
24
+ * these rows to anything else in GA4 sees the same token they would in the GA4 UI.
25
+ */
26
+ export const GA4_UNSET_DIMENSION = '(not set)';
21
27
  /**
22
28
  * Build the `ExternalID` from the declared key values.
23
29
  *
@@ -104,6 +110,18 @@ export function projectRow(obj, row, propertyId) {
104
110
  fields[obj.Metrics[i]] = parseMetric(valueAt(row.metricValues, i));
105
111
  }
106
112
  fields.propertyId = propertyId;
113
+ // A primary-key component must never be empty. GA4 reports untagged traffic with an empty
114
+ // `sessionCampaignName` / `sessionMedium` (direct visits, email-signature links, anything with
115
+ // no UTM tagging), and an empty component does not survive the write: MJ's generated
116
+ // `spCreate` inserts the row and then re-selects it by primary key, an empty string is stored
117
+ // as NULL for a nullable column, and `= NULL` matches nothing — so the create comes back as
118
+ // "no rows returned from SQL" and the row is dropped. GA4's own convention for a dimension
119
+ // with no value is the literal `(not set)`, so use that rather than inventing a sentinel.
120
+ for (const f of obj.Fields) {
121
+ if (f.IsPrimaryKey && f.Name !== 'date' && fields[f.Name] === '') {
122
+ fields[f.Name] = GA4_UNSET_DIMENSION;
123
+ }
124
+ }
107
125
  const keyValues = obj.Fields.filter((f) => f.IsPrimaryKey).map((f) => String(fields[f.Name] ?? ''));
108
126
  return {
109
127
  Record: {
@@ -1 +1 @@
1
- {"version":3,"file":"GA4Rows.js","sourceRoot":"","sources":["../src/GA4Rows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GA4Rows.js","sourceRoot":"","sources":["../src/GA4Rows.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/connector-ga4",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "MemberJunction Google Analytics 4 connector (Data API v1beta).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,7 +13,7 @@
13
13
  "test": "vitest run"
14
14
  },
15
15
  "author": "MemberJunction.com",
16
- "license": "ISC",
16
+ "license": "BUSL-1.1",
17
17
  "peerDependencies": {
18
18
  "@memberjunction/core": ">=5.43.0 <6.0.0",
19
19
  "@memberjunction/core-entities": ">=5.43.0 <6.0.0",