@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 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;AAmFnG,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"}
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
- function buildDefaultValues(formDefinition, hiddenFields, initialValues) {
27
- const defaults = {};
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":"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"}
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';
@@ -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;AACvE,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"}
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;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AASnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,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.2",
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.2"
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.2"
66
+ "@se-studio/core-ui": "1.14.3"
67
67
  },
68
68
  "scripts": {
69
69
  "build": "tsc --project tsconfig.build.json",