@iann29/rastro 0.10.0 → 0.10.2

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 (101) hide show
  1. package/agent/manifest.json +1 -1
  2. package/dist/client/index.d.ts +6 -1
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +9 -3
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/component/_generated/component.d.ts +1 -0
  7. package/dist/component/_generated/component.d.ts.map +1 -1
  8. package/dist/component/meta.d.ts +11 -5
  9. package/dist/component/meta.d.ts.map +1 -1
  10. package/dist/component/meta.js +88 -25
  11. package/dist/component/meta.js.map +1 -1
  12. package/dist/component/metaGraph.d.ts +0 -1
  13. package/dist/component/metaGraph.d.ts.map +1 -1
  14. package/dist/component/metaGraph.js +29 -16
  15. package/dist/component/metaGraph.js.map +1 -1
  16. package/dist/component/pipeline.d.ts +1 -0
  17. package/dist/component/pipeline.d.ts.map +1 -1
  18. package/dist/component/pipeline.js +18 -5
  19. package/dist/component/pipeline.js.map +1 -1
  20. package/dist/tracker/generated.d.ts +1 -1
  21. package/dist/tracker/generated.js +1 -1
  22. package/dist/ui/index.d.ts +2 -2
  23. package/dist/ui/index.d.ts.map +1 -1
  24. package/dist/ui/index.js +3 -2
  25. package/dist/ui/index.js.map +1 -1
  26. package/dist/ui/integrations/AccountPicker.d.ts.map +1 -1
  27. package/dist/ui/integrations/AccountPicker.js +6 -2
  28. package/dist/ui/integrations/AccountPicker.js.map +1 -1
  29. package/dist/ui/integrations/ClientCards.d.ts.map +1 -1
  30. package/dist/ui/integrations/ClientCards.js +6 -2
  31. package/dist/ui/integrations/ClientCards.js.map +1 -1
  32. package/dist/ui/integrations/ClientsTable.d.ts.map +1 -1
  33. package/dist/ui/integrations/ClientsTable.js +26 -10
  34. package/dist/ui/integrations/ClientsTable.js.map +1 -1
  35. package/dist/ui/integrations/Connect.d.ts +8 -2
  36. package/dist/ui/integrations/Connect.d.ts.map +1 -1
  37. package/dist/ui/integrations/Connect.js +18 -5
  38. package/dist/ui/integrations/Connect.js.map +1 -1
  39. package/dist/ui/integrations/Connection.d.ts.map +1 -1
  40. package/dist/ui/integrations/Connection.js +18 -4
  41. package/dist/ui/integrations/Connection.js.map +1 -1
  42. package/dist/ui/integrations/Dialogs.d.ts +4 -1
  43. package/dist/ui/integrations/Dialogs.d.ts.map +1 -1
  44. package/dist/ui/integrations/Dialogs.js +13 -4
  45. package/dist/ui/integrations/Dialogs.js.map +1 -1
  46. package/dist/ui/integrations/EventsFeed.d.ts.map +1 -1
  47. package/dist/ui/integrations/EventsFeed.js +5 -1
  48. package/dist/ui/integrations/EventsFeed.js.map +1 -1
  49. package/dist/ui/integrations/EventsSheet.d.ts +9 -3
  50. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -1
  51. package/dist/ui/integrations/EventsSheet.js +20 -5
  52. package/dist/ui/integrations/EventsSheet.js.map +1 -1
  53. package/dist/ui/integrations/Icons.d.ts +2 -0
  54. package/dist/ui/integrations/Icons.d.ts.map +1 -1
  55. package/dist/ui/integrations/Icons.js +2 -0
  56. package/dist/ui/integrations/Icons.js.map +1 -1
  57. package/dist/ui/integrations/IntegrationsView.d.ts +10 -9
  58. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -1
  59. package/dist/ui/integrations/IntegrationsView.js +43 -15
  60. package/dist/ui/integrations/IntegrationsView.js.map +1 -1
  61. package/dist/ui/integrations/Overlay.js +1 -1
  62. package/dist/ui/integrations/Overlay.js.map +1 -1
  63. package/dist/ui/integrations/Partner.d.ts +14 -0
  64. package/dist/ui/integrations/Partner.d.ts.map +1 -0
  65. package/dist/ui/integrations/Partner.js +38 -0
  66. package/dist/ui/integrations/Partner.js.map +1 -0
  67. package/dist/ui/integrations/RowMenu.js +1 -1
  68. package/dist/ui/integrations/RowMenu.js.map +1 -1
  69. package/dist/ui/integrations/audience.d.ts +12 -0
  70. package/dist/ui/integrations/audience.d.ts.map +1 -0
  71. package/dist/ui/integrations/audience.js +12 -0
  72. package/dist/ui/integrations/audience.js.map +1 -0
  73. package/dist/ui/integrations/index.d.ts +2 -2
  74. package/dist/ui/integrations/index.d.ts.map +1 -1
  75. package/dist/ui/integrations/index.js +1 -1
  76. package/dist/ui/integrations/index.js.map +1 -1
  77. package/dist/ui/integrations/{overlay.d.ts → modal.d.ts} +1 -1
  78. package/dist/ui/integrations/modal.d.ts.map +1 -0
  79. package/dist/ui/integrations/{overlay.js → modal.js} +1 -1
  80. package/dist/ui/integrations/modal.js.map +1 -0
  81. package/dist/ui/integrations/model.d.ts +18 -3
  82. package/dist/ui/integrations/model.d.ts.map +1 -1
  83. package/dist/ui/integrations/model.js +35 -2
  84. package/dist/ui/integrations/model.js.map +1 -1
  85. package/dist/ui/integrations/types.d.ts +53 -3
  86. package/dist/ui/integrations/types.d.ts.map +1 -1
  87. package/dist/ui/sample.d.ts +62 -0
  88. package/dist/ui/sample.d.ts.map +1 -1
  89. package/dist/ui/sample.js +21 -0
  90. package/dist/ui/sample.js.map +1 -1
  91. package/dist/ui/ui.css +73 -5
  92. package/docs/meta-ads.md +53 -4
  93. package/docs/upgrading.md +27 -0
  94. package/package.json +1 -1
  95. package/src/component/_generated/component.ts +1 -0
  96. package/src/component/meta.ts +102 -31
  97. package/src/component/metaGraph.ts +35 -21
  98. package/src/component/pipeline.ts +23 -5
  99. package/src/tracker/generated.ts +1 -1
  100. package/dist/ui/integrations/overlay.d.ts.map +0 -1
  101. package/dist/ui/integrations/overlay.js.map +0 -1
@@ -7,6 +7,7 @@ import {
7
7
  type QueryCtx,
8
8
  } from "./_generated/server.js";
9
9
  import { fail } from "./errors.js";
10
+ import { ownerKeyOf } from "./meta.js";
10
11
  import { enqueueColumnEvent, type MetaUserData } from "./metaCapi.js";
11
12
  import { cleanString } from "./sanitize.js";
12
13
  import {
@@ -139,10 +140,30 @@ export const setEventMap = mutation({
139
140
  siteId: v.id("sites"),
140
141
  columns: v.record(v.string(), v.union(metaColumnEventValidator, v.null())),
141
142
  sendLeadEvent: v.boolean(),
143
+ /**
144
+ * The owner saving the map. The map feeds the site's pixel, so whoever
145
+ * set the pixel decides it: with `ownerKey`, a pixel another owner (or
146
+ * the host) set is a `CONFLICT`. A site without a pixel takes anyone's.
147
+ */
148
+ ownerKey: v.optional(v.string()),
142
149
  },
143
150
  returns: v.null(),
144
151
  handler: async (ctx, args) => {
145
152
  await requireSite(ctx, args.siteId);
153
+ const pixel = await ctx.db
154
+ .query("sitePixels")
155
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
156
+ .unique();
157
+ if (
158
+ args.ownerKey !== undefined &&
159
+ pixel &&
160
+ pixel.setBy !== ownerKeyOf(args.ownerKey)
161
+ ) {
162
+ fail(
163
+ "CONFLICT",
164
+ "the site's pixel was set by another owner on this host; change its events there",
165
+ );
166
+ }
146
167
  const existing = await pipelineOf(ctx, args.siteId);
147
168
  const declared = new Set((existing?.columns ?? []).map((row) => row.key));
148
169
  for (const key of Object.keys(args.columns)) {
@@ -174,14 +195,11 @@ export const setEventMap = mutation({
174
195
  updatedAt: now,
175
196
  });
176
197
  }
177
- const pixel = await ctx.db
178
- .query("sitePixels")
179
- .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
180
- .unique();
198
+ // `updatedAt` stays: it says when the pixel itself was set, which is what
199
+ // removing its owner compares against.
181
200
  if (pixel && pixel.sendLeadEvent !== args.sendLeadEvent) {
182
201
  await ctx.db.patch("sitePixels", pixel._id, {
183
202
  sendLeadEvent: args.sendLeadEvent,
184
- updatedAt: now,
185
203
  });
186
204
  }
187
205
  return null;
@@ -1,5 +1,5 @@
1
1
  // Generated by scripts/build-tracker.mjs. Do not edit.
2
- export const RASTRO_VERSION = "0.10.0";
2
+ export const RASTRO_VERSION = "0.10.2";
3
3
  export const TRACKER_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,i=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!i)return;const n=()=>crypto.randomUUID?.()||Math.random()+\"\",r=new URLSearchParams(location.search),s=r.get(\"ref\")?.slice(0,64);let o;for(const t of[\"source\",\"medium\",\"campaign\",\"term\",\"content\"]){const e=r.get(\"utm_\"+t)?.slice(0,64);e&&((o??={})[\"utm_\"+t]=e)}const a=\"gclid gbraid wbraid msclkid ttclid twclid li_fat_id ScCid rdt_cid dclid epik srsltid mc_cid mc_eid _hsenc igsh igshid fbclid\".split(\" \").filter(t=>r.has(t)).slice(0,8);let c,d,l,h,f=t.dataset.visitor||\"\",p=Boolean(f);try{f||=localStorage._rv||=n()}catch{}try{d=sessionStorage,l=d._r,c=d._ri==f&&d._rt,h=s||d._a,h&&(d._a=h),o||=d._u&&JSON.parse(d._u),o&&(d._u=JSON.stringify(o))}catch{h=s}let v,g=0;const u=[];let m=document.referrer.split(\"/\",3).join(\"/\")||void 0;const _=t=>{const n=u.splice(0,50);if(!n.length)return;const r=()=>new Blob([JSON.stringify({siteId:e,events:n,sentAt:Date.now()})]);let s=r();for(;s.size>64e3&&n.length>1;)u.unshift(n.pop()),s=r();t&&navigator.sendBeacon(i,s)||fetch(i,{method:\"POST\",body:s,keepalive:1}).catch(()=>{}),u.length&&_(t)},y=(t,e,i)=>{const r=Date.now(),s=r-c;c=r,s<18e5||(l=n(),\"pageview\"!=t&&(S=\"\",w()));try{d._r=l,d._ri=f,d._rt=r}catch{}u.push({eventId:`${l}.${r.toString(36)}.${g}`,sessionId:l,visitorId:f||l,type:t,name:e,path:location.pathname.slice(0,256),referrer:m,timestamp:r,sequence:g++,affiliateSlug:h,...i}),clearTimeout(v),v=setTimeout(_,1200)};let S;const w=()=>{const t=location.pathname;t!=S&&(S=t,y(\"pageview\",void 0,{properties:o,clid:a.length?a:void 0}))};window.rastro=(e,i,r)=>{if(\"context\"==e)return{sessionId:l,visitorId:f||l,identified:p};if(\"identify\"==e||\"reset\"==e){if(\"identify\"==e&&(!i||i.length>128||!/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(i)))return;if(\"identify\"==e&&i==f)return;_();const r=\"reset\"==e||p;if(p=\"identify\"==e,f=\"identify\"==e?i:n(),t.dataset.visitor=\"identify\"==e?f:\"\",r){h=void 0,o=void 0,m=void 0,a.length=0;try{\"reset\"==e&&(localStorage._rv=f),d._a=\"\",d._u=\"\"}catch{}}c=0,g=0,S=\"\",w()}\"event\"==e&&y(\"custom\",`${i||\"event\"}`.slice(0,80),r&&JSON.stringify(r).length>2e4?void 0:{properties:r})},document.addEventListener(\"click\",t=>{const e=t.target?.closest(\"a,button,[data-rastro-event]\");if(!e)return;const i=e.dataset.rastroEvent,n=e.href,r=n&&new URL(n),s=/^https?:$/.test(r?.protocol),o=s&&r.origin!=location.origin;y(i?\"custom\":o?\"outbound\":\"click\",i,{target:(e.dataset.rastroLabel||e.innerText||e.tagName).slice(0,64),href:s?((o?r.origin:\"\")+r.pathname).slice(0,256):void 0})},1);for(const t of[\"pushState\",\"replaceState\"]){const e=history[t];history[t]=(...t)=>{e.apply(history,t),w()}}addEventListener(\"popstate\",w);let b=0;const I=()=>{y(\"heartbeat\"),_()},L=()=>{b&&(clearInterval(b),b=0,y(\"leave\"),_(1))},E=()=>{document.hidden?L():b||(I(),b=setInterval(I,2e4))};addEventListener(\"pagehide\",L),addEventListener(\"pageshow\",E),document.addEventListener(\"visibilitychange\",E),b=setInterval(I,2e4),w(),E()})();";
4
4
  export const TRACKER_GZIP_BASE64 = "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";
5
5
  export const TRACKER_RAW_BYTES = 2999;
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpE;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,OAAO,EAAE,MAAM,IAAI,EACnB,OAAO,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QA2CxC;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,EAClD,OAAO,EAAE,MAAM,IAAI,QAsBpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/ui/integrations/overlay.ts"],"names":[],"mappings":"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"}