@getvitops/utils 8.0.1 → 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.
Files changed (77) hide show
  1. package/CHANGELOG.md +289 -8
  2. package/dist/{adc-BFrzpMHq.d.mts → adc-BoEoogyo.d.mts} +2 -3
  3. package/dist/adc-BoEoogyo.d.mts.map +1 -0
  4. package/dist/ads/index.d.mts +50 -17
  5. package/dist/ads/index.d.mts.map +1 -1
  6. package/dist/ads/index.mjs +77 -8
  7. package/dist/ads/index.mjs.map +1 -1
  8. package/dist/cloudflare-BiK61Oq4.d.mts.map +1 -1
  9. package/dist/{cloudflare-CgAsXiqe.mjs → cloudflare-CD8vwrgj.mjs} +2 -24
  10. package/dist/cloudflare-CD8vwrgj.mjs.map +1 -0
  11. package/dist/color/index.d.mts +34 -35
  12. package/dist/color/index.d.mts.map +1 -1
  13. package/dist/color/index.mjs +3 -1
  14. package/dist/color/index.mjs.map +1 -1
  15. package/dist/crm/index.d.mts +288 -0
  16. package/dist/crm/index.d.mts.map +1 -0
  17. package/dist/crm/index.mjs +731 -0
  18. package/dist/crm/index.mjs.map +1 -0
  19. package/dist/email/index.d.mts +216 -0
  20. package/dist/email/index.d.mts.map +1 -0
  21. package/dist/email/index.mjs +331 -0
  22. package/dist/email/index.mjs.map +1 -0
  23. package/dist/favicon.d.mts +8 -9
  24. package/dist/favicon.d.mts.map +1 -1
  25. package/dist/git/index.d.mts +65 -0
  26. package/dist/git/index.d.mts.map +1 -0
  27. package/dist/git/index.mjs +107 -0
  28. package/dist/git/index.mjs.map +1 -0
  29. package/dist/hosting/index.d.mts +184 -0
  30. package/dist/hosting/index.d.mts.map +1 -0
  31. package/dist/hosting/index.mjs +553 -0
  32. package/dist/hosting/index.mjs.map +1 -0
  33. package/dist/identity-BoRddTx3.mjs +35 -0
  34. package/dist/identity-BoRddTx3.mjs.map +1 -0
  35. package/dist/index.d.mts +24 -25
  36. package/dist/index.d.mts.map +1 -1
  37. package/dist/index.mjs +5 -5
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/indexing/index.d.mts +23 -24
  40. package/dist/indexing/index.d.mts.map +1 -1
  41. package/dist/media/index.d.mts +24 -24
  42. package/dist/media/index.d.mts.map +1 -1
  43. package/dist/media/index.mjs +3 -3
  44. package/dist/media/index.mjs.map +1 -1
  45. package/dist/notify/index.d.mts +26 -15
  46. package/dist/notify/index.d.mts.map +1 -1
  47. package/dist/notify/index.mjs +50 -20
  48. package/dist/notify/index.mjs.map +1 -1
  49. package/dist/onboarding/index.d.mts +10 -141
  50. package/dist/onboarding/index.d.mts.map +1 -1
  51. package/dist/onboarding/index.mjs +2 -144
  52. package/dist/onboarding/index.mjs.map +1 -1
  53. package/dist/plan-BLKikoOG.mjs +150 -0
  54. package/dist/plan-BLKikoOG.mjs.map +1 -0
  55. package/dist/plan-Hq8Pb0Uw.d.mts +133 -0
  56. package/dist/plan-Hq8Pb0Uw.d.mts.map +1 -0
  57. package/dist/plan-format-A18SvJ7C.mjs +24 -0
  58. package/dist/plan-format-A18SvJ7C.mjs.map +1 -0
  59. package/dist/reviews/index.d.mts +12 -13
  60. package/dist/reviews/index.d.mts.map +1 -1
  61. package/dist/schema/index.d.mts +7 -7
  62. package/dist/schema/index.d.mts.map +1 -1
  63. package/dist/security/index.d.mts +2 -2
  64. package/dist/security/index.d.mts.map +1 -1
  65. package/dist/{token-Bz_-igw-.d.mts → token-DmmoQ7um.d.mts} +6 -3
  66. package/dist/token-DmmoQ7um.d.mts.map +1 -0
  67. package/dist/tracking/index.d.mts +43 -17
  68. package/dist/tracking/index.d.mts.map +1 -1
  69. package/dist/tracking/index.mjs +2 -1
  70. package/dist/tracking/index.mjs.map +1 -1
  71. package/dist/{types-CHHjzRrv.d.mts → types-7ELci8RQ.d.mts} +4 -2
  72. package/dist/types-7ELci8RQ.d.mts.map +1 -0
  73. package/package.json +18 -4
  74. package/dist/adc-BFrzpMHq.d.mts.map +0 -1
  75. package/dist/cloudflare-CgAsXiqe.mjs.map +0 -1
  76. package/dist/token-Bz_-igw-.d.mts.map +0 -1
  77. package/dist/types-CHHjzRrv.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/reviews/types.ts","../../src/reviews/plan.ts","../../src/reviews/cache.ts","../../src/reviews/gbp.ts"],"mappings":";;;;;;;;AAgBA;;;;;UAAiB,oBAAA;EAMf;EAJA,SAAA;EAQA;EANA,UAAA;EAQI;EANJ,QAAA;EAUe;EARf,SAAA;;EAEA,KAAA;EAQA;EANA,IAAA;AAAA;;UAIe,aAAA;EAI+B;EAF9C,SAAA;EAMqB;EAJrB,SAAA,EAAW,MAAM,SAAS,oBAAA;AAAA;;UAIX,MAAA;EACf,EAAA;EAKA;EAHA,QAAA;EAKA;EAHA,MAAA;EACA,MAAA;EACA,WAAA;EACA,IAAA;EACA,WAAA;EACA,SAAA;EACA,KAAA;IAAU,IAAA;IAAc,EAAA;EAAA;;EAExB,GAAA;AAAA;;UAIe,eAAA;EACf,UAAA;EACA,SAAA;EACA,SAAA;EACA,aAAA;EACA,gBAAA;EACA,OAAA,EAAS,MAAM;AAAA;;UAIA,WAAA;EACf,OAAA;EACA,SAAA,EAAW,MAAM,SAAS,eAAA;AAAA;;;;UClDX,YAAA;EACf,GAAA;EACA,SAAA;EACA,UAAA;EDUe;ECRf,IAAA;AAAA;AAAA,UAGe,WAAA;EDOf;ECLA,OAAA;EACA,SAAA,EAAW,YAAY;EACvB,KAAA;AAAA;AAAA,UAGe,SAAA;EACf,MAAA,EAAQ,aAAA;EDKa;ECHrB,cAAA,EAAgB,GAAG;EDGE;ECDrB,YAAA;EDIA;ECFA,aAAA;AAAA;;iBAIc,IAAA,CAAK,KAAA,EAAO,SAAA,GAAY,WAAW;;iBAuDnC,UAAA,CAAW,CAAc,EAAX,WAAW;;;;;;AD/CpC;AAIL;;;iBC8DgB,aAAA,CAAc,OAAA,EAAS,MAAA,IAAU,MAAA,EAAQ,oBAAA,GAAuB,MAAA;;;;;;;;;iBA2BhE,UAAA,CACd,QAAA,EAAU,WAAA,cACV,OAAA,EAAS,MAAA,SAAe,eAAA,IACvB,WAAA;;;;cCvIU,kBAAA;;;AFcP;AAIN;;;;;iBERgB,SAAA,CAAU,IAAA,WAAe,WAAW;;iBAKpC,OAAA,CAAQ,SAAA,EAAW,MAAA,SAAe,eAAA,IAAmB,WAAA;;iBAarD,UAAA,CAAW,IAAA,UAAc,KAAA,EAAO,WAAW;;;;UCoB1C,kBAAA;EACf,EAAA;EACA,OAAA,EAAS,MAAM;EACf,aAAA;EACA,gBAAA;EACA,MAAA;EACA,OAAA;AAAA;;;;;;;;iBAUoB,YAAA,CACpB,IAAA,EAAM,cAAA,EACN,SAAA,UACA,UAAA,UACA,SAAA,UAAkB,KAAA,GACjB,OAAA,CAAQ,kBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/reviews/types.ts","../../src/reviews/plan.ts","../../src/reviews/cache.ts","../../src/reviews/gbp.ts"],"mappings":";;;;;;;;;;;;UAgBiB;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;UAIe;;EAEf;;EAEA,WAAW,eAAe;;;UAIX;EACf;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;IAAU;IAAc;;;EAExB;;;UAIe;EACf;EACA;EACA;EACA;EACA;EACA,SAAS;;;UAIM;EACf;EACA,WAAW,eAAe;;;;;UClDX;EACf;EACA;EACA;;EAEA;;UAGe;;EAEf;EACA,WAAW;EACX;;UAGe;EACf,QAAQ;;EAER,gBAAgB;;EAEhB;;EAEA;;;wBAIc,KAAK,OAAO,YAAY;;wBAuDxB,WAAW,GAAG;;;;;;;;;;wBAmBd,cAAc,SAAS,UAAU,QAAQ,uBAAuB;;;;;;;;;wBA2BhE,WACd,UAAU,yBACV,SAAS,eAAe,mBACvB;;;;qBCvIU;;;;;;;;;wBAUG,UAAU,eAAe;;wBAKzB,QAAQ,WAAW,eAAe,mBAAmB;;wBAarD,WAAW,cAAc,OAAO;;;;UCoB/B;EACf;EACA,SAAS;EACT;EACA;EACA;EACA;;;;;;;;;wBAUoB,aACpB,MAAM,gBACN,mBACA,oBACA,mBAAkB,QACjB,QAAQ"}
@@ -20,7 +20,7 @@ interface ArticleGraphOptions {
20
20
  keywords?: string[];
21
21
  }
22
22
  /** Build a schema.org Article JSON-LD graph. */
23
- declare function articleGraph(options: ArticleGraphOptions): Record<string, unknown>;
23
+ export declare function articleGraph(options: ArticleGraphOptions): Record<string, unknown>;
24
24
  //#endregion
25
25
  //#region src/schema/breadcrumb.d.ts
26
26
  interface BreadcrumbItem {
@@ -31,7 +31,7 @@ interface BreadcrumbGraphOptions {
31
31
  items: BreadcrumbItem[];
32
32
  }
33
33
  /** Build a schema.org BreadcrumbList JSON-LD graph. */
34
- declare function breadcrumbGraph(options: BreadcrumbGraphOptions): Record<string, unknown>;
34
+ export declare function breadcrumbGraph(options: BreadcrumbGraphOptions): Record<string, unknown>;
35
35
  //#endregion
36
36
  //#region src/schema/faq.d.ts
37
37
  interface FAQItem {
@@ -47,7 +47,7 @@ interface FAQGraphOptions {
47
47
  * NOTE: Google recommends FAQ markup only for authoritative government
48
48
  * and health sites. For other sites, consider using QAPage schema instead.
49
49
  */
50
- declare function faqGraph(options: FAQGraphOptions): Record<string, unknown>;
50
+ export declare function faqGraph(options: FAQGraphOptions): Record<string, unknown>;
51
51
  //#endregion
52
52
  //#region src/schema/itemList.d.ts
53
53
  type ItemListEntryType = 'Article' | 'Recipe' | 'Movie' | 'Course' | 'Restaurant' | 'Product' | (string & {});
@@ -69,7 +69,7 @@ interface ItemListGraphOptions {
69
69
  name?: string;
70
70
  }
71
71
  /** Build a schema.org ItemList JSON-LD graph (e.g. for a carousel rich result). */
72
- declare function itemListGraph(options: ItemListGraphOptions): Record<string, unknown>;
72
+ export declare function itemListGraph(options: ItemListGraphOptions): Record<string, unknown>;
73
73
  //#endregion
74
74
  //#region src/schema/localBusiness.d.ts
75
75
  interface OpeningHoursSpecification {
@@ -136,7 +136,7 @@ interface LocalBusinessGraphOptions {
136
136
  knowsLanguage?: string[];
137
137
  }
138
138
  /** Build a schema.org LocalBusiness (or subtype) JSON-LD graph. */
139
- declare function localBusinessGraph(options: LocalBusinessGraphOptions): Record<string, unknown>;
139
+ export declare function localBusinessGraph(options: LocalBusinessGraphOptions): Record<string, unknown>;
140
140
  //#endregion
141
141
  //#region src/schema/organization.d.ts
142
142
  interface OrganizationGraphOptions {
@@ -185,7 +185,7 @@ interface OrganizationGraphOptions {
185
185
  }[];
186
186
  }
187
187
  /** Build a schema.org Organization JSON-LD graph. */
188
- declare function organizationGraph(options: OrganizationGraphOptions): Record<string, unknown>;
188
+ export declare function organizationGraph(options: OrganizationGraphOptions): Record<string, unknown>;
189
189
  //#endregion
190
- export { type ArticleAuthor, type ArticleGraphOptions, type BreadcrumbGraphOptions, type BreadcrumbItem, type FAQGraphOptions, type FAQItem, type ItemListEntry, type ItemListEntryType, type ItemListGraphOptions, type LocalBusinessGraphOptions, type OpeningHoursSpecification, type OrganizationGraphOptions, type SpecialHoursSpecification, articleGraph, breadcrumbGraph, faqGraph, itemListGraph, localBusinessGraph, organizationGraph };
190
+ export type { ArticleAuthor, ArticleGraphOptions, BreadcrumbGraphOptions, BreadcrumbItem, FAQGraphOptions, FAQItem, ItemListEntry, ItemListEntryType, ItemListGraphOptions, LocalBusinessGraphOptions, OpeningHoursSpecification, OrganizationGraphOptions, SpecialHoursSpecification };
191
191
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/schema/article.ts","../../src/schema/breadcrumb.ts","../../src/schema/faq.ts","../../src/schema/itemList.ts","../../src/schema/localBusiness.ts","../../src/schema/organization.ts"],"mappings":";UAAiB,aAAA;EACf,IAAA;EACA,GAAG;AAAA;AAAA,UAGY,mBAAA;EACf,QAAA;EACA,WAAA;EACA,KAAA;EACA,aAAA;EACA,YAAA;EACA,MAAA,EAAQ,aAAA,GAAgB,aAAa;EACrC,SAAA;IACE,IAAA;IACA,IAAA;EAAA;EAEF,gBAAA;EACA,cAAA;EACA,SAAA;EACA,QAAA;AAAA;;iBAIc,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,MAAM;;;UCvBjD,cAAA;EACf,IAAA;EACA,GAAG;AAAA;AAAA,UAGY,sBAAA;EACf,KAAA,EAAO,cAAc;AAAA;;iBAIP,eAAA,CAAgB,OAAA,EAAS,sBAAA,GAAyB,MAAM;;;UCVvD,OAAA;EACf,QAAA;EACA,MAAM;AAAA;AAAA,UAGS,eAAA;EACf,KAAA,EAAO,OAAO;AAAA;;;;;;;iBASA,QAAA,CAAS,OAAA,EAAS,eAAA,GAAkB,MAAM;;;KCf9C,iBAAA;AAAA,UAWK,aAAA;EACf,IAAA,EAAM,iBAAiB;EACvB,IAAA;EHZA;AACG;AAGL;;;EGcE,GAAA;EACA,KAAA;EACA,WAAA;AAAA;AAAA,UAGe,oBAAA;EACf,KAAA,EAAO,aAAa;EHdpB;EGgBA,IAAA;AAAA;;iBAIc,aAAA,CAAc,OAAA,EAAS,oBAAA,GAAuB,MAAM;;;UC/BnD,yBAAA;EACf,SAAA;EACA,KAAA;EACA,MAAA;AAAA;AJDG;AAGL;;;;;AAHK,UIUY,yBAAA;EACf,SAAA;EACA,YAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,UAGe,yBAAA;EJPf;EISA,IAAA;EACA,IAAA;EACA,WAAA;EACA,GAAA;EACA,SAAA;EACA,KAAA;EACA,KAAA;EACA,UAAA;EACA,OAAA;IACE,aAAA;IACA,eAAA;IACA,aAAA;IACA,UAAA;IACA,cAAA;EAAA;EAEF,GAAA;IACE,QAAA;IACA,SAAA;EAAA;EAEF,yBAAA,GAA4B,yBAAA;EAC5B,gCAAA,GAAmC,yBAAyB;EAC5D,eAAA;IACE,WAAA;IACA,WAAA;IACA,WAAA;IACA,UAAA;IACA,WAAA;EAAA;EAEF,MAAA;IACE,MAAA;IACA,aAAA;IACA,UAAA;IACA,YAAA;MACE,WAAA;MACA,UAAA;MACA,WAAA;IAAA;EAAA;EAGJ,eAAA;EACA,kBAAA;EACA,UAAA;EACA,MAAA;EACA,aAAA;AAAA;;iBAIc,kBAAA,CAAmB,OAAA,EAAS,yBAAA,GAA4B,MAAM;;;UCnE7D,wBAAA;EACf,IAAA;EACA,GAAA;EACA,IAAA;EACA,WAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;IACE,aAAA;IACA,eAAA;IACA,aAAA;IACA,UAAA;IACA,cAAA;EAAA;EAEF,MAAA;EACA,YAAA;EACA,QAAA;EACA,iBAAA;IAA+B,QAAA;IAAkB,QAAA;EAAA;EACjD,kBAAA;IACE,IAAA;IACA,GAAA;EAAA;EAEF,eAAA;IACE,IAAA;IACA,GAAA;EAAA;EAEF,YAAA;IACE,IAAA;IACA,SAAA;IACA,KAAA;IACA,WAAA;IACA,iBAAA;IACA,UAAA;EAAA;EAEF,UAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA;IACE,IAAA;IACA,GAAA;EAAA;AAAA;;iBAKY,iBAAA,CAAkB,OAAA,EAAS,wBAAA,GAA2B,MAAM"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/schema/article.ts","../../src/schema/breadcrumb.ts","../../src/schema/faq.ts","../../src/schema/itemList.ts","../../src/schema/localBusiness.ts","../../src/schema/organization.ts"],"mappings":";UAAiB;EACf;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA,QAAQ,gBAAgB;EACxB;IACE;IACA;;EAEF;EACA;EACA;EACA;;;wBAIc,aAAa,SAAS,sBAAsB;;;UCvB3C;EACf;EACA;;UAGe;EACf,OAAO;;;wBAIO,gBAAgB,SAAS,yBAAyB;;;UCVjD;EACf;EACA;;UAGe;EACf,OAAO;;;;;;;;wBASO,SAAS,SAAS,kBAAkB;;;KCfxC;UAWK;EACf,MAAM;EACN;;;;;;EAMA;EACA;EACA;;UAGe;EACf,OAAO;;EAEP;;;wBAIc,cAAc,SAAS,uBAAuB;;;UC/B7C;EACf;EACA;EACA;;;;;;;;UASe;EACf;EACA;EACA;EACA;;UAGe;;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;;EAEF,4BAA4B;EAC5B,mCAAmC;EACnC;IACE;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;MACE;MACA;MACA;;;EAGJ;EACA;EACA;EACA;EACA;;;wBAIc,mBAAmB,SAAS,4BAA4B;;;UCnEvD;EACf;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;EAEF;EACA;EACA;EACA;IAA+B;IAAkB;;EACjD;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;;EAEF;EACA;EACA;EACA;IACE;IACA;;;;wBAKY,kBAAkB,SAAS,2BAA2B"}
@@ -42,7 +42,7 @@ interface TurnstileVerifyResult {
42
42
  * failed verification is not this module's business to act on; the caller
43
43
  * (`createConversionRoute`) decides what a failure means for the request.
44
44
  */
45
- declare function verifyTurnstileToken(token: string, secretKey: string, remoteIp?: string, fetchImpl?: typeof fetch): Promise<TurnstileVerifyResult>;
45
+ export declare function verifyTurnstileToken(token: string, secretKey: string, remoteIp?: string, fetchImpl?: typeof fetch): Promise<TurnstileVerifyResult>;
46
46
  //#endregion
47
- export { type TurnstileVerifyResult, verifyTurnstileToken };
47
+ export type { TurnstileVerifyResult };
48
48
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/security/turnstile.ts"],"mappings":";;AA+BA;;;;AAGY;AAaZ;;;;;;;;;;;;;;;;AAKgC;;;;;;UArBf,qBAAA;EACf,OAAA;;EAEA,UAAU;AAAA;;;;;;;;;;;iBAaU,oBAAA,CACpB,KAAA,UACA,SAAA,UACA,QAAA,WACA,SAAA,UAAkB,KAAA,GACjB,OAAA,CAAQ,qBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/security/turnstile.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BiB;EACf;;EAEA;;;;;;;;;;;;wBAaoB,qBACpB,eACA,mBACA,mBACA,mBAAkB,QACjB,QAAQ"}
@@ -65,10 +65,13 @@ type GoogleAuthLike = string | GoogleAuth;
65
65
  declare function googleHeaders(auth: GoogleAuthLike, extra?: Record<string, string>): Record<string, string>;
66
66
  /** Scopes, named once so a caller never spells one out. */
67
67
  declare const SCOPES: {
68
- /** Search Console (`sitemaps.submit`, `urlInspection`, `sites`). */readonly webmasters: "https://www.googleapis.com/auth/webmasters"; /** Site Verification API. */
69
- readonly siteVerification: "https://www.googleapis.com/auth/siteverification"; /** Business Profile (reviews). The GCP project must be allowlisted by Google. */
68
+ /** Search Console (`sitemaps.submit`, `urlInspection`, `sites`). */
69
+ readonly webmasters: "https://www.googleapis.com/auth/webmasters";
70
+ /** Site Verification API. */
71
+ readonly siteVerification: "https://www.googleapis.com/auth/siteverification";
72
+ /** Business Profile (reviews). The GCP project must be allowlisted by Google. */
70
73
  readonly businessProfile: "https://www.googleapis.com/auth/business.manage";
71
74
  };
72
75
  //#endregion
73
76
  export { SCOPES as a, googleHeaders as c, GoogleOAuth as i, GoogleAuthLike as n, ServiceAccount as o, GoogleCredential as r, googleAccessToken as s, GoogleAuth as t };
74
- //# sourceMappingURL=token-Bz_-igw-.d.mts.map
77
+ //# sourceMappingURL=token-DmmoQ7um.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-DmmoQ7um.d.mts","names":[],"sources":["../src/google/token.ts"],"mappings":";;UAkCiB;EACf;EACA;;;UAIe;EACf;EACA;EACA;;;;;;;;;;KAWU;EACN;EAAyB,SAAS;EAAgB;;EAClD;EAAe,OAAO;;;;;;;;;;;iBA8CZ,kBACd,YAAY,kBACZ,mBAAkB,OAClB,eACC;;;;;;;;;;;;;;UA6Bc;EACf;EACA;;;;;;;;;KAUU,0BAA0B;;iBAGtB,cACd,MAAM,gBACN,QAAQ,yBACP;;cA2BU"}
@@ -1,5 +1,4 @@
1
- import { i as TrackingData, n as TrackingCategory, r as TrackingConfig, t as ConversionEvent } from "../types-CHHjzRrv.mjs";
2
-
1
+ import { i as TrackingData, n as TrackingCategory, r as TrackingConfig, t as ConversionEvent } from "../types-7ELci8RQ.mjs";
3
2
  //#region src/tracking/params.d.ts
4
3
  /**
5
4
  * The ad-platform vocabulary — the one place that says which URL parameters mean
@@ -23,12 +22,12 @@ import { i as TrackingData, n as TrackingCategory, r as TrackingConfig, t as Con
23
22
  * unattributed — silently, since an unattributed conversion looks exactly like an
24
23
  * organic one. `li_fat_id` and `epik` were missing for precisely that reason.
25
24
  */
26
- declare const PLATFORM_PARAMS: Readonly<Record<string, string>>;
25
+ export declare const PLATFORM_PARAMS: Readonly<Record<string, string>>;
27
26
  /** Just the parameter names, in the same precedence order. */
28
- declare const CLICK_ID_PARAMS: readonly string[];
29
- declare const UTM_PARAMS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"];
27
+ export declare const CLICK_ID_PARAMS: readonly string[];
28
+ export declare const UTM_PARAMS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"];
30
29
  /** Everything the capture script pulls off the landing URL. */
31
- declare const TRACKED_PARAMS: readonly string[];
30
+ export declare const TRACKED_PARAMS: readonly string[];
32
31
  /**
33
32
  * The attribution cookie.
34
33
  *
@@ -36,15 +35,15 @@ declare const TRACKED_PARAMS: readonly string[];
36
35
  * never sent anywhere. It is still a persistent identifier, which is why writing
37
36
  * it waits on consent.
38
37
  */
39
- declare const TRACKING_COOKIE = "_ac";
38
+ export declare const TRACKING_COOKIE = "_ac";
40
39
  /** 90 days — an ad click and the conversion it produces are rarely further apart. */
41
- declare const TRACKING_COOKIE_DAYS = 90;
40
+ export declare const TRACKING_COOKIE_DAYS = 90;
42
41
  /** The A/B variant cookie, assigned by the router when a site runs experiments. */
43
- declare const AB_COOKIE = "_ab";
42
+ export declare const AB_COOKIE = "_ab";
44
43
  //#endregion
45
44
  //#region src/tracking/cookie.d.ts
46
45
  /** Read one cookie out of a `document.cookie`-shaped string. */
47
- declare function readCookie(cookieString: string | null | undefined, name: string): string | null;
46
+ export declare function readCookie(cookieString: string | null | undefined, name: string): string | null;
48
47
  /**
49
48
  * Cookie header → attribution, or `null`.
50
49
  *
@@ -53,9 +52,9 @@ declare function readCookie(cookieString: string | null | undefined, name: strin
53
52
  * fields happened to survive, which is worse than reporting it unattributed:
54
53
  * "we don't know" is actionable, a wrong campaign is not.
55
54
  */
56
- declare function parseTrackingCookie(cookieHeader: string | null | undefined): TrackingData | null;
55
+ export declare function parseTrackingCookie(cookieHeader: string | null | undefined): TrackingData | null;
57
56
  /** Attribution → cookie value (not the full `Set-Cookie` — see `cookieAttributes`). */
58
- declare function serializeTrackingCookie(data: TrackingData): string;
57
+ export declare function serializeTrackingCookie(data: TrackingData): string;
59
58
  /**
60
59
  * Attributes for the attribution cookie.
61
60
  *
@@ -64,7 +63,7 @@ declare function serializeTrackingCookie(data: TrackingData): string;
64
63
  * cross-site navigation — so a returning click would read as a fresh one. No
65
64
  * `HttpOnly`, because the capture script has to write it from the page.
66
65
  */
67
- declare function cookieAttributes(now: number, secure: boolean): string;
66
+ export declare function cookieAttributes(now: number, secure: boolean): string;
68
67
  /**
69
68
  * Fold a fresh capture into whatever was already stored.
70
69
  *
@@ -73,7 +72,7 @@ declare function cookieAttributes(now: number, secure: boolean): string;
73
72
  * Taking the latest would restart the window on every visit and make the cookie
74
73
  * outlive the click it represents.
75
74
  */
76
- declare function mergeTracking(existing: TrackingData | null, captured: TrackingData, now: number): TrackingData;
75
+ export declare function mergeTracking(existing: TrackingData | null, captured: TrackingData, now: number): TrackingData;
77
76
  //#endregion
78
77
  //#region src/tracking/platform.d.ts
79
78
  /**
@@ -83,12 +82,39 @@ declare function mergeTracking(existing: TrackingData | null, captured: Tracking
83
82
  * a newsletter or a partner site is still attribution, just self-declared rather
84
83
  * than platform-issued. Returns null when there is nothing to go on.
85
84
  */
86
- declare function identifyPlatform(data: TrackingData): string | null;
85
+ export declare function identifyPlatform(data: TrackingData): string | null;
87
86
  /** The click ID to quote, with the parameter it came from. */
88
- declare function getPrimaryClickId(data: TrackingData): {
87
+ export declare function getPrimaryClickId(data: TrackingData): {
89
88
  param: string;
90
89
  value: string;
91
90
  } | null;
92
91
  //#endregion
93
- export { AB_COOKIE, CLICK_ID_PARAMS, type ConversionEvent, PLATFORM_PARAMS, TRACKED_PARAMS, TRACKING_COOKIE, TRACKING_COOKIE_DAYS, type TrackingCategory, type TrackingConfig, type TrackingData, UTM_PARAMS, cookieAttributes, getPrimaryClickId, identifyPlatform, mergeTracking, parseTrackingCookie, readCookie, serializeTrackingCookie };
92
+ //#region src/tracking/identity.d.ts
93
+ /**
94
+ * Pulling a submitter's identity out of a form's fields.
95
+ *
96
+ * Extracted from `notify/render.ts`'s `submitterName()`, which needed only the
97
+ * display name for a subject line. `crm/map.ts` needs the whole set — first
98
+ * name, last name, email, phone, company — to fill a CRM record, and a form's
99
+ * field names vary the same way `submitterName()` already accounted for
100
+ * (`name` vs `first_name`/`last_name` vs neither). Two independent cascades
101
+ * over the same handful of aliases is exactly the failure `render.ts`'s own
102
+ * comment records: a downstream site had five of six forms carrying
103
+ * `first_name`/`last_name`, and a cascade that only checked `name` read every
104
+ * one of them as "Unknown". Keep this the one place that knows the aliases;
105
+ * `submitterName()` and `crm/map.ts` both delegate to it.
106
+ */
107
+ interface SubmitterIdentity {
108
+ firstName?: string | undefined;
109
+ lastName?: string | undefined;
110
+ /** The best available display name — a submitted full name, first + last
111
+ * joined, or the email address as a last resort. Never empty. */
112
+ fullName: string;
113
+ email?: string | undefined;
114
+ phone?: string | undefined;
115
+ company?: string | undefined;
116
+ }
117
+ export declare function identifySubmitter(formData: Record<string, string>): SubmitterIdentity;
118
+ //#endregion
119
+ export type { ConversionEvent, SubmitterIdentity, TrackingCategory, TrackingConfig, TrackingData };
94
120
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/tracking/params.ts","../../src/tracking/cookie.ts","../../src/tracking/platform.ts"],"mappings":";;;;;;AAuBA;;;;AAA6C;AAc7C;;;;AAA8E;AAE9E;;;;AAMU;AAGV;;;;AAXA,cAda,eAAA,EAAiB,QAAQ,CAAC,MAAA;AAkCvC;AAAA,cApBa,eAAA;AAAA,cAEA,UAAA;;cASA,cAAA;AAYb;;;;AAAiC;AAGjC;;AAHA,cAHa,eAAA;;cAGA,oBAAA;;cAGA,SAAA;;;;iBChDG,UAAA,CAAW,YAAA,6BAAyC,IAAY;ADQhF;;;;AAA6C;AAc7C;;;AAdA,iBCSgB,mBAAA,CAAoB,YAAA,8BAA0C,YAAY;ADKZ;AAAA,iBCQ9D,uBAAA,CAAwB,IAAkB,EAAZ,YAAY;;;;ADAhD;AAGV;;;;iBCYgB,gBAAA,CAAiB,GAAA,UAAa,MAAe;ADH7D;;;;AAA4B;AAG5B;;;AAHA,iBCgBgB,aAAA,CACd,QAAA,EAAU,YAAA,SACV,QAAA,EAAU,YAAA,EACV,GAAA,WACC,YAAA;;;;;ADtDH;;;;AAA6C;iBEL7B,gBAAA,CAAiB,IAAkB,EAAZ,YAAY;;iBASnC,iBAAA,CAAkB,IAAA,EAAM,YAAY;EAAK,KAAA;EAAe,KAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/tracking/params.ts","../../src/tracking/cookie.ts","../../src/tracking/platform.ts","../../src/tracking/identity.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;qBAuBa,iBAAiB,SAAS;;qBAc1B;qBAEA;;qBASA;;;;;;;;qBASA;;qBAGA;;qBAGA;;;;wBChDG,WAAW,yCAAyC;;;;;;;;;wBAiBpD,oBAAoB,0CAA0C;;wBAa9D,wBAAwB,MAAM;;;;;;;;;wBAe9B,iBAAiB,aAAa;;;;;;;;;wBAa9B,cACd,UAAU,qBACV,UAAU,cACV,cACC;;;;;;;;;;wBC3Da,iBAAiB,MAAM;;wBASvB,kBAAkB,MAAM;EAAiB;EAAe;;;;;;;;;;;;;;;;;;UCZvD;EACf;EACA;;;EAGA;EACA;EACA;EACA;;wBAWc,kBAAkB,UAAU,yBAAyB"}
@@ -1,3 +1,4 @@
1
+ import { t as identifySubmitter } from "../identity-BoRddTx3.mjs";
1
2
  import { a as PLATFORM_PARAMS, c as TRACKING_COOKIE_DAYS, i as CLICK_ID_PARAMS, l as UTM_PARAMS, n as identifyPlatform, o as TRACKED_PARAMS, r as AB_COOKIE, s as TRACKING_COOKIE, t as getPrimaryClickId } from "../platform-0nlOIy8h.mjs";
2
3
 
3
4
  //#region src/tracking/cookie.ts
@@ -73,5 +74,5 @@ function mergeTracking(existing, captured, now) {
73
74
  }
74
75
 
75
76
  //#endregion
76
- export { AB_COOKIE, CLICK_ID_PARAMS, PLATFORM_PARAMS, TRACKED_PARAMS, TRACKING_COOKIE, TRACKING_COOKIE_DAYS, UTM_PARAMS, cookieAttributes, getPrimaryClickId, identifyPlatform, mergeTracking, parseTrackingCookie, readCookie, serializeTrackingCookie };
77
+ export { AB_COOKIE, CLICK_ID_PARAMS, PLATFORM_PARAMS, TRACKED_PARAMS, TRACKING_COOKIE, TRACKING_COOKIE_DAYS, UTM_PARAMS, cookieAttributes, getPrimaryClickId, identifyPlatform, identifySubmitter, mergeTracking, parseTrackingCookie, readCookie, serializeTrackingCookie };
77
78
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/tracking/cookie.ts"],"sourcesContent":["/**\n * Reading and writing the `_ac` cookie, as functions over a cookie **string**.\n *\n * String in, string out, so one implementation serves both ends: the browser\n * passes `document.cookie`, the conversion handler passes the request's `Cookie`\n * header. A separate server-side parser would be a second thing to keep in step\n * with the writer, and the failure — attribution silently absent from a\n * notification — looks identical to a visitor who arrived organically.\n *\n * The same shape, for the same reason, as `@getvitops/core`'s consent store.\n */\nimport { TRACKING_COOKIE, TRACKING_COOKIE_DAYS } from './params.ts';\nimport type { TrackingData } from './types.ts';\n\n/** Read one cookie out of a `document.cookie`-shaped string. */\nexport function readCookie(cookieString: string | null | undefined, name: string): string | null {\n if (!cookieString) return null;\n for (const part of cookieString.split(';')) {\n const raw = part.trim();\n if (raw.slice(0, name.length + 1) === `${name}=`) return raw.slice(name.length + 1);\n }\n return null;\n}\n\n/**\n * Cookie header → attribution, or `null`.\n *\n * Anything unparseable reads as `null` — no attribution — rather than as a\n * partial record. A half-read cookie would attribute a conversion to whichever\n * fields happened to survive, which is worse than reporting it unattributed:\n * \"we don't know\" is actionable, a wrong campaign is not.\n */\nexport function parseTrackingCookie(cookieHeader: string | null | undefined): TrackingData | null {\n const raw = readCookie(cookieHeader, TRACKING_COOKIE);\n if (!raw) return null;\n try {\n const data: unknown = JSON.parse(decodeURIComponent(raw));\n if (typeof data !== 'object' || data === null || Array.isArray(data)) return null;\n return data as TrackingData;\n } catch {\n return null;\n }\n}\n\n/** Attribution → cookie value (not the full `Set-Cookie` — see `cookieAttributes`). */\nexport function serializeTrackingCookie(data: TrackingData): string {\n // Undefined values would serialize as absent keys anyway; dropping them first\n // keeps the cookie small and the round-trip exact.\n const clean = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined));\n return encodeURIComponent(JSON.stringify(clean));\n}\n\n/**\n * Attributes for the attribution cookie.\n *\n * `SameSite=Lax` rather than `Strict`: the visitor arrives here by following a\n * link from the ad platform, and `Strict` withholds the cookie on exactly that\n * cross-site navigation — so a returning click would read as a fresh one. No\n * `HttpOnly`, because the capture script has to write it from the page.\n */\nexport function cookieAttributes(now: number, secure: boolean): string {\n const expires = new Date(now + TRACKING_COOKIE_DAYS * 864e5).toUTCString();\n return `;expires=${expires};path=/;SameSite=Lax${secure ? ';Secure' : ''}`;\n}\n\n/**\n * Fold a fresh capture into whatever was already stored.\n *\n * New values win, but `ts` is the **first** capture's — it dates the visitor's\n * original arrival, which is what a 90-day attribution window is measured from.\n * Taking the latest would restart the window on every visit and make the cookie\n * outlive the click it represents.\n */\nexport function mergeTracking(\n existing: TrackingData | null,\n captured: TrackingData,\n now: number,\n): TrackingData {\n return { ...existing, ...captured, ts: existing?.ts ?? now };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAgB,WAAW,cAAyC,MAA6B;CAC/F,IAAI,CAAC,cAAc,OAAO;CAC1B,KAAK,MAAM,QAAQ,aAAa,MAAM,GAAG,GAAG;EAC1C,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,IAAI,MAAM,GAAG,KAAK,SAAS,CAAC,MAAM,GAAG,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC;CACpF;CACA,OAAO;AACT;;;;;;;;;AAUA,SAAgB,oBAAoB,cAA8D;CAChG,MAAM,MAAM,WAAW,mBAA6B;CACpD,IAAI,CAAC,KAAK,OAAO;CACjB,IAAI;EACF,MAAM,OAAgB,KAAK,MAAM,mBAAmB,GAAG,CAAC;EACxD,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG,OAAO;EAC7E,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,wBAAwB,MAA4B;CAGlE,MAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,OAAO,MAAM,MAAS,CAAC;CACxF,OAAO,mBAAmB,KAAK,UAAU,KAAK,CAAC;AACjD;;;;;;;;;AAUA,SAAgB,iBAAiB,KAAa,QAAyB;CAErE,OAAO,YADS,IAAI,KAAK,WAA6B,KAAK,CAAC,CAAC,YACpC,EAAE,sBAAsB,SAAS,YAAY;AACxE;;;;;;;;;AAUA,SAAgB,cACd,UACA,UACA,KACc;CACd,OAAO;EAAE,GAAG;EAAU,GAAG;EAAU,IAAI,UAAU,MAAM;CAAI;AAC7D"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/tracking/cookie.ts"],"sourcesContent":["/**\n * Reading and writing the `_ac` cookie, as functions over a cookie **string**.\n *\n * String in, string out, so one implementation serves both ends: the browser\n * passes `document.cookie`, the conversion handler passes the request's `Cookie`\n * header. A separate server-side parser would be a second thing to keep in step\n * with the writer, and the failure — attribution silently absent from a\n * notification — looks identical to a visitor who arrived organically.\n *\n * The same shape, for the same reason, as `@getvitops/core`'s consent store.\n */\nimport { TRACKING_COOKIE, TRACKING_COOKIE_DAYS } from './params.ts';\nimport type { TrackingData } from './types.ts';\n\n/** Read one cookie out of a `document.cookie`-shaped string. */\nexport function readCookie(cookieString: string | null | undefined, name: string): string | null {\n if (!cookieString) return null;\n for (const part of cookieString.split(';')) {\n const raw = part.trim();\n if (raw.slice(0, name.length + 1) === `${name}=`) return raw.slice(name.length + 1);\n }\n return null;\n}\n\n/**\n * Cookie header → attribution, or `null`.\n *\n * Anything unparseable reads as `null` — no attribution — rather than as a\n * partial record. A half-read cookie would attribute a conversion to whichever\n * fields happened to survive, which is worse than reporting it unattributed:\n * \"we don't know\" is actionable, a wrong campaign is not.\n */\nexport function parseTrackingCookie(cookieHeader: string | null | undefined): TrackingData | null {\n const raw = readCookie(cookieHeader, TRACKING_COOKIE);\n if (!raw) return null;\n try {\n const data: unknown = JSON.parse(decodeURIComponent(raw));\n if (typeof data !== 'object' || data === null || Array.isArray(data)) return null;\n return data as TrackingData;\n } catch {\n return null;\n }\n}\n\n/** Attribution → cookie value (not the full `Set-Cookie` — see `cookieAttributes`). */\nexport function serializeTrackingCookie(data: TrackingData): string {\n // Undefined values would serialize as absent keys anyway; dropping them first\n // keeps the cookie small and the round-trip exact.\n const clean = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined));\n return encodeURIComponent(JSON.stringify(clean));\n}\n\n/**\n * Attributes for the attribution cookie.\n *\n * `SameSite=Lax` rather than `Strict`: the visitor arrives here by following a\n * link from the ad platform, and `Strict` withholds the cookie on exactly that\n * cross-site navigation — so a returning click would read as a fresh one. No\n * `HttpOnly`, because the capture script has to write it from the page.\n */\nexport function cookieAttributes(now: number, secure: boolean): string {\n const expires = new Date(now + TRACKING_COOKIE_DAYS * 864e5).toUTCString();\n return `;expires=${expires};path=/;SameSite=Lax${secure ? ';Secure' : ''}`;\n}\n\n/**\n * Fold a fresh capture into whatever was already stored.\n *\n * New values win, but `ts` is the **first** capture's — it dates the visitor's\n * original arrival, which is what a 90-day attribution window is measured from.\n * Taking the latest would restart the window on every visit and make the cookie\n * outlive the click it represents.\n */\nexport function mergeTracking(\n existing: TrackingData | null,\n captured: TrackingData,\n now: number,\n): TrackingData {\n return { ...existing, ...captured, ts: existing?.ts ?? now };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,WAAW,cAAyC,MAA6B;CAC/F,IAAI,CAAC,cAAc,OAAO;CAC1B,KAAK,MAAM,QAAQ,aAAa,MAAM,GAAG,GAAG;EAC1C,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,IAAI,MAAM,GAAG,KAAK,SAAS,CAAC,MAAM,GAAG,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC;CACpF;CACA,OAAO;AACT;;;;;;;;;AAUA,SAAgB,oBAAoB,cAA8D;CAChG,MAAM,MAAM,WAAW,mBAA6B;CACpD,IAAI,CAAC,KAAK,OAAO;CACjB,IAAI;EACF,MAAM,OAAgB,KAAK,MAAM,mBAAmB,GAAG,CAAC;EACxD,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG,OAAO;EAC7E,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,wBAAwB,MAA4B;CAGlE,MAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,OAAO,MAAM,MAAS,CAAC;CACxF,OAAO,mBAAmB,KAAK,UAAU,KAAK,CAAC;AACjD;;;;;;;;;AAUA,SAAgB,iBAAiB,KAAa,QAAyB;CAErE,OAAO,YADS,IAAI,KAAK,WAA6B,KAAK,CAAC,CAAC,YACpC,EAAE,sBAAsB,SAAS,YAAY;AACxE;;;;;;;;;AAUA,SAAgB,cACd,UACA,UACA,KACc;CACd,OAAO;EAAE,GAAG;EAAU,GAAG;EAAU,IAAI,UAAU,MAAM;CAAI;AAC7D"}
@@ -52,10 +52,12 @@ interface TrackingData {
52
52
  * and their tests need no fake timers.
53
53
  */
54
54
  interface ConversionEvent {
55
- type: 'form' | 'call';
55
+ type: 'form' | 'call' | 'email';
56
56
  /** Submitted fields, for `type: 'form'`. Honeypots are stripped before this. */
57
57
  formData?: Record<string, string> | undefined;
58
58
  phone?: string | undefined;
59
+ /** The `mailto:` address, for `type: 'email'`. */
60
+ email?: string | undefined;
59
61
  /** Attribution from the `_ac` cookie, or null when the visitor arrived cold. */
60
62
  tracking: TrackingData | null;
61
63
  userAgent?: string | undefined;
@@ -65,4 +67,4 @@ interface ConversionEvent {
65
67
  }
66
68
  //#endregion
67
69
  export { TrackingData as i, TrackingCategory as n, TrackingConfig as r, ConversionEvent as t };
68
- //# sourceMappingURL=types-CHHjzRrv.d.mts.map
70
+ //# sourceMappingURL=types-7ELci8RQ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-7ELci8RQ.d.mts","names":[],"sources":["../src/tracking/types.ts"],"mappings":";;;;;;;;;;KAiBY;UAEK;EACf;;;;;;;EAOA,WAAW;EACX;;;;;;;;;;UAWe;GACd;;EAED;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;UAee;EACf;;EAEA,WAAW;EACX;;EAEA;;EAEA,UAAU;EACV;EACA;;EAEA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getvitops/utils",
3
- "version": "8.0.1",
3
+ "version": "8.2.0-alpha.0",
4
4
  "description": "Shared build-time utilities for the Vitops toolchain — favicon generation and friends.",
5
5
  "homepage": "https://docs.vitops.ca",
6
6
  "bugs": "https://github.com/getvitops/design-system/issues",
@@ -54,6 +54,10 @@
54
54
  "types": "./dist/notify/index.d.mts",
55
55
  "import": "./dist/notify/index.mjs"
56
56
  },
57
+ "./crm": {
58
+ "types": "./dist/crm/index.d.mts",
59
+ "import": "./dist/crm/index.mjs"
60
+ },
57
61
  "./tracking": {
58
62
  "types": "./dist/tracking/index.d.mts",
59
63
  "import": "./dist/tracking/index.mjs"
@@ -65,6 +69,18 @@
65
69
  "./schema": {
66
70
  "types": "./dist/schema/index.d.mts",
67
71
  "import": "./dist/schema/index.mjs"
72
+ },
73
+ "./hosting": {
74
+ "types": "./dist/hosting/index.d.mts",
75
+ "import": "./dist/hosting/index.mjs"
76
+ },
77
+ "./email": {
78
+ "types": "./dist/email/index.d.mts",
79
+ "import": "./dist/email/index.mjs"
80
+ },
81
+ "./git": {
82
+ "types": "./dist/git/index.d.mts",
83
+ "import": "./dist/git/index.mjs"
68
84
  }
69
85
  },
70
86
  "publishConfig": {
@@ -76,9 +92,7 @@
76
92
  "png-to-ico": "^3.0.2",
77
93
  "sharp": "^0.35.3"
78
94
  },
79
- "devDependencies": {
80
- "vitest": "4.1.9"
81
- },
95
+ "devDependencies": {},
82
96
  "engines": {
83
97
  "node": ">=24"
84
98
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"adc-BFrzpMHq.d.mts","names":[],"sources":["../src/google/adc.ts"],"mappings":";;;;iBAkBgB,YAAA,CAAa,GAAA,WAAc,WAAW;;iBAwBtC,eAAA,CAAgB,GAAW;;;;;;AAsB1C;;;;iBALe,kBAAA,CAAmB,IAAA;EACjC,GAAA,EAAK,MAAM;EACX,QAAA;EACA,IAAA;EACA,IAAA,MAAU,KAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloudflare-CgAsXiqe.mjs","names":[],"sources":["../src/plan-format.ts","../src/onboarding/cloudflare.ts"],"sourcesContent":["/**\n * The end-of-run summary table shared by `onboarding/plan.ts`'s and `ads/plan.ts`'s\n * `formatSummary` — same header row, same column padding, same \"Reminders\n * (manual — no API):\" tail. Their `StepAction`/`StepPlan`/`formatPlan` glyph\n * renderers stay separate: onboarding's steps are `create | update | skip`\n * with no `blocked` state, ads' are `create | skip | blocked` with a `needs`\n * field, and collapsing those two shapes into one would blur a real\n * difference rather than remove duplication.\n */\nconst pad = (s: string, n: number) => s.padEnd(n);\n\n/** Render a fixed-width table, then a \"Reminders\" section if any were passed. */\nexport function table(headers: string[], rows: string[][], reminders: string[]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((row) => row[i]?.length ?? 0)),\n );\n const line = (cells: string[]) =>\n cells\n .map((c, i) => pad(c, widths[i] ?? 0))\n .join(' ')\n .trimEnd();\n\n const out = [line(headers), widths.map((w) => '─'.repeat(w)).join(' ')];\n for (const row of rows) out.push(line(row));\n if (reminders.length) out.push('', 'Reminders (manual — no API):', ...reminders);\n return out.join('\\n');\n}\n","/**\n * Cloudflare DNS — the one thing this command writes.\n *\n * Scoped to exactly what onboarding needs and nothing more: find a zone by name,\n * read the apex TXT records, and *create* the verification TXT when it is missing.\n * There is deliberately no update and no delete — the command's contract is that it\n * never removes a DNS record, so the destructive verbs are simply absent rather\n * than guarded.\n *\n * The token is a `Zone:DNS:Edit` credential from the environment\n * (`CLOUDFLARE_API_TOKEN`); listing a zone by name also needs `Zone:Read`, which\n * Cloudflare's standard \"Edit zone DNS\" token template already bundles. As with the\n * indexing executors, `fetchImpl` is injected so the request shape is testable\n * without the network, and every call returns a structured result rather than\n * throwing — the caller decides what a failure means per domain.\n */\nconst API = 'https://api.cloudflare.com/client/v4';\n\ninterface CfEnvelope<T> {\n success: boolean;\n errors?: { code: number; message: string }[];\n result?: T;\n}\n\nconst cfError = (status: number, body: CfEnvelope<unknown>): string => {\n const first = body.errors?.[0];\n return first ? `${first.code} ${first.message}` : `HTTP ${status}`;\n};\n\n/** Find the zone id for a domain (`GET /zones?name=`). */\nexport async function findZoneId(\n token: string,\n domain: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<{ ok: boolean; status: number; zoneId?: string; message?: string }> {\n const res = await fetchImpl(`${API}/zones?name=${encodeURIComponent(domain)}`, {\n headers: { authorization: `Bearer ${token}` },\n });\n const body = (await res.json()) as CfEnvelope<{ id: string; name: string }[]>;\n if (!res.ok || !body.success)\n return { ok: false, status: res.status, message: cfError(res.status, body) };\n const zone = body.result?.[0];\n if (!zone)\n return {\n ok: false,\n status: res.status,\n // Name the scope: this lookup is a GET /zones?name=, which needs\n // `Zone:Read` — a token carrying only `Zone:DNS:Edit` reaches here and\n // reads as \"the zone isn't in this account\", which sends you to the\n // wrong dashboard.\n message: `no Cloudflare zone named \"${domain}\" (is it in this account, and does the token carry Zone:Read as well as Zone:DNS:Edit? The \"Edit zone DNS\" template covers both.)`,\n };\n return { ok: true, status: res.status, zoneId: zone.id };\n}\n\n/** List the apex TXT record contents for a zone. */\nexport async function listApexTxt(\n token: string,\n zoneId: string,\n domain: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<{ ok: boolean; status: number; contents: string[]; message?: string }> {\n const res = await fetchImpl(\n `${API}/zones/${zoneId}/dns_records?type=TXT&name=${encodeURIComponent(domain)}`,\n { headers: { authorization: `Bearer ${token}` } },\n );\n const body = (await res.json()) as CfEnvelope<{ content: string }[]>;\n if (!res.ok || !body.success)\n return { ok: false, status: res.status, contents: [], message: cfError(res.status, body) };\n // Cloudflare returns TXT content quoted; normalise so an exact compare works.\n const contents = (body.result ?? []).map((r) => r.content.replace(/^\"|\"$/g, ''));\n return { ok: true, status: res.status, contents };\n}\n\n/**\n * Create an apex TXT record. **Create only** — never called when one already\n * exists (the planner decides that), and there is no sibling that edits or removes.\n */\nexport async function createApexTxt(\n token: string,\n zoneId: string,\n domain: string,\n content: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<{ ok: boolean; status: number; message?: string }> {\n const res = await fetchImpl(`${API}/zones/${zoneId}/dns_records`, {\n method: 'POST',\n headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json' },\n body: JSON.stringify({ type: 'TXT', name: domain, content }),\n });\n const body = (await res.json()) as CfEnvelope<{ id: string }>;\n if (!res.ok || !body.success)\n return { ok: false, status: res.status, message: cfError(res.status, body) };\n return { ok: true, status: res.status };\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,OAAO,GAAW,MAAc,EAAE,OAAO,CAAC;;AAGhD,SAAgB,MAAM,SAAmB,MAAkB,WAA6B;CACtF,MAAM,SAAS,QAAQ,KAAK,GAAG,MAC7B,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,KAAK,QAAQ,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC,CAC9D;CACA,MAAM,QAAQ,UACZ,MACG,KAAK,GAAG,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,CACrC,KAAK,IAAI,CAAC,CACV,QAAQ;CAEb,MAAM,MAAM,CAAC,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACvE,KAAK,MAAM,OAAO,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;CAC1C,IAAI,UAAU,QAAQ,IAAI,KAAK,IAAI,gCAAgC,GAAG,SAAS;CAC/E,OAAO,IAAI,KAAK,IAAI;AACtB;;;;;;;;;;;;;;;;;;;;ACVA,MAAM,MAAM;AAQZ,MAAM,WAAW,QAAgB,SAAsC;CACrE,MAAM,QAAQ,KAAK,SAAS;CAC5B,OAAO,QAAQ,GAAG,MAAM,KAAK,GAAG,MAAM,YAAY,QAAQ;AAC5D;;AAGA,eAAsB,WACpB,OACA,QACA,YAA0B,OACmD;CAC7E,MAAM,MAAM,MAAM,UAAU,GAAG,IAAI,cAAc,mBAAmB,MAAM,KAAK,EAC7E,SAAS,EAAE,eAAe,UAAU,QAAQ,EAC9C,CAAC;CACD,MAAM,OAAQ,MAAM,IAAI,KAAK;CAC7B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,SACnB,OAAO;EAAE,IAAI;EAAO,QAAQ,IAAI;EAAQ,SAAS,QAAQ,IAAI,QAAQ,IAAI;CAAE;CAC7E,MAAM,OAAO,KAAK,SAAS;CAC3B,IAAI,CAAC,MACH,OAAO;EACL,IAAI;EACJ,QAAQ,IAAI;EAKZ,SAAS,6BAA6B,OAAO;CAC/C;CACF,OAAO;EAAE,IAAI;EAAM,QAAQ,IAAI;EAAQ,QAAQ,KAAK;CAAG;AACzD;;AAGA,eAAsB,YACpB,OACA,QACA,QACA,YAA0B,OACsD;CAChF,MAAM,MAAM,MAAM,UAChB,GAAG,IAAI,SAAS,OAAO,6BAA6B,mBAAmB,MAAM,KAC7E,EAAE,SAAS,EAAE,eAAe,UAAU,QAAQ,EAAE,CAClD;CACA,MAAM,OAAQ,MAAM,IAAI,KAAK;CAC7B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,SACnB,OAAO;EAAE,IAAI;EAAO,QAAQ,IAAI;EAAQ,UAAU,CAAC;EAAG,SAAS,QAAQ,IAAI,QAAQ,IAAI;CAAE;CAE3F,MAAM,YAAY,KAAK,UAAU,CAAC,EAAC,CAAE,KAAK,MAAM,EAAE,QAAQ,QAAQ,UAAU,EAAE,CAAC;CAC/E,OAAO;EAAE,IAAI;EAAM,QAAQ,IAAI;EAAQ;CAAS;AAClD;;;;;AAMA,eAAsB,cACpB,OACA,QACA,QACA,SACA,YAA0B,OACkC;CAC5D,MAAM,MAAM,MAAM,UAAU,GAAG,IAAI,SAAS,OAAO,eAAe;EAChE,QAAQ;EACR,SAAS;GAAE,eAAe,UAAU;GAAS,gBAAgB;EAAmB;EAChF,MAAM,KAAK,UAAU;GAAE,MAAM;GAAO,MAAM;GAAQ;EAAQ,CAAC;CAC7D,CAAC;CACD,MAAM,OAAQ,MAAM,IAAI,KAAK;CAC7B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,SACnB,OAAO;EAAE,IAAI;EAAO,QAAQ,IAAI;EAAQ,SAAS,QAAQ,IAAI,QAAQ,IAAI;CAAE;CAC7E,OAAO;EAAE,IAAI;EAAM,QAAQ,IAAI;CAAO;AACxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-Bz_-igw-.d.mts","names":[],"sources":["../src/google/token.ts"],"mappings":";;UAkCiB,cAAA;EACf,YAAA;EACA,WAAW;AAAA;AAAA;AAAA,UAII,WAAA;EACf,QAAA;EACA,YAAA;EACA,YAAA;AAAA;;;;AAAY;AAWd;;;;KAAY,gBAAA;EACN,IAAA;EAAyB,OAAA,EAAS,cAAA;EAAgB,KAAA;AAAA;EAClD,IAAA;EAAe,KAAA,EAAO,WAAW;AAAA;AAAA;AA8CvC;;;;;;;;AA9CuC,iBA8CvB,iBAAA,CACd,UAAA,EAAY,gBAAA,EACZ,SAAA,UAAkB,KAAA,EAClB,GAAA,YACC,OAAA;;;;;;;AAAO;AA6BV;;;;AAEc;AAUd;UAZiB,UAAA;EACf,KAAA;EACA,YAAY;AAAA;AAad;;;;;;;AAAA,KAHY,cAAA,YAA0B,UAAU;;iBAGhC,aAAA,CACd,IAAA,EAAM,cAAA,EACN,KAAA,GAAQ,MAAA,mBACP,MAAA;;cA2BU,MAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CHHjzRrv.d.mts","names":[],"sources":["../src/tracking/types.ts"],"mappings":";;AAiBA;;;;AAA4B;AAE5B;;;KAFY,gBAAA;AAAA,UAEK,cAAA;EACf,OAAA;EAOW;;;AACF;AAWX;;EAZE,QAAA,GAAW,gBAAgB;EAC3B,SAAA;AAAA;;;;;;AAoBU;AAeZ;;UAxBiB,YAAA;EAAA,CACd,KAAA;EAwBD;EAtBA,WAAA;EAwBW;EAtBX,QAAA;EAyBA;EAvBA,EAAA;EAwBA;EAtBA,UAAA;AAAA;;AAyBE;;;;;;;;;;;UAVa,eAAA;EACf,IAAA;;EAEA,QAAA,GAAW,MAAA;EACX,KAAA;;EAEA,QAAA,EAAU,YAAY;EACtB,SAAA;EACA,EAAA;;EAEA,EAAA;AAAA"}