@walkeros/cli 4.9.0-next-1793283841805 → 4.9.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 +14 -7
- package/dist/cli.js +1541 -1416
- package/dist/examples/customers/README.md +2 -2
- package/dist/examples/flow-complete.json +52 -22
- package/dist/examples/flow-complete.md +32 -7
- package/dist/examples/index.d.ts +24 -0
- package/dist/examples/index.js +78 -24
- package/dist/examples/index.js.map +1 -1
- package/dist/examples/shared/README.md +3 -0
- package/dist/examples/shared/products/SKU-1 +1 -0
- package/dist/examples/shared/products/SKU-2 +1 -0
- package/dist/index.js +1 -1
- package/dist/validate.js +1 -1
- package/examples/customers/README.md +2 -2
- package/examples/flow-complete.json +52 -22
- package/examples/flow-complete.md +32 -7
- package/examples/shared/README.md +3 -0
- package/examples/shared/products/SKU-1 +1 -0
- package/examples/shared/products/SKU-2 +1 -0
- package/package.json +30 -30
|
@@ -6,6 +6,9 @@ Files the server flow of `flow-complete.json` serves first party.
|
|
|
6
6
|
- The `assets` store (`@walkeros/server-store-fs`,
|
|
7
7
|
`basePath: "$env.ASSETS_DIR:./shared"`) reads from it, and the `file`
|
|
8
8
|
transformer answers `GET /walker.js` with it.
|
|
9
|
+
- `products/SKU-1` and `products/SKU-2` are the demo products of the order
|
|
10
|
+
example as JSON (name and price, no personal data); the `productApi`
|
|
11
|
+
transformer answers `GET /demo/products/SKU-1` with them.
|
|
9
12
|
- `walker.js` is generated, not committed. Build the web flow straight into this
|
|
10
13
|
folder (web builds ignore root `include`):
|
|
11
14
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"Trail Runner","price":129.9}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"Running Socks","price":9.95}
|
package/dist/index.js
CHANGED
|
@@ -6515,7 +6515,7 @@ async function readStepPackageInfo(resolved, options) {
|
|
|
6515
6515
|
}
|
|
6516
6516
|
|
|
6517
6517
|
// src/commands/validate/validators/settings.ts
|
|
6518
|
-
var CLIENT_HEADER = "walkeros-cli/4.9.0
|
|
6518
|
+
var CLIENT_HEADER = "walkeros-cli/4.9.0";
|
|
6519
6519
|
var LOGGER = createLogger();
|
|
6520
6520
|
function createSettingsContext(configDir) {
|
|
6521
6521
|
return { configDir, cache: /* @__PURE__ */ new Map(), compiled: /* @__PURE__ */ new Map() };
|
package/dist/validate.js
CHANGED
|
@@ -870,7 +870,7 @@ async function readStepPackageInfo(resolved, options) {
|
|
|
870
870
|
}
|
|
871
871
|
|
|
872
872
|
// src/commands/validate/validators/settings.ts
|
|
873
|
-
var CLIENT_HEADER = "walkeros-cli/4.9.0
|
|
873
|
+
var CLIENT_HEADER = "walkeros-cli/4.9.0";
|
|
874
874
|
var LOGGER = createLogger();
|
|
875
875
|
function createSettingsContext(configDir) {
|
|
876
876
|
return { configDir, cache: /* @__PURE__ */ new Map(), compiled: /* @__PURE__ */ new Map() };
|
|
@@ -17,5 +17,5 @@ needs the variables the setup in `flow-complete.md` exports (`GCP_SA`,
|
|
|
17
17
|
`FINGERPRINT_SALT`, `EMAIL_SALT`, `META_ACCESS_TOKEN`).
|
|
18
18
|
|
|
19
19
|
In production the store is swapped for a real one, e.g.
|
|
20
|
-
`@walkeros/server-store-sheets
|
|
21
|
-
change.
|
|
20
|
+
`@walkeros/server-store-sheets`, a GCS store, or `@walkeros/server-store-api`
|
|
21
|
+
for your CRM's API; the `loadUser` step does not change.
|
|
@@ -241,25 +241,25 @@
|
|
|
241
241
|
"bundle": {
|
|
242
242
|
"packages": {
|
|
243
243
|
"@walkeros/collector": {
|
|
244
|
-
"version": "4.9.0
|
|
244
|
+
"version": "4.9.0"
|
|
245
245
|
},
|
|
246
246
|
"@walkeros/web-source-cmp-usercentrics": {
|
|
247
|
-
"version": "4.9.0
|
|
247
|
+
"version": "4.9.0"
|
|
248
248
|
},
|
|
249
249
|
"@walkeros/web-source-session": {
|
|
250
|
-
"version": "4.9.0
|
|
250
|
+
"version": "4.9.0"
|
|
251
251
|
},
|
|
252
252
|
"@walkeros/web-source-datalayer": {
|
|
253
|
-
"version": "4.9.0
|
|
253
|
+
"version": "4.9.0"
|
|
254
254
|
},
|
|
255
255
|
"@walkeros/web-source-browser": {
|
|
256
|
-
"version": "4.9.0
|
|
256
|
+
"version": "4.9.0"
|
|
257
257
|
},
|
|
258
258
|
"@walkeros/web-destination-gtag": {
|
|
259
|
-
"version": "4.9.0
|
|
259
|
+
"version": "4.9.0"
|
|
260
260
|
},
|
|
261
261
|
"@walkeros/web-destination-api": {
|
|
262
|
-
"version": "4.9.0
|
|
262
|
+
"version": "4.9.0"
|
|
263
263
|
}
|
|
264
264
|
},
|
|
265
265
|
"env": {
|
|
@@ -1778,40 +1778,40 @@
|
|
|
1778
1778
|
"bundle": {
|
|
1779
1779
|
"packages": {
|
|
1780
1780
|
"@walkeros/collector": {
|
|
1781
|
-
"version": "4.9.0
|
|
1781
|
+
"version": "4.9.0"
|
|
1782
1782
|
},
|
|
1783
1783
|
"@walkeros/server-source-express": {
|
|
1784
|
-
"version": "4.9.0
|
|
1784
|
+
"version": "4.9.0"
|
|
1785
1785
|
},
|
|
1786
1786
|
"@walkeros/transformer-ga4": {
|
|
1787
|
-
"version": "4.9.0
|
|
1787
|
+
"version": "4.9.0"
|
|
1788
1788
|
},
|
|
1789
1789
|
"@walkeros/transformer-validate": {
|
|
1790
|
-
"version": "4.9.0
|
|
1790
|
+
"version": "4.9.0"
|
|
1791
1791
|
},
|
|
1792
1792
|
"@walkeros/server-transformer-bot": {
|
|
1793
|
-
"version": "4.9.0
|
|
1793
|
+
"version": "4.9.0"
|
|
1794
1794
|
},
|
|
1795
1795
|
"@walkeros/server-transformer-fingerprint": {
|
|
1796
|
-
"version": "4.9.0
|
|
1796
|
+
"version": "4.9.0"
|
|
1797
1797
|
},
|
|
1798
1798
|
"@walkeros/server-transformer-file": {
|
|
1799
|
-
"version": "4.9.0
|
|
1799
|
+
"version": "4.9.0"
|
|
1800
1800
|
},
|
|
1801
1801
|
"@walkeros/server-store-fs": {
|
|
1802
|
-
"version": "4.9.0
|
|
1802
|
+
"version": "4.9.0"
|
|
1803
1803
|
},
|
|
1804
1804
|
"@walkeros/server-destination-gcp": {
|
|
1805
|
-
"version": "4.9.0
|
|
1805
|
+
"version": "4.9.0"
|
|
1806
1806
|
},
|
|
1807
1807
|
"@walkeros/server-destination-meta": {
|
|
1808
|
-
"version": "4.9.0
|
|
1808
|
+
"version": "4.9.0"
|
|
1809
1809
|
},
|
|
1810
1810
|
"@walkeros/server-destination-piwikpro": {
|
|
1811
|
-
"version": "4.9.0
|
|
1811
|
+
"version": "4.9.0"
|
|
1812
1812
|
},
|
|
1813
1813
|
"@walkeros/server-destination-datamanager": {
|
|
1814
|
-
"version": "4.9.0
|
|
1814
|
+
"version": "4.9.0"
|
|
1815
1815
|
}
|
|
1816
1816
|
}
|
|
1817
1817
|
}
|
|
@@ -1881,6 +1881,10 @@
|
|
|
1881
1881
|
{
|
|
1882
1882
|
"path": "/walker.js",
|
|
1883
1883
|
"methods": ["GET"]
|
|
1884
|
+
},
|
|
1885
|
+
{
|
|
1886
|
+
"path": "/demo/products/:id",
|
|
1887
|
+
"methods": ["GET"]
|
|
1884
1888
|
}
|
|
1885
1889
|
],
|
|
1886
1890
|
"cors": {
|
|
@@ -1942,6 +1946,14 @@
|
|
|
1942
1946
|
"value": "/g/collect"
|
|
1943
1947
|
},
|
|
1944
1948
|
"stop": true
|
|
1949
|
+
},
|
|
1950
|
+
{
|
|
1951
|
+
"match": {
|
|
1952
|
+
"key": "ingest.path",
|
|
1953
|
+
"operator": "prefix",
|
|
1954
|
+
"value": "/demo/products/"
|
|
1955
|
+
},
|
|
1956
|
+
"next": "productApi"
|
|
1945
1957
|
}
|
|
1946
1958
|
]
|
|
1947
1959
|
},
|
|
@@ -2412,6 +2424,7 @@
|
|
|
2412
2424
|
},
|
|
2413
2425
|
"config": {
|
|
2414
2426
|
"settings": {
|
|
2427
|
+
"prefix": "/",
|
|
2415
2428
|
"headers": {
|
|
2416
2429
|
"Cache-Control": "public, max-age=300",
|
|
2417
2430
|
"Cross-Origin-Resource-Policy": "same-site"
|
|
@@ -2422,6 +2435,23 @@
|
|
|
2422
2435
|
"stop": true
|
|
2423
2436
|
}
|
|
2424
2437
|
},
|
|
2438
|
+
"productApi": {
|
|
2439
|
+
"package": "@walkeros/server-transformer-file",
|
|
2440
|
+
"env": {
|
|
2441
|
+
"store": "$store.assets"
|
|
2442
|
+
},
|
|
2443
|
+
"config": {
|
|
2444
|
+
"settings": {
|
|
2445
|
+
"prefix": "/demo/",
|
|
2446
|
+
"headers": {
|
|
2447
|
+
"Content-Type": "application/json; charset=utf-8"
|
|
2448
|
+
}
|
|
2449
|
+
}
|
|
2450
|
+
},
|
|
2451
|
+
"next": {
|
|
2452
|
+
"stop": true
|
|
2453
|
+
}
|
|
2454
|
+
},
|
|
2425
2455
|
"dedup": {
|
|
2426
2456
|
"cache": {
|
|
2427
2457
|
"stop": true,
|
|
@@ -4852,13 +4882,13 @@
|
|
|
4852
4882
|
"bundle": {
|
|
4853
4883
|
"packages": {
|
|
4854
4884
|
"@walkeros/collector": {
|
|
4855
|
-
"version": "4.9.0
|
|
4885
|
+
"version": "4.9.0"
|
|
4856
4886
|
},
|
|
4857
4887
|
"@walkeros/server-source-gcp": {
|
|
4858
|
-
"version": "4.9.0
|
|
4888
|
+
"version": "4.9.0"
|
|
4859
4889
|
},
|
|
4860
4890
|
"@walkeros/server-destination-gcp": {
|
|
4861
|
-
"version": "4.9.0
|
|
4891
|
+
"version": "4.9.0"
|
|
4862
4892
|
}
|
|
4863
4893
|
}
|
|
4864
4894
|
}
|
|
@@ -39,8 +39,8 @@ web usercentrics, session, dataLayer, browser
|
|
|
39
39
|
-> collector.next: opt-out stop, pageGroup
|
|
40
40
|
-> ga4 (to Google, main property) gtm (dataLayer) collect (to server)
|
|
41
41
|
|
|
42
|
-
server express /collect /g/collect /walker.js
|
|
43
|
-
before: one [ G-SUBSITE hit -> ga4Decode -> ga4Consent | *.js -> file (stop) | other /g/collect (stop) ]
|
|
42
|
+
server express /collect /g/collect /walker.js /demo/products/:id
|
|
43
|
+
before: one [ G-SUBSITE hit -> ga4Decode -> ga4Consent | *.js -> file (stop) | other /g/collect (stop) | /demo/products/ -> productApi (stop) ]
|
|
44
44
|
next: opt-out stop, dedup
|
|
45
45
|
-> collector.next: fingerprint, bot, not impression -> enrich [ loadUser, sessionSave, sessionLoad, validate ]
|
|
46
46
|
-> pubsub (every event, email pseudonymized)
|
|
@@ -140,13 +140,14 @@ walkeros push packages/cli/examples/flow-complete.json -f web -e '{"name":"page
|
|
|
140
140
|
## server-entry: A first-party endpoint, and a GA4 migration path
|
|
141
141
|
|
|
142
142
|
- **Purpose:** one express source answers the browser (`/collect`), GA4 hits of
|
|
143
|
-
a sub-site (`/g/collect`)
|
|
143
|
+
a sub-site (`/g/collect`), script requests (`/walker.js`) and product lookups
|
|
144
|
+
(`/demo/products/:id`).
|
|
144
145
|
- **Features:**
|
|
145
146
|
- `server-url` at `/flows/server/config/url`: The full collect endpoint, local
|
|
146
147
|
by default, SERVER_URL in production.
|
|
147
148
|
- `express-paths` at `/flows/server/sources/express/config/settings/paths`:
|
|
148
149
|
One route per job, each with its own methods: /collect, /g/collect,
|
|
149
|
-
/walker.js.
|
|
150
|
+
/walker.js, /demo/products/:id.
|
|
150
151
|
- `express-cors` at `/flows/server/sources/express/config/settings/cors`: CORS
|
|
151
152
|
response headers for the shop origin; express adds X-Content-Type-Options
|
|
152
153
|
itself.
|
|
@@ -740,6 +741,15 @@ walkeros push packages/cli/examples/flow-complete.json -f server -e '{"name":"pa
|
|
|
740
741
|
first party from the server flow.
|
|
741
742
|
- `file-headers` at `/flows/server/transformers/file/config/settings/headers`:
|
|
742
743
|
Default response headers for served files: caching and resource policy.
|
|
744
|
+
- `file-prefix` at `/flows/server/transformers/file/config/settings/prefix`:
|
|
745
|
+
prefix / makes the step own every script request: a missing walker.js
|
|
746
|
+
answers 404 instead of the tracking pixel.
|
|
747
|
+
- `products-case` at `/flows/server/sources/express/before/one/3`: The last
|
|
748
|
+
case sends product lookups (/demo/products/<id>) to productApi.
|
|
749
|
+
- `product-api` at `/flows/server/transformers/productApi`: A lookup route:
|
|
750
|
+
GET /demo/products/<id> answers the product as JSON from the assets store
|
|
751
|
+
(prefix /demo/ is stripped to the key products/<id>; headers sets the JSON
|
|
752
|
+
Content-Type), 404 for an unknown id, and never becomes an event.
|
|
743
753
|
- `gclid-to-ads` at
|
|
744
754
|
`/flows/server/destinations/datamanager/config/mapping/order/complete/data/map/gclid`:
|
|
745
755
|
The gclid saved at session start reaches Google Ads with the purchase.
|
|
@@ -752,12 +762,27 @@ walkeros push packages/cli/examples/flow-complete.json -f server -e '{"name":"pa
|
|
|
752
762
|
(`packages/cli/examples/customers`, one JSON record per customer id), outside
|
|
753
763
|
root `include`, so no customer data ships in a bundle. `basePath` is relative
|
|
754
764
|
to the working directory, so `CUSTOMERS_DIR` holds it as an absolute path (the
|
|
755
|
-
setup block at the top exports it). In production a Sheets or GCS store
|
|
756
|
-
its place; `loadUser`
|
|
765
|
+
setup block at the top exports it). In production a Sheets or GCS store, or
|
|
766
|
+
`@walkeros/server-store-api` for your CRM's API, takes its place; `loadUser`
|
|
767
|
+
does not change.
|
|
757
768
|
- **walker.js first party:** the `file` transformer answers `GET /walker.js`
|
|
758
769
|
from the `assets` store with `settings.headers` (`Cache-Control`,
|
|
759
770
|
`Cross-Origin-Resource-Policy`) and ends with `next: { stop: true }`. Express
|
|
760
|
-
`settings.cors` adds the CORS headers.
|
|
771
|
+
`settings.cors` adds the CORS headers. With `prefix: "/"` the step owns every
|
|
772
|
+
script request: a missing `walker.js` answers 404 with
|
|
773
|
+
`Cache-Control: no-store` instead of the tracking pixel.
|
|
774
|
+
- **A lookup route:** `productApi` is a second `file` step on the same `assets`
|
|
775
|
+
store. `GET /demo/products/SKU-1` answers 200 with the product as JSON
|
|
776
|
+
(`shared/products/SKU-1`; `settings.headers` sets the JSON `Content-Type`,
|
|
777
|
+
since the step serves bytes as stored), an unknown id answers 404 with
|
|
778
|
+
`Cache-Control: no-store`, and `next: { stop: true }` keeps every lookup from
|
|
779
|
+
becoming an event. A failing store read answers 503 and is logged at ERROR.
|
|
780
|
+
|
|
781
|
+
```bash
|
|
782
|
+
curl -i http://localhost:8080/demo/products/SKU-1
|
|
783
|
+
curl -i http://localhost:8080/demo/products/SKU-9
|
|
784
|
+
```
|
|
785
|
+
|
|
761
786
|
- **Why `X-Content-Type-Options: nosniff` is not in the file:** express sets it
|
|
762
787
|
on every response itself.
|
|
763
788
|
- The `file` example is proven over HTTP in the integration test; its simulation
|
|
@@ -6,6 +6,9 @@ Files the server flow of `flow-complete.json` serves first party.
|
|
|
6
6
|
- The `assets` store (`@walkeros/server-store-fs`,
|
|
7
7
|
`basePath: "$env.ASSETS_DIR:./shared"`) reads from it, and the `file`
|
|
8
8
|
transformer answers `GET /walker.js` with it.
|
|
9
|
+
- `products/SKU-1` and `products/SKU-2` are the demo products of the order
|
|
10
|
+
example as JSON (name and price, no personal data); the `productApi`
|
|
11
|
+
transformer answers `GET /demo/products/SKU-1` with them.
|
|
9
12
|
- `walker.js` is generated, not committed. Build the web flow straight into this
|
|
10
13
|
folder (web builds ignore root `include`):
|
|
11
14
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"Trail Runner","price":129.9}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"Running Socks","price":9.95}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/cli",
|
|
3
|
-
"version": "4.9.0
|
|
3
|
+
"version": "4.9.0",
|
|
4
4
|
"description": "walkerOS CLI - Bundle and deploy walkerOS components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@vercel/nft": "^1.10.2",
|
|
56
|
-
"@walkeros/collector": "4.9.0
|
|
57
|
-
"@walkeros/core": "4.9.0
|
|
58
|
-
"@walkeros/server-core": "4.9.0
|
|
59
|
-
"@walkeros/server-destination-api": "4.9.0
|
|
60
|
-
"@walkeros/transformer-validate": "4.9.0
|
|
61
|
-
"@walkeros/web-core": "4.9.0
|
|
56
|
+
"@walkeros/collector": "4.9.0",
|
|
57
|
+
"@walkeros/core": "4.9.0",
|
|
58
|
+
"@walkeros/server-core": "4.9.0",
|
|
59
|
+
"@walkeros/server-destination-api": "4.9.0",
|
|
60
|
+
"@walkeros/transformer-validate": "4.9.0",
|
|
61
|
+
"@walkeros/web-core": "4.9.0",
|
|
62
62
|
"ajv": "^8.17.1",
|
|
63
63
|
"chalk": "^5.6.2",
|
|
64
64
|
"ci-info": "^4.4.0",
|
|
@@ -80,29 +80,29 @@
|
|
|
80
80
|
"@types/pacote": "^11.1.8",
|
|
81
81
|
"@types/picomatch": "4.0.3",
|
|
82
82
|
"@types/semver": "^7.7.1",
|
|
83
|
-
"@walkeros/config": "4.9.0
|
|
84
|
-
"@walkeros/core": "4.9.0
|
|
85
|
-
"@walkeros/destination-demo": "4.9.0
|
|
86
|
-
"@walkeros/server-destination-aws": "4.9.0
|
|
87
|
-
"@walkeros/server-destination-datamanager": "4.9.0
|
|
88
|
-
"@walkeros/server-destination-gcp": "4.9.0
|
|
89
|
-
"@walkeros/server-destination-meta": "4.9.0
|
|
90
|
-
"@walkeros/server-destination-piwikpro": "4.9.0
|
|
91
|
-
"@walkeros/server-source-aws": "4.9.0
|
|
92
|
-
"@walkeros/server-source-express": "4.9.0
|
|
93
|
-
"@walkeros/server-source-gcp": "4.9.0
|
|
94
|
-
"@walkeros/server-store-fs": "4.9.0
|
|
95
|
-
"@walkeros/server-transformer-bot": "4.9.0
|
|
96
|
-
"@walkeros/server-transformer-file": "4.9.0
|
|
97
|
-
"@walkeros/server-transformer-fingerprint": "4.9.0
|
|
98
|
-
"@walkeros/transformer-ga4": "4.9.0
|
|
99
|
-
"@walkeros/web-destination-api": "4.9.0
|
|
100
|
-
"@walkeros/web-destination-gtag": "4.9.0
|
|
101
|
-
"@walkeros/web-source-browser": "4.9.0
|
|
102
|
-
"@walkeros/web-source-cmp-cookiefirst": "4.9.0
|
|
103
|
-
"@walkeros/web-source-cmp-usercentrics": "4.9.0
|
|
104
|
-
"@walkeros/web-source-datalayer": "4.9.0
|
|
105
|
-
"@walkeros/web-source-session": "4.9.0
|
|
83
|
+
"@walkeros/config": "4.9.0",
|
|
84
|
+
"@walkeros/core": "4.9.0",
|
|
85
|
+
"@walkeros/destination-demo": "4.9.0",
|
|
86
|
+
"@walkeros/server-destination-aws": "4.9.0",
|
|
87
|
+
"@walkeros/server-destination-datamanager": "4.9.0",
|
|
88
|
+
"@walkeros/server-destination-gcp": "4.9.0",
|
|
89
|
+
"@walkeros/server-destination-meta": "4.9.0",
|
|
90
|
+
"@walkeros/server-destination-piwikpro": "4.9.0",
|
|
91
|
+
"@walkeros/server-source-aws": "4.9.0",
|
|
92
|
+
"@walkeros/server-source-express": "4.9.0",
|
|
93
|
+
"@walkeros/server-source-gcp": "4.9.0",
|
|
94
|
+
"@walkeros/server-store-fs": "4.9.0",
|
|
95
|
+
"@walkeros/server-transformer-bot": "4.9.0",
|
|
96
|
+
"@walkeros/server-transformer-file": "4.9.0",
|
|
97
|
+
"@walkeros/server-transformer-fingerprint": "4.9.0",
|
|
98
|
+
"@walkeros/transformer-ga4": "4.9.0",
|
|
99
|
+
"@walkeros/web-destination-api": "4.9.0",
|
|
100
|
+
"@walkeros/web-destination-gtag": "4.9.0",
|
|
101
|
+
"@walkeros/web-source-browser": "4.9.0",
|
|
102
|
+
"@walkeros/web-source-cmp-cookiefirst": "4.9.0",
|
|
103
|
+
"@walkeros/web-source-cmp-usercentrics": "4.9.0",
|
|
104
|
+
"@walkeros/web-source-datalayer": "4.9.0",
|
|
105
|
+
"@walkeros/web-source-session": "4.9.0",
|
|
106
106
|
"msw": "^2.12.10",
|
|
107
107
|
"tsx": "^4.21.0"
|
|
108
108
|
},
|