@aranova/tracking-react 0.27.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.mts +4 -3
- package/dist/client.d.ts +4 -3
- package/dist/client.js +195 -277
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +157 -249
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.mts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +271 -390
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +260 -390
- package/dist/index.mjs.map +1 -1
- package/dist/ingest-typed-BdKmlouW.d.ts +791 -0
- package/dist/ingest-typed-Bo7WPmpU.d.mts +791 -0
- package/dist/{phone-utils-BVzSNBf1.d.mts → phone-utils-CubQif9Z.d.mts} +18 -78
- package/dist/{phone-utils-BVzSNBf1.d.ts → phone-utils-CubQif9Z.d.ts} +18 -78
- package/dist/phone.d.mts +2 -2
- package/dist/phone.d.ts +2 -2
- package/dist/phone.js +0 -464
- package/dist/phone.js.map +1 -1
- package/dist/phone.mjs +0 -464
- package/dist/phone.mjs.map +1 -1
- package/dist/{sales-D4TB9gRS.d.ts → sales-Bhh9mLBA.d.ts} +89 -328
- package/dist/{sales-cYjB07y8.d.mts → sales-C7Xjsq-a.d.mts} +89 -328
- package/dist/sales.d.mts +2 -2
- package/dist/sales.d.ts +2 -2
- package/dist/sales.js +265 -127
- package/dist/sales.js.map +1 -1
- package/dist/sales.mjs +254 -127
- package/dist/sales.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/ingest-typed-BxLFlZ7N.d.mts +0 -1371
- package/dist/ingest-typed-ByQVRMvP.d.ts +0 -1371
package/dist/client.mjs
CHANGED
|
@@ -595,10 +595,10 @@ function readStoredRecord() {
|
|
|
595
595
|
return null;
|
|
596
596
|
}
|
|
597
597
|
}
|
|
598
|
-
function writeRecord(
|
|
599
|
-
memoryRecord =
|
|
598
|
+
function writeRecord(record3) {
|
|
599
|
+
memoryRecord = record3;
|
|
600
600
|
try {
|
|
601
|
-
window.localStorage.setItem(LANDING_STORAGE_KEY, JSON.stringify(
|
|
601
|
+
window.localStorage.setItem(LANDING_STORAGE_KEY, JSON.stringify(record3));
|
|
602
602
|
} catch {
|
|
603
603
|
}
|
|
604
604
|
}
|
|
@@ -620,9 +620,9 @@ function getOrCaptureLandingParams(sessionId, url) {
|
|
|
620
620
|
if (memoryRecord && memoryRecord.session_id === sessionId) {
|
|
621
621
|
return memoryRecord.params;
|
|
622
622
|
}
|
|
623
|
-
const
|
|
624
|
-
writeRecord(
|
|
625
|
-
return
|
|
623
|
+
const record3 = { session_id: sessionId, params: captureFromUrl(url) };
|
|
624
|
+
writeRecord(record3);
|
|
625
|
+
return record3.params;
|
|
626
626
|
}
|
|
627
627
|
function buildLandingPayloadFields(sessionId, override) {
|
|
628
628
|
const params = override ?? (typeof window === "undefined" ? null : getOrCaptureLandingParams(sessionId));
|
|
@@ -1454,25 +1454,32 @@ function getOrRotateSessionId(now = Date.now()) {
|
|
|
1454
1454
|
return { id: fresh.id, isNew: true };
|
|
1455
1455
|
}
|
|
1456
1456
|
|
|
1457
|
+
// ../tracking-core/src/page-view.ts
|
|
1458
|
+
import { parse } from "zod/mini";
|
|
1459
|
+
|
|
1457
1460
|
// ../tracking-core/src/events/page-view.ts
|
|
1458
|
-
import
|
|
1459
|
-
var pageViewMetadataSchema = z.
|
|
1460
|
-
page: z.
|
|
1461
|
-
title: z.
|
|
1461
|
+
import * as z from "zod/mini";
|
|
1462
|
+
var pageViewMetadataSchema = z.strictObject({
|
|
1463
|
+
page: z.strictObject({
|
|
1464
|
+
title: z.nullable(z.string()),
|
|
1462
1465
|
path: z.string(),
|
|
1463
1466
|
search: z.string(),
|
|
1464
1467
|
hash: z.string()
|
|
1465
|
-
})
|
|
1466
|
-
referrer: z.
|
|
1467
|
-
//
|
|
1468
|
+
}),
|
|
1469
|
+
referrer: z.nullable(z.string()),
|
|
1470
|
+
// Optional + nullable — absent (undefined) OR explicit null OR a
|
|
1468
1471
|
// real viewport object. Mirrors Pydantic's `_Viewport | None = None`
|
|
1469
1472
|
// on the backend side so the drift test stays clean.
|
|
1470
|
-
viewport: z.
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1473
|
+
viewport: z.optional(
|
|
1474
|
+
z.nullable(
|
|
1475
|
+
z.strictObject({
|
|
1476
|
+
w: z.number(),
|
|
1477
|
+
h: z.number()
|
|
1478
|
+
})
|
|
1479
|
+
)
|
|
1480
|
+
)
|
|
1481
|
+
});
|
|
1482
|
+
var pageViewConfigSchema = z.strictObject({});
|
|
1476
1483
|
|
|
1477
1484
|
// ../tracking-core/src/page-view.ts
|
|
1478
1485
|
var LAST_FIRED_URL_STORAGE_KEY = "aranova_tracking_last_fired_url";
|
|
@@ -1508,7 +1515,7 @@ function setLastFiredUrl(url) {
|
|
|
1508
1515
|
}
|
|
1509
1516
|
function buildPageViewMetadata(referrerOverride) {
|
|
1510
1517
|
if (typeof window === "undefined" || typeof document === "undefined") return null;
|
|
1511
|
-
return
|
|
1518
|
+
return parse(pageViewMetadataSchema, {
|
|
1512
1519
|
page: {
|
|
1513
1520
|
title: document.title || null,
|
|
1514
1521
|
path: window.location.pathname,
|
|
@@ -2004,186 +2011,198 @@ function createTrackingClient(config) {
|
|
|
2004
2011
|
};
|
|
2005
2012
|
}
|
|
2006
2013
|
|
|
2014
|
+
// ../tracking-core/src/ingest-typed.ts
|
|
2015
|
+
import { parse as parse2 } from "zod/mini";
|
|
2016
|
+
|
|
2007
2017
|
// ../tracking-core/src/events/cta-click.ts
|
|
2008
|
-
import
|
|
2009
|
-
var ctaClickMetadataSchema = z2.
|
|
2018
|
+
import * as z2 from "zod/mini";
|
|
2019
|
+
var ctaClickMetadataSchema = z2.strictObject({
|
|
2010
2020
|
cta_name: z2.string(),
|
|
2011
|
-
page: z2.
|
|
2021
|
+
page: z2.strictObject({
|
|
2012
2022
|
path: z2.string()
|
|
2013
|
-
})
|
|
2014
|
-
section: z2.
|
|
2015
|
-
destination_url: z2.
|
|
2023
|
+
}),
|
|
2024
|
+
section: z2.optional(z2.nullable(z2.string())),
|
|
2025
|
+
destination_url: z2.optional(z2.nullable(z2.string())),
|
|
2016
2026
|
// Set by auto-capture (and available to manual callers): the link target
|
|
2017
2027
|
// and a short element descriptor (tag#id) for tying clicks to specific UI.
|
|
2018
|
-
href: z2.
|
|
2019
|
-
element: z2.
|
|
2020
|
-
})
|
|
2021
|
-
var ctaClickConfigSchema = z2.
|
|
2022
|
-
autoCapture: z2.
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
})
|
|
2028
|
+
href: z2.optional(z2.nullable(z2.string())),
|
|
2029
|
+
element: z2.optional(z2.nullable(z2.string()))
|
|
2030
|
+
});
|
|
2031
|
+
var ctaClickConfigSchema = z2.strictObject({
|
|
2032
|
+
autoCapture: z2.optional(
|
|
2033
|
+
z2.strictObject({
|
|
2034
|
+
selector: z2.optional(z2.string())
|
|
2035
|
+
})
|
|
2036
|
+
)
|
|
2037
|
+
});
|
|
2026
2038
|
|
|
2027
2039
|
// ../tracking-core/src/events/sdk-heartbeat.ts
|
|
2028
|
-
import
|
|
2029
|
-
var sdkHeartbeatTriggersSchema = z3.
|
|
2040
|
+
import * as z3 from "zod/mini";
|
|
2041
|
+
var sdkHeartbeatTriggersSchema = z3.strictObject({
|
|
2030
2042
|
automatic: z3.array(z3.string()),
|
|
2031
2043
|
manual: z3.array(z3.string())
|
|
2032
|
-
})
|
|
2033
|
-
var sdkHeartbeatMetadataSchema = z3.
|
|
2044
|
+
});
|
|
2045
|
+
var sdkHeartbeatMetadataSchema = z3.strictObject({
|
|
2034
2046
|
sdk_version: z3.string(),
|
|
2035
|
-
package_name: z3.
|
|
2047
|
+
package_name: z3.nullable(z3.string()),
|
|
2036
2048
|
surface: z3.enum(["next", "react", "script"]),
|
|
2037
2049
|
triggers: sdkHeartbeatTriggersSchema,
|
|
2038
|
-
trigger_config: z3.record(z3.string(), z3.record(z3.string(), z3.unknown()))
|
|
2039
|
-
configured_gtag_ids: z3.record(z3.string(), z3.string())
|
|
2050
|
+
trigger_config: z3.optional(z3.nullable(z3.record(z3.string(), z3.record(z3.string(), z3.unknown())))),
|
|
2051
|
+
configured_gtag_ids: z3.optional(z3.nullable(z3.record(z3.string(), z3.string()))),
|
|
2040
2052
|
// Site whose config object the SDK resolves; null on a legacy business ref.
|
|
2041
|
-
config_site_id: z3.
|
|
2042
|
-
})
|
|
2043
|
-
var sdkHeartbeatConfigSchema = z3.
|
|
2053
|
+
config_site_id: z3.optional(z3.nullable(z3.uuid()))
|
|
2054
|
+
});
|
|
2055
|
+
var sdkHeartbeatConfigSchema = z3.strictObject({});
|
|
2044
2056
|
|
|
2045
2057
|
// ../tracking-core/src/events/form-start.ts
|
|
2046
|
-
import
|
|
2047
|
-
var formStartMetadataSchema = z4.
|
|
2048
|
-
form: z4.
|
|
2058
|
+
import * as z4 from "zod/mini";
|
|
2059
|
+
var formStartMetadataSchema = z4.strictObject({
|
|
2060
|
+
form: z4.strictObject({
|
|
2049
2061
|
id: z4.string(),
|
|
2050
|
-
action: z4.
|
|
2051
|
-
})
|
|
2052
|
-
page: z4.
|
|
2062
|
+
action: z4.nullable(z4.string())
|
|
2063
|
+
}),
|
|
2064
|
+
page: z4.strictObject({
|
|
2053
2065
|
path: z4.string()
|
|
2054
|
-
})
|
|
2055
|
-
})
|
|
2056
|
-
var formStartConfigSchema = z4.
|
|
2057
|
-
selector: z4.
|
|
2058
|
-
})
|
|
2066
|
+
})
|
|
2067
|
+
});
|
|
2068
|
+
var formStartConfigSchema = z4.strictObject({
|
|
2069
|
+
selector: z4.optional(z4.string())
|
|
2070
|
+
});
|
|
2059
2071
|
|
|
2060
2072
|
// ../tracking-core/src/events/form-submit.ts
|
|
2061
|
-
import
|
|
2073
|
+
import * as z5 from "zod/mini";
|
|
2062
2074
|
var jsonValueSchema = z5.lazy(
|
|
2063
2075
|
() => z5.union([
|
|
2064
2076
|
z5.string(),
|
|
2065
|
-
z5.number()
|
|
2077
|
+
z5.number(),
|
|
2066
2078
|
z5.boolean(),
|
|
2067
2079
|
z5.null(),
|
|
2068
2080
|
z5.array(jsonValueSchema),
|
|
2069
|
-
z5.record(jsonValueSchema)
|
|
2081
|
+
z5.record(z5.string(), jsonValueSchema)
|
|
2070
2082
|
])
|
|
2071
|
-
);
|
|
2072
|
-
var formSubmitMetadataSchema = z5.
|
|
2073
|
-
form: z5.
|
|
2083
|
+
).register(z5.globalRegistry, { id: "JsonSerializableValue" });
|
|
2084
|
+
var formSubmitMetadataSchema = z5.strictObject({
|
|
2085
|
+
form: z5.strictObject({
|
|
2074
2086
|
id: z5.string(),
|
|
2075
|
-
action: z5.
|
|
2076
|
-
fields: z5.
|
|
2077
|
-
z5.
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2087
|
+
action: z5.nullable(z5.string()),
|
|
2088
|
+
fields: z5.optional(
|
|
2089
|
+
z5.array(
|
|
2090
|
+
z5.strictObject({
|
|
2091
|
+
name: z5.string(),
|
|
2092
|
+
type: z5.string(),
|
|
2093
|
+
label: z5.nullable(z5.string()),
|
|
2094
|
+
value: jsonValueSchema
|
|
2095
|
+
})
|
|
2096
|
+
)
|
|
2097
|
+
)
|
|
2098
|
+
}),
|
|
2099
|
+
page: z5.strictObject({
|
|
2086
2100
|
path: z5.string()
|
|
2087
|
-
})
|
|
2088
|
-
})
|
|
2089
|
-
var formSubmitConfigSchema = z5.
|
|
2101
|
+
})
|
|
2102
|
+
});
|
|
2103
|
+
var formSubmitConfigSchema = z5.strictObject({});
|
|
2090
2104
|
|
|
2091
2105
|
// ../tracking-core/src/events/multi-page-session.ts
|
|
2092
|
-
import
|
|
2093
|
-
var multiPageSessionMetadataSchema = z6.
|
|
2094
|
-
page_count: z6.
|
|
2095
|
-
page: z6.
|
|
2106
|
+
import * as z6 from "zod/mini";
|
|
2107
|
+
var multiPageSessionMetadataSchema = z6.strictObject({
|
|
2108
|
+
page_count: z6.int().check(z6.gte(2)),
|
|
2109
|
+
page: z6.strictObject({
|
|
2096
2110
|
path: z6.string()
|
|
2097
|
-
})
|
|
2098
|
-
})
|
|
2099
|
-
var multiPageSessionConfigSchema = z6.
|
|
2100
|
-
pageThreshold: z6.
|
|
2101
|
-
})
|
|
2111
|
+
})
|
|
2112
|
+
});
|
|
2113
|
+
var multiPageSessionConfigSchema = z6.strictObject({
|
|
2114
|
+
pageThreshold: z6.int().check(z6.gte(2))
|
|
2115
|
+
});
|
|
2102
2116
|
|
|
2103
2117
|
// ../tracking-core/src/events/page-exit.ts
|
|
2104
|
-
import
|
|
2105
|
-
var pageExitMetadataSchema = z7.
|
|
2106
|
-
dwell_ms: z7.
|
|
2118
|
+
import * as z7 from "zod/mini";
|
|
2119
|
+
var pageExitMetadataSchema = z7.strictObject({
|
|
2120
|
+
dwell_ms: z7.int().check(z7.gte(0)),
|
|
2107
2121
|
// null = left without any scroll signal; floor is 0 so a valid 0% is never
|
|
2108
2122
|
// rejected (a single bad field 422s the whole keepalive beacon batch).
|
|
2109
|
-
max_scroll_percent: z7.
|
|
2123
|
+
max_scroll_percent: z7.nullable(z7.int().check(z7.gte(0), z7.lte(100))),
|
|
2110
2124
|
// The gating baseline: the fraction of the page visible at load with
|
|
2111
2125
|
// zero scrolling — or, for pages that grew after the post-paint snapshot
|
|
2112
2126
|
// (skeleton/streaming renders), the first-scroll position that
|
|
2113
2127
|
// established it. null = page had no scrollable range, or the segment
|
|
2114
|
-
// ended before the snapshot.
|
|
2128
|
+
// ended before the snapshot. Optionality is load-bearing: SDK builds
|
|
2115
2129
|
// predating this field keep POSTing page_exit without the key —
|
|
2116
2130
|
// requiring it would 422 whole keepalive beacon batches.
|
|
2117
|
-
scroll_baseline_percent: z7.
|
|
2118
|
-
page: z7.
|
|
2131
|
+
scroll_baseline_percent: z7.optional(z7.nullable(z7.int().check(z7.gte(0), z7.lte(100)))),
|
|
2132
|
+
page: z7.strictObject({
|
|
2119
2133
|
path: z7.string()
|
|
2120
|
-
})
|
|
2121
|
-
})
|
|
2122
|
-
var pageExitConfigSchema = z7.
|
|
2134
|
+
})
|
|
2135
|
+
});
|
|
2136
|
+
var pageExitConfigSchema = z7.strictObject({});
|
|
2123
2137
|
|
|
2124
2138
|
// ../tracking-core/src/events/phone-click.ts
|
|
2125
|
-
import
|
|
2126
|
-
var phoneClickMetadataSchema = z8.
|
|
2139
|
+
import * as z8 from "zod/mini";
|
|
2140
|
+
var phoneClickMetadataSchema = z8.strictObject({
|
|
2127
2141
|
phone_number: z8.string(),
|
|
2128
|
-
page: z8.
|
|
2142
|
+
page: z8.strictObject({
|
|
2129
2143
|
path: z8.string()
|
|
2130
|
-
})
|
|
2131
|
-
section: z8.
|
|
2132
|
-
})
|
|
2133
|
-
var phoneClickConfigSchema = z8.
|
|
2134
|
-
autoCapture: z8.
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
})
|
|
2144
|
+
}),
|
|
2145
|
+
section: z8.optional(z8.nullable(z8.string()))
|
|
2146
|
+
});
|
|
2147
|
+
var phoneClickConfigSchema = z8.strictObject({
|
|
2148
|
+
autoCapture: z8.optional(
|
|
2149
|
+
z8.strictObject({
|
|
2150
|
+
selector: z8.optional(z8.string())
|
|
2151
|
+
})
|
|
2152
|
+
)
|
|
2153
|
+
});
|
|
2138
2154
|
|
|
2139
2155
|
// ../tracking-core/src/events/scroll-depth.ts
|
|
2140
|
-
import
|
|
2141
|
-
var scrollDepthMetadataSchema = z9.
|
|
2142
|
-
depth_percent: z9.
|
|
2143
|
-
page: z9.
|
|
2156
|
+
import * as z9 from "zod/mini";
|
|
2157
|
+
var scrollDepthMetadataSchema = z9.strictObject({
|
|
2158
|
+
depth_percent: z9.int().check(z9.gte(1), z9.lte(100)),
|
|
2159
|
+
page: z9.strictObject({
|
|
2144
2160
|
path: z9.string()
|
|
2145
|
-
})
|
|
2146
|
-
})
|
|
2147
|
-
var scrollDepthConfigSchema = z9.
|
|
2148
|
-
thresholds: z9.array(z9.
|
|
2149
|
-
})
|
|
2161
|
+
})
|
|
2162
|
+
});
|
|
2163
|
+
var scrollDepthConfigSchema = z9.strictObject({
|
|
2164
|
+
thresholds: z9.array(z9.int().check(z9.gte(1), z9.lte(100))).check(z9.minLength(1))
|
|
2165
|
+
});
|
|
2150
2166
|
|
|
2151
2167
|
// ../tracking-core/src/events/specific-page-visit.ts
|
|
2152
|
-
import
|
|
2168
|
+
import * as z10 from "zod/mini";
|
|
2153
2169
|
var PAGE_IDENTITY_MAX_LENGTH = 64;
|
|
2154
2170
|
var PAGE_IDENTITY_PATTERN = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/;
|
|
2155
|
-
var pageIdentitySchema = z10.string().
|
|
2156
|
-
|
|
2157
|
-
|
|
2171
|
+
var pageIdentitySchema = z10.string().check(
|
|
2172
|
+
z10.maxLength(PAGE_IDENTITY_MAX_LENGTH),
|
|
2173
|
+
z10.regex(PAGE_IDENTITY_PATTERN, {
|
|
2174
|
+
message: "page identity must be lowercase snake_case, start with a letter, and contain at most 64 characters"
|
|
2175
|
+
})
|
|
2176
|
+
);
|
|
2158
2177
|
var specificPageNameSchema = pageIdentitySchema;
|
|
2159
|
-
var specificPageVisitMetadataSchema = z10.
|
|
2178
|
+
var specificPageVisitMetadataSchema = z10.strictObject({
|
|
2160
2179
|
page_name: specificPageNameSchema,
|
|
2161
|
-
page: z10.
|
|
2180
|
+
page: z10.strictObject({
|
|
2162
2181
|
path: z10.string()
|
|
2163
|
-
})
|
|
2164
|
-
})
|
|
2165
|
-
var specificPageVisitConfigSchema = z10.
|
|
2182
|
+
})
|
|
2183
|
+
});
|
|
2184
|
+
var specificPageVisitConfigSchema = z10.strictObject({
|
|
2166
2185
|
pages: z10.array(
|
|
2167
|
-
z10.
|
|
2186
|
+
z10.strictObject({
|
|
2168
2187
|
name: specificPageNameSchema,
|
|
2169
2188
|
pathPattern: z10.custom((value) => value instanceof RegExp, {
|
|
2170
2189
|
message: "pathPattern must be a RegExp"
|
|
2171
2190
|
})
|
|
2172
|
-
})
|
|
2173
|
-
).
|
|
2174
|
-
})
|
|
2191
|
+
})
|
|
2192
|
+
).check(z10.minLength(1))
|
|
2193
|
+
});
|
|
2175
2194
|
|
|
2176
2195
|
// ../tracking-core/src/events/time-on-site.ts
|
|
2177
|
-
import
|
|
2178
|
-
var timeOnSiteMetadataSchema = z11.
|
|
2179
|
-
duration_ms: z11.
|
|
2180
|
-
page: z11.
|
|
2196
|
+
import * as z11 from "zod/mini";
|
|
2197
|
+
var timeOnSiteMetadataSchema = z11.strictObject({
|
|
2198
|
+
duration_ms: z11.int().check(z11.nonnegative()),
|
|
2199
|
+
page: z11.strictObject({
|
|
2181
2200
|
path: z11.string()
|
|
2182
|
-
})
|
|
2183
|
-
})
|
|
2184
|
-
var timeOnSiteConfigSchema = z11.
|
|
2185
|
-
thresholdSeconds: z11.
|
|
2186
|
-
})
|
|
2201
|
+
})
|
|
2202
|
+
});
|
|
2203
|
+
var timeOnSiteConfigSchema = z11.strictObject({
|
|
2204
|
+
thresholdSeconds: z11.int().check(z11.positive())
|
|
2205
|
+
});
|
|
2187
2206
|
|
|
2188
2207
|
// ../tracking-core/src/events/semantics.ts
|
|
2189
2208
|
var EVENT_SEMANTICS = {
|
|
@@ -2342,7 +2361,7 @@ function createTypedClient(raw, registry, options = {}) {
|
|
|
2342
2361
|
trackEvent(eventType, metadata, opts) {
|
|
2343
2362
|
if (debug) {
|
|
2344
2363
|
const def = getEventDefinition(eventType);
|
|
2345
|
-
def.metadataSchema
|
|
2364
|
+
parse2(def.metadataSchema, metadata);
|
|
2346
2365
|
}
|
|
2347
2366
|
raw.trackEvent({
|
|
2348
2367
|
eventType,
|
|
@@ -2966,117 +2985,6 @@ function attachPhoneClickCapture(client, config) {
|
|
|
2966
2985
|
};
|
|
2967
2986
|
}
|
|
2968
2987
|
|
|
2969
|
-
// ../tracking-core/src/resources/sales/schema.ts
|
|
2970
|
-
import { z as z12 } from "zod";
|
|
2971
|
-
var SUPPORTED_CURRENCIES = ["USD", "CAD"];
|
|
2972
|
-
var TRACKING_ENVIRONMENTS = ["production", "development"];
|
|
2973
|
-
var currencySchema = z12.enum(SUPPORTED_CURRENCIES);
|
|
2974
|
-
var centsSchema = z12.number().int().nonnegative();
|
|
2975
|
-
var quantitySchema = z12.string().regex(/^\d+(\.\d{1,3})?$/);
|
|
2976
|
-
var metadataSchema = z12.record(z12.unknown());
|
|
2977
|
-
var saleItemSchema = z12.object({
|
|
2978
|
-
external_item_id: z12.string().nullable().optional(),
|
|
2979
|
-
name: z12.string().nullable().optional(),
|
|
2980
|
-
category: z12.string().nullable().optional(),
|
|
2981
|
-
quantity: quantitySchema,
|
|
2982
|
-
unit_price_cents: centsSchema,
|
|
2983
|
-
// Non-negativity validated on the wire — same contract as the other cents
|
|
2984
|
-
// fields — and backstopped by the DB CHECK.
|
|
2985
|
-
unit_cost_cents: centsSchema.nullable().optional()
|
|
2986
|
-
}).strict();
|
|
2987
|
-
var saleServiceSchema = z12.object({
|
|
2988
|
-
service: z12.string(),
|
|
2989
|
-
amount_cents: centsSchema
|
|
2990
|
-
}).strict();
|
|
2991
|
-
var customerNameSchema = z12.string().max(200);
|
|
2992
|
-
var customerPhoneSchema = z12.string().max(64);
|
|
2993
|
-
var customerEmailSchema = z12.string().max(320).email();
|
|
2994
|
-
function refineServiceXor(val, ctx, { requireAmount }) {
|
|
2995
|
-
if (val.services != null) {
|
|
2996
|
-
if (val.service != null) {
|
|
2997
|
-
ctx.addIssue({
|
|
2998
|
-
code: z12.ZodIssueCode.custom,
|
|
2999
|
-
message: "pass either `service` or `services`, not both",
|
|
3000
|
-
path: ["services"]
|
|
3001
|
-
});
|
|
3002
|
-
}
|
|
3003
|
-
if (val.services.length === 0) {
|
|
3004
|
-
ctx.addIssue({
|
|
3005
|
-
code: z12.ZodIssueCode.custom,
|
|
3006
|
-
message: "`services` must not be empty",
|
|
3007
|
-
path: ["services"]
|
|
3008
|
-
});
|
|
3009
|
-
}
|
|
3010
|
-
const keys = val.services.map((s) => s.service);
|
|
3011
|
-
if (new Set(keys).size !== keys.length) {
|
|
3012
|
-
ctx.addIssue({
|
|
3013
|
-
code: z12.ZodIssueCode.custom,
|
|
3014
|
-
message: "`services` must not list the same service more than once",
|
|
3015
|
-
path: ["services"]
|
|
3016
|
-
});
|
|
3017
|
-
}
|
|
3018
|
-
if (val.amount_total_cents != null) {
|
|
3019
|
-
const sum = val.services.reduce((acc, s) => acc + s.amount_cents, 0);
|
|
3020
|
-
if (val.amount_total_cents !== sum) {
|
|
3021
|
-
ctx.addIssue({
|
|
3022
|
-
code: z12.ZodIssueCode.custom,
|
|
3023
|
-
message: "amount_total_cents must equal the sum of the services amounts (omit it to derive it automatically)",
|
|
3024
|
-
path: ["amount_total_cents"]
|
|
3025
|
-
});
|
|
3026
|
-
}
|
|
3027
|
-
}
|
|
3028
|
-
} else if (requireAmount && val.amount_total_cents == null) {
|
|
3029
|
-
ctx.addIssue({
|
|
3030
|
-
code: z12.ZodIssueCode.custom,
|
|
3031
|
-
message: "amount_total_cents is required unless `services` is provided",
|
|
3032
|
-
path: ["amount_total_cents"]
|
|
3033
|
-
});
|
|
3034
|
-
}
|
|
3035
|
-
}
|
|
3036
|
-
var saleCreateSchema = z12.object({
|
|
3037
|
-
external_id: z12.string().nullable().optional(),
|
|
3038
|
-
description: z12.string().nullable().optional(),
|
|
3039
|
-
service: z12.string().nullable().optional(),
|
|
3040
|
-
services: z12.array(saleServiceSchema).nullable().optional(),
|
|
3041
|
-
currency: currencySchema,
|
|
3042
|
-
// Optional only because the plural `services` form derives it from the sum
|
|
3043
|
-
// (see refineServiceXor); the singular/serviceless path still requires it.
|
|
3044
|
-
amount_total_cents: centsSchema.nullable().optional(),
|
|
3045
|
-
occurred_at: z12.string().datetime(),
|
|
3046
|
-
environment: z12.enum(TRACKING_ENVIRONMENTS).default("production"),
|
|
3047
|
-
items: z12.array(saleItemSchema).default([]),
|
|
3048
|
-
metadata: metadataSchema.nullable().optional(),
|
|
3049
|
-
customer_name: customerNameSchema.nullable().optional(),
|
|
3050
|
-
customer_phone: customerPhoneSchema.nullable().optional(),
|
|
3051
|
-
customer_email: customerEmailSchema.nullable().optional(),
|
|
3052
|
-
// CASL consent attestation: the customer agreed to receive SMS. Recorded
|
|
3053
|
-
// with a timestamp server-side; every SMS send path gates on it.
|
|
3054
|
-
//
|
|
3055
|
-
// Tri-state: omit it (or send null) to let the server apply the business's
|
|
3056
|
-
// configured default-opt-in policy, honouring a returning customer's
|
|
3057
|
-
// remembered preference. Send an explicit boolean to assert consent state
|
|
3058
|
-
// yourself — `false` records a deliberate opt-out.
|
|
3059
|
-
sms_consent: z12.boolean().nullable().optional()
|
|
3060
|
-
}).strict().superRefine((val, ctx) => refineServiceXor(val, ctx, { requireAmount: true }));
|
|
3061
|
-
var saleUpdateSchema = z12.object({
|
|
3062
|
-
description: z12.string().nullable().optional(),
|
|
3063
|
-
service: z12.string().nullable().optional(),
|
|
3064
|
-
services: z12.array(saleServiceSchema).nullable().optional(),
|
|
3065
|
-
currency: currencySchema.optional(),
|
|
3066
|
-
amount_total_cents: centsSchema.optional(),
|
|
3067
|
-
occurred_at: z12.string().datetime().optional(),
|
|
3068
|
-
items: z12.array(saleItemSchema).optional(),
|
|
3069
|
-
metadata: metadataSchema.nullable().optional(),
|
|
3070
|
-
customer_name: customerNameSchema.nullable().optional(),
|
|
3071
|
-
// Re-attest when changing a filler-looking name; the server clears the
|
|
3072
|
-
// prior attestation whenever `customer_name` changes.
|
|
3073
|
-
customer_name_placeholder_confirmed: z12.boolean().optional(),
|
|
3074
|
-
customer_phone: customerPhoneSchema.nullable().optional(),
|
|
3075
|
-
customer_email: customerEmailSchema.nullable().optional(),
|
|
3076
|
-
// NOT NULL server-side: omit to leave unchanged (explicit null is rejected).
|
|
3077
|
-
sms_consent: z12.boolean().optional()
|
|
3078
|
-
}).strict().superRefine((val, ctx) => refineServiceXor(val, ctx, { requireAmount: false }));
|
|
3079
|
-
|
|
3080
2988
|
// src/hooks.ts
|
|
3081
2989
|
function useGclid() {
|
|
3082
2990
|
const [gclid, setGclid] = useState(null);
|
|
@@ -3408,7 +3316,7 @@ function GoogleAdsTracking(props) {
|
|
|
3408
3316
|
import { createContext as createContext2, useContext as useContext2, useEffect as useEffect5, useMemo as useMemo4 } from "react";
|
|
3409
3317
|
|
|
3410
3318
|
// package.json
|
|
3411
|
-
var version = "0.
|
|
3319
|
+
var version = "1.0.0";
|
|
3412
3320
|
|
|
3413
3321
|
// ../tracking-core/src/phone-react.tsx
|
|
3414
3322
|
import {
|