@se-studio/hubspot 6.0.2 → 6.0.4
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/CHANGELOG.md +12 -0
- package/README.md +30 -0
- package/dist/forms/client/HubspotDynamicForm.d.ts +7 -0
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +15 -4
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -1
- package/dist/forms/client/marketingParams.d.ts +28 -0
- package/dist/forms/client/marketingParams.d.ts.map +1 -0
- package/dist/forms/client/marketingParams.js +164 -0
- package/dist/forms/client/marketingParams.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/docs/llms.md +2 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 6.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 6438b49: Auto-fill empty HubSpot form hidden fields from UTM/query params and first-touch sessionStorage (exported helpers for site forks).
|
|
8
|
+
|
|
9
|
+
## 6.0.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- @se-studio/core-ui@1.14.3
|
|
14
|
+
|
|
3
15
|
## 6.0.2
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@ HubSpot tracking and API-driven form rendering for Next.js marketing sites.
|
|
|
6
6
|
|
|
7
7
|
- **`HubSpotAnalyticsAdapter`** — `AnalyticsAdapter` for HubSpot tracking code (SPA Mode B page views, custom behavioural events)
|
|
8
8
|
- **`HubspotDynamicForm`** — React renderer from HubSpot Marketing Forms API definitions
|
|
9
|
+
- **UTM / marketing hidden fields** — auto-fills empty hidden form fields from URL query params and first-touch `sessionStorage` (`utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content`, plus any query key that matches a hidden field name)
|
|
9
10
|
- **`createHubspotFormExternalRenderer`** — CMS external component factory (`externalComponentType: "Hubspot form"`)
|
|
10
11
|
- **Per-form fetch** — `GET /marketing/v3/forms/{formId}` with Next.js `unstable_cache` (no bulk form download)
|
|
11
12
|
|
|
@@ -80,6 +81,35 @@ export const HubspotFormRegistration = defineExternalComponent({
|
|
|
80
81
|
});
|
|
81
82
|
```
|
|
82
83
|
|
|
84
|
+
### Hidden UTM / campaign fields
|
|
85
|
+
|
|
86
|
+
If the HubSpot form defines **hidden** fields whose internal names match query params (e.g. `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content`), `HubspotDynamicForm` fills them on mount from:
|
|
87
|
+
|
|
88
|
+
1. HubSpot form defaults (if any)
|
|
89
|
+
2. First-touch `sessionStorage` + current URL (URL wins for keys present on the form page)
|
|
90
|
+
3. CMS `data.hiddenFields` / `data.initialValues` (**highest** — static overrides win)
|
|
91
|
+
|
|
92
|
+
First-touch is stored under `sessionStorage` key `se_studio_marketing_params` so a visitor who lands with UTMs on `/` and submits on `/contact-us/` still attributes correctly.
|
|
93
|
+
|
|
94
|
+
Sites that fork the form renderer should call the same helpers (do not reimplement):
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import {
|
|
98
|
+
applyMarketingParamsToHiddenFields,
|
|
99
|
+
buildDefaultValues,
|
|
100
|
+
captureMarketingParams,
|
|
101
|
+
} from '@se-studio/hubspot';
|
|
102
|
+
|
|
103
|
+
// Optional: call once in a root client provider so multi-page capture runs before the form mounts
|
|
104
|
+
captureMarketingParams();
|
|
105
|
+
|
|
106
|
+
// When seeding form state (same order as HubspotDynamicForm):
|
|
107
|
+
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
108
|
+
// or applyMarketingParamsToHiddenFields(formDefinition, baseDefaults)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Submissions already send Forms API `context` (`hutk`, `pageUri`, `pageName`) via `useHubspotSubmit`.
|
|
112
|
+
|
|
83
113
|
## Cache revalidation
|
|
84
114
|
|
|
85
115
|
When a form changes in HubSpot, revalidate:
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormDefinition } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Seed form values from definition defaults, then URL/session marketing params
|
|
4
|
+
* for empty hidden fields, then CMS hiddenFields / initialValues (highest priority).
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildDefaultValues(formDefinition: HubspotFormDefinition, hiddenFields?: Record<string, string>, initialValues?: Record<string, string>, options?: {
|
|
7
|
+
applyMarketingParams?: boolean;
|
|
8
|
+
}): Record<string, HubspotFieldResponse>;
|
|
2
9
|
export interface HubspotDynamicFormProps {
|
|
3
10
|
portalId: string;
|
|
4
11
|
formDefinition: HubspotFormDefinition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAyBnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;CACpE;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,GACV,EAAE,uBAAuB,+BAwGzB"}
|
|
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { decode } from 'html-entities';
|
|
4
4
|
import { useCallback, useEffect, useMemo } from 'react';
|
|
5
5
|
import { collectVisibleFields } from './dependentFields';
|
|
6
|
+
import { applyMarketingParamsToHiddenFields, captureMarketingParams } from './marketingParams';
|
|
6
7
|
import { isSupportedFieldType, renderHubspotField } from './renderHubspotField';
|
|
7
8
|
import { useHubspotSubmit } from './useHubspotSubmit';
|
|
8
9
|
const DEFAULT_CLASS_NAMES = {
|
|
@@ -23,8 +24,12 @@ const DEFAULT_CLASS_NAMES = {
|
|
|
23
24
|
legalConsent: 'text-sm flex flex-col gap-2',
|
|
24
25
|
richText: 'text-sm',
|
|
25
26
|
};
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Seed form values from definition defaults, then URL/session marketing params
|
|
29
|
+
* for empty hidden fields, then CMS hiddenFields / initialValues (highest priority).
|
|
30
|
+
*/
|
|
31
|
+
export function buildDefaultValues(formDefinition, hiddenFields, initialValues, options) {
|
|
32
|
+
let defaults = {};
|
|
28
33
|
for (const group of formDefinition.fieldGroups) {
|
|
29
34
|
for (const field of group.fields) {
|
|
30
35
|
if (field.hidden && field.defaultValues?.length) {
|
|
@@ -43,17 +48,23 @@ function buildDefaultValues(formDefinition, hiddenFields, initialValues) {
|
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
}
|
|
51
|
+
// URL / session → empty hidden fields (client-only when applyMarketingParams is true)
|
|
52
|
+
if (options?.applyMarketingParams !== false) {
|
|
53
|
+
captureMarketingParams();
|
|
54
|
+
defaults = applyMarketingParamsToHiddenFields(formDefinition, defaults);
|
|
55
|
+
}
|
|
56
|
+
// CMS static values win over marketing params
|
|
46
57
|
for (const [name, value] of Object.entries(hiddenFields ?? {})) {
|
|
47
58
|
defaults[name] = {
|
|
48
59
|
name,
|
|
49
|
-
objectTypeId: '0-1',
|
|
60
|
+
objectTypeId: defaults[name]?.objectTypeId ?? '0-1',
|
|
50
61
|
value,
|
|
51
62
|
};
|
|
52
63
|
}
|
|
53
64
|
for (const [name, value] of Object.entries(initialValues ?? {})) {
|
|
54
65
|
defaults[name] = {
|
|
55
66
|
name,
|
|
56
|
-
objectTypeId: '0-1',
|
|
67
|
+
objectTypeId: defaults[name]?.objectTypeId ?? '0-1',
|
|
57
68
|
value,
|
|
58
69
|
};
|
|
59
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,mBAAmB,GAA0B;IACjD,IAAI,EAAE,qBAAqB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,oBAAoB;IACjC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,yBAAyB;IACrC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,6BAA6B;IAC3C,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
2
|
+
/** sessionStorage key for first-touch marketing params (cross-page form attribution). */
|
|
3
|
+
export declare const MARKETING_PARAMS_STORAGE_KEY = "se_studio_marketing_params";
|
|
4
|
+
/**
|
|
5
|
+
* Standard marketing query keys to capture even when no matching form field exists yet.
|
|
6
|
+
* OM1 contact/demo/webinar forms use the five `utm_*` contact properties.
|
|
7
|
+
*/
|
|
8
|
+
export declare const KNOWN_MARKETING_PARAM_KEYS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "fbclid", "msclkid"];
|
|
9
|
+
/**
|
|
10
|
+
* Read current URL marketing params and merge first-touch into sessionStorage
|
|
11
|
+
* (existing session keys are not overwritten).
|
|
12
|
+
*
|
|
13
|
+
* Safe to call on every page load so multi-page journeys retain UTMs when the
|
|
14
|
+
* form page has no query string.
|
|
15
|
+
*/
|
|
16
|
+
export declare function captureMarketingParams(): Record<string, string>;
|
|
17
|
+
/**
|
|
18
|
+
* Marketing params for form fill: first-touch session, then current URL
|
|
19
|
+
* (URL wins for keys present on this page — last-touch on the form URL).
|
|
20
|
+
*/
|
|
21
|
+
export declare function getMarketingParams(): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Fill empty hidden form fields from marketing params (URL + session).
|
|
24
|
+
* Does not overwrite existing non-empty values (definition defaults or prior fills).
|
|
25
|
+
* Preserves each field's `objectTypeId` from the form definition.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyMarketingParamsToHiddenFields(formDefinition: HubspotFormDefinition, defaults: Record<string, HubspotFieldResponse>, marketingParams?: Record<string, string>): Record<string, HubspotFieldResponse>;
|
|
28
|
+
//# sourceMappingURL=marketingParams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketingParams.d.ts","sourceRoot":"","sources":["../../../src/forms/client/marketingParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAoB,MAAM,UAAU,CAAC;AAE9F,yFAAyF;AACzF,eAAO,MAAM,4BAA4B,+BAA+B,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,gHAS7B,CAAC;AAwDX;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO3D;AA8BD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,cAAc,EAAE,qBAAqB,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC9C,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAwB,GAC7D,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAoBtC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** sessionStorage key for first-touch marketing params (cross-page form attribution). */
|
|
2
|
+
export const MARKETING_PARAMS_STORAGE_KEY = 'se_studio_marketing_params';
|
|
3
|
+
/**
|
|
4
|
+
* Standard marketing query keys to capture even when no matching form field exists yet.
|
|
5
|
+
* OM1 contact/demo/webinar forms use the five `utm_*` contact properties.
|
|
6
|
+
*/
|
|
7
|
+
export const KNOWN_MARKETING_PARAM_KEYS = [
|
|
8
|
+
'utm_source',
|
|
9
|
+
'utm_medium',
|
|
10
|
+
'utm_campaign',
|
|
11
|
+
'utm_term',
|
|
12
|
+
'utm_content',
|
|
13
|
+
'gclid',
|
|
14
|
+
'fbclid',
|
|
15
|
+
'msclkid',
|
|
16
|
+
];
|
|
17
|
+
function isBrowser() {
|
|
18
|
+
return typeof window !== 'undefined' && typeof window.sessionStorage !== 'undefined';
|
|
19
|
+
}
|
|
20
|
+
function readSessionParams() {
|
|
21
|
+
if (!isBrowser()) {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const raw = window.sessionStorage.getItem(MARKETING_PARAMS_STORAGE_KEY);
|
|
26
|
+
if (!raw) {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
35
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
36
|
+
result[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function writeSessionParams(params) {
|
|
46
|
+
if (!isBrowser()) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
window.sessionStorage.setItem(MARKETING_PARAMS_STORAGE_KEY, JSON.stringify(params));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Ignore quota / private mode failures
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function readUrlParams() {
|
|
57
|
+
if (!isBrowser()) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
const result = {};
|
|
61
|
+
const search = new URLSearchParams(window.location.search);
|
|
62
|
+
for (const [key, value] of search.entries()) {
|
|
63
|
+
if (value) {
|
|
64
|
+
result[key] = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read current URL marketing params and merge first-touch into sessionStorage
|
|
71
|
+
* (existing session keys are not overwritten).
|
|
72
|
+
*
|
|
73
|
+
* Safe to call on every page load so multi-page journeys retain UTMs when the
|
|
74
|
+
* form page has no query string.
|
|
75
|
+
*/
|
|
76
|
+
export function captureMarketingParams() {
|
|
77
|
+
if (!isBrowser()) {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
const stored = readSessionParams();
|
|
81
|
+
const fromUrl = readUrlParams();
|
|
82
|
+
let changed = false;
|
|
83
|
+
for (const key of KNOWN_MARKETING_PARAM_KEYS) {
|
|
84
|
+
const value = fromUrl[key];
|
|
85
|
+
if (value && !stored[key]) {
|
|
86
|
+
stored[key] = value;
|
|
87
|
+
changed = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Also first-touch any other query keys (matches HubSpot native “param name = field name”)
|
|
91
|
+
for (const [key, value] of Object.entries(fromUrl)) {
|
|
92
|
+
if (value && !stored[key]) {
|
|
93
|
+
stored[key] = value;
|
|
94
|
+
changed = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (changed) {
|
|
98
|
+
writeSessionParams(stored);
|
|
99
|
+
}
|
|
100
|
+
return stored;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Marketing params for form fill: first-touch session, then current URL
|
|
104
|
+
* (URL wins for keys present on this page — last-touch on the form URL).
|
|
105
|
+
*/
|
|
106
|
+
export function getMarketingParams() {
|
|
107
|
+
if (!isBrowser()) {
|
|
108
|
+
return {};
|
|
109
|
+
}
|
|
110
|
+
const stored = captureMarketingParams();
|
|
111
|
+
const fromUrl = readUrlParams();
|
|
112
|
+
return { ...stored, ...fromUrl };
|
|
113
|
+
}
|
|
114
|
+
function hasNonEmptyValue(field) {
|
|
115
|
+
if (!field) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const { value } = field;
|
|
119
|
+
if (Array.isArray(value)) {
|
|
120
|
+
return value.some((entry) => String(entry).length > 0);
|
|
121
|
+
}
|
|
122
|
+
return String(value).length > 0;
|
|
123
|
+
}
|
|
124
|
+
function collectHiddenFields(formDefinition) {
|
|
125
|
+
const hidden = [];
|
|
126
|
+
for (const group of formDefinition.fieldGroups) {
|
|
127
|
+
for (const field of group.fields) {
|
|
128
|
+
if (field.hidden) {
|
|
129
|
+
hidden.push(field);
|
|
130
|
+
}
|
|
131
|
+
for (const dep of field.dependentFields ?? []) {
|
|
132
|
+
if (dep.dependentField.hidden) {
|
|
133
|
+
hidden.push(dep.dependentField);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return hidden;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Fill empty hidden form fields from marketing params (URL + session).
|
|
142
|
+
* Does not overwrite existing non-empty values (definition defaults or prior fills).
|
|
143
|
+
* Preserves each field's `objectTypeId` from the form definition.
|
|
144
|
+
*/
|
|
145
|
+
export function applyMarketingParamsToHiddenFields(formDefinition, defaults, marketingParams = getMarketingParams()) {
|
|
146
|
+
const result = { ...defaults };
|
|
147
|
+
const hiddenFields = collectHiddenFields(formDefinition);
|
|
148
|
+
for (const field of hiddenFields) {
|
|
149
|
+
const paramValue = marketingParams[field.name];
|
|
150
|
+
if (!paramValue) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (hasNonEmptyValue(result[field.name])) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
result[field.name] = {
|
|
157
|
+
name: field.name,
|
|
158
|
+
objectTypeId: field.objectTypeId,
|
|
159
|
+
value: paramValue,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=marketingParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketingParams.js","sourceRoot":"","sources":["../../../src/forms/client/marketingParams.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { HubspotDynamicFormProps } from './forms/client/HubspotDynamicForm';
|
|
2
|
-
export { HubspotDynamicForm } from './forms/client/HubspotDynamicForm';
|
|
2
|
+
export { buildDefaultValues, HubspotDynamicForm } from './forms/client/HubspotDynamicForm';
|
|
3
|
+
export { applyMarketingParamsToHiddenFields, captureMarketingParams, getMarketingParams, KNOWN_MARKETING_PARAM_KEYS, MARKETING_PARAMS_STORAGE_KEY, } from './forms/client/marketingParams';
|
|
3
4
|
export type { UseHubspotSubmitOptions } from './forms/client/useHubspotSubmit';
|
|
4
5
|
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
5
6
|
export type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormContext, HubspotFormDefinition, HubspotFormExternalData, HubspotFormSubmissionResponse, } from './forms/types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { HubspotDynamicForm } from './forms/client/HubspotDynamicForm';
|
|
1
|
+
export { buildDefaultValues, HubspotDynamicForm } from './forms/client/HubspotDynamicForm';
|
|
2
|
+
export { applyMarketingParamsToHiddenFields, captureMarketingParams, getMarketingParams, KNOWN_MARKETING_PARAM_KEYS, MARKETING_PARAMS_STORAGE_KEY, } from './forms/client/marketingParams';
|
|
2
3
|
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
3
4
|
export { createHubSpotBootstrapScript } from './tracking/createHubSpotBootstrapScript';
|
|
4
5
|
export { HubSpotAnalyticsAdapter } from './tracking/HubSpotAnalyticsAdapter';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AASnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
package/docs/llms.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
| Import | Contents |
|
|
6
6
|
|--------|----------|
|
|
7
|
-
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, types |
|
|
7
|
+
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, `buildDefaultValues`, `captureMarketingParams`, `getMarketingParams`, `applyMarketingParamsToHiddenFields`, types |
|
|
8
8
|
| `@se-studio/hubspot/server` | `getHubspotFormDefinition`, `submitHubspotForm`, `hubspotFormTag` |
|
|
9
9
|
| `@se-studio/hubspot/external` | `createHubspotFormExternalRenderer` |
|
|
10
10
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
- `externalComponentType`: `"Hubspot form"`
|
|
14
14
|
- `data.formId` (required): HubSpot form GUID
|
|
15
15
|
- `data.portalId` (optional): defaults to `HUBSPOT_PORTAL_ID`
|
|
16
|
+
- Hidden UTM fields: `HubspotDynamicForm` auto-fills empty hidden fields from URL query + first-touch `sessionStorage` (`utm_source`, etc.). CMS `hiddenFields` override. Forks should import `buildDefaultValues` / `applyMarketingParamsToHiddenFields` rather than reimplementing.
|
|
16
17
|
|
|
17
18
|
## Analytics
|
|
18
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/hubspot",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.4",
|
|
4
4
|
"description": "HubSpot tracking and API-driven form rendering for Next.js marketing sites",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"react": "^19.0.0",
|
|
45
45
|
"react-dom": "^19.0.0",
|
|
46
46
|
"@se-studio/core-data-types": "1.6.1",
|
|
47
|
-
"@se-studio/core-ui": "1.14.
|
|
47
|
+
"@se-studio/core-ui": "1.14.3"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@hubspot/api-client": "^14.0.1",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"typescript": "^6.0.3",
|
|
64
64
|
"vitest": "^4.1.9",
|
|
65
65
|
"@se-studio/core-data-types": "1.6.1",
|
|
66
|
-
"@se-studio/core-ui": "1.14.
|
|
66
|
+
"@se-studio/core-ui": "1.14.3"
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "tsc --project tsconfig.build.json",
|