@iann29/rastro 0.10.9 → 0.11.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 (178) hide show
  1. package/README.md +8 -0
  2. package/agent/integration.md +45 -0
  3. package/agent/manifest.json +4 -4
  4. package/dist/client/federation.d.ts +82 -9
  5. package/dist/client/federation.d.ts.map +1 -1
  6. package/dist/client/federation.js +40 -2
  7. package/dist/client/federation.js.map +1 -1
  8. package/dist/client/index.d.ts +464 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +259 -7
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +10 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +273 -21
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/_generated/server.d.ts +2 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -1
  19. package/dist/component/_generated/server.js.map +1 -1
  20. package/dist/component/constants.d.ts +31 -0
  21. package/dist/component/constants.d.ts.map +1 -1
  22. package/dist/component/constants.js +31 -0
  23. package/dist/component/constants.js.map +1 -1
  24. package/dist/component/convex.config.d.ts +2 -0
  25. package/dist/component/convex.config.js +7 -0
  26. package/dist/component/convex.config.js.map +1 -1
  27. package/dist/component/errors.d.ts +1 -1
  28. package/dist/component/errors.d.ts.map +1 -1
  29. package/dist/component/errors.js.map +1 -1
  30. package/dist/component/http.d.ts.map +1 -1
  31. package/dist/component/http.js +64 -0
  32. package/dist/component/http.js.map +1 -1
  33. package/dist/component/leadAdsValidators.d.ts +1092 -0
  34. package/dist/component/leadAdsValidators.d.ts.map +1 -0
  35. package/dist/component/leadAdsValidators.js +304 -0
  36. package/dist/component/leadAdsValidators.js.map +1 -0
  37. package/dist/component/leadFormRules.d.ts +60 -0
  38. package/dist/component/leadFormRules.d.ts.map +1 -0
  39. package/dist/component/leadFormRules.js +140 -0
  40. package/dist/component/leadFormRules.js.map +1 -0
  41. package/dist/component/leadFormStore.d.ts +16 -0
  42. package/dist/component/leadFormStore.d.ts.map +1 -0
  43. package/dist/component/leadFormStore.js +92 -0
  44. package/dist/component/leadFormStore.js.map +1 -0
  45. package/dist/component/leadgenToken.d.ts +56 -0
  46. package/dist/component/leadgenToken.d.ts.map +1 -0
  47. package/dist/component/leadgenToken.js +262 -0
  48. package/dist/component/leadgenToken.js.map +1 -0
  49. package/dist/component/leads.d.ts +76 -7
  50. package/dist/component/leads.d.ts.map +1 -1
  51. package/dist/component/leads.js +112 -78
  52. package/dist/component/leads.js.map +1 -1
  53. package/dist/component/meta.d.ts.map +1 -1
  54. package/dist/component/meta.js +21 -1
  55. package/dist/component/meta.js.map +1 -1
  56. package/dist/component/metaFake.d.ts +44 -0
  57. package/dist/component/metaFake.d.ts.map +1 -1
  58. package/dist/component/metaFake.js +400 -1
  59. package/dist/component/metaFake.js.map +1 -1
  60. package/dist/component/metaGraph.d.ts +91 -0
  61. package/dist/component/metaGraph.d.ts.map +1 -1
  62. package/dist/component/metaGraph.js +217 -0
  63. package/dist/component/metaGraph.js.map +1 -1
  64. package/dist/component/metaLeads.d.ts +681 -0
  65. package/dist/component/metaLeads.d.ts.map +1 -0
  66. package/dist/component/metaLeads.js +2634 -0
  67. package/dist/component/metaLeads.js.map +1 -0
  68. package/dist/component/schema.d.ts +414 -5
  69. package/dist/component/schema.d.ts.map +1 -1
  70. package/dist/component/schema.js +169 -1
  71. package/dist/component/schema.js.map +1 -1
  72. package/dist/component/validators.d.ts +235 -11
  73. package/dist/component/validators.d.ts.map +1 -1
  74. package/dist/component/validators.js +14 -1
  75. package/dist/component/validators.js.map +1 -1
  76. package/dist/tracker/generated.d.ts +1 -1
  77. package/dist/tracker/generated.js +1 -1
  78. package/dist/ui/campaigns/CampaignsView.d.ts +5 -1
  79. package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -1
  80. package/dist/ui/campaigns/CampaignsView.js.map +1 -1
  81. package/dist/ui/campaigns/Drawer.d.ts.map +1 -1
  82. package/dist/ui/campaigns/Drawer.js +8 -26
  83. package/dist/ui/campaigns/Drawer.js.map +1 -1
  84. package/dist/ui/campaigns/labels.d.ts +29 -1
  85. package/dist/ui/campaigns/labels.d.ts.map +1 -1
  86. package/dist/ui/campaigns/labels.js +77 -2
  87. package/dist/ui/campaigns/labels.js.map +1 -1
  88. package/dist/ui/campaigns/model.js +2 -2
  89. package/dist/ui/campaigns/model.js.map +1 -1
  90. package/dist/ui/forms/FirstContact.d.ts +19 -0
  91. package/dist/ui/forms/FirstContact.d.ts.map +1 -0
  92. package/dist/ui/forms/FirstContact.js +81 -0
  93. package/dist/ui/forms/FirstContact.js.map +1 -0
  94. package/dist/ui/forms/FormLead.d.ts +28 -0
  95. package/dist/ui/forms/FormLead.d.ts.map +1 -0
  96. package/dist/ui/forms/FormLead.js +199 -0
  97. package/dist/ui/forms/FormLead.js.map +1 -0
  98. package/dist/ui/forms/FormRulesDrawer.d.ts +49 -0
  99. package/dist/ui/forms/FormRulesDrawer.d.ts.map +1 -0
  100. package/dist/ui/forms/FormRulesDrawer.js +149 -0
  101. package/dist/ui/forms/FormRulesDrawer.js.map +1 -0
  102. package/dist/ui/forms/FormsView.d.ts +10 -0
  103. package/dist/ui/forms/FormsView.d.ts.map +1 -0
  104. package/dist/ui/forms/FormsView.js +215 -0
  105. package/dist/ui/forms/FormsView.js.map +1 -0
  106. package/dist/ui/forms/Icons.d.ts +46 -0
  107. package/dist/ui/forms/Icons.d.ts.map +1 -0
  108. package/dist/ui/forms/Icons.js +45 -0
  109. package/dist/ui/forms/Icons.js.map +1 -0
  110. package/dist/ui/forms/RuleRow.d.ts +37 -0
  111. package/dist/ui/forms/RuleRow.d.ts.map +1 -0
  112. package/dist/ui/forms/RuleRow.js +80 -0
  113. package/dist/ui/forms/RuleRow.js.map +1 -0
  114. package/dist/ui/forms/WhatsAppButtonGuide.d.ts +33 -0
  115. package/dist/ui/forms/WhatsAppButtonGuide.d.ts.map +1 -0
  116. package/dist/ui/forms/WhatsAppButtonGuide.js +90 -0
  117. package/dist/ui/forms/WhatsAppButtonGuide.js.map +1 -0
  118. package/dist/ui/forms/index.d.ts +11 -0
  119. package/dist/ui/forms/index.d.ts.map +1 -0
  120. package/dist/ui/forms/index.js +7 -0
  121. package/dist/ui/forms/index.js.map +1 -0
  122. package/dist/ui/forms/journey.d.ts +19 -0
  123. package/dist/ui/forms/journey.d.ts.map +1 -0
  124. package/dist/ui/forms/journey.js +54 -0
  125. package/dist/ui/forms/journey.js.map +1 -0
  126. package/dist/ui/forms/model.d.ts +239 -0
  127. package/dist/ui/forms/model.d.ts.map +1 -0
  128. package/dist/ui/forms/model.js +556 -0
  129. package/dist/ui/forms/model.js.map +1 -0
  130. package/dist/ui/forms/sample.d.ts +36 -0
  131. package/dist/ui/forms/sample.d.ts.map +1 -0
  132. package/dist/ui/forms/sample.js +444 -0
  133. package/dist/ui/forms/sample.js.map +1 -0
  134. package/dist/ui/forms/types.d.ts +454 -0
  135. package/dist/ui/forms/types.d.ts.map +1 -0
  136. package/dist/ui/forms/types.js +2 -0
  137. package/dist/ui/forms/types.js.map +1 -0
  138. package/dist/ui/index.d.ts +2 -0
  139. package/dist/ui/index.d.ts.map +1 -1
  140. package/dist/ui/index.js +4 -0
  141. package/dist/ui/index.js.map +1 -1
  142. package/dist/ui/integrations/Overlay.d.ts +3 -1
  143. package/dist/ui/integrations/Overlay.d.ts.map +1 -1
  144. package/dist/ui/integrations/Overlay.js +2 -2
  145. package/dist/ui/integrations/Overlay.js.map +1 -1
  146. package/dist/ui/portfolio/PortfolioView.d.ts +4 -1
  147. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -1
  148. package/dist/ui/portfolio/PortfolioView.js.map +1 -1
  149. package/dist/ui/sample.d.ts +3 -1
  150. package/dist/ui/sample.d.ts.map +1 -1
  151. package/dist/ui/sample.js +2 -0
  152. package/dist/ui/sample.js.map +1 -1
  153. package/dist/ui/seed.d.ts +1 -1
  154. package/dist/ui/ui.css +2301 -0
  155. package/docs/federation.md +19 -0
  156. package/docs/meta-ads.md +713 -7
  157. package/docs/upgrading.md +70 -0
  158. package/llms.txt +1 -0
  159. package/package.json +1 -1
  160. package/src/component/_generated/api.ts +10 -0
  161. package/src/component/_generated/component.ts +289 -20
  162. package/src/component/_generated/server.ts +2 -0
  163. package/src/component/constants.ts +33 -0
  164. package/src/component/convex.config.ts +7 -0
  165. package/src/component/errors.ts +3 -1
  166. package/src/component/http.ts +75 -0
  167. package/src/component/leadAdsValidators.ts +365 -0
  168. package/src/component/leadFormRules.ts +202 -0
  169. package/src/component/leadFormStore.ts +129 -0
  170. package/src/component/leadgenToken.ts +348 -0
  171. package/src/component/leads.ts +136 -84
  172. package/src/component/meta.ts +21 -1
  173. package/src/component/metaFake.ts +485 -1
  174. package/src/component/metaGraph.ts +327 -0
  175. package/src/component/metaLeads.ts +3101 -0
  176. package/src/component/schema.ts +187 -1
  177. package/src/component/validators.ts +17 -1
  178. package/src/tracker/generated.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leadAdsValidators.d.ts","sourceRoot":"","sources":["../../src/component/leadAdsValidators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ import { v } from "convex/values";
2
+ /*
3
+ * Lead Ads: Pages, instant forms, their rules and the leads they bring
4
+ * (metaLeads.ts, since 0.11.0). A lead's personal data (name, phone, e-mail,
5
+ * any answer typed freely) never reaches a table: it goes from Meta to the
6
+ * host's handler in memory. Only the answers to choice questions are kept.
7
+ */
8
+ const countersFields = {
9
+ leads: v.number(),
10
+ qualified: v.number(),
11
+ won: v.number(),
12
+ revenueCents: v.number(),
13
+ };
14
+ /** One option of a choice question, as Meta lists it. */
15
+ export const metaFormOptionValidator = v.object({
16
+ key: v.string(),
17
+ value: v.string(),
18
+ });
19
+ /** One question of an instant form. `options` only on choice questions. */
20
+ export const metaFormQuestionValidator = v.object({
21
+ key: v.string(),
22
+ label: v.string(),
23
+ /** Meta's type: `FULL_NAME`, `EMAIL`, `PHONE`, `CUSTOM`… */
24
+ type: v.string(),
25
+ options: v.optional(v.array(metaFormOptionValidator)),
26
+ });
27
+ /** Where a rule sends a lead: a board column, or the discard with a reason. */
28
+ export const formRuleTargetValidator = v.union(v.object({ column: v.string() }), v.object({ discard: v.string() }));
29
+ /** One rule: an answer to a choice question decides where the lead goes. */
30
+ export const formRuleValidator = v.object({
31
+ questionKey: v.string(),
32
+ /** Option keys (or values) of the question; any of them matches. */
33
+ answers: v.array(v.string()),
34
+ to: formRuleTargetValidator,
35
+ });
36
+ /** The brakes on an automatic first message (the host's own sender). */
37
+ export const firstContactBrakesValidator = v.object({
38
+ waitMinutes: v.number(),
39
+ maxPerHour: v.number(),
40
+ businessHoursOnly: v.boolean(),
41
+ });
42
+ /**
43
+ * How the host makes the first contact. `lead_starts`: the form's end screen
44
+ * has the WhatsApp button and the lead writes first (recommended);
45
+ * `one_click`: a person sends the suggested `text`; `automatic`: a scheduled
46
+ * send under `brakes`, which the host keeps off unless the business accepted
47
+ * the risk.
48
+ */
49
+ export const firstContactValidator = v.object({
50
+ mode: v.union(v.literal("lead_starts"), v.literal("one_click"), v.literal("automatic")),
51
+ text: v.optional(v.string()),
52
+ brakes: v.optional(firstContactBrakesValidator),
53
+ });
54
+ /**
55
+ * What the rules decided for a lead: a column (`null` is the host's own
56
+ * entry, when no rule matched and the form names no entry column), or the
57
+ * discard with its reason.
58
+ */
59
+ export const formLeadDecisionValidator = v.union(v.object({ column: v.union(v.string(), v.null()) }), v.object({ discard: v.string() }));
60
+ /** A choice answer as stored: the question and the option keys picked. */
61
+ export const formChoiceAnswerValidator = v.object({
62
+ questionKey: v.string(),
63
+ answers: v.array(v.string()),
64
+ });
65
+ /** Where a form lead came from: the Page, the form and the ad. */
66
+ export const formLeadOriginValidator = v.object({
67
+ pageId: v.string(),
68
+ pageName: v.union(v.string(), v.null()),
69
+ formId: v.string(),
70
+ formName: v.union(v.string(), v.null()),
71
+ adId: v.union(v.string(), v.null()),
72
+ adName: v.union(v.string(), v.null()),
73
+ adsetId: v.union(v.string(), v.null()),
74
+ adsetName: v.union(v.string(), v.null()),
75
+ campaignId: v.union(v.string(), v.null()),
76
+ campaignName: v.union(v.string(), v.null()),
77
+ /** `fb` or `ig`, as Meta says where the form was filled. */
78
+ platform: v.union(v.string(), v.null()),
79
+ isOrganic: v.boolean(),
80
+ });
81
+ /** A choice answer with the labels the form shows. */
82
+ export const formLabeledAnswerValidator = v.object({
83
+ questionKey: v.string(),
84
+ label: v.string(),
85
+ values: v.array(v.string()),
86
+ });
87
+ /**
88
+ * What the component hands the host's form lead handler (an internal
89
+ * mutation registered with `setFormLeadHandler`). `contact` and
90
+ * `freeAnswers` come from Meta in memory and are never stored by Rastro; the
91
+ * host owns the person from here. The handler must be idempotent on
92
+ * `leadgenId`.
93
+ */
94
+ export const formLeadPayloadValidator = v.object({
95
+ siteId: v.string(),
96
+ /** Rastro's lead; `leadKey` is what `setLeadStage` takes for it. */
97
+ leadId: v.string(),
98
+ leadKey: v.string(),
99
+ leadgenId: v.string(),
100
+ /** When the lead submitted the form (Meta's `created_time`). */
101
+ receivedAt: v.number(),
102
+ contact: v.object({
103
+ name: v.union(v.string(), v.null()),
104
+ /** As the lead typed it, usually with the country code (`+55…`). */
105
+ phone: v.union(v.string(), v.null()),
106
+ email: v.union(v.string(), v.null()),
107
+ }),
108
+ /** Answers typed freely (and any personal field besides the contact). */
109
+ freeAnswers: v.array(v.object({ questionKey: v.string(), label: v.string(), value: v.string() })),
110
+ /** The choice answers, with the labels the form shows. */
111
+ answers: v.array(formLabeledAnswerValidator),
112
+ decision: formLeadDecisionValidator,
113
+ /** The rule indexes evaluated, in order; the last one decided if any did. */
114
+ rulePath: v.array(v.number()),
115
+ /** The rule that decided, or null when none matched. */
116
+ ruleIndex: v.union(v.number(), v.null()),
117
+ origin: formLeadOriginValidator,
118
+ firstContact: firstContactValidator,
119
+ });
120
+ /**
121
+ * What stops or slows a linked Page, as a code a screen maps to its own text
122
+ * (decision D6). Only `META_TOKEN_INVALID` and `META_PERMISSION_MISSING` are
123
+ * fixed by reconnecting Meta (the second also covers a Page the login no
124
+ * longer lists). `HANDLER_MISSING`, `HANDLER_FAILED` and `HANDLER_GAVE_UP`
125
+ * are the host's (no form lead handler; it throws and the lead is read again;
126
+ * it threw too often and the lead was skipped for good); `SECRETS_KEY_MISSING`
127
+ * is the host's env.
128
+ * `META_TRUNCATED`, `META_RATE_LIMITED`, `META_UNAVAILABLE` and `RUN_TIMEOUT`
129
+ * pass by themselves: the next run goes on.
130
+ */
131
+ export const META_PAGE_ERROR_CODES = [
132
+ "META_TOKEN_INVALID",
133
+ "META_PERMISSION_MISSING",
134
+ "HANDLER_MISSING",
135
+ "HANDLER_FAILED",
136
+ "HANDLER_GAVE_UP",
137
+ "SECRETS_KEY_MISSING",
138
+ "META_TRUNCATED",
139
+ "META_RATE_LIMITED",
140
+ "META_UNAVAILABLE",
141
+ "RUN_TIMEOUT",
142
+ ];
143
+ export const metaPageErrorCodeValidator = v.union(v.literal("META_TOKEN_INVALID"), v.literal("META_PERMISSION_MISSING"), v.literal("HANDLER_MISSING"), v.literal("HANDLER_FAILED"), v.literal("HANDLER_GAVE_UP"), v.literal("SECRETS_KEY_MISSING"), v.literal("META_TRUNCATED"), v.literal("META_RATE_LIMITED"), v.literal("META_UNAVAILABLE"), v.literal("RUN_TIMEOUT"));
144
+ /** What `metaLinkedPages` answers the control plane (decision D1). */
145
+ export const linkedPagesValidator = v.object({
146
+ pages: v.array(v.object({ pageId: v.string(), siteId: v.string() })),
147
+ /**
148
+ * The component has `RASTRO_FEDERATION_AUDIENCE`: its leadgen route can
149
+ * verify a forward. False, every forward would answer `503`.
150
+ */
151
+ leadgenReady: v.boolean(),
152
+ /** The issuer the leadgen route verifies forwards against. */
153
+ issuer: v.string(),
154
+ /**
155
+ * The audience the leadgen route expects (`RASTRO_FEDERATION_AUDIENCE`,
156
+ * without a trailing slash), or null when it has none.
157
+ */
158
+ audience: v.union(v.string(), v.null()),
159
+ /**
160
+ * The host registered its form lead handler (the Lead Ads opt-in). False,
161
+ * the component reads no Pages: the list stays empty until it does, and
162
+ * reconnecting Meta changes nothing.
163
+ */
164
+ handlerReady: v.boolean(),
165
+ });
166
+ /** A Page an owner's Meta connection lists, as a screen shows it. */
167
+ export const metaPageValidator = v.object({
168
+ pageId: v.string(),
169
+ name: v.string(),
170
+ tasks: v.array(v.string()),
171
+ /** Meta granted `leads_retrieval` for the Page to this login. */
172
+ leadsAllowed: v.boolean(),
173
+ /** The site the Page feeds, whoever linked it; null when free. */
174
+ linkedSiteId: v.union(v.string(), v.null()),
175
+ /** Federated reads only: linked to a site outside the caller's grant. */
176
+ linkedOutsideScope: v.optional(v.boolean()),
177
+ /** Whether this owner linked it; null while the Page is free. */
178
+ own: v.union(v.boolean(), v.null()),
179
+ subscribedAt: v.union(v.number(), v.null()),
180
+ /**
181
+ * What stops or slows the Page, as a code (`META_PAGE_ERROR_CODES`): Meta
182
+ * refused its token or lead access, or, for a Page this owner linked, the
183
+ * host's handler or the last reconciliation. Null when nothing does.
184
+ */
185
+ lastError: v.union(metaPageErrorCodeValidator, v.null()),
186
+ /** Whether the host registered its form lead handler (no lead comes in without it). */
187
+ handlerReady: v.boolean(),
188
+ });
189
+ const formRulesSummaryValidator = v.object({
190
+ configured: v.boolean(),
191
+ count: v.number(),
192
+ entryColumn: v.union(v.string(), v.null()),
193
+ /** With an owner: whether that owner may edit them (not another's). */
194
+ own: v.optional(v.boolean()),
195
+ });
196
+ /** One instant form of a Page linked to the site, for the forms screen. */
197
+ export const metaFormRowValidator = v.object({
198
+ formId: v.string(),
199
+ name: v.string(),
200
+ /** Meta's status: `ACTIVE`, `ARCHIVED`, `DELETED`, `DRAFT`. */
201
+ status: v.string(),
202
+ questions: v.array(metaFormQuestionValidator),
203
+ /** The end screen's WhatsApp button; null when Meta does not say. */
204
+ whatsappButton: v.union(v.boolean(), v.null()),
205
+ /** The host marked the button as set by hand ("Já liguei"). */
206
+ whatsappButtonConfirmed: v.boolean(),
207
+ createdTime: v.union(v.number(), v.null()),
208
+ syncedAt: v.number(),
209
+ /** Leads in the 30 UTC days up to `now`; null without `now`. */
210
+ leads30d: v.union(v.number(), v.null()),
211
+ /** Those leads per UTC day, oldest first (30 entries); null without `now`. */
212
+ daily: v.union(v.array(v.number()), v.null()),
213
+ lastLeadAt: v.union(v.number(), v.null()),
214
+ rules: formRulesSummaryValidator,
215
+ });
216
+ /** The Pages linked to a site, each with its forms. */
217
+ export const metaFormsValidator = v.array(v.object({
218
+ pageId: v.string(),
219
+ pageName: v.string(),
220
+ leadsAllowed: v.boolean(),
221
+ subscribedAt: v.union(v.number(), v.null()),
222
+ lastReconcileAt: v.union(v.number(), v.null()),
223
+ lastLeadAt: v.union(v.number(), v.null()),
224
+ /** As on `metaPages`: a code of `META_PAGE_ERROR_CODES`, or null. */
225
+ lastError: v.union(metaPageErrorCodeValidator, v.null()),
226
+ /** With an owner: whether that owner linked the Page. */
227
+ own: v.optional(v.boolean()),
228
+ /** Whether the host registered its form lead handler. */
229
+ handlerReady: v.boolean(),
230
+ forms: v.array(metaFormRowValidator),
231
+ }));
232
+ /** A form's rules as the drawer edits them, each with its monthly count. */
233
+ export const formRulesValidator = v.object({
234
+ siteId: v.string(),
235
+ formId: v.string(),
236
+ configured: v.boolean(),
237
+ entryColumn: v.union(v.string(), v.null()),
238
+ rules: v.array(v.object({
239
+ ...formRuleValidator.fields,
240
+ /** Leads this rule decided in the 30 days up to `now`; null without. */
241
+ monthCount: v.union(v.number(), v.null()),
242
+ })),
243
+ firstContact: firstContactValidator,
244
+ whatsappButtonConfirmed: v.boolean(),
245
+ updatedAt: v.union(v.number(), v.null()),
246
+ /** With an owner: whether that owner may edit them (not another's). */
247
+ own: v.optional(v.boolean()),
248
+ });
249
+ /** The last 30 days' leads of a form under a draft of its rules. */
250
+ export const formRulesSimulationValidator = v.object({
251
+ total: v.number(),
252
+ /**
253
+ * Leads no rule matched: they go to the entry. Unlike `formsReport`'s
254
+ * `entry`, this counts them whether or not the draft names an entry column.
255
+ */
256
+ entry: v.number(),
257
+ /** Per draft rule, in order: the leads it would decide. */
258
+ rules: v.array(v.number()),
259
+ /**
260
+ * Leads per column the draft sends them to. With an `entryColumn`, its row
261
+ * already holds the `entry` leads: add `entry` only when no row names it.
262
+ */
263
+ columns: v.array(v.object({ column: v.string(), leads: v.number() })),
264
+ discarded: v.array(v.object({ reason: v.string(), leads: v.number() })),
265
+ /** A read cap was hit: the figures cover the newest leads only. */
266
+ partial: v.boolean(),
267
+ });
268
+ /**
269
+ * Per form: its leads in the range and where the rules sent them. One row per
270
+ * (siteId, formId): a Page moved from one site to another inside the range
271
+ * has a row for each, so key rows by both. The range is whole UTC days:
272
+ * `from` floors to its day and `to` takes in the UTC day it falls on.
273
+ */
274
+ export const formsReportValidator = v.object({
275
+ forms: v.array(v.object({
276
+ siteId: v.string(),
277
+ pageId: v.string(),
278
+ formId: v.string(),
279
+ name: v.union(v.string(), v.null()),
280
+ ...countersFields,
281
+ /** Leads a rule (or the entry column) sent to each column. */
282
+ columns: v.array(v.object({ column: v.string(), leads: v.number() })),
283
+ /** Leads that went to the host's own entry (no column named). */
284
+ entry: v.number(),
285
+ discarded: v.array(v.object({ reason: v.string(), leads: v.number() })),
286
+ /** Discarded leads someone sent back to the funnel. */
287
+ returned: v.number(),
288
+ })),
289
+ /** A read cap was hit: the decision counts are a lower bound. */
290
+ partial: v.boolean(),
291
+ });
292
+ /** A form lead as the journey shows it: answers, origin and the path. */
293
+ export const formLeadDetailValidator = v.object({
294
+ leadgenId: v.string(),
295
+ receivedAt: v.number(),
296
+ origin: formLeadOriginValidator,
297
+ answers: v.array(formLabeledAnswerValidator),
298
+ decision: formLeadDecisionValidator,
299
+ rulePath: v.array(v.number()),
300
+ ruleIndex: v.union(v.number(), v.null()),
301
+ /** When a discarded lead was sent back, and the reason it had. */
302
+ returned: v.union(v.object({ at: v.number(), reason: v.string() }), v.null()),
303
+ });
304
+ //# sourceMappingURL=leadAdsValidators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leadAdsValidators.js","sourceRoot":"","sources":["../../src/component/leadAdsValidators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { FormChoiceAnswer, FormLeadDecision, FormRule, MetaFormQuestion } from "./leadAdsValidators.js";
2
+ /** One `field_data` entry as Meta returns it: the question key, the values. */
3
+ export interface LeadField {
4
+ name: string;
5
+ values: string[];
6
+ }
7
+ export interface SplitLead {
8
+ contact: {
9
+ name: string | null;
10
+ phone: string | null;
11
+ email: string | null;
12
+ };
13
+ freeAnswers: Array<{
14
+ questionKey: string;
15
+ label: string;
16
+ value: string;
17
+ }>;
18
+ choices: FormChoiceAnswer[];
19
+ }
20
+ /** The question's options, when it is a choice question. */
21
+ export declare function choiceOptions(question: MetaFormQuestion | undefined): Array<{
22
+ key: string;
23
+ value: string;
24
+ }> | null;
25
+ /**
26
+ * The option an answer names, by its key or its shown value (Meta returns
27
+ * either, depending on the form), or null when it names none.
28
+ */
29
+ export declare function optionKeyOf(question: MetaFormQuestion | undefined, answer: string): string | null;
30
+ /**
31
+ * Splits a lead's answers. The identity fields become `contact`; an answer
32
+ * to a choice question that names its options becomes a choice; anything
33
+ * else, including any field the form does not describe, is a free answer.
34
+ * Only `choices` may ever be stored.
35
+ */
36
+ export declare function splitLeadFields(questions: readonly MetaFormQuestion[], fields: readonly LeadField[]): SplitLead;
37
+ export interface RuleOutcome {
38
+ decision: FormLeadDecision;
39
+ rulePath: number[];
40
+ ruleIndex: number | null;
41
+ }
42
+ /**
43
+ * The first rule whose question the lead answered with one of its answers
44
+ * decides; with none, the lead goes to `entryColumn` (null: the host's own
45
+ * entry). `rulePath` lists every rule looked at, in order.
46
+ */
47
+ export declare function evaluateRules(rules: readonly FormRule[], entryColumn: string | null, choices: readonly FormChoiceAnswer[]): RuleOutcome;
48
+ /**
49
+ * A rule's identity for its monthly count: the question, the answers and the
50
+ * target. Reordering keeps a rule's count; changing it starts a new one, as
51
+ * an edited rule only decides the leads after it.
52
+ */
53
+ export declare function ruleSignature(rule: FormRule): string;
54
+ /** The choice answers with the labels the form shows, for the host. */
55
+ export declare function labelChoices(questions: readonly MetaFormQuestion[], choices: readonly FormChoiceAnswer[]): Array<{
56
+ questionKey: string;
57
+ label: string;
58
+ values: string[];
59
+ }>;
60
+ //# sourceMappingURL=leadFormRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leadFormRules.d.ts","sourceRoot":"","sources":["../../src/component/leadFormRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAUhC,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7E,WAAW,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAcD,4DAA4D;AAC5D,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GACrC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAI9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAQf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,MAAM,EAAE,SAAS,SAAS,EAAE,GAC3B,SAAS,CAqDX;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,WAAW,CAqBb;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAUpD;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAajE"}
@@ -0,0 +1,140 @@
1
+ const MAX_VALUE = 500;
2
+ const NAME_FIELDS = new Set(["full_name"]);
3
+ const FIRST_NAME_FIELDS = new Set(["first_name"]);
4
+ const LAST_NAME_FIELDS = new Set(["last_name"]);
5
+ const PHONE_FIELDS = new Set(["phone_number", "phone"]);
6
+ const EMAIL_FIELDS = new Set(["email"]);
7
+ const normalize = (value) => value.normalize("NFC").trim().toLowerCase().replace(/\s+/g, " ");
8
+ const clip = (value) => value.trim().slice(0, MAX_VALUE);
9
+ /** The question's options, when it is a choice question. */
10
+ export function choiceOptions(question) {
11
+ return question?.options && question.options.length > 0
12
+ ? question.options
13
+ : null;
14
+ }
15
+ /**
16
+ * The option an answer names, by its key or its shown value (Meta returns
17
+ * either, depending on the form), or null when it names none.
18
+ */
19
+ export function optionKeyOf(question, answer) {
20
+ const options = choiceOptions(question);
21
+ if (!options)
22
+ return null;
23
+ const wanted = normalize(answer);
24
+ const found = options.find((option) => normalize(option.key) === wanted) ??
25
+ options.find((option) => normalize(option.value) === wanted);
26
+ return found?.key ?? null;
27
+ }
28
+ /**
29
+ * Splits a lead's answers. The identity fields become `contact`; an answer
30
+ * to a choice question that names its options becomes a choice; anything
31
+ * else, including any field the form does not describe, is a free answer.
32
+ * Only `choices` may ever be stored.
33
+ */
34
+ export function splitLeadFields(questions, fields) {
35
+ const byKey = new Map(questions.map((question) => [question.key, question]));
36
+ let fullName = null;
37
+ let firstName = null;
38
+ let lastName = null;
39
+ let phone = null;
40
+ let email = null;
41
+ const freeAnswers = [];
42
+ const choices = [];
43
+ for (const field of fields) {
44
+ const values = field.values.map(clip).filter(Boolean);
45
+ if (values.length === 0)
46
+ continue;
47
+ const key = field.name;
48
+ const question = byKey.get(key);
49
+ const type = question?.type.toUpperCase() ?? "";
50
+ if (NAME_FIELDS.has(key) || type === "FULL_NAME") {
51
+ fullName ??= values.join(" ");
52
+ continue;
53
+ }
54
+ if (FIRST_NAME_FIELDS.has(key) || type === "FIRST_NAME") {
55
+ firstName ??= values.join(" ");
56
+ continue;
57
+ }
58
+ if (LAST_NAME_FIELDS.has(key) || type === "LAST_NAME") {
59
+ lastName ??= values.join(" ");
60
+ continue;
61
+ }
62
+ if (PHONE_FIELDS.has(key) || type === "PHONE") {
63
+ phone ??= values[0];
64
+ continue;
65
+ }
66
+ if (EMAIL_FIELDS.has(key) || type === "EMAIL") {
67
+ email ??= values[0];
68
+ continue;
69
+ }
70
+ if (choiceOptions(question)) {
71
+ const keys = values.map((value) => optionKeyOf(question, value));
72
+ // Every value must name an option: a stray value may be something
73
+ // the lead typed, so the whole answer stays in memory.
74
+ if (keys.every((option) => option !== null)) {
75
+ choices.push({ questionKey: key, answers: [...new Set(keys)] });
76
+ continue;
77
+ }
78
+ }
79
+ freeAnswers.push({
80
+ questionKey: key,
81
+ label: question?.label ?? key,
82
+ value: values.join(", "),
83
+ });
84
+ }
85
+ const name = fullName ?? ([firstName, lastName].filter(Boolean).join(" ") || null);
86
+ return { contact: { name, phone, email }, freeAnswers, choices };
87
+ }
88
+ /**
89
+ * The first rule whose question the lead answered with one of its answers
90
+ * decides; with none, the lead goes to `entryColumn` (null: the host's own
91
+ * entry). `rulePath` lists every rule looked at, in order.
92
+ */
93
+ export function evaluateRules(rules, entryColumn, choices) {
94
+ const answered = new Map(choices.map((choice) => [choice.questionKey, new Set(choice.answers)]));
95
+ const rulePath = [];
96
+ for (const [index, rule] of rules.entries()) {
97
+ rulePath.push(index);
98
+ const picked = answered.get(rule.questionKey);
99
+ if (!picked || !rule.answers.some((answer) => picked.has(answer))) {
100
+ continue;
101
+ }
102
+ return {
103
+ decision: "column" in rule.to
104
+ ? { column: rule.to.column }
105
+ : { discard: rule.to.discard },
106
+ rulePath,
107
+ ruleIndex: index,
108
+ };
109
+ }
110
+ return { decision: { column: entryColumn }, rulePath, ruleIndex: null };
111
+ }
112
+ /**
113
+ * A rule's identity for its monthly count: the question, the answers and the
114
+ * target. Reordering keeps a rule's count; changing it starts a new one, as
115
+ * an edited rule only decides the leads after it.
116
+ */
117
+ export function ruleSignature(rule) {
118
+ const target = "column" in rule.to
119
+ ? `column:${rule.to.column}`
120
+ : `discard:${rule.to.discard}`;
121
+ return JSON.stringify([
122
+ rule.questionKey,
123
+ [...new Set(rule.answers)].sort(),
124
+ target,
125
+ ]);
126
+ }
127
+ /** The choice answers with the labels the form shows, for the host. */
128
+ export function labelChoices(questions, choices) {
129
+ const byKey = new Map(questions.map((question) => [question.key, question]));
130
+ return choices.map((choice) => {
131
+ const question = byKey.get(choice.questionKey);
132
+ const options = choiceOptions(question) ?? [];
133
+ return {
134
+ questionKey: choice.questionKey,
135
+ label: question?.label ?? choice.questionKey,
136
+ values: choice.answers.map((key) => options.find((option) => option.key === key)?.value ?? key),
137
+ };
138
+ });
139
+ }
140
+ //# sourceMappingURL=leadFormRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leadFormRules.js","sourceRoot":"","sources":["../../src/component/leadFormRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Infer } from "convex/values";
2
+ import type { Doc, Id } from "./_generated/dataModel.js";
3
+ import type { MutationCtx, QueryCtx } from "./_generated/server.js";
4
+ import type { formLeadDetailValidator, formLeadOriginValidator } from "./leadAdsValidators.js";
5
+ /** Where a form lead came from, with the names Rastro knows. */
6
+ export declare function formLeadOrigin(ctx: QueryCtx, row: Pick<Doc<"formLeads">, "siteId" | "pageId" | "formId" | "adId" | "adsetId" | "campaignId" | "platform" | "isOrganic">): Promise<Infer<typeof formLeadOriginValidator>>;
7
+ /** A form lead's answers, origin and path, for the lead journey. */
8
+ export declare function formLeadDetail(ctx: QueryCtx, lead: Pick<Doc<"leads">, "_id">): Promise<Infer<typeof formLeadDetailValidator> | null>;
9
+ /**
10
+ * Deletes a removed lead's ingestion record and leaves its leadgen id behind
11
+ * (nothing else), so the same Meta lead is never ingested again.
12
+ */
13
+ export declare function forgetFormLead(ctx: MutationCtx, leadId: Id<"leads">): Promise<void>;
14
+ /** Whether the host removed the lead Meta knows by this leadgen id. */
15
+ export declare function isForgottenFormLead(ctx: QueryCtx, leadgenId: string): Promise<boolean>;
16
+ //# sourceMappingURL=leadFormStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leadFormStore.d.ts","sourceRoot":"","sources":["../../src/component/leadFormStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAQhC,gEAAgE;AAChE,wBAAsB,cAAc,CAClC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,IAAI,CACP,GAAG,CAAC,WAAW,CAAC,EACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,SAAS,GACT,YAAY,GACZ,UAAU,GACV,WAAW,CACd,GACA,OAAO,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAqChD;AAED,oEAAoE;AACpE,wBAAsB,cAAc,CAClC,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAoBvD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAClB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,uEAAuE;AACvE,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAOlB"}