@gradial/aci 0.1.42 → 0.1.43

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 (63) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +4 -4
  3. package/dist/audience-data-models.d.ts +286 -0
  4. package/dist/audience-data-models.js +46 -0
  5. package/dist/cli/compile-registry.d.mts +5 -1
  6. package/dist/cli/compile-registry.mjs +25 -10
  7. package/dist/cli/validate-content.d.mts +31 -1
  8. package/dist/cli/validate-content.mjs +50 -12
  9. package/dist/collect/aci.js +1 -0
  10. package/dist/collect/aci.js.sha256 +1 -0
  11. package/dist/collect/batcher.d.ts +2 -0
  12. package/dist/collect/batcher.js +18 -6
  13. package/dist/collect/consent/envelope.d.ts +9 -3
  14. package/dist/collect/consent/envelope.js +58 -40
  15. package/dist/collect/index.js +9 -2
  16. package/dist/collect/linkclicks.js +4 -2
  17. package/dist/collect/transport.d.ts +2 -0
  18. package/dist/collect/transport.js +6 -3
  19. package/dist/consent/portable-envelope.d.ts +9 -0
  20. package/dist/consent/portable-envelope.js +110 -0
  21. package/dist/consent-banner/index.js +2 -1
  22. package/dist/content/assets.d.ts +1 -0
  23. package/dist/content/assets.js +1 -0
  24. package/dist/content/resolve-slots.js +1 -0
  25. package/dist/content/types.d.ts +2 -0
  26. package/dist/next/collect-route.d.ts +2 -2
  27. package/dist/next/collect-route.js +90 -19
  28. package/dist/next/envelope-digest.d.ts +21 -0
  29. package/dist/next/envelope-digest.js +58 -0
  30. package/dist/next/middleware.d.ts +16 -2
  31. package/dist/next/middleware.js +190 -10
  32. package/dist/next/personalization-host.d.ts +16 -7
  33. package/dist/next/personalization-host.js +14 -33
  34. package/dist/next/server.d.ts +1 -0
  35. package/dist/next/server.js +3 -0
  36. package/dist/next/vercel-collect-sdk-route.d.ts +27 -0
  37. package/dist/next/vercel-collect-sdk-route.js +205 -0
  38. package/dist/next/vercel-personalization.d.ts +3 -2
  39. package/dist/next/vercel-personalization.js +3 -2
  40. package/dist/next/vercel-s3-personalization.d.ts +25 -4
  41. package/dist/next/vercel-s3-personalization.js +368 -14
  42. package/dist/providers/s3.d.ts +19 -4
  43. package/dist/providers/s3.js +92 -22
  44. package/dist/testing/conformance/checks.js +75 -4
  45. package/dist/types/block-ref.d.ts +2 -0
  46. package/dist/types/block-ref.js +1 -0
  47. package/package.json +27 -16
  48. package/src/cli/compile-registry.mjs +24 -10
  49. package/src/cli/validate-content.mjs +52 -13
  50. package/src/types/block-ref.test.ts +45 -0
  51. package/src/types/block-ref.ts +2 -0
  52. package/templates/astro/starter-content/src/fixtures/atomicBlocks.ts +7 -6
  53. package/templates/astro/starter-content/src/fixtures/composition.ts +3 -2
  54. package/templates/astro/starter-content/src/fixtures/sections.ts +2 -1
  55. package/templates/common/.agents/skills/authoring/SKILL.md +11 -3
  56. package/templates/common/.agents/skills/authoring/references/block-slots.md +3 -0
  57. package/templates/common/.content/pages/home/_index.json +10 -0
  58. package/templates/common/starter-content/.content/pages/about/_index.json +3 -0
  59. package/templates/common/starter-content/.content/pages/home/_index.json +9 -0
  60. package/templates/nextjs/starter-content/src/middleware.ts +31 -1
  61. package/templates/nextjs/template/src/app/collect/route.ts +2 -2
  62. package/templates/nextjs/template/src/middleware.ts +31 -1
  63. package/templates/nextjs/template/src/middleware.ts.tmpl +31 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.43 - 2026-07-27
4
+
5
+ ### Fixed
6
+
7
+ - Ship the native CLI support required by the starter's `event_latest`
8
+ audience criteria in the same release as the SDK, so `aci content compile`
9
+ cannot resolve an older nested platform binary.
10
+
3
11
  ## 0.1.40 - 2026-07-21
4
12
 
5
13
  ### Added
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Agentic Content Infrastructure SDK
2
2
 
3
- `@gradial/aci` `0.1.33` is a pre-1.0 public-surface reset for the ACI
3
+ `@gradial/aci` `0.1.43` is a pre-1.0 public-surface reset for the ACI
4
4
  client SDK. Breaking changes from the old `0.1.x` accidental surface are
5
5
  intentional: the root import is framework-neutral, framework runtime behavior is
6
6
  behind explicit subpaths, and the first required customer path is React/Next.
@@ -8,7 +8,7 @@ behind explicit subpaths, and the first required customer path is React/Next.
8
8
  ## Install
9
9
 
10
10
  ```bash
11
- npm install @gradial/aci@0.1.33 zod@^4
11
+ npm install @gradial/aci@0.1.43 zod@^4
12
12
  ```
13
13
 
14
14
  ## Root Import
@@ -85,13 +85,13 @@ go through an app-owned HTTP endpoint backed server-side by a `ContentProvider`.
85
85
  The first RC scaffold path is Next:
86
86
 
87
87
  ```bash
88
- npx @gradial/aci@0.1.33 init my-site --template next-starter
88
+ npx @gradial/aci@0.1.43 init my-site --template next-starter
89
89
  ```
90
90
 
91
91
  List available templates:
92
92
 
93
93
  ```bash
94
- npx @gradial/aci@0.1.33 init --list
94
+ npx @gradial/aci@0.1.43 init --list
95
95
  ```
96
96
 
97
97
  ## Personalization: The One-Tag Install
@@ -9,6 +9,149 @@ export declare const segmentDataModel: import("./index.js").DataModelContract<z.
9
9
  }>;
10
10
  priority: z.ZodOptional<z.ZodNumber>;
11
11
  description: z.ZodOptional<z.ZodString>;
12
+ criteria: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
13
+ all: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
14
+ minCount: z.ZodNumber;
15
+ event: z.ZodString;
16
+ path: z.ZodOptional<z.ZodString>;
17
+ referrer: z.ZodOptional<z.ZodString>;
18
+ withinDays: z.ZodOptional<z.ZodNumber>;
19
+ experiment: z.ZodOptional<z.ZodObject<{
20
+ experimentId: z.ZodString;
21
+ armId: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strict>>;
23
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
24
+ type: z.ZodLiteral<"event_count">;
25
+ }, z.core.$strict>, z.ZodObject<{
26
+ event: z.ZodString;
27
+ path: z.ZodOptional<z.ZodString>;
28
+ referrer: z.ZodOptional<z.ZodString>;
29
+ withinDays: z.ZodOptional<z.ZodNumber>;
30
+ experiment: z.ZodOptional<z.ZodObject<{
31
+ experimentId: z.ZodString;
32
+ armId: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>>;
34
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
35
+ type: z.ZodLiteral<"event_exists">;
36
+ }, z.core.$strict>, z.ZodObject<{
37
+ event: z.ZodString;
38
+ path: z.ZodOptional<z.ZodString>;
39
+ referrer: z.ZodOptional<z.ZodString>;
40
+ withinDays: z.ZodOptional<z.ZodNumber>;
41
+ experiment: z.ZodOptional<z.ZodObject<{
42
+ experimentId: z.ZodString;
43
+ armId: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strict>>;
45
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
46
+ type: z.ZodLiteral<"event_latest">;
47
+ }, z.core.$strict>], "type">>;
48
+ any: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
49
+ minCount: z.ZodNumber;
50
+ event: z.ZodString;
51
+ path: z.ZodOptional<z.ZodString>;
52
+ referrer: z.ZodOptional<z.ZodString>;
53
+ withinDays: z.ZodOptional<z.ZodNumber>;
54
+ experiment: z.ZodOptional<z.ZodObject<{
55
+ experimentId: z.ZodString;
56
+ armId: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strict>>;
58
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
59
+ type: z.ZodLiteral<"event_count">;
60
+ }, z.core.$strict>, z.ZodObject<{
61
+ event: z.ZodString;
62
+ path: z.ZodOptional<z.ZodString>;
63
+ referrer: z.ZodOptional<z.ZodString>;
64
+ withinDays: z.ZodOptional<z.ZodNumber>;
65
+ experiment: z.ZodOptional<z.ZodObject<{
66
+ experimentId: z.ZodString;
67
+ armId: z.ZodOptional<z.ZodString>;
68
+ }, z.core.$strict>>;
69
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
70
+ type: z.ZodLiteral<"event_exists">;
71
+ }, z.core.$strict>, z.ZodObject<{
72
+ event: z.ZodString;
73
+ path: z.ZodOptional<z.ZodString>;
74
+ referrer: z.ZodOptional<z.ZodString>;
75
+ withinDays: z.ZodOptional<z.ZodNumber>;
76
+ experiment: z.ZodOptional<z.ZodObject<{
77
+ experimentId: z.ZodString;
78
+ armId: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strict>>;
80
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
81
+ type: z.ZodLiteral<"event_latest">;
82
+ }, z.core.$strict>], "type">>>;
83
+ }, z.core.$strict>, z.ZodObject<{
84
+ all: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
85
+ minCount: z.ZodNumber;
86
+ event: z.ZodString;
87
+ path: z.ZodOptional<z.ZodString>;
88
+ referrer: z.ZodOptional<z.ZodString>;
89
+ withinDays: z.ZodOptional<z.ZodNumber>;
90
+ experiment: z.ZodOptional<z.ZodObject<{
91
+ experimentId: z.ZodString;
92
+ armId: z.ZodOptional<z.ZodString>;
93
+ }, z.core.$strict>>;
94
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
95
+ type: z.ZodLiteral<"event_count">;
96
+ }, z.core.$strict>, z.ZodObject<{
97
+ event: z.ZodString;
98
+ path: z.ZodOptional<z.ZodString>;
99
+ referrer: z.ZodOptional<z.ZodString>;
100
+ withinDays: z.ZodOptional<z.ZodNumber>;
101
+ experiment: z.ZodOptional<z.ZodObject<{
102
+ experimentId: z.ZodString;
103
+ armId: z.ZodOptional<z.ZodString>;
104
+ }, z.core.$strict>>;
105
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
106
+ type: z.ZodLiteral<"event_exists">;
107
+ }, z.core.$strict>, z.ZodObject<{
108
+ event: z.ZodString;
109
+ path: z.ZodOptional<z.ZodString>;
110
+ referrer: z.ZodOptional<z.ZodString>;
111
+ withinDays: z.ZodOptional<z.ZodNumber>;
112
+ experiment: z.ZodOptional<z.ZodObject<{
113
+ experimentId: z.ZodString;
114
+ armId: z.ZodOptional<z.ZodString>;
115
+ }, z.core.$strict>>;
116
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
117
+ type: z.ZodLiteral<"event_latest">;
118
+ }, z.core.$strict>], "type">>>;
119
+ any: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
120
+ minCount: z.ZodNumber;
121
+ event: z.ZodString;
122
+ path: z.ZodOptional<z.ZodString>;
123
+ referrer: z.ZodOptional<z.ZodString>;
124
+ withinDays: z.ZodOptional<z.ZodNumber>;
125
+ experiment: z.ZodOptional<z.ZodObject<{
126
+ experimentId: z.ZodString;
127
+ armId: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strict>>;
129
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
130
+ type: z.ZodLiteral<"event_count">;
131
+ }, z.core.$strict>, z.ZodObject<{
132
+ event: z.ZodString;
133
+ path: z.ZodOptional<z.ZodString>;
134
+ referrer: z.ZodOptional<z.ZodString>;
135
+ withinDays: z.ZodOptional<z.ZodNumber>;
136
+ experiment: z.ZodOptional<z.ZodObject<{
137
+ experimentId: z.ZodString;
138
+ armId: z.ZodOptional<z.ZodString>;
139
+ }, z.core.$strict>>;
140
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
141
+ type: z.ZodLiteral<"event_exists">;
142
+ }, z.core.$strict>, z.ZodObject<{
143
+ event: z.ZodString;
144
+ path: z.ZodOptional<z.ZodString>;
145
+ referrer: z.ZodOptional<z.ZodString>;
146
+ withinDays: z.ZodOptional<z.ZodNumber>;
147
+ experiment: z.ZodOptional<z.ZodObject<{
148
+ experimentId: z.ZodString;
149
+ armId: z.ZodOptional<z.ZodString>;
150
+ }, z.core.$strict>>;
151
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
152
+ type: z.ZodLiteral<"event_latest">;
153
+ }, z.core.$strict>], "type">>;
154
+ }, z.core.$strict>]>>;
12
155
  }, z.core.$strip>, "segment">;
13
156
  export declare const audienceDataModel: import("./index.js").DataModelContract<z.ZodObject<{
14
157
  id: z.ZodString;
@@ -259,6 +402,149 @@ export declare const audienceDataModels: (import("./index.js").DataModelContract
259
402
  }>;
260
403
  priority: z.ZodOptional<z.ZodNumber>;
261
404
  description: z.ZodOptional<z.ZodString>;
405
+ criteria: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
406
+ all: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
407
+ minCount: z.ZodNumber;
408
+ event: z.ZodString;
409
+ path: z.ZodOptional<z.ZodString>;
410
+ referrer: z.ZodOptional<z.ZodString>;
411
+ withinDays: z.ZodOptional<z.ZodNumber>;
412
+ experiment: z.ZodOptional<z.ZodObject<{
413
+ experimentId: z.ZodString;
414
+ armId: z.ZodOptional<z.ZodString>;
415
+ }, z.core.$strict>>;
416
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
417
+ type: z.ZodLiteral<"event_count">;
418
+ }, z.core.$strict>, z.ZodObject<{
419
+ event: z.ZodString;
420
+ path: z.ZodOptional<z.ZodString>;
421
+ referrer: z.ZodOptional<z.ZodString>;
422
+ withinDays: z.ZodOptional<z.ZodNumber>;
423
+ experiment: z.ZodOptional<z.ZodObject<{
424
+ experimentId: z.ZodString;
425
+ armId: z.ZodOptional<z.ZodString>;
426
+ }, z.core.$strict>>;
427
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
428
+ type: z.ZodLiteral<"event_exists">;
429
+ }, z.core.$strict>, z.ZodObject<{
430
+ event: z.ZodString;
431
+ path: z.ZodOptional<z.ZodString>;
432
+ referrer: z.ZodOptional<z.ZodString>;
433
+ withinDays: z.ZodOptional<z.ZodNumber>;
434
+ experiment: z.ZodOptional<z.ZodObject<{
435
+ experimentId: z.ZodString;
436
+ armId: z.ZodOptional<z.ZodString>;
437
+ }, z.core.$strict>>;
438
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
439
+ type: z.ZodLiteral<"event_latest">;
440
+ }, z.core.$strict>], "type">>;
441
+ any: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
442
+ minCount: z.ZodNumber;
443
+ event: z.ZodString;
444
+ path: z.ZodOptional<z.ZodString>;
445
+ referrer: z.ZodOptional<z.ZodString>;
446
+ withinDays: z.ZodOptional<z.ZodNumber>;
447
+ experiment: z.ZodOptional<z.ZodObject<{
448
+ experimentId: z.ZodString;
449
+ armId: z.ZodOptional<z.ZodString>;
450
+ }, z.core.$strict>>;
451
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
452
+ type: z.ZodLiteral<"event_count">;
453
+ }, z.core.$strict>, z.ZodObject<{
454
+ event: z.ZodString;
455
+ path: z.ZodOptional<z.ZodString>;
456
+ referrer: z.ZodOptional<z.ZodString>;
457
+ withinDays: z.ZodOptional<z.ZodNumber>;
458
+ experiment: z.ZodOptional<z.ZodObject<{
459
+ experimentId: z.ZodString;
460
+ armId: z.ZodOptional<z.ZodString>;
461
+ }, z.core.$strict>>;
462
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
463
+ type: z.ZodLiteral<"event_exists">;
464
+ }, z.core.$strict>, z.ZodObject<{
465
+ event: z.ZodString;
466
+ path: z.ZodOptional<z.ZodString>;
467
+ referrer: z.ZodOptional<z.ZodString>;
468
+ withinDays: z.ZodOptional<z.ZodNumber>;
469
+ experiment: z.ZodOptional<z.ZodObject<{
470
+ experimentId: z.ZodString;
471
+ armId: z.ZodOptional<z.ZodString>;
472
+ }, z.core.$strict>>;
473
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
474
+ type: z.ZodLiteral<"event_latest">;
475
+ }, z.core.$strict>], "type">>>;
476
+ }, z.core.$strict>, z.ZodObject<{
477
+ all: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
478
+ minCount: z.ZodNumber;
479
+ event: z.ZodString;
480
+ path: z.ZodOptional<z.ZodString>;
481
+ referrer: z.ZodOptional<z.ZodString>;
482
+ withinDays: z.ZodOptional<z.ZodNumber>;
483
+ experiment: z.ZodOptional<z.ZodObject<{
484
+ experimentId: z.ZodString;
485
+ armId: z.ZodOptional<z.ZodString>;
486
+ }, z.core.$strict>>;
487
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
488
+ type: z.ZodLiteral<"event_count">;
489
+ }, z.core.$strict>, z.ZodObject<{
490
+ event: z.ZodString;
491
+ path: z.ZodOptional<z.ZodString>;
492
+ referrer: z.ZodOptional<z.ZodString>;
493
+ withinDays: z.ZodOptional<z.ZodNumber>;
494
+ experiment: z.ZodOptional<z.ZodObject<{
495
+ experimentId: z.ZodString;
496
+ armId: z.ZodOptional<z.ZodString>;
497
+ }, z.core.$strict>>;
498
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
499
+ type: z.ZodLiteral<"event_exists">;
500
+ }, z.core.$strict>, z.ZodObject<{
501
+ event: z.ZodString;
502
+ path: z.ZodOptional<z.ZodString>;
503
+ referrer: z.ZodOptional<z.ZodString>;
504
+ withinDays: z.ZodOptional<z.ZodNumber>;
505
+ experiment: z.ZodOptional<z.ZodObject<{
506
+ experimentId: z.ZodString;
507
+ armId: z.ZodOptional<z.ZodString>;
508
+ }, z.core.$strict>>;
509
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
510
+ type: z.ZodLiteral<"event_latest">;
511
+ }, z.core.$strict>], "type">>>;
512
+ any: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
513
+ minCount: z.ZodNumber;
514
+ event: z.ZodString;
515
+ path: z.ZodOptional<z.ZodString>;
516
+ referrer: z.ZodOptional<z.ZodString>;
517
+ withinDays: z.ZodOptional<z.ZodNumber>;
518
+ experiment: z.ZodOptional<z.ZodObject<{
519
+ experimentId: z.ZodString;
520
+ armId: z.ZodOptional<z.ZodString>;
521
+ }, z.core.$strict>>;
522
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
523
+ type: z.ZodLiteral<"event_count">;
524
+ }, z.core.$strict>, z.ZodObject<{
525
+ event: z.ZodString;
526
+ path: z.ZodOptional<z.ZodString>;
527
+ referrer: z.ZodOptional<z.ZodString>;
528
+ withinDays: z.ZodOptional<z.ZodNumber>;
529
+ experiment: z.ZodOptional<z.ZodObject<{
530
+ experimentId: z.ZodString;
531
+ armId: z.ZodOptional<z.ZodString>;
532
+ }, z.core.$strict>>;
533
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
534
+ type: z.ZodLiteral<"event_exists">;
535
+ }, z.core.$strict>, z.ZodObject<{
536
+ event: z.ZodString;
537
+ path: z.ZodOptional<z.ZodString>;
538
+ referrer: z.ZodOptional<z.ZodString>;
539
+ withinDays: z.ZodOptional<z.ZodNumber>;
540
+ experiment: z.ZodOptional<z.ZodObject<{
541
+ experimentId: z.ZodString;
542
+ armId: z.ZodOptional<z.ZodString>;
543
+ }, z.core.$strict>>;
544
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
545
+ type: z.ZodLiteral<"event_latest">;
546
+ }, z.core.$strict>], "type">>;
547
+ }, z.core.$strict>]>>;
262
548
  }, z.core.$strip>, "segment"> | import("./index.js").DataModelContract<z.ZodObject<{
263
549
  id: z.ZodString;
264
550
  displayName: z.ZodString;
@@ -4,6 +4,51 @@ const resourceStatus = z.enum(['draft', 'enabled', 'disabled']);
4
4
  const experimentStatus = z.enum(['draft', 'running', 'paused', 'stopped', 'promoted', 'archived']);
5
5
  const experimentKind = z.enum(['ab', 'abn', 'xt']);
6
6
  const scalarValue = z.union([z.string(), z.number(), z.boolean()]);
7
+ // Largest whole-day window whose nanoseconds fit in Go's time.Duration:
8
+ // floor(MaxInt64 / (24 * time.Hour)) = 106751.
9
+ const maxCriteriaWithinDays = 106751;
10
+ const criteriaFilterValue = z.union([
11
+ z.string().regex(/^(?!\*$)/, 'must not be a lone "*"'),
12
+ z.number(),
13
+ z.boolean(),
14
+ ]);
15
+ const criteriaExperimentSchema = z.object({
16
+ experimentId: z.string().regex(/\S/, 'experimentId is required'),
17
+ armId: z.string().optional(),
18
+ }).strict();
19
+ const criteriaFilterShape = {
20
+ event: z.string().regex(/\S/, 'event is required'),
21
+ path: z.string().regex(/^(?!\*$)/, 'path must not be a lone "*"').optional(),
22
+ referrer: z.string().regex(/^(?!\*$)/, 'referrer must not be a lone "*"').optional(),
23
+ withinDays: z.number().int().positive().max(maxCriteriaWithinDays).optional(),
24
+ experiment: criteriaExperimentSchema.optional(),
25
+ properties: z.record(z.string(), criteriaFilterValue).optional(),
26
+ };
27
+ const segmentCriteriaConditionSchema = z.discriminatedUnion('type', [
28
+ z.object({
29
+ type: z.literal('event_count'),
30
+ ...criteriaFilterShape,
31
+ minCount: z.number().int().positive(),
32
+ }).strict(),
33
+ z.object({
34
+ type: z.literal('event_exists'),
35
+ ...criteriaFilterShape,
36
+ }).strict(),
37
+ z.object({
38
+ type: z.literal('event_latest'),
39
+ ...criteriaFilterShape,
40
+ }).strict(),
41
+ ]);
42
+ const segmentCriteriaSchema = z.union([
43
+ z.object({
44
+ all: z.array(segmentCriteriaConditionSchema).min(1),
45
+ any: z.array(segmentCriteriaConditionSchema).optional(),
46
+ }).strict(),
47
+ z.object({
48
+ all: z.array(segmentCriteriaConditionSchema).optional(),
49
+ any: z.array(segmentCriteriaConditionSchema).min(1),
50
+ }).strict(),
51
+ ]);
7
52
  const requestRuleConditionSchema = z.object({
8
53
  field: z.string().min(1),
9
54
  operator: z.enum(['equals', 'contains', 'startsWith', 'exists']),
@@ -21,6 +66,7 @@ export const segmentDataModel = defineDataModel({
21
66
  status: resourceStatus,
22
67
  priority: z.number().int().nonnegative().optional(),
23
68
  description: z.string().optional(),
69
+ criteria: segmentCriteriaSchema.optional(),
24
70
  }),
25
71
  });
26
72
  export const audienceDataModel = defineDataModel({
@@ -1,2 +1,6 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export function compileRegistry(options: any): Promise<{
3
+ registry: string;
4
+ schemas: string[];
5
+ }>;
6
+ export function generatePageSchema(schemaDir: any, componentEntries: any, outDir: any): Promise<string>;
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import { realpathSync } from 'node:fs';
2
3
  import { mkdir, writeFile } from 'node:fs/promises';
3
4
  import path from 'node:path';
4
- import { pathToFileURL } from 'node:url';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
5
6
  import { z } from 'zod';
6
7
  import { ImageSchema } from '../types/image.ts';
7
8
  import { VideoSchema } from '../types/video.ts';
@@ -18,14 +19,16 @@ try {
18
19
  globalThis.React = React;
19
20
  }
20
21
  catch { /* react not available — component files without JSX will still work */ }
21
- const args = parseArgs(process.argv.slice(2));
22
- try {
23
- const result = await compileRegistry(args);
24
- console.log(JSON.stringify({ success: true, ...result, errors: [] }, null, 2));
25
- }
26
- catch (error) {
27
- console.error(JSON.stringify({ success: false, errors: [String(error?.message ?? error)] }, null, 2));
28
- process.exitCode = 1;
22
+ if (isMainModule()) {
23
+ const args = parseArgs(process.argv.slice(2));
24
+ try {
25
+ const result = await compileRegistry(args);
26
+ console.log(JSON.stringify({ success: true, ...result, errors: [] }, null, 2));
27
+ }
28
+ catch (error) {
29
+ console.error(JSON.stringify({ success: false, errors: [String(error?.message ?? error)] }, null, 2));
30
+ process.exitCode = 1;
31
+ }
29
32
  }
30
33
  async function compileRegistry(options) {
31
34
  const required = ['components', 'layouts', 'output'];
@@ -440,9 +443,10 @@ async function generatePageSchema(schemaDir, componentEntries, outDir) {
440
443
  const defs = {
441
444
  baseBlock: {
442
445
  type: 'object',
443
- required: ['id', 'component', 'props'],
446
+ required: ['$type', 'id', 'component', 'props'],
444
447
  additionalProperties: true,
445
448
  properties: {
449
+ $type: { const: 'component' },
446
450
  id: { type: 'string', minLength: 1 },
447
451
  component: { type: 'string' },
448
452
  props: { type: 'object' },
@@ -757,3 +761,14 @@ function parseArgs(argv) {
757
761
  }
758
762
  return out;
759
763
  }
764
+ function isMainModule() {
765
+ if (!process.argv[1])
766
+ return false;
767
+ try {
768
+ return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(path.resolve(process.argv[1]));
769
+ }
770
+ catch {
771
+ return false;
772
+ }
773
+ }
774
+ export { compileRegistry, generatePageSchema };
@@ -1,2 +1,32 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export function validateContent(options: any): Promise<{
3
+ warnings?: any[] | undefined;
4
+ success: boolean;
5
+ pagesValidated: number;
6
+ blocksValidated: number;
7
+ errors: ({
8
+ page: string;
9
+ message: string;
10
+ fragment?: undefined;
11
+ component?: undefined;
12
+ path?: undefined;
13
+ } | {
14
+ fragment: string;
15
+ message: string;
16
+ page?: undefined;
17
+ component?: undefined;
18
+ path?: undefined;
19
+ } | {
20
+ fragment: string;
21
+ component: any;
22
+ message: string;
23
+ page?: undefined;
24
+ path?: undefined;
25
+ } | {
26
+ fragment: string;
27
+ component: any;
28
+ path: any;
29
+ message: any;
30
+ page?: undefined;
31
+ })[];
32
+ }>;
@@ -19,21 +19,25 @@
19
19
  * Uses the JSON schemas generated by compile-registry — portable, no React/CSS
20
20
  * imports needed, same schemas usable by Go backend or other tools.
21
21
  */
22
+ import { realpathSync } from 'node:fs';
22
23
  import { readdir, readFile } from 'node:fs/promises';
23
24
  import path from 'node:path';
24
- const args = parseArgs(process.argv.slice(2));
25
- try {
26
- const result = await validateContent(args);
27
- console.log(JSON.stringify(result, null, 2));
28
- if (!result.success)
25
+ import { fileURLToPath } from 'node:url';
26
+ if (isMainModule()) {
27
+ const args = parseArgs(process.argv.slice(2));
28
+ try {
29
+ const result = await validateContent(args);
30
+ console.log(JSON.stringify(result, null, 2));
31
+ if (!result.success)
32
+ process.exitCode = 1;
33
+ }
34
+ catch (error) {
35
+ console.error(JSON.stringify({
36
+ success: false,
37
+ errors: [{ message: String(error?.message ?? error) }],
38
+ }, null, 2));
29
39
  process.exitCode = 1;
30
- }
31
- catch (error) {
32
- console.error(JSON.stringify({
33
- success: false,
34
- errors: [{ message: String(error?.message ?? error) }],
35
- }, null, 2));
36
- process.exitCode = 1;
40
+ }
37
41
  }
38
42
  // ---------------------------------------------------------------------------
39
43
  // Main
@@ -86,6 +90,22 @@ async function validateContent(options) {
86
90
  const blocks = collectBlocks(pageData);
87
91
  for (const block of blocks) {
88
92
  blocksValidated++;
93
+ if (!block || typeof block !== 'object') {
94
+ collector.push({
95
+ page: relativePath,
96
+ blockId: '<unknown>',
97
+ message: 'page region entry must be a component block',
98
+ });
99
+ continue;
100
+ }
101
+ if (block.$type !== 'component') {
102
+ collector.push({
103
+ page: relativePath,
104
+ blockId: block.id ?? '<unknown>',
105
+ path: '$type',
106
+ message: 'block "$type" must be "component"',
107
+ });
108
+ }
89
109
  if (!block.component) {
90
110
  collector.push({
91
111
  page: relativePath,
@@ -348,6 +368,13 @@ function validateNestedSlots(parentBlock, componentMap, schemaMap, path = 'props
348
368
  issues.push({ path: nestedPath, message: `${parentBlock.component}: block ref child must be a block` });
349
369
  continue;
350
370
  }
371
+ if (nestedBlock.$type !== 'component') {
372
+ issues.push({
373
+ path: `${nestedPath}.$type`,
374
+ message: `${parentBlock.component}: block ref child "$type" must be "component"`,
375
+ });
376
+ continue;
377
+ }
351
378
  if (!componentMap.has(nestedBlock.component)) {
352
379
  issues.push({ path: `${nestedPath}.component`, message: `${parentBlock.component}: unknown nested component "${nestedBlock.component}"` });
353
380
  continue;
@@ -424,3 +451,14 @@ function parseArgs(argv) {
424
451
  }
425
452
  return out;
426
453
  }
454
+ function isMainModule() {
455
+ if (!process.argv[1])
456
+ return false;
457
+ try {
458
+ return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(path.resolve(process.argv[1]));
459
+ }
460
+ catch {
461
+ return false;
462
+ }
463
+ }
464
+ export { validateContent };
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var Ne=Object.defineProperty;var Le=(t,e,n)=>e in t?Ne(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var y=(t,e,n)=>Le(t,typeof e!="symbol"?e+"":e,n);var x="data-aci-event",Oe="data-aci-on",H="data-aci-prop-",De="data-aci-refresh",q="custom.";function D(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();if(!(e===""||/[\s/]/.test(e)))return e.startsWith(q)?e:q+e}function Re(t){let e;for(let n of Array.from(t.attributes)){if(!n.name.startsWith(H))continue;let r=n.name.slice(H.length);r!==""&&((e!=null?e:e={})[r]=n.value)}return e}function U(t,e){let n=D(t.getAttribute(x));if(n===void 0){e==null||e("capture",{reason:"malformed_declaration",attr:x});return}return{eventName:n,properties:Re(t)}}function X(t){var e,n;return(n=(e=t.getAttribute(Oe))==null?void 0:e.trim().toLowerCase())!=null?n:"click"}function $(t,e,n){let{document:r,debug:o}=e;r.addEventListener("click",f=>{var l,p;try{let u=f.target;if((l=u==null?void 0:u.closest)==null?void 0:l.call(u,`[${De}]`)){n==null||n();return}let m=(p=u==null?void 0:u.closest)==null?void 0:p.call(u,`[${x}]`);if(!m||X(m)!=="click")return;let g=U(m,o);g&&t(g)}catch(u){o==null||o("capture",{reason:"click_handler_failed",error:String(u)})}});let i=e.intersectionObserver;if(typeof i!="function")return;let s=Array.from(r.querySelectorAll(`[${x}]`)).filter(f=>X(f)==="visible");if(s.length===0)return;let a=new WeakSet,c=new i((f,l)=>{try{for(let p of f){if(!p.isIntersecting||p.intersectionRatio<.5||a.has(p.target))continue;a.add(p.target),l.unobserve(p.target);let u=U(p.target,o);u&&t(u)}}catch(p){o==null||o("capture",{reason:"visible_handler_failed",error:String(p)})}},{threshold:.5});for(let f of s)c.observe(f)}function K(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Y(t,e,n,r){let o=(...a)=>{try{let[c,...f]=a;if(c==="track"){let l=D(f[0]);if(l===void 0){r==null||r("capture",{reason:"malformed_track_name",name:f[0]});return}let p=f[1];if(p!==void 0&&!K(p)){r==null||r("capture",{reason:"malformed_track_properties",name:l});return}n.track(l,p);return}if(c==="consent"){if(e.preset!=="manual"){r==null||r("consent",{reason:"preset_authoritative",preset:e.preset});return}let l=f[0];if(!K(l)){r==null||r("consent",{reason:"malformed_consent_envelope"});return}n.consent({p:l.p,src:l.src});return}r==null||r("capture",{reason:"unknown_command",command:c})}catch(c){r==null||r("capture",{reason:"command_failed",error:String(c)})}},i=t.aci,s=i==null?void 0:i.q;if(t.aci=o,s!=null)for(let a of Array.from(s)){let c=Array.from(a);o(...c)}}var Be="experiment.exposure",Fe='script[type="application/json"][data-aci-assignments]';function Ve(t){if(typeof t!="object"||t===null)return null;let e=t,n=e.experimentId,r=e.armId,o=e.allocationVersion;return typeof n!="string"||n===""||typeof r!="string"||r===""||typeof o!="string"?null:{experimentId:n,armId:r,allocationVersion:o}}function Me(t,e){try{let n=t.querySelector(Fe);if(!n)return[];let r=n.textContent;if(r==null||r.trim()==="")return[];let o=JSON.parse(r);if(typeof o!="object"||o===null)return e==null||e("capture",{reason:"assignments_malformed"}),[];let i=o;if(i.v!==1||!Array.isArray(i.experiments))return e==null||e("capture",{reason:"assignments_malformed"}),[];let s=[];for(let a of i.experiments){let c=Ve(a);c&&s.push(c)}return s}catch(n){return e==null||e("capture",{reason:"assignments_parse_failed",error:String(n)}),[]}}function J(t,e){if(!e||t.experiment!==void 0)return t;let n=e.getActiveAssignments()[0];if(!n)return t;let r={experimentId:n.experimentId,armId:n.armId,allocationVersion:n.allocationVersion};return{...t,experiment:r}}function Q(t){let e=[],n=new Set,r,o=()=>{e=Me(t.document,t.debug);for(let i of e)n.has(i.experimentId)||(n.add(i.experimentId),r==null||r({eventName:Be,url:t.window.location.href,experiment:{experimentId:i.experimentId,armId:i.armId,allocationVersion:i.allocationVersion}}))};return{getActiveAssignments:()=>e.map(i=>({...i})),start(i){r=i,o()},rearm(){n.clear(),o()}}}var Z="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function We(t){globalThis.crypto.getRandomValues(t)}function S(t,e){let n=t!=null?t:Date.now(),r="";for(let c=0;c<10;c++)r=Z[n%32]+r,n=Math.floor(n/32);let o=new Uint8Array(10);(e!=null?e:We)(o);let i="",s=0,a=0;for(let c of o)for(s=s<<8|c,a+=8;a>=5;)i+=Z[s>>>a-5&31],a-=5;return r+i}var Ge=60*1024,je=100,ze=5e3,ee='{"envelopeId":"',te='","events":[',ne="]}",He=26,A=ee.length+He+te.length+ne.length,qe=new TextEncoder,Ue=t=>qe.encode(t).length,T=class{constructor(e){y(this,"options");y(this,"maxBytes");y(this,"queue",[]);y(this,"queuedBytes",0);y(this,"flushing",!1);y(this,"intervalId");var n;this.options=e,this.maxBytes=(n=e.maxBatchBytes)!=null?n:Ge}get pending(){return this.queue.length}push(e){let n=JSON.stringify(e),r=Ue(n);this.queue.push({json:n,bytes:r,eventId:e.eventId}),this.queuedBytes+=r,!this.flushing&&this.envelopeBytes()>=this.maxBytes&&this.flush()}flush(){var e,n;if(!this.flushing){this.flushing=!0;try{(n=(e=this.options).onTick)==null||n.call(e),this.drain()}finally{this.flushing=!1}}}start(){var o,i,s,a;let e=(o=this.options.timers)!=null?o:{setInterval:(c,f)=>setInterval(c,f),clearInterval:c=>clearInterval(c)};this.intervalId=e.setInterval(()=>this.flush(),(i=this.options.flushIntervalMs)!=null?i:ze);let n=(s=this.options.documentTarget)!=null?s:typeof document!="undefined"?document:void 0;n==null||n.addEventListener("visibilitychange",()=>{n.visibilityState==="hidden"&&this.flush()});let r=(a=this.options.windowTarget)!=null?a:typeof window!="undefined"?window:void 0;r==null||r.addEventListener("pagehide",()=>this.flush()),this.flush()}stop(){if(this.intervalId!==void 0){let e=this.options.timers;e?e.clearInterval(this.intervalId):clearInterval(this.intervalId),this.intervalId=void 0}}envelopeBytes(){let e=this.queue.length>1?this.queue.length-1:0;return A+this.queuedBytes+e}drain(){var e,n,r;for(;this.queue.length>0;){let o=this.queue[0];if(A+o.bytes>this.maxBytes){this.queue.shift(),this.queuedBytes-=o.bytes,(n=(e=this.options).debug)==null||n.call(e,"flush",{reason:"oversize_event",eventId:o.eventId,bytes:o.bytes});continue}let i=[],s=A;for(;this.queue.length>0;){let c=this.queue[0];if(A+c.bytes>this.maxBytes||i.length>=je)break;let f=s+c.bytes+(i.length>0?1:0);if(f>this.maxBytes)break;i.push(c.json),s=f,this.queue.shift(),this.queuedBytes-=c.bytes}if(i.length===0)continue;let a=((r=this.options.createEnvelopeId)!=null?r:S)();this.options.send(ee+a+te+i.join(",")+ne)}}};var Xe=new Set(["c15t","onetrust","cookiebot","trustarc","manual"]);function P(t,e){var o;let n=(o=t==null?void 0:t.getAttribute)==null?void 0:o.call(t,e);if(n==null)return;let r=n.trim();return r===""?void 0:r}function re(t){var r;let e=(r=P(t,"data-aci-consent"))==null?void 0:r.toLowerCase(),n=e!==void 0&&Xe.has(e)?e:"manual";return{site:P(t,"data-aci-site"),preset:n,categories:P(t,"data-aci-consent-categories"),debug:P(t,"data-aci-debug")==="1"}}function oe(t,e,n){if(!t)return()=>{};let r=e!=null?e:(i=>console.debug("[aci]",i)),o=n!=null?n:Date.now;return(i,s)=>{try{r({t:o(),kind:i,detail:s})}catch{}}}var R=new TextEncoder,$e=2048,Ke=32,Ye=128,Je=512,Qe=2147483647,Ze=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/,et=/^[\t\n\v\f\r ]+|[\t\n\v\f\r ]+$/g,tt=new Set(["true","all","granted","yes","personalization","personalized"]);function _(t,e=!0){let n=w(t);if(!n)return null;if(e)try{n=decodeURIComponent(n)}catch{}if(n=w(n),!n||R.encode(n).byteLength>$e)return null;if(tt.has(n.toLowerCase()))return{version:0,purposes:["personalization"],grantedAt:""};try{let r=JSON.parse(n),o=typeof r.t=="string"?r.t:"";return!Number.isInteger(r.v)||r.v<0||r.v>Qe||!Array.isArray(r.p)||r.p.length>Ke||!r.p.every(i=>typeof i=="string")||r.p.some(i=>R.encode(i).byteLength>Ye)||r.t!==void 0&&r.t!==null&&(typeof r.t!="string"||r.t===""||!nt(r.t))||r.src!==void 0&&r.src!==null&&typeof r.src!="string"||typeof r.src=="string"&&R.encode(r.src).byteLength>Je?null:{version:r.v,purposes:r.p,grantedAt:o,source:typeof r.src=="string"?r.src:void 0}}catch{return null}}function B(t){return(t==null?void 0:t.purposes.some(e=>w(e).toLowerCase()==="personalization"))||!1}function w(t){return t.replace(et,"")}function nt(t){let e=Ze.exec(t);if(!e||Number.isNaN(Date.parse(t)))return!1;let n=Number(e[1]),r=Number(e[2]),o=Number(e[3]),i=Number(e[4]),s=Number(e[5]),a=Number(e[6]);if(r<1||r>12||o<1||o>rt(n,r)||i>23||s>59||a>59)return!1;let c=e[8];return c==="Z"||Number(c.slice(1,3))<=23&&Number(c.slice(4,6))<=59}function rt(t,e){return e===2?t%4===0&&(t%100!==0||t%400===0)?29:28:[4,6,9,11].includes(e)?30:31}var ie="personalization",F="aci_consent",V=1,ot=365*24*60*60;function it(t,e){var r;let n=`${F}=${t.encoded}; Path=/; Max-Age=${ot}; SameSite=Lax`;((r=e.document.location)==null?void 0:r.protocol)==="https:"&&(n+="; Secure"),e.document.cookie=n}function I(t,e,n){var o;let r=st(t,e,n.now);return r===null?!1:(B(r.snapshot)||(o=n.gapBuffer)==null||o.purge(),it(r,n),!0)}function se(t){for(let e of t.cookie.split(";")){let n=w(e);if(n.startsWith(F+"="))return n.slice(F.length+1)}}function ae(t){return t===void 0||t===""?!1:B(_(t,!0))}function ce(t){var r;if(!Array.isArray(t))return;let e=[];for(let o of t){if(typeof o!="string")return;e.push(w(o))}let n=JSON.stringify({v:V,p:e});return(r=_(n,!1))==null?void 0:r.purposes}function ue(t){var o;if(t!==void 0&&typeof t!="string")return;let e=typeof t=="string"?w(t):"",r=JSON.stringify({v:V,p:[],src:e===""?"manual":e});return(o=_(r,!1))==null?void 0:o.source}function st(t,e,n){try{let r=JSON.stringify({v:V,p:t,t:new Date((n!=null?n:Date.now)()).toISOString(),src:e}),o=_(r,!1);return o===null?null:{encoded:encodeURIComponent(r),snapshot:o}}catch{return null}}var at="cmp-",ct=/^[a-z0-9._-]+$/,ut={c15t:"measurement,marketing",onetrust:"c0002,c0004",cookiebot:"statistics,marketing",trustarc:"functional,advertising"};function M(t,e){let n=e!=null?e:ut[t];if(n===void 0)return null;let r=n.split(",").map(o=>o.trim().toLowerCase()).filter(o=>o!=="");if(r.length===0)return null;for(let o of r)if(!ct.test(o))return null;return r}function ft(t,e){return e.filter(r=>r in t.categories).some(r=>t.categories[r]===!0)?[ie]:[]}function k(t,e,n){var r,o,i,s;try{let a=M(e,n.categories);if(a===null){(r=n.debug)==null||r.call(n,"consent",{reason:"unparseable_mapping",preset:e});return}if(a.filter(l=>l in t.categories).length===0){(o=n.debug)==null||o.call(n,"consent",{reason:"unmappable_cmp_state",preset:e});return}let f=ft(t,a);I(f,at+e,{document:n.document,gapBuffer:n.gapBuffer,now:n.now}),(i=n.debug)==null||i.call(n,"consent",{reason:"written",preset:e,purposes:f})}catch(a){(s=n.debug)==null||s.call(n,"consent",{reason:"consent_bridge_failed",preset:e,error:String(a)})}}var fe=250,lt=1e4;function C(t,e,n){var s;let r=(s=n==null?void 0:n.scheduler)!=null?s:{setTimeout:(a,c)=>setTimeout(a,c),clearTimeout:a=>clearTimeout(a)},o=Math.floor(lt/fe),i=()=>{var c,f;let a;try{a=t()}catch(l){(c=n==null?void 0:n.debug)==null||c.call(n,"consent",{reason:"cmp_read_failed",error:String(l)});return}if(a!==void 0){e(a);return}if(o-=1,o<=0){(f=n==null?void 0:n.debug)==null||f.call(n,"consent",{reason:"cmp_not_found"});return}r.setTimeout(i,fe)};i()}function b(t,e){try{e()}catch(n){t==null||t("consent",{reason:"adapter_failed",error:String(n)})}}var dt="c15t";function pt(t){if(typeof t!="object"||t===null)return;let e={};for(let[n,r]of Object.entries(t))typeof r=="boolean"&&(e[n.toLowerCase()]=r);return{categories:e}}function mt(t,e){return typeof t=="object"&&t!==null?"consents"in t?t.consents:t:e.consents}function le(t){C(()=>{let e=t.window.c15t;return typeof e=="object"&&e!==null?e:void 0},e=>{b(t.debug,()=>{var r;let n=o=>{let i=pt(o);i&&k(i,dt,t)};n(e.consents),(r=e.onConsentChange)==null||r.call(e,o=>b(t.debug,()=>n(mt(o,e))))})},t)}var gt="cookiebot",vt=["CookiebotOnConsentReady","CookiebotOnAccept","CookiebotOnDecline"];function de(t){let e=t.Cookiebot;return typeof e=="object"&&e!==null?e:void 0}function ht(t){if(typeof t!="object"||t===null)return;let e={};for(let[n,r]of Object.entries(t))typeof r=="boolean"&&(e[n.toLowerCase()]=r);return{categories:e}}function pe(t){let e=()=>{let r=de(t.window);if(!r||r.hasResponse!==!0)return;let o=ht(r.consent);o&&k(o,gt,t)},n=t.window;if(typeof n.addEventListener=="function")for(let r of vt)n.addEventListener(r,()=>b(t.debug,e));C(()=>de(t.window),()=>b(t.debug,e),t)}var me="onetrust",bt=/^c\d{4}$/;function yt(t,e){let n={};for(let r of t.split(",")){let o=r.trim().toLowerCase();o!==""&&(n[o]=!0)}for(let r of e!=null?e:[])!(r in n)&&bt.test(r)&&(n[r]=!1);return{categories:n}}function ge(t){let e=t.window,n=()=>{let o=e.OnetrustActiveGroups;if(typeof o!="string")return;let i=M(me,t.categories);k(yt(o,i),me,t)},r=e.OptanonWrapper;e.OptanonWrapper=()=>{if(typeof r=="function")try{r()}catch{}b(t.debug,n)},C(()=>{let o=e.OnetrustActiveGroups;return typeof o=="string"?o:void 0},()=>b(t.debug,n),t)}var Et="trustarc",kt={required:1,functional:2,advertising:3},ve="PrivacyManagerAPI";function he(t){let e=t.truste,n=e==null?void 0:e.cma,r=n==null?void 0:n.callApi;return typeof r=="function"?r.bind(n):void 0}function Ct(t){if(typeof t!="object"||t===null)return;let e=t.consentDecision;if(typeof e!="number"||!Number.isFinite(e)||e<1)return;let n={};for(let[r,o]of Object.entries(kt))n[r]=e>=o;return{categories:n}}function wt(t){return typeof t=="string"?t.includes(ve):typeof t=="object"&&t!==null&&ve in t}function St(t){let e=t.location;return typeof(e==null?void 0:e.hostname)=="string"?e.hostname:void 0}function be(t){let e=()=>{let r=he(t.window);if(!r)return;let o=Ct(r("getConsentDecision",St(t.window)));o&&k(o,Et,t)},n=t.window;typeof n.addEventListener=="function"&&n.addEventListener("message",r=>b(t.debug,()=>{wt(r==null?void 0:r.data)&&e()})),C(()=>he(t.window),()=>b(t.debug,e),t)}var N="aci:buf";var ye="aci_m",L=class{constructor(e){y(this,"events");y(this,"storage");y(this,"debug");this.debug=e==null?void 0:e.debug,this.storage=e==null?void 0:e.storage,this.events=this.restore()}push(e){var n;this.events.push(e),this.events.length>50&&(this.events.splice(0,this.events.length-50),(n=this.debug)==null||n.call(this,"buffer",{reason:"cap_drop_oldest"})),this.persist()}drain(){let e=this.events;return this.events=[],this.persist(),e}purge(){var e;this.events.length>0&&((e=this.debug)==null||e.call(this,"buffer",{reason:"purged",count:this.events.length})),this.events=[],this.persist()}size(){return this.events.length}restore(){var r;let e=this.storage;if(!e)return[];let n;try{n=e.getItem(N)}catch(o){return this.storage=void 0,(r=this.debug)==null||r.call(this,"buffer",{reason:"storage_unavailable",error:String(o)}),[]}if(n==null)return[];try{let o=JSON.parse(n);if(Array.isArray(o))return o}catch{}try{e.removeItem(N)}catch{this.storage=void 0}return[]}persist(){var n;let e=this.storage;if(e)try{this.events.length===0?e.removeItem(N):e.setItem(N,JSON.stringify(this.events))}catch(r){this.storage=void 0,(n=this.debug)==null||n.call(this,"buffer",{reason:"storage_unavailable",error:String(r)})}}};function Ee(t){for(let e of t.cookie.split(";")){let n=e.trim();if(n.startsWith(ye+"="))return n.slice(ye.length+1)!==""}return!1}function ke(t,e){if(e.grants()&&!e.marker()){e.gapBuffer.push(t);return}e.batcher.push(t)}function W(t,e,n,r){if(t.size()===0||!n())return;let o=t.drain();for(let i of o)e.push(i);r==null||r("buffer",{reason:"flushed",count:o.length})}var _t="rum.link_click";function Ce(t,e){var i;let{document:n,debug:r}=e,o=(i=n.defaultView)==null?void 0:i.location;n.addEventListener("click",s=>{var a,c,f;try{let l=s.target,p=(a=l==null?void 0:l.closest)==null?void 0:a.call(l,"a[href]");if(!p)return;let u=p;t({eventName:_t,url:o==null?void 0:o.href,properties:{linkText:(f=(c=u.textContent)==null?void 0:c.trim())!=null?f:"",linkHref:u.href}})}catch(l){r==null||r("capture",{reason:"link_click_failed",error:String(l)})}},{capture:!0})}var xt="rum.page_view";function we(t){let e=t.indexOf("#");return e===-1?t:t.slice(0,e)}function Se(t,e){let n=we(t.location.href),r=()=>{let s=we(t.location.href);if(s!==n){n=s;for(let a of e)a()}},o=t.history,i=s=>{let a=o[s].bind(o);o[s]=(...c)=>{let f=a(...c);return r(),f}};i("pushState"),i("replaceState"),t.addEventListener("popstate",r)}function _e(t,e){let n=()=>t({eventName:xt,url:e.location.href,referrer:e.document.referrer});return n(),n}var G="/collect";function xe(t,e){let n=e==null?void 0:e.debug,r=e!==void 0&&"navigator"in e?e.navigator:globalThis.navigator,o=e!==void 0&&"fetch"in e?e.fetch:globalThis.fetch,i;try{i=new Blob([t],{type:"text/plain"})}catch{n==null||n("flush",{reason:"no_blob"});return}if(r!=null&&r.sendBeacon)try{if(r.sendBeacon(G,i))return}catch{}if(!o){n==null||n("flush",{reason:"no_transport"});return}try{o(G,{method:"POST",body:i,keepalive:!0}).catch(s=>{n==null||n("flush",{reason:"fetch_failed",error:String(s)})})}catch(s){n==null||n("flush",{reason:"fetch_failed",error:String(s)})}}function Ae(t){var n,r;let e=t!==void 0&&"fetch"in t?t.fetch:globalThis.fetch;if(!e)return Promise.resolve(!1);try{let o=((n=t==null?void 0:t.createEnvelopeId)!=null?n:S)(),i=new Blob([`{"envelopeId":"${o}","events":[]}`],{type:"text/plain"});return e(G,{method:"POST",body:i,keepalive:!0,credentials:"same-origin"}).then(s=>{var a;return typeof s=="object"&&s!==null&&"ok"in s&&s.ok===!1?((a=t==null?void 0:t.debug)==null||a.call(t,"flush",{reason:"refresh_failed",status:"not_ok"}),!1):!0}).catch(s=>{var a;return(a=t==null?void 0:t.debug)==null||a.call(t,"flush",{reason:"refresh_failed",error:String(s)}),!1})}catch(o){return(r=t==null?void 0:t.debug)==null||r.call(t,"flush",{reason:"refresh_failed",error:String(o)}),Promise.resolve(!1)}}var At="rum.variation_view",j="data-aci-variation";function Te(t,e){var f,l,p;let{document:n,debug:r}=e,o=e.MutationObserver;if(typeof o!="function")return;let i=(f=n.defaultView)==null?void 0:f.location,s=new WeakSet,a=u=>{let h=u.getAttribute(j);h!=null&&(s.has(u)||(s.add(u),t({eventName:At,url:i==null?void 0:i.href,properties:{variantKey:h}})))},c=u=>{try{u.hasAttribute(j)&&a(u);for(let h of Array.from(u.querySelectorAll(`[${j}]`)))a(h)}catch(h){r==null||r("capture",{reason:"variation_scan_failed",error:String(h)})}};try{let u=(l=n.body)!=null?l:n.documentElement;u&&c(u)}catch(u){r==null||r("capture",{reason:"variation_initial_scan_failed",error:String(u)})}try{let u=(p=n.body)!=null?p:n.documentElement;if(!u)return;new o(m=>{try{for(let g of m)for(let d=0;d<g.addedNodes.length;d++){let v=g.addedNodes[d];if((v==null?void 0:v.nodeType)!==1)continue;let E=v.element;E&&c(E)}}catch(g){r==null||r("capture",{reason:"variation_observer_failed",error:String(g)})}}).observe(u,{subtree:!0,childList:!0})}catch(u){r==null||r("capture",{reason:"variation_observe_failed",error:String(u)})}}var Tt="rum.web_vital";function Pe(t,e){var h,m,g;let n=e.PerformanceObserver;if(typeof n!="function")return;let{performance:r,debug:o}=e,i=(m=(h=e.window)==null?void 0:h.location)==null?void 0:m.href,s=e.document,a=new Set,c=(d,v)=>{a.has(d)||(a.add(d),t({eventName:Tt,url:i,properties:{vitalName:d,vitalValue:v}}))};try{let d=r==null?void 0:r.getEntriesByType("navigation")[0];d&&typeof d.responseStart=="number"&&typeof d.requestStart=="number"&&c("TTFB",d.responseStart-d.requestStart)}catch(d){o==null||o("capture",{reason:"ttfb_failed",error:String(d)})}let f=0,l=0,p=(d,v)=>{try{new n(Ie=>{try{for(let O of Ie.getEntries())v(O)}catch(O){o==null||o("capture",{reason:`${d}_handler_failed`,error:String(O)})}}).observe({type:d,buffered:!0})}catch(E){o==null||o("capture",{reason:`${d}_observe_failed`,error:String(E)})}};p("largest-contentful-paint",d=>{c("LCP",d.startTime)}),p("first-input",d=>{c("FID",d.startTime)}),p("layout-shift",d=>{var v;d.hadRecentInput||(f+=(v=d.value)!=null?v:0)}),p("event",d=>{var E;let v=(E=d.value)!=null?E:0;v>l&&(l=v)}),p("paint",d=>{d.name==="first-contentful-paint"&&c("FCP",d.startTime)});let u=()=>{try{a.has("CLS")||c("CLS",f),a.has("INP")||c("INP",l)}catch(d){o==null||o("capture",{reason:"visibility_handler_failed",error:String(d)})}};s&&s.addEventListener("visibilitychange",()=>{s.visibilityState==="hidden"&&u()}),(g=e.window)==null||g.addEventListener("pagehide",u)}var z={c15t:le,onetrust:ge,cookiebot:pe,trustarc:be};function Pt(t){var e,n;return typeof((e=t.navigator)==null?void 0:e.sendBeacon)=="function"&&typeof t.IntersectionObserver=="function"&&typeof((n=t.crypto)==null?void 0:n.getRandomValues)=="function"}function It(t){try{return t.sessionStorage}catch{return}}function Nt(t){var o;let e=t!=null?t:typeof window!="undefined"?window:void 0;if(!e||e.__aci_loaded||(e.__aci_loaded=!0,!Pt(e)))return;let n=re(e.document.currentScript),r=oe(n.debug);try{let i=e.document,s=new L({storage:It(e),debug:r}),a=()=>{try{return ae(se(i))}catch{return!1}},c=()=>{try{return Ee(i)}catch{return!1}},f={navigator:e.navigator,fetch:typeof e.fetch=="function"?e.fetch.bind(e):void 0,debug:r},l;l=new T({send:m=>xe(m,f),debug:r,onTick:()=>W(s,l,c,r),timers:{setInterval:(m,g)=>e.setInterval(m,g),clearInterval:m=>e.clearInterval(m)},documentTarget:i,windowTarget:e});let p=Q({document:i,window:e,debug:r}),u=m=>{ke({...J(m,p),eventId:S(void 0,g=>e.crypto.getRandomValues(g))},{grants:a,marker:c,gapBuffer:s,batcher:l})};p.start(u),Y(e,n,{track:(m,g)=>u({eventName:m,properties:g}),consent:({p:m,src:g})=>{let d=ce(m);if(d===void 0){r("consent",{reason:"malformed_purposes"});return}let v=ue(g);if(v===void 0){r("consent",{reason:"malformed_source"});return}I(d,v,{document:i,gapBuffer:s})||r("consent",{reason:"oversized_envelope"})}},r);let h=_e(u,e);Se(e,[()=>p.rearm(),h]),$(u,{document:i,intersectionObserver:e.IntersectionObserver,debug:r},()=>{Ae(f).then(m=>{m&&e.location.reload()})}),Ce(u,{document:i,debug:r}),Pe(u,{performance:e.performance,PerformanceObserver:e.PerformanceObserver,window:e,document:i,debug:r}),Te(u,{document:i,MutationObserver:e.MutationObserver,debug:r}),n.preset!=="manual"&&((o=z[n.preset])==null||o.call(z,{window:e,document:i,categories:n.categories,gapBuffer:s,debug:r,scheduler:{setTimeout:(m,g)=>e.setTimeout(m,g),clearTimeout:m=>e.clearTimeout(m)}})),l.start(),W(s,l,c,r),r("init",{config:n})}catch(i){r("init",{error:String(i)})}}Nt();})();
@@ -0,0 +1 @@
1
+ 46f87bbce4c938e9540939102be1094f5cd956d0f3a5836e9af5c3b0b8c582ad