@getvitops/generator 8.1.0 → 8.2.0-alpha.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/CHANGELOG.md +352 -17
- package/assets/js/consent.js +1 -1
- package/assets/js/deferred.js +1 -1
- package/assets/js/editor.js +2 -2
- package/assets/js/elements.js +4 -4
- package/assets/js/polyfills/adoptedStyleSheets.js +1 -1
- package/assets/js/polyfills/css-anchor-positioning-fn.js +4 -4
- package/assets/js/polyfills/global.esm.js +1 -1
- package/assets/js/polyfills/invokers-polyfill.js +1 -1
- package/assets/js/polyfills/popover.js +2 -2
- package/assets/js/polyfills/webcomponents-bundle.js +9 -9
- package/config.schema.json +333 -118
- package/dist/config-DvbYx3Gi.mjs +1971 -0
- package/dist/config-DvbYx3Gi.mjs.map +1 -0
- package/dist/config.d.mts +2544 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +3 -0
- package/dist/icons-sprite-Bf_KmKeX.d.mts +267 -0
- package/dist/icons-sprite-Bf_KmKeX.d.mts.map +1 -0
- package/dist/icons-sprite.d.mts +2 -0
- package/dist/icons-sprite.mjs +129 -0
- package/dist/icons-sprite.mjs.map +1 -0
- package/dist/index.d.mts +57 -2854
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +93 -2386
- package/dist/index.mjs.map +1 -1
- package/dist/schema-Dmq1J7S3.d.mts +292 -0
- package/dist/schema-Dmq1J7S3.d.mts.map +1 -0
- package/dist/tokens-8SXMDAd1.d.mts +229 -0
- package/dist/tokens-8SXMDAd1.d.mts.map +1 -0
- package/dist/tokens-zi594IZ3.mjs +697 -0
- package/dist/tokens-zi594IZ3.mjs.map +1 -0
- package/dist/tokens.d.mts +2 -0
- package/dist/tokens.mjs +3 -0
- package/package.json +17 -5
- package/schema.json +12 -28
package/config.schema.json
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
"description": "URL of the published config JSON Schema (stamped by `vitops init --site`) so editors provide autocomplete + validation.",
|
|
8
8
|
"type": "string"
|
|
9
9
|
},
|
|
10
|
+
"configVersion": {
|
|
11
|
+
"description": "The config shape version (see `CONFIG_VERSION`) — absent reads as version 1, which is every config validated by this schema so far.",
|
|
12
|
+
"type": "number",
|
|
13
|
+
"const": 1
|
|
14
|
+
},
|
|
10
15
|
"designSystem": {
|
|
11
16
|
"type": "object",
|
|
12
17
|
"properties": {
|
|
@@ -456,13 +461,9 @@
|
|
|
456
461
|
"type": "string"
|
|
457
462
|
},
|
|
458
463
|
"additionalProperties": {
|
|
459
|
-
"
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
},
|
|
463
|
-
{
|
|
464
|
-
"type": "number"
|
|
465
|
-
}
|
|
464
|
+
"type": [
|
|
465
|
+
"string",
|
|
466
|
+
"number"
|
|
466
467
|
]
|
|
467
468
|
},
|
|
468
469
|
"description": "A bag of CSS-ish keys, each mapped to a declaration plus a `--<role>-<sfx>` override hook. The recognised set is **closed**: `family`, `size`, `weight`, `style`, `line-height`, `tracking` (→ `letter-spacing`), `text-transform`, `text-decoration`, `text-wrap`, `color`. Note the last four are spelled with their full CSS property names — `transform` and `decoration` are NOT accepted. Anything unrecognised is **ignored**, not passed through, so the generator warns rather than emitting it: a silently-dropped `transform: uppercase` is how title-case navigation reaches production. Note also that `style`, `text-transform`, `text-decoration` and `text-wrap` are emitted on **every** role at their identity value (`normal`/`none`/`none`/`wrap`) whether declared or not, so applying one role class over another fully resets it — which means **omitting `text-wrap` is not \"inherit\"**: it emits `text-wrap: wrap` and cancels the `pretty` the role would otherwise inherit from a `pretty` ancestor such as a `body`-mapped role. Declare it on every role — `balance` for heading-like roles, `pretty` for copy, `wrap` for short single-line labels."
|
|
@@ -504,13 +505,9 @@
|
|
|
504
505
|
"type": "string"
|
|
505
506
|
},
|
|
506
507
|
"additionalProperties": {
|
|
507
|
-
"
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
},
|
|
511
|
-
{
|
|
512
|
-
"type": "number"
|
|
513
|
-
}
|
|
508
|
+
"type": [
|
|
509
|
+
"string",
|
|
510
|
+
"number"
|
|
514
511
|
]
|
|
515
512
|
},
|
|
516
513
|
"description": "Extra literal declarations merged into the effect class as-is."
|
|
@@ -521,13 +518,9 @@
|
|
|
521
518
|
"type": "string"
|
|
522
519
|
},
|
|
523
520
|
"additionalProperties": {
|
|
524
|
-
"
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
"type": "number"
|
|
530
|
-
}
|
|
521
|
+
"type": [
|
|
522
|
+
"string",
|
|
523
|
+
"number"
|
|
531
524
|
]
|
|
532
525
|
},
|
|
533
526
|
"description": "Effect endpoint variables (`--<key>: <value>`, e.g. opacity-from, translate-y-to) that override the keyframe defaults."
|
|
@@ -556,13 +549,9 @@
|
|
|
556
549
|
"type": "string"
|
|
557
550
|
},
|
|
558
551
|
"additionalProperties": {
|
|
559
|
-
"
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
},
|
|
563
|
-
{
|
|
564
|
-
"type": "number"
|
|
565
|
-
}
|
|
552
|
+
"type": [
|
|
553
|
+
"string",
|
|
554
|
+
"number"
|
|
566
555
|
]
|
|
567
556
|
}
|
|
568
557
|
}
|
|
@@ -694,7 +683,7 @@
|
|
|
694
683
|
"description": "General contact address. Also the last fallback for privacy requests — see `contact`.",
|
|
695
684
|
"type": "string",
|
|
696
685
|
"format": "email",
|
|
697
|
-
"pattern": "^(
|
|
686
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
698
687
|
},
|
|
699
688
|
"phone": {
|
|
700
689
|
"description": "General contact telephone number.",
|
|
@@ -761,7 +750,7 @@
|
|
|
761
750
|
"email": {
|
|
762
751
|
"type": "string",
|
|
763
752
|
"format": "email",
|
|
764
|
-
"pattern": "^(
|
|
753
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
765
754
|
},
|
|
766
755
|
"phone": {
|
|
767
756
|
"type": "string"
|
|
@@ -851,7 +840,7 @@
|
|
|
851
840
|
"email": {
|
|
852
841
|
"type": "string",
|
|
853
842
|
"format": "email",
|
|
854
|
-
"pattern": "^(
|
|
843
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
855
844
|
},
|
|
856
845
|
"phone": {
|
|
857
846
|
"type": "string"
|
|
@@ -1178,13 +1167,9 @@
|
|
|
1178
1167
|
"description": "A string, or a per-locale map of strings (`{ en: \"…\", fr: \"…\" }`)."
|
|
1179
1168
|
},
|
|
1180
1169
|
"price": {
|
|
1181
|
-
"
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
},
|
|
1185
|
-
{
|
|
1186
|
-
"type": "number"
|
|
1187
|
-
}
|
|
1170
|
+
"type": [
|
|
1171
|
+
"string",
|
|
1172
|
+
"number"
|
|
1188
1173
|
]
|
|
1189
1174
|
},
|
|
1190
1175
|
"priceCurrency": {
|
|
@@ -1450,14 +1435,14 @@
|
|
|
1450
1435
|
"items": {
|
|
1451
1436
|
"type": "string",
|
|
1452
1437
|
"format": "email",
|
|
1453
|
-
"pattern": "^(
|
|
1438
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
1454
1439
|
}
|
|
1455
1440
|
},
|
|
1456
1441
|
"fullUserGroup": {
|
|
1457
1442
|
"description": "A Google Group to grant Full-User access in Search Console. SURFACED AS A REMINDER only: Search Console exposes no user/permission API, so this step stays manual by design.",
|
|
1458
1443
|
"type": "string",
|
|
1459
1444
|
"format": "email",
|
|
1460
|
-
"pattern": "^(
|
|
1445
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
1461
1446
|
}
|
|
1462
1447
|
},
|
|
1463
1448
|
"additionalProperties": false
|
|
@@ -1505,6 +1490,27 @@
|
|
|
1505
1490
|
},
|
|
1506
1491
|
"description": "Deploy environments (production, dev, …): URL, API origin, analytics toggle, robots policy, active A/B variant."
|
|
1507
1492
|
},
|
|
1493
|
+
"plan": {
|
|
1494
|
+
"description": "Commercial plan/add-on entitlement, gating which capability fields below may be turned on. Absence means unrestricted.",
|
|
1495
|
+
"type": "object",
|
|
1496
|
+
"properties": {
|
|
1497
|
+
"key": {
|
|
1498
|
+
"type": "string",
|
|
1499
|
+
"description": "Commercial plan identifier (e.g. \"essentials\", \"growth\") — open string, not a closed enum."
|
|
1500
|
+
},
|
|
1501
|
+
"addons": {
|
|
1502
|
+
"description": "Add-on keys this site is entitled to (e.g. \"ab_testing\", \"server_side_tracking\") — checked against PLAN_CAPABILITIES.",
|
|
1503
|
+
"type": "array",
|
|
1504
|
+
"items": {
|
|
1505
|
+
"type": "string"
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
},
|
|
1509
|
+
"required": [
|
|
1510
|
+
"key"
|
|
1511
|
+
],
|
|
1512
|
+
"additionalProperties": false
|
|
1513
|
+
},
|
|
1508
1514
|
"abTesting": {
|
|
1509
1515
|
"description": "A/B testing: cookie-based split plus named variants whose `overrides` patch the config per environment.",
|
|
1510
1516
|
"type": "object",
|
|
@@ -1562,6 +1568,65 @@
|
|
|
1562
1568
|
],
|
|
1563
1569
|
"additionalProperties": false
|
|
1564
1570
|
},
|
|
1571
|
+
"experiments": {
|
|
1572
|
+
"description": "Runtime, per-visitor content experiments — one config-schema-free page branches on a cookie the vitopsAbTesting() middleware assigns. Distinct from `abTesting`, which merges a whole build/environment variant at resolve time; this instead lets one page (e.g. a real, nav-linked /contact) run a copy test without a second URL or a second deploy. Keyed by an open experiment name so more than one can run at once.",
|
|
1573
|
+
"type": "object",
|
|
1574
|
+
"propertyNames": {
|
|
1575
|
+
"type": "string"
|
|
1576
|
+
},
|
|
1577
|
+
"additionalProperties": {
|
|
1578
|
+
"type": "object",
|
|
1579
|
+
"properties": {
|
|
1580
|
+
"enabled": {
|
|
1581
|
+
"type": "boolean"
|
|
1582
|
+
},
|
|
1583
|
+
"category": {
|
|
1584
|
+
"description": "Consent category this experiment's assignment cookie waits on (default `analytics`) — independent of `site.tracking.category`, so an experiment never piggybacks on ad-attribution consent.",
|
|
1585
|
+
"type": "string",
|
|
1586
|
+
"enum": [
|
|
1587
|
+
"analytics",
|
|
1588
|
+
"marketing"
|
|
1589
|
+
]
|
|
1590
|
+
},
|
|
1591
|
+
"cookieName": {
|
|
1592
|
+
"description": "Default `_ab_<experiment key>`.",
|
|
1593
|
+
"type": "string"
|
|
1594
|
+
},
|
|
1595
|
+
"cookieMaxAge": {
|
|
1596
|
+
"description": "Seconds.",
|
|
1597
|
+
"type": "integer",
|
|
1598
|
+
"exclusiveMinimum": 0,
|
|
1599
|
+
"maximum": 9007199254740991
|
|
1600
|
+
},
|
|
1601
|
+
"splitRatio": {
|
|
1602
|
+
"description": "Fraction of new visitors auto-assigned to `variants[1]` (default 0.5). 0 means nobody is auto-assigned — a manually or query-param-set cookie still pins a visitor to `variants[1]`, which is what makes 0 a real blue/green-preview mode rather than a no-op.",
|
|
1603
|
+
"type": "number",
|
|
1604
|
+
"minimum": 0,
|
|
1605
|
+
"maximum": 1
|
|
1606
|
+
},
|
|
1607
|
+
"variants": {
|
|
1608
|
+
"type": "array",
|
|
1609
|
+
"prefixItems": [
|
|
1610
|
+
{
|
|
1611
|
+
"type": "string"
|
|
1612
|
+
},
|
|
1613
|
+
{
|
|
1614
|
+
"type": "string"
|
|
1615
|
+
}
|
|
1616
|
+
],
|
|
1617
|
+
"items": false,
|
|
1618
|
+
"minItems": 2,
|
|
1619
|
+
"maxItems": 2,
|
|
1620
|
+
"description": "Exactly two variant names, e.g. [\"control\", \"new-form\"]. `variants[0]` is the default a visitor with no assignment yet effectively sees."
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
"required": [
|
|
1624
|
+
"enabled",
|
|
1625
|
+
"variants"
|
|
1626
|
+
],
|
|
1627
|
+
"additionalProperties": false
|
|
1628
|
+
}
|
|
1629
|
+
},
|
|
1565
1630
|
"fonts": {
|
|
1566
1631
|
"description": "Font LOADING (a serialisable projection of the Astro Fonts API: provider, weights, subsets, preload). Font TOKENS live in `designSystem.themes.<theme>.fonts` and reference the same `cssVariable`.",
|
|
1567
1632
|
"type": "array",
|
|
@@ -1591,13 +1656,9 @@
|
|
|
1591
1656
|
"weights": {
|
|
1592
1657
|
"type": "array",
|
|
1593
1658
|
"items": {
|
|
1594
|
-
"
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
},
|
|
1598
|
-
{
|
|
1599
|
-
"type": "string"
|
|
1600
|
-
}
|
|
1659
|
+
"type": [
|
|
1660
|
+
"number",
|
|
1661
|
+
"string"
|
|
1601
1662
|
]
|
|
1602
1663
|
}
|
|
1603
1664
|
},
|
|
@@ -1660,13 +1721,9 @@
|
|
|
1660
1721
|
}
|
|
1661
1722
|
},
|
|
1662
1723
|
"weight": {
|
|
1663
|
-
"
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
},
|
|
1667
|
-
{
|
|
1668
|
-
"type": "string"
|
|
1669
|
-
}
|
|
1724
|
+
"type": [
|
|
1725
|
+
"number",
|
|
1726
|
+
"string"
|
|
1670
1727
|
]
|
|
1671
1728
|
},
|
|
1672
1729
|
"style": {
|
|
@@ -1711,13 +1768,9 @@
|
|
|
1711
1768
|
"type": "object",
|
|
1712
1769
|
"properties": {
|
|
1713
1770
|
"weight": {
|
|
1714
|
-
"
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
},
|
|
1718
|
-
{
|
|
1719
|
-
"type": "string"
|
|
1720
|
-
}
|
|
1771
|
+
"type": [
|
|
1772
|
+
"number",
|
|
1773
|
+
"string"
|
|
1721
1774
|
]
|
|
1722
1775
|
},
|
|
1723
1776
|
"style": {
|
|
@@ -2079,16 +2132,10 @@
|
|
|
2079
2132
|
"type": "string"
|
|
2080
2133
|
},
|
|
2081
2134
|
"additionalProperties": {
|
|
2082
|
-
"
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
{
|
|
2087
|
-
"type": "number"
|
|
2088
|
-
},
|
|
2089
|
-
{
|
|
2090
|
-
"type": "boolean"
|
|
2091
|
-
}
|
|
2135
|
+
"type": [
|
|
2136
|
+
"string",
|
|
2137
|
+
"number",
|
|
2138
|
+
"boolean"
|
|
2092
2139
|
]
|
|
2093
2140
|
}
|
|
2094
2141
|
}
|
|
@@ -2106,16 +2153,10 @@
|
|
|
2106
2153
|
"type": "string"
|
|
2107
2154
|
},
|
|
2108
2155
|
"additionalProperties": {
|
|
2109
|
-
"
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
{
|
|
2114
|
-
"type": "number"
|
|
2115
|
-
},
|
|
2116
|
-
{
|
|
2117
|
-
"type": "boolean"
|
|
2118
|
-
}
|
|
2156
|
+
"type": [
|
|
2157
|
+
"string",
|
|
2158
|
+
"number",
|
|
2159
|
+
"boolean"
|
|
2119
2160
|
]
|
|
2120
2161
|
}
|
|
2121
2162
|
},
|
|
@@ -2465,6 +2506,16 @@
|
|
|
2465
2506
|
"cookies": {
|
|
2466
2507
|
"description": "Default false — Matomo runs cookieless (`disableCookies`), which is what lets the cookie notice state positively that it sets none.",
|
|
2467
2508
|
"type": "boolean"
|
|
2509
|
+
},
|
|
2510
|
+
"abVariantDimensions": {
|
|
2511
|
+
"description": "Pre-created Matomo custom-dimension index per `site.experiments` key — Matomo requires the dimension to exist in the instance before a value can be pushed for it.",
|
|
2512
|
+
"type": "object",
|
|
2513
|
+
"propertyNames": {
|
|
2514
|
+
"type": "string"
|
|
2515
|
+
},
|
|
2516
|
+
"additionalProperties": {
|
|
2517
|
+
"type": "number"
|
|
2518
|
+
}
|
|
2468
2519
|
}
|
|
2469
2520
|
},
|
|
2470
2521
|
"required": [
|
|
@@ -2486,7 +2537,7 @@
|
|
|
2486
2537
|
{
|
|
2487
2538
|
"type": "string",
|
|
2488
2539
|
"format": "email",
|
|
2489
|
-
"pattern": "^(
|
|
2540
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2490
2541
|
},
|
|
2491
2542
|
{
|
|
2492
2543
|
"type": "object",
|
|
@@ -2500,13 +2551,13 @@
|
|
|
2500
2551
|
"description": "Recipient. Defaults to the primary location’s `email`, then the first location that has one.",
|
|
2501
2552
|
"type": "string",
|
|
2502
2553
|
"format": "email",
|
|
2503
|
-
"pattern": "^(
|
|
2554
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2504
2555
|
},
|
|
2505
2556
|
"from": {
|
|
2506
2557
|
"description": "Sender. Defaults to `noreply@<domains.canonical>`. Its domain must be onboarded (`wrangler email sending enable <domain>`) or every send fails.",
|
|
2507
2558
|
"type": "string",
|
|
2508
2559
|
"format": "email",
|
|
2509
|
-
"pattern": "^(
|
|
2560
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2510
2561
|
},
|
|
2511
2562
|
"fromName": {
|
|
2512
2563
|
"description": "Display name on the From header. Defaults to `organization.name`.",
|
|
@@ -2516,11 +2567,15 @@
|
|
|
2516
2567
|
"description": "Reply-To header.",
|
|
2517
2568
|
"type": "string",
|
|
2518
2569
|
"format": "email",
|
|
2519
|
-
"pattern": "^(
|
|
2570
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2520
2571
|
},
|
|
2521
2572
|
"binding": {
|
|
2522
2573
|
"description": "Workers `send_email` binding name (default `EMAIL`). Set it when using a restricted binding.",
|
|
2523
2574
|
"type": "string"
|
|
2575
|
+
},
|
|
2576
|
+
"verifySender": {
|
|
2577
|
+
"description": "Set false to skip `vitops email check`'s deploy-time onboarding warning for this site — for a `from` domain the scan cannot see is correct (e.g. built dynamically), which would otherwise be a false positive.",
|
|
2578
|
+
"type": "boolean"
|
|
2524
2579
|
}
|
|
2525
2580
|
},
|
|
2526
2581
|
"required": [
|
|
@@ -2529,6 +2584,10 @@
|
|
|
2529
2584
|
"additionalProperties": false
|
|
2530
2585
|
}
|
|
2531
2586
|
]
|
|
2587
|
+
},
|
|
2588
|
+
"actionUrl": {
|
|
2589
|
+
"description": "Optional action-link template added to the conversion email (e.g. a link into your ad platform or your own CRM/portal). `{clickId}` is replaced with the ad click ID captured on `_ac` (gclid, fbclid, …). Omitted from the email when the event carries no click ID to interpolate, rather than rendering a broken link.",
|
|
2590
|
+
"type": "string"
|
|
2532
2591
|
}
|
|
2533
2592
|
},
|
|
2534
2593
|
"additionalProperties": false
|
|
@@ -2587,8 +2646,30 @@
|
|
|
2587
2646
|
"type": "string"
|
|
2588
2647
|
},
|
|
2589
2648
|
"conversionLabel": {
|
|
2590
|
-
"description": "Google Ads only: the conversion action label paired with the `AW-…` conversion ID.",
|
|
2591
|
-
"
|
|
2649
|
+
"description": "Google Ads only: the conversion action label(s) paired with the `AW-…` conversion ID — either one bare label (back-compat, treated as the `call` action) or a map of action → label, so a call, an email click and a form submission each fire their own Google Ads conversion action instead of all three reporting as the same one.",
|
|
2650
|
+
"anyOf": [
|
|
2651
|
+
{
|
|
2652
|
+
"type": "string"
|
|
2653
|
+
},
|
|
2654
|
+
{
|
|
2655
|
+
"type": "object",
|
|
2656
|
+
"properties": {
|
|
2657
|
+
"call": {
|
|
2658
|
+
"description": "Fired on a tel: link click.",
|
|
2659
|
+
"type": "string"
|
|
2660
|
+
},
|
|
2661
|
+
"email": {
|
|
2662
|
+
"description": "Fired on a mailto: link click.",
|
|
2663
|
+
"type": "string"
|
|
2664
|
+
},
|
|
2665
|
+
"form": {
|
|
2666
|
+
"description": "Fired client-side by `vitopsFormConversion()` — the consumer's own submit handler calls it once a form POST succeeds.",
|
|
2667
|
+
"type": "string"
|
|
2668
|
+
}
|
|
2669
|
+
},
|
|
2670
|
+
"additionalProperties": false
|
|
2671
|
+
}
|
|
2672
|
+
]
|
|
2592
2673
|
},
|
|
2593
2674
|
"domain": {
|
|
2594
2675
|
"description": "Bare hostname to verify with this platform. Defaults to the host of `domains.canonical` — set it only when the ad account is verified against a different domain.",
|
|
@@ -2683,6 +2764,150 @@
|
|
|
2683
2764
|
],
|
|
2684
2765
|
"additionalProperties": false
|
|
2685
2766
|
},
|
|
2767
|
+
"crm": {
|
|
2768
|
+
"description": "Push form submissions into a client CRM (HubSpot, Zoho Bigin, or Jobber) alongside the notification email. Read by `createConversionRoute()`'s `crm` option and `vitops crm check`/`vitops crm setup`. Credentials never live here.",
|
|
2769
|
+
"type": "object",
|
|
2770
|
+
"properties": {
|
|
2771
|
+
"provider": {
|
|
2772
|
+
"type": "string",
|
|
2773
|
+
"enum": [
|
|
2774
|
+
"hubspot",
|
|
2775
|
+
"bigin",
|
|
2776
|
+
"jobber"
|
|
2777
|
+
],
|
|
2778
|
+
"description": "Which CRM this site pushes form submissions into."
|
|
2779
|
+
},
|
|
2780
|
+
"enabled": {
|
|
2781
|
+
"description": "Set false to keep the block on record without writing to the CRM.",
|
|
2782
|
+
"type": "boolean"
|
|
2783
|
+
},
|
|
2784
|
+
"hubspot": {
|
|
2785
|
+
"description": "Required when `provider` is `hubspot`.",
|
|
2786
|
+
"type": "object",
|
|
2787
|
+
"properties": {
|
|
2788
|
+
"portalId": {
|
|
2789
|
+
"type": "string",
|
|
2790
|
+
"description": "The HubSpot portal (hub) ID the form belongs to."
|
|
2791
|
+
},
|
|
2792
|
+
"formGuid": {
|
|
2793
|
+
"type": "string",
|
|
2794
|
+
"description": "The HubSpot form GUID to submit against."
|
|
2795
|
+
},
|
|
2796
|
+
"dataCenter": {
|
|
2797
|
+
"description": "Which regional submissions API to post to (default `na`).",
|
|
2798
|
+
"type": "string",
|
|
2799
|
+
"enum": [
|
|
2800
|
+
"na",
|
|
2801
|
+
"eu"
|
|
2802
|
+
]
|
|
2803
|
+
}
|
|
2804
|
+
},
|
|
2805
|
+
"required": [
|
|
2806
|
+
"portalId",
|
|
2807
|
+
"formGuid"
|
|
2808
|
+
],
|
|
2809
|
+
"additionalProperties": false
|
|
2810
|
+
},
|
|
2811
|
+
"bigin": {
|
|
2812
|
+
"description": "Required when `provider` is `bigin`.",
|
|
2813
|
+
"type": "object",
|
|
2814
|
+
"properties": {
|
|
2815
|
+
"dataCenter": {
|
|
2816
|
+
"type": "string",
|
|
2817
|
+
"enum": [
|
|
2818
|
+
"com",
|
|
2819
|
+
"ca",
|
|
2820
|
+
"eu",
|
|
2821
|
+
"in",
|
|
2822
|
+
"com.au",
|
|
2823
|
+
"jp"
|
|
2824
|
+
],
|
|
2825
|
+
"description": "The self-client's data centre — determines both the OAuth accounts host and the API host (`www.zohoapis.<dc>`)."
|
|
2826
|
+
},
|
|
2827
|
+
"duplicateCheckField": {
|
|
2828
|
+
"description": "Bigin field the upsert dedupes on (default `Email`, Bigin's own unique field).",
|
|
2829
|
+
"type": "string"
|
|
2830
|
+
},
|
|
2831
|
+
"pipeline": {
|
|
2832
|
+
"description": "Also open a Pipelines record alongside the Contact.",
|
|
2833
|
+
"type": "object",
|
|
2834
|
+
"properties": {
|
|
2835
|
+
"enabled": {
|
|
2836
|
+
"type": "boolean",
|
|
2837
|
+
"description": "Also open a Pipelines record for the new/updated contact."
|
|
2838
|
+
},
|
|
2839
|
+
"subPipeline": {
|
|
2840
|
+
"description": "Sub-pipeline to file the record under.",
|
|
2841
|
+
"type": "string"
|
|
2842
|
+
},
|
|
2843
|
+
"stage": {
|
|
2844
|
+
"description": "Starting stage for the pipeline record.",
|
|
2845
|
+
"type": "string"
|
|
2846
|
+
}
|
|
2847
|
+
},
|
|
2848
|
+
"required": [
|
|
2849
|
+
"enabled"
|
|
2850
|
+
],
|
|
2851
|
+
"additionalProperties": false
|
|
2852
|
+
}
|
|
2853
|
+
},
|
|
2854
|
+
"required": [
|
|
2855
|
+
"dataCenter"
|
|
2856
|
+
],
|
|
2857
|
+
"additionalProperties": false
|
|
2858
|
+
},
|
|
2859
|
+
"jobber": {
|
|
2860
|
+
"description": "Required when `provider` is `jobber`.",
|
|
2861
|
+
"type": "object",
|
|
2862
|
+
"properties": {
|
|
2863
|
+
"apiVersion": {
|
|
2864
|
+
"description": "Override the pinned `X-JOBBER-GRAPHQL-VERSION` date this integration is tested against. An escape hatch for an app pinned to a different version — Jobber's schema can change field names between versions.",
|
|
2865
|
+
"type": "string"
|
|
2866
|
+
},
|
|
2867
|
+
"dedupe": {
|
|
2868
|
+
"description": "Look up an existing client by email before creating one (default false pending verification of Jobber's search API against a live schema — see AGENTS.md). Jobber's `clientCreate` has no upsert, so without this a resubmitting visitor creates a second client.",
|
|
2869
|
+
"type": "boolean"
|
|
2870
|
+
},
|
|
2871
|
+
"note": {
|
|
2872
|
+
"description": "Attach a best-effort note carrying the submitted message and any attribution/extra fields with no dedicated Jobber field.",
|
|
2873
|
+
"type": "object",
|
|
2874
|
+
"properties": {
|
|
2875
|
+
"enabled": {
|
|
2876
|
+
"description": "Attach a best-effort note carrying the message and unmapped attribution (default true). A failure here never loses the client record itself.",
|
|
2877
|
+
"type": "boolean"
|
|
2878
|
+
}
|
|
2879
|
+
},
|
|
2880
|
+
"additionalProperties": false
|
|
2881
|
+
}
|
|
2882
|
+
},
|
|
2883
|
+
"additionalProperties": false
|
|
2884
|
+
},
|
|
2885
|
+
"fieldMap": {
|
|
2886
|
+
"description": "Submitted form field name → CRM property name. A field with no entry here is dropped, not guessed — an unmapped field never reaches the CRM.",
|
|
2887
|
+
"type": "object",
|
|
2888
|
+
"propertyNames": {
|
|
2889
|
+
"type": "string"
|
|
2890
|
+
},
|
|
2891
|
+
"additionalProperties": {
|
|
2892
|
+
"type": "string"
|
|
2893
|
+
}
|
|
2894
|
+
},
|
|
2895
|
+
"trackingFields": {
|
|
2896
|
+
"description": "`_ac` attribution key (a click-ID param, a UTM param, `landingPage`, `referrer`, or `ab_variant`) → CRM property name. Same drop-if-unmapped rule as `fieldMap`; a visitor with no `_ac` cookie maps to no attribution fields at all, never an error.",
|
|
2897
|
+
"type": "object",
|
|
2898
|
+
"propertyNames": {
|
|
2899
|
+
"type": "string"
|
|
2900
|
+
},
|
|
2901
|
+
"additionalProperties": {
|
|
2902
|
+
"type": "string"
|
|
2903
|
+
}
|
|
2904
|
+
}
|
|
2905
|
+
},
|
|
2906
|
+
"required": [
|
|
2907
|
+
"provider"
|
|
2908
|
+
],
|
|
2909
|
+
"additionalProperties": false
|
|
2910
|
+
},
|
|
2686
2911
|
"security": {
|
|
2687
2912
|
"description": "Security integrations (bot protection).",
|
|
2688
2913
|
"type": "object",
|
|
@@ -2740,7 +2965,7 @@
|
|
|
2740
2965
|
"email": {
|
|
2741
2966
|
"type": "string",
|
|
2742
2967
|
"format": "email",
|
|
2743
|
-
"pattern": "^(
|
|
2968
|
+
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
|
|
2744
2969
|
},
|
|
2745
2970
|
"phone": {
|
|
2746
2971
|
"type": "string"
|
|
@@ -3045,6 +3270,14 @@
|
|
|
3045
3270
|
},
|
|
3046
3271
|
"type": {
|
|
3047
3272
|
"type": "string"
|
|
3273
|
+
},
|
|
3274
|
+
"repo": {
|
|
3275
|
+
"description": "`owner/name` of this site's GitHub repository. Read by the EmDash design-system-editor plugin route to auto-commit a client's admin edit back to `branch` — see AGENTS.md's \"EmDash plugin as the design-system editing surface\" section. Absent means that sync is skipped (the live override still applies); nothing else in this toolchain reads it today.",
|
|
3276
|
+
"type": "string"
|
|
3277
|
+
},
|
|
3278
|
+
"branch": {
|
|
3279
|
+
"description": "Branch the design-system-editor sync commits to. Default `\"dev\"` — never `main`/production directly; a commit here still needs this repo's own `promote` PR + admin approval to reach production, the same gate every other change goes through.",
|
|
3280
|
+
"type": "string"
|
|
3048
3281
|
}
|
|
3049
3282
|
},
|
|
3050
3283
|
"additionalProperties": false
|
|
@@ -3126,16 +3359,10 @@
|
|
|
3126
3359
|
"type": "string"
|
|
3127
3360
|
},
|
|
3128
3361
|
"additionalProperties": {
|
|
3129
|
-
"
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
{
|
|
3134
|
-
"type": "number"
|
|
3135
|
-
},
|
|
3136
|
-
{
|
|
3137
|
-
"type": "boolean"
|
|
3138
|
-
}
|
|
3362
|
+
"type": [
|
|
3363
|
+
"string",
|
|
3364
|
+
"number",
|
|
3365
|
+
"boolean"
|
|
3139
3366
|
]
|
|
3140
3367
|
}
|
|
3141
3368
|
},
|
|
@@ -3145,16 +3372,10 @@
|
|
|
3145
3372
|
"type": "string"
|
|
3146
3373
|
},
|
|
3147
3374
|
"additionalProperties": {
|
|
3148
|
-
"
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
{
|
|
3153
|
-
"type": "number"
|
|
3154
|
-
},
|
|
3155
|
-
{
|
|
3156
|
-
"type": "boolean"
|
|
3157
|
-
}
|
|
3375
|
+
"type": [
|
|
3376
|
+
"string",
|
|
3377
|
+
"number",
|
|
3378
|
+
"boolean"
|
|
3158
3379
|
]
|
|
3159
3380
|
}
|
|
3160
3381
|
},
|
|
@@ -3192,16 +3413,10 @@
|
|
|
3192
3413
|
"type": "string"
|
|
3193
3414
|
},
|
|
3194
3415
|
"additionalProperties": {
|
|
3195
|
-
"
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
{
|
|
3200
|
-
"type": "number"
|
|
3201
|
-
},
|
|
3202
|
-
{
|
|
3203
|
-
"type": "boolean"
|
|
3204
|
-
}
|
|
3416
|
+
"type": [
|
|
3417
|
+
"string",
|
|
3418
|
+
"number",
|
|
3419
|
+
"boolean"
|
|
3205
3420
|
]
|
|
3206
3421
|
}
|
|
3207
3422
|
},
|