@walkeros/cli 4.8.2 → 4.8.3-next-1793115089237

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +59 -3
  2. package/README.md +2 -2
  3. package/dist/cli.js +1320 -1318
  4. package/dist/dev.d.ts +51 -3
  5. package/dist/dev.js +186 -0
  6. package/dist/dev.js.map +1 -1
  7. package/dist/examples/README.md +12 -1
  8. package/dist/examples/contracts/app.json +261 -0
  9. package/dist/examples/contracts/base.json +708 -0
  10. package/dist/examples/contracts/ecommerce.json +963 -0
  11. package/dist/examples/contracts/leadgen.json +240 -0
  12. package/dist/examples/contracts/publisher.json +372 -0
  13. package/dist/examples/contracts/saas.json +229 -0
  14. package/dist/examples/contracts/travel.json +234 -0
  15. package/dist/examples/customers/README.md +4 -1
  16. package/dist/examples/flow-complete.json +40 -25
  17. package/dist/examples/flow-complete.md +5 -3
  18. package/dist/examples/index.js +42 -27
  19. package/dist/examples/index.js.map +1 -1
  20. package/dist/examples/shared/README.md +4 -0
  21. package/dist/index.d.ts +41 -41
  22. package/dist/index.js +161 -134
  23. package/dist/index.js.map +1 -1
  24. package/dist/validate.js +264 -132
  25. package/dist/validate.js.map +1 -1
  26. package/examples/README.md +12 -1
  27. package/examples/contracts/app.json +261 -0
  28. package/examples/contracts/base.json +708 -0
  29. package/examples/contracts/ecommerce.json +963 -0
  30. package/examples/contracts/leadgen.json +240 -0
  31. package/examples/contracts/publisher.json +372 -0
  32. package/examples/contracts/saas.json +229 -0
  33. package/examples/contracts/travel.json +234 -0
  34. package/examples/customers/README.md +4 -1
  35. package/examples/flow-complete.json +40 -25
  36. package/examples/flow-complete.md +5 -3
  37. package/examples/shared/README.md +4 -0
  38. package/package.json +30 -30
  39. package/dist/examples/test.html +0 -43
  40. package/dist/examples/web-serve.js +0 -25503
  41. package/examples/test.html +0 -43
  42. package/examples/web-serve.js +0 -25503
@@ -0,0 +1,229 @@
1
+ {
2
+ "saas": {
3
+ "description": "Events of a SaaS product: trials and subscriptions.",
4
+ "extend": "default",
5
+ "schema": {
6
+ "description": "What every SaaS event adds.",
7
+ "type": "object",
8
+ "properties": {
9
+ "user": {
10
+ "type": "object",
11
+ "properties": {
12
+ "account": {
13
+ "type": "string",
14
+ "description": "The id of the company account the user belongs to.",
15
+ "examples": ["0e8c78ea9d97a7b8185e8632"]
16
+ }
17
+ }
18
+ }
19
+ }
20
+ },
21
+ "events": {
22
+ "trial": {
23
+ "start": {
24
+ "title": "Trial start",
25
+ "description": "A free trial of a paid plan began. Every SaaS product with trials needs it.",
26
+ "examples": [
27
+ {
28
+ "name": "trial start",
29
+ "data": {
30
+ "end": "2026-10-15T00:00:00Z"
31
+ },
32
+ "nested": [
33
+ {
34
+ "entity": "plan",
35
+ "data": {
36
+ "id": "business",
37
+ "name": "Business"
38
+ }
39
+ }
40
+ ],
41
+ "user": {
42
+ "id": "us3r",
43
+ "account": "0e8c78ea9d97a7b8185e8632"
44
+ }
45
+ }
46
+ ],
47
+ "required": ["nested"],
48
+ "properties": {
49
+ "data": {
50
+ "type": "object",
51
+ "description": "The trial.",
52
+ "properties": {
53
+ "end": {
54
+ "type": "string",
55
+ "format": "date-time",
56
+ "description": "When the trial ends.",
57
+ "examples": ["2026-10-15T00:00:00Z"]
58
+ }
59
+ }
60
+ },
61
+ "nested": {
62
+ "type": "array",
63
+ "description": "The plan on trial.",
64
+ "contains": {
65
+ "type": "object",
66
+ "required": ["entity", "data"],
67
+ "properties": {
68
+ "entity": {
69
+ "type": "string",
70
+ "enum": ["plan"],
71
+ "description": "The entity name, plan.",
72
+ "examples": ["plan"]
73
+ },
74
+ "data": {
75
+ "type": "object",
76
+ "description": "The plan.",
77
+ "required": ["id"],
78
+ "properties": {
79
+ "id": {
80
+ "type": ["string", "number"],
81
+ "description": "The id of the plan.",
82
+ "examples": ["business"]
83
+ },
84
+ "name": {
85
+ "type": "string",
86
+ "description": "The name of the plan.",
87
+ "examples": ["Business"]
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "subscription": {
98
+ "start": {
99
+ "title": "Subscription start",
100
+ "description": "An account started to pay for a plan. Every SaaS product needs it. A renewal is no subscription start.",
101
+ "examples": [
102
+ {
103
+ "name": "subscription start",
104
+ "data": {
105
+ "id": "sub_9f21",
106
+ "value": 49,
107
+ "currency": "EUR",
108
+ "interval": "month"
109
+ },
110
+ "nested": [
111
+ {
112
+ "entity": "plan",
113
+ "data": {
114
+ "id": "business",
115
+ "name": "Business"
116
+ }
117
+ }
118
+ ],
119
+ "user": {
120
+ "id": "us3r",
121
+ "account": "0e8c78ea9d97a7b8185e8632"
122
+ }
123
+ }
124
+ ],
125
+ "required": ["data", "nested"],
126
+ "properties": {
127
+ "data": {
128
+ "type": "object",
129
+ "description": "The subscription.",
130
+ "required": ["id", "value", "currency"],
131
+ "properties": {
132
+ "id": {
133
+ "type": ["string", "number"],
134
+ "description": "The id of the subscription.",
135
+ "examples": ["sub_9f21"]
136
+ },
137
+ "value": {
138
+ "type": "number",
139
+ "description": "The amount of the first billing period, without tax.",
140
+ "examples": [49]
141
+ },
142
+ "currency": {
143
+ "type": "string",
144
+ "description": "The currency of value, as a three-letter code.",
145
+ "examples": ["EUR"]
146
+ },
147
+ "interval": {
148
+ "type": "string",
149
+ "description": "How often the subscription is billed, such as month or year.",
150
+ "examples": ["month"]
151
+ }
152
+ }
153
+ },
154
+ "nested": {
155
+ "type": "array",
156
+ "description": "The plan subscribed to.",
157
+ "contains": {
158
+ "type": "object",
159
+ "required": ["entity", "data"],
160
+ "properties": {
161
+ "entity": {
162
+ "type": "string",
163
+ "enum": ["plan"],
164
+ "description": "The entity name, plan.",
165
+ "examples": ["plan"]
166
+ },
167
+ "data": {
168
+ "type": "object",
169
+ "description": "The plan.",
170
+ "required": ["id"],
171
+ "properties": {
172
+ "id": {
173
+ "type": ["string", "number"],
174
+ "description": "The id of the plan.",
175
+ "examples": ["business"]
176
+ },
177
+ "name": {
178
+ "type": "string",
179
+ "description": "The name of the plan.",
180
+ "examples": ["Business"]
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "cancel": {
190
+ "title": "Subscription cancel",
191
+ "description": "An account cancelled its subscription. Recommended for every SaaS product.",
192
+ "examples": [
193
+ {
194
+ "name": "subscription cancel",
195
+ "data": {
196
+ "id": "sub_9f21",
197
+ "reason": "too expensive"
198
+ },
199
+ "user": {
200
+ "id": "us3r",
201
+ "account": "0e8c78ea9d97a7b8185e8632"
202
+ }
203
+ }
204
+ ],
205
+ "required": ["data"],
206
+ "properties": {
207
+ "data": {
208
+ "type": "object",
209
+ "description": "The cancelled subscription.",
210
+ "required": ["id"],
211
+ "properties": {
212
+ "id": {
213
+ "type": ["string", "number"],
214
+ "description": "The id of the subscription.",
215
+ "examples": ["sub_9f21"]
216
+ },
217
+ "reason": {
218
+ "type": "string",
219
+ "description": "Why the account cancelled.",
220
+ "examples": ["too expensive"]
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
@@ -0,0 +1,234 @@
1
+ {
2
+ "travel": {
3
+ "description": "Events of a travel booking site, from the trip being planned to the confirmed booking.",
4
+ "extend": "default",
5
+ "events": {
6
+ "itinerary": {
7
+ "add": {
8
+ "title": "Itinerary add",
9
+ "description": "A visitor added an experience or a destination to the trip they plan.",
10
+ "examples": [
11
+ {
12
+ "name": "itinerary add",
13
+ "data": {
14
+ "id": "it3m",
15
+ "type": "experience"
16
+ },
17
+ "trigger": "click"
18
+ }
19
+ ],
20
+ "required": ["data"],
21
+ "properties": {
22
+ "data": {
23
+ "type": "object",
24
+ "description": "The item added to the trip.",
25
+ "required": ["id", "type"],
26
+ "properties": {
27
+ "id": {
28
+ "type": ["string", "number"],
29
+ "description": "The id of the item.",
30
+ "examples": ["it3m"]
31
+ },
32
+ "type": {
33
+ "type": "string",
34
+ "description": "What is booked, such as an experience or a destination.",
35
+ "examples": ["experience"]
36
+ },
37
+ "title": {
38
+ "type": "string",
39
+ "description": "The name of what is booked."
40
+ },
41
+ "location": {
42
+ "type": "string",
43
+ "description": "Where it takes place."
44
+ },
45
+ "price": {
46
+ "type": "number",
47
+ "description": "The price per participant."
48
+ },
49
+ "currency": {
50
+ "type": "string",
51
+ "description": "The currency of every amount, as a three-letter code.",
52
+ "examples": ["EUR"]
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "booking": {
60
+ "start": {
61
+ "title": "Booking start",
62
+ "description": "A visitor began to book.",
63
+ "examples": [
64
+ {
65
+ "name": "booking start",
66
+ "data": {
67
+ "id": "b00k1ng",
68
+ "type": "experience"
69
+ },
70
+ "trigger": "click"
71
+ }
72
+ ],
73
+ "required": ["data"],
74
+ "properties": {
75
+ "data": {
76
+ "type": "object",
77
+ "description": "The booking.",
78
+ "required": ["id", "type"],
79
+ "properties": {
80
+ "id": {
81
+ "type": ["string", "number"],
82
+ "description": "The booking number.",
83
+ "examples": ["b00k1ng"]
84
+ },
85
+ "type": {
86
+ "type": "string",
87
+ "description": "What is booked, such as an experience or a destination.",
88
+ "examples": ["experience"]
89
+ },
90
+ "title": {
91
+ "type": "string",
92
+ "description": "The name of what is booked."
93
+ },
94
+ "location": {
95
+ "type": "string",
96
+ "description": "Where it takes place."
97
+ },
98
+ "price": {
99
+ "type": "number",
100
+ "description": "The price per participant."
101
+ },
102
+ "currency": {
103
+ "type": "string",
104
+ "description": "The currency of every amount, as a three-letter code.",
105
+ "examples": ["EUR"]
106
+ }
107
+ }
108
+ }
109
+ }
110
+ },
111
+ "complete": {
112
+ "title": "Booking complete",
113
+ "description": "A booking was confirmed.",
114
+ "examples": [
115
+ {
116
+ "name": "booking complete",
117
+ "data": {
118
+ "id": "b00k1ng",
119
+ "type": "experience",
120
+ "start": "2026-11-12",
121
+ "end": "2026-11-15",
122
+ "participants": 2,
123
+ "insurance": false,
124
+ "value": 120,
125
+ "price": 60,
126
+ "currency": "EUR"
127
+ },
128
+ "trigger": "load"
129
+ }
130
+ ],
131
+ "required": ["data"],
132
+ "properties": {
133
+ "data": {
134
+ "type": "object",
135
+ "description": "The booking.",
136
+ "required": ["id", "value", "currency"],
137
+ "properties": {
138
+ "id": {
139
+ "type": ["string", "number"],
140
+ "description": "The booking number.",
141
+ "examples": ["b00k1ng"]
142
+ },
143
+ "type": {
144
+ "type": "string",
145
+ "description": "What is booked, such as an experience or a destination.",
146
+ "examples": ["experience"]
147
+ },
148
+ "title": {
149
+ "type": "string",
150
+ "description": "The name of what is booked."
151
+ },
152
+ "location": {
153
+ "type": "string",
154
+ "description": "Where it takes place."
155
+ },
156
+ "price": {
157
+ "type": "number",
158
+ "description": "The price per participant.",
159
+ "examples": [60]
160
+ },
161
+ "currency": {
162
+ "type": "string",
163
+ "description": "The currency of every amount, as a three-letter code.",
164
+ "examples": ["EUR"]
165
+ },
166
+ "start": {
167
+ "type": "string",
168
+ "format": "date",
169
+ "description": "The first day of the booking.",
170
+ "examples": ["2026-11-12"]
171
+ },
172
+ "end": {
173
+ "type": "string",
174
+ "format": "date",
175
+ "description": "The last day of the booking.",
176
+ "examples": ["2026-11-15"]
177
+ },
178
+ "participants": {
179
+ "type": "number",
180
+ "description": "How many people the booking is for.",
181
+ "examples": [2]
182
+ },
183
+ "insurance": {
184
+ "type": "boolean",
185
+ "description": "True when the booking includes insurance.",
186
+ "examples": [false]
187
+ },
188
+ "value": {
189
+ "type": "number",
190
+ "description": "The price times the participants.",
191
+ "examples": [120]
192
+ }
193
+ }
194
+ }
195
+ }
196
+ }
197
+ },
198
+ "filter": {
199
+ "apply": {
200
+ "title": "Filter apply",
201
+ "description": "A visitor filtered a list of results.",
202
+ "examples": [
203
+ {
204
+ "name": "filter apply",
205
+ "data": {
206
+ "type": "price",
207
+ "option": "under 100"
208
+ },
209
+ "trigger": "click"
210
+ }
211
+ ],
212
+ "properties": {
213
+ "data": {
214
+ "type": "object",
215
+ "description": "The filter.",
216
+ "properties": {
217
+ "type": {
218
+ "type": "string",
219
+ "description": "What the filter works on, such as price.",
220
+ "examples": ["price"]
221
+ },
222
+ "option": {
223
+ "type": "string",
224
+ "description": "The option chosen.",
225
+ "examples": ["under 100"]
226
+ }
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
@@ -11,7 +11,10 @@ Not covered by root `include`, so no customer data ships in a bundle. `basePath`
11
11
  defaults to `./customers`, relative to the working directory: run
12
12
  `walkeros push` from `packages/cli/examples`, or set `CUSTOMERS_DIR` to this
13
13
  folder's absolute path (always for `runneros start`, which runs inside the
14
- artifact folder).
14
+ artifact folder). From any other directory the lookup finds no file and the user
15
+ gets no `ltv` or `segment`, without an error. A server flow simulation also
16
+ needs the variables the setup in `flow-complete.md` exports (`GCP_SA`,
17
+ `FINGERPRINT_SALT`, `EMAIL_SALT`).
15
18
 
16
19
  In production the store is swapped for a real one, e.g.
17
20
  `@walkeros/server-store-sheets` or a GCS store; the `loadUser` step does not
@@ -241,25 +241,25 @@
241
241
  "bundle": {
242
242
  "packages": {
243
243
  "@walkeros/collector": {
244
- "version": "4.8.2"
244
+ "version": "4.8.3-next-1793115089237"
245
245
  },
246
246
  "@walkeros/web-source-cmp-usercentrics": {
247
- "version": "4.8.2"
247
+ "version": "4.8.3-next-1793115089237"
248
248
  },
249
249
  "@walkeros/web-source-session": {
250
- "version": "4.8.2"
250
+ "version": "4.8.3-next-1793115089237"
251
251
  },
252
252
  "@walkeros/web-source-datalayer": {
253
- "version": "4.8.2"
253
+ "version": "4.8.3-next-1793115089237"
254
254
  },
255
255
  "@walkeros/web-source-browser": {
256
- "version": "4.8.2"
256
+ "version": "4.8.3-next-1793115089237"
257
257
  },
258
258
  "@walkeros/web-destination-gtag": {
259
- "version": "4.8.2"
259
+ "version": "4.8.3-next-1793115089237"
260
260
  },
261
261
  "@walkeros/web-destination-api": {
262
- "version": "4.8.2"
262
+ "version": "4.8.3-next-1793115089237"
263
263
  }
264
264
  },
265
265
  "env": {
@@ -305,7 +305,7 @@
305
305
  "examples": {
306
306
  "explicitDecision": {
307
307
  "title": "Explicit decision",
308
- "description": "The user accepts every category in the banner. categoryMap turns essential and functional into functional, so the collector receives exactly the consent keys the contract names.",
308
+ "description": "The user accepts every category in the banner. categoryMap folds essential into functional so the collector receives exactly the consent keys the contract names; because any deny denies, functional still follows the functional category, and essential never grants it alone.",
309
309
  "public": true,
310
310
  "trigger": {
311
311
  "type": "consent",
@@ -931,7 +931,14 @@
931
931
  "ga4": {
932
932
  "measurementId": "$env.GA4_MEASUREMENT_ID:G-MAINSITE"
933
933
  },
934
- "como": true
934
+ "como": {
935
+ "marketing": [
936
+ "ad_storage",
937
+ "ad_user_data",
938
+ "ad_personalization"
939
+ ],
940
+ "functional": "analytics_storage"
941
+ }
935
942
  },
936
943
  "mapping": {
937
944
  "product": {
@@ -1419,6 +1426,14 @@
1419
1426
  "settings": {
1420
1427
  "gtm": {
1421
1428
  "containerId": "$env.GTM_ID:GTM-SHOP01"
1429
+ },
1430
+ "como": {
1431
+ "marketing": [
1432
+ "ad_storage",
1433
+ "ad_user_data",
1434
+ "ad_personalization"
1435
+ ],
1436
+ "functional": "analytics_storage"
1422
1437
  }
1423
1438
  },
1424
1439
  "mapping": {
@@ -1763,40 +1778,40 @@
1763
1778
  "bundle": {
1764
1779
  "packages": {
1765
1780
  "@walkeros/collector": {
1766
- "version": "4.8.2"
1781
+ "version": "4.8.3-next-1793115089237"
1767
1782
  },
1768
1783
  "@walkeros/server-source-express": {
1769
- "version": "4.8.2"
1784
+ "version": "4.8.3-next-1793115089237"
1770
1785
  },
1771
1786
  "@walkeros/transformer-ga4": {
1772
- "version": "4.8.2"
1787
+ "version": "4.8.3-next-1793115089237"
1773
1788
  },
1774
1789
  "@walkeros/transformer-validate": {
1775
- "version": "4.8.2"
1790
+ "version": "4.8.3-next-1793115089237"
1776
1791
  },
1777
1792
  "@walkeros/server-transformer-bot": {
1778
- "version": "4.8.2"
1793
+ "version": "4.8.3-next-1793115089237"
1779
1794
  },
1780
1795
  "@walkeros/server-transformer-fingerprint": {
1781
- "version": "4.8.2"
1796
+ "version": "4.8.3-next-1793115089237"
1782
1797
  },
1783
1798
  "@walkeros/server-transformer-file": {
1784
- "version": "4.8.2"
1799
+ "version": "4.8.3-next-1793115089237"
1785
1800
  },
1786
1801
  "@walkeros/server-store-fs": {
1787
- "version": "4.8.2"
1802
+ "version": "4.8.3-next-1793115089237"
1788
1803
  },
1789
1804
  "@walkeros/server-destination-gcp": {
1790
- "version": "4.8.2"
1805
+ "version": "4.8.3-next-1793115089237"
1791
1806
  },
1792
1807
  "@walkeros/server-destination-meta": {
1793
- "version": "4.8.2"
1808
+ "version": "4.8.3-next-1793115089237"
1794
1809
  },
1795
1810
  "@walkeros/server-destination-piwikpro": {
1796
- "version": "4.8.2"
1811
+ "version": "4.8.3-next-1793115089237"
1797
1812
  },
1798
1813
  "@walkeros/server-destination-datamanager": {
1799
- "version": "4.8.2"
1814
+ "version": "4.8.3-next-1793115089237"
1800
1815
  }
1801
1816
  }
1802
1817
  }
@@ -1882,7 +1897,7 @@
1882
1897
  },
1883
1898
  "ingest": {
1884
1899
  "map": {
1885
- "ip": "ip",
1900
+ "ip": "headers.x-client-ip",
1886
1901
  "path": "path",
1887
1902
  "method": "method",
1888
1903
  "url": "url",
@@ -4837,13 +4852,13 @@
4837
4852
  "bundle": {
4838
4853
  "packages": {
4839
4854
  "@walkeros/collector": {
4840
- "version": "4.8.2"
4855
+ "version": "4.8.3-next-1793115089237"
4841
4856
  },
4842
4857
  "@walkeros/server-source-gcp": {
4843
- "version": "4.8.2"
4858
+ "version": "4.8.3-next-1793115089237"
4844
4859
  },
4845
4860
  "@walkeros/server-destination-gcp": {
4846
- "version": "4.8.2"
4861
+ "version": "4.8.3-next-1793115089237"
4847
4862
  }
4848
4863
  }
4849
4864
  }
@@ -349,7 +349,8 @@ walkeros push packages/cli/examples/flow-complete.json -f web -e '{"name":"order
349
349
  - **Features:**
350
350
  - `cmp-category-map` at
351
351
  `/flows/web/sources/usercentrics/config/settings/categoryMap`: categoryMap
352
- maps CMP categories onto exactly the consent keys the contract names.
352
+ maps CMP categories onto exactly the consent keys the contract names; folded
353
+ in, essential never grants functional alone.
353
354
  - `cmp-explicit-only` at
354
355
  `/flows/web/sources/usercentrics/config/settings/explicitOnly`: explicitOnly
355
356
  publishes consent only after a real decision, so consent.functional present
@@ -389,8 +390,9 @@ walkeros push packages/cli/examples/flow-complete.json -f web -e '{"name":"order
389
390
  - `pubsub-before` at `/flows/server/destinations/pubsub/before`: A conditional
390
391
  next on Pub/Sub runs pseudonymize only when an email exists; other events
391
392
  pass untouched.
392
- - `ga4-como` at `/flows/web/destinations/ga4/config/settings/como`: como turns
393
- walker consent into Google Consent Mode calls.
393
+ - `ga4-como` at `/flows/web/destinations/ga4/config/settings/como`: como maps
394
+ this flow's consent keys to Google Consent Mode: functional to
395
+ analytics_storage, marketing to the ad parameters.
394
396
  - **Consent keys:** there are no collector consent defaults, only granted keys
395
397
  travel. `consent.functional` is set only by Usercentrics with `explicitOnly`,
396
398
  so its presence means the user decided.