@iann29/rastro 0.1.0-alpha.0 → 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +579 -57
- package/agent/integration.md +661 -0
- package/agent/manifest.json +187 -0
- package/agent/manifest.schema.json +411 -0
- package/dist/client/federation.d.ts +236 -0
- package/dist/client/federation.d.ts.map +1 -0
- package/dist/client/federation.js +196 -0
- package/dist/client/federation.js.map +1 -0
- package/dist/client/index.d.ts +2467 -18
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +461 -32
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +18 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +302 -4
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +4 -0
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/affiliates.d.ts.map +1 -1
- package/dist/component/affiliates.js +6 -2
- package/dist/component/affiliates.js.map +1 -1
- package/dist/component/cardinality.d.ts +12 -0
- package/dist/component/cardinality.d.ts.map +1 -0
- package/dist/component/cardinality.js +94 -0
- package/dist/component/cardinality.js.map +1 -0
- package/dist/component/constants.d.ts +34 -7
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +47 -7
- package/dist/component/constants.js.map +1 -1
- package/dist/component/convex.config.d.ts +6 -1
- package/dist/component/convex.config.js +9 -1
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/coverage.d.ts +19 -0
- package/dist/component/coverage.d.ts.map +1 -0
- package/dist/component/coverage.js +30 -0
- package/dist/component/coverage.js.map +1 -0
- package/dist/component/diagnostics.d.ts +9 -0
- package/dist/component/diagnostics.d.ts.map +1 -0
- package/dist/component/diagnostics.js +47 -0
- package/dist/component/diagnostics.js.map +1 -0
- package/dist/component/errors.d.ts +1 -1
- package/dist/component/errors.d.ts.map +1 -1
- package/dist/component/errors.js.map +1 -1
- package/dist/component/eventStore.d.ts +106 -0
- package/dist/component/eventStore.d.ts.map +1 -0
- package/dist/component/eventStore.js +294 -0
- package/dist/component/eventStore.js.map +1 -0
- package/dist/component/funnels.d.ts.map +1 -1
- package/dist/component/funnels.js +5 -3
- package/dist/component/funnels.js.map +1 -1
- package/dist/component/geo.d.ts +71 -0
- package/dist/component/geo.d.ts.map +1 -0
- package/dist/component/geo.js +611 -0
- package/dist/component/geo.js.map +1 -0
- package/dist/component/goals.d.ts.map +1 -1
- package/dist/component/goals.js +25 -9
- package/dist/component/goals.js.map +1 -1
- package/dist/component/guards.d.ts.map +1 -1
- package/dist/component/guards.js.map +1 -1
- package/dist/component/http.d.ts.map +1 -1
- package/dist/component/http.js +284 -53
- package/dist/component/http.js.map +1 -1
- package/dist/component/identity.d.ts +13 -0
- package/dist/component/identity.d.ts.map +1 -0
- package/dist/component/identity.js +58 -0
- package/dist/component/identity.js.map +1 -0
- package/dist/component/ingest.d.ts +3 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +1105 -243
- package/dist/component/ingest.js.map +1 -1
- package/dist/component/live.d.ts +8 -0
- package/dist/component/live.d.ts.map +1 -1
- package/dist/component/live.js +74 -9
- package/dist/component/live.js.map +1 -1
- package/dist/component/reports.d.ts +273 -24
- package/dist/component/reports.d.ts.map +1 -1
- package/dist/component/reports.js +1320 -150
- package/dist/component/reports.js.map +1 -1
- package/dist/component/retention.d.ts +75 -1
- package/dist/component/retention.d.ts.map +1 -1
- package/dist/component/retention.js +541 -31
- package/dist/component/retention.js.map +1 -1
- package/dist/component/sanitize.d.ts +24 -1
- package/dist/component/sanitize.d.ts.map +1 -1
- package/dist/component/sanitize.js +107 -19
- package/dist/component/sanitize.js.map +1 -1
- package/dist/component/schema.d.ts +462 -55
- package/dist/component/schema.js +195 -15
- package/dist/component/schema.js.map +1 -1
- package/dist/component/sites.d.ts.map +1 -1
- package/dist/component/sites.js +38 -25
- package/dist/component/sites.js.map +1 -1
- package/dist/component/useragent.d.ts +9 -0
- package/dist/component/useragent.d.ts.map +1 -0
- package/dist/component/useragent.js +152 -0
- package/dist/component/useragent.js.map +1 -0
- package/dist/component/validators.d.ts +101 -16
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +19 -2
- package/dist/component/validators.js.map +1 -1
- package/dist/component/visitors.d.ts +19 -0
- package/dist/component/visitors.d.ts.map +1 -0
- package/dist/component/visitors.js +86 -0
- package/dist/component/visitors.js.map +1 -0
- package/dist/component/vitals.d.ts +41 -0
- package/dist/component/vitals.d.ts.map +1 -0
- package/dist/component/vitals.js +115 -0
- package/dist/component/vitals.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/tracker/generated.d.ts +8 -4
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +8 -4
- package/dist/tracker/generated.js.map +1 -1
- package/dist/tracker/tracker.d.ts +1 -1
- package/dist/tracker/tracker.d.ts.map +1 -1
- package/dist/tracker/tracker.js +81 -33
- package/dist/tracker/tracker.js.map +1 -1
- package/dist/tracker/vitals.d.ts +10 -0
- package/dist/tracker/vitals.d.ts.map +1 -0
- package/dist/tracker/vitals.js +140 -0
- package/dist/tracker/vitals.js.map +1 -0
- package/dist/tracker.min.js +1 -1
- package/dist/vitals.min.js +1 -0
- package/docs/benchmarks/2026-08-20-realistic.md +171 -0
- package/docs/benchmarks/2026-08-21-formal-certification.md +353 -0
- package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
- package/docs/federation-setup.md +397 -0
- package/docs/federation.md +262 -0
- package/docs/upgrading.md +259 -0
- package/llms.txt +71 -0
- package/package.json +61 -11
- package/scripts/benchmark-ingest.mjs +601 -0
- package/scripts/generate-federation-keys.mjs +20 -0
- package/src/component/_generated/api.ts +18 -0
- package/src/component/_generated/component.ts +366 -4
- package/src/component/_generated/server.ts +4 -0
- package/src/component/affiliates.ts +20 -5
- package/src/component/cardinality.ts +117 -0
- package/src/component/constants.ts +47 -7
- package/src/component/convex.config.ts +11 -1
- package/src/component/coverage.ts +36 -0
- package/src/component/diagnostics.ts +65 -0
- package/src/component/errors.ts +2 -1
- package/src/component/eventStore.ts +489 -0
- package/src/component/funnels.ts +19 -16
- package/src/component/geo.ts +781 -0
- package/src/component/goals.ts +45 -16
- package/src/component/guards.ts +3 -1
- package/src/component/http.ts +403 -60
- package/src/component/identity.ts +74 -0
- package/src/component/ingest.ts +1652 -291
- package/src/component/live.ts +90 -9
- package/src/component/reports.ts +1929 -199
- package/src/component/retention.ts +774 -97
- package/src/component/sanitize.ts +154 -32
- package/src/component/schema.ts +219 -15
- package/src/component/sites.ts +56 -28
- package/src/component/useragent.ts +171 -0
- package/src/component/validators.ts +29 -1
- package/src/component/visitors.ts +116 -0
- package/src/component/vitals.ts +146 -0
package/src/component/funnels.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
2
|
import { mutation, query } from "./_generated/server.js";
|
|
3
|
-
import {
|
|
4
|
-
MAX_FUNNELS_PER_SITE,
|
|
5
|
-
MAX_FUNNEL_STEPS,
|
|
6
|
-
} from "./constants.js";
|
|
3
|
+
import { MAX_FUNNELS_PER_SITE, MAX_FUNNEL_STEPS } from "./constants.js";
|
|
7
4
|
import { fail } from "./errors.js";
|
|
8
5
|
import { cleanString, sanitizePath, sanitizeSlug } from "./sanitize.js";
|
|
9
|
-
import {
|
|
10
|
-
funnelFieldsValidator,
|
|
11
|
-
funnelStepValidator,
|
|
12
|
-
} from "./validators.js";
|
|
6
|
+
import { funnelFieldsValidator, funnelStepValidator } from "./validators.js";
|
|
13
7
|
|
|
14
8
|
const funnelDocumentValidator = funnelFieldsValidator.extend({
|
|
15
9
|
_id: v.id("funnels"),
|
|
@@ -28,7 +22,8 @@ export const upsert = mutation({
|
|
|
28
22
|
},
|
|
29
23
|
returns: v.id("funnels"),
|
|
30
24
|
handler: async (ctx, args) => {
|
|
31
|
-
if (!(await ctx.db.get("sites", args.siteId)))
|
|
25
|
+
if (!(await ctx.db.get("sites", args.siteId)))
|
|
26
|
+
fail("NOT_FOUND", "site not found");
|
|
32
27
|
if (args.steps.length < 2 || args.steps.length > MAX_FUNNEL_STEPS) {
|
|
33
28
|
fail("INVALID_ARGUMENT", `funnels require 2-${MAX_FUNNEL_STEPS} steps`);
|
|
34
29
|
}
|
|
@@ -37,7 +32,10 @@ export const upsert = mutation({
|
|
|
37
32
|
args.conversionWindowMs < 60_000 ||
|
|
38
33
|
args.conversionWindowMs > 90 * 86_400_000
|
|
39
34
|
) {
|
|
40
|
-
fail(
|
|
35
|
+
fail(
|
|
36
|
+
"INVALID_ARGUMENT",
|
|
37
|
+
"conversionWindowMs must be between one minute and 90 days",
|
|
38
|
+
);
|
|
41
39
|
}
|
|
42
40
|
let key: string;
|
|
43
41
|
let steps: Array<{
|
|
@@ -49,9 +47,10 @@ export const upsert = mutation({
|
|
|
49
47
|
key = sanitizeSlug(args.key, "key");
|
|
50
48
|
steps = args.steps.map((step) => {
|
|
51
49
|
const stepName = cleanString(step.name, 80);
|
|
52
|
-
const value =
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
const value =
|
|
51
|
+
step.type === "pageview"
|
|
52
|
+
? sanitizePath(step.value)
|
|
53
|
+
: cleanString(step.value, 80);
|
|
55
54
|
if (!stepName || !value) {
|
|
56
55
|
throw new Error("funnel steps require name and value");
|
|
57
56
|
}
|
|
@@ -79,7 +78,8 @@ export const upsert = mutation({
|
|
|
79
78
|
const now = Date.now();
|
|
80
79
|
if (funnelId) {
|
|
81
80
|
const funnel = await ctx.db.get("funnels", funnelId);
|
|
82
|
-
if (!funnel || funnel.siteId !== args.siteId)
|
|
81
|
+
if (!funnel || funnel.siteId !== args.siteId)
|
|
82
|
+
fail("NOT_FOUND", "funnel not found");
|
|
83
83
|
await ctx.db.patch("funnels", funnelId, {
|
|
84
84
|
key,
|
|
85
85
|
name,
|
|
@@ -96,7 +96,9 @@ export const upsert = mutation({
|
|
|
96
96
|
.withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
|
|
97
97
|
.take(MAX_FUNNELS_PER_SITE + 1);
|
|
98
98
|
if (funnels.length >= MAX_FUNNELS_PER_SITE) {
|
|
99
|
-
fail("LIMIT_EXCEEDED", "funnel limit reached", {
|
|
99
|
+
fail("LIMIT_EXCEEDED", "funnel limit reached", {
|
|
100
|
+
limit: MAX_FUNNELS_PER_SITE,
|
|
101
|
+
});
|
|
100
102
|
}
|
|
101
103
|
return await ctx.db.insert("funnels", {
|
|
102
104
|
siteId: args.siteId,
|
|
@@ -127,7 +129,8 @@ export const remove = mutation({
|
|
|
127
129
|
returns: v.null(),
|
|
128
130
|
handler: async (ctx, args) => {
|
|
129
131
|
const funnel = await ctx.db.get("funnels", args.funnelId);
|
|
130
|
-
if (!funnel || funnel.siteId !== args.siteId)
|
|
132
|
+
if (!funnel || funnel.siteId !== args.siteId)
|
|
133
|
+
fail("NOT_FOUND", "funnel not found");
|
|
131
134
|
await ctx.db.delete("funnels", args.funnelId);
|
|
132
135
|
return null;
|
|
133
136
|
},
|