@glassanalytics/cli 0.0.0-stage → 0.2.1
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/LICENSE +21 -0
- package/README.md +22 -2
- package/dist/glass.js +1631 -0
- package/dist/worker/migrations/0001_init.sql +134 -0
- package/dist/worker/migrations/0002_cohorts.sql +11 -0
- package/dist/worker/migrations/0003_insights.sql +14 -0
- package/dist/worker/worker.js +24014 -0
- package/package.json +38 -3
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
-- Glass D1 schema, v1.
|
|
2
|
+
--
|
|
3
|
+
-- D1 always holds Glass's mutable state (projects, persons, identities, flags,
|
|
4
|
+
-- experiments, replay index). In the default "d1" store it also holds events;
|
|
5
|
+
-- in "lake" mode events live in Iceberg tables with the same columns.
|
|
6
|
+
--
|
|
7
|
+
-- Never edit a migration that has shipped. Add a new numbered file instead;
|
|
8
|
+
-- `glass upgrade` applies pending migrations with `wrangler d1 migrations apply`.
|
|
9
|
+
|
|
10
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
-- JSON array of allowed origins for browser ingest; NULL or [] allows any origin.
|
|
14
|
+
allowed_origins TEXT,
|
|
15
|
+
created_at INTEGER NOT NULL
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
19
|
+
id TEXT NOT NULL,
|
|
20
|
+
project TEXT NOT NULL,
|
|
21
|
+
event TEXT NOT NULL,
|
|
22
|
+
ts_ms INTEGER NOT NULL,
|
|
23
|
+
distinct_id TEXT NOT NULL,
|
|
24
|
+
user_id TEXT,
|
|
25
|
+
person_id TEXT NOT NULL,
|
|
26
|
+
session_id TEXT NOT NULL DEFAULT '',
|
|
27
|
+
url TEXT NOT NULL DEFAULT '',
|
|
28
|
+
host TEXT NOT NULL DEFAULT '',
|
|
29
|
+
path TEXT NOT NULL DEFAULT '',
|
|
30
|
+
referrer TEXT NOT NULL DEFAULT '',
|
|
31
|
+
referrer_host TEXT NOT NULL DEFAULT '',
|
|
32
|
+
title TEXT NOT NULL DEFAULT '',
|
|
33
|
+
utm_source TEXT NOT NULL DEFAULT '',
|
|
34
|
+
utm_medium TEXT NOT NULL DEFAULT '',
|
|
35
|
+
utm_campaign TEXT NOT NULL DEFAULT '',
|
|
36
|
+
utm_term TEXT NOT NULL DEFAULT '',
|
|
37
|
+
utm_content TEXT NOT NULL DEFAULT '',
|
|
38
|
+
country TEXT NOT NULL DEFAULT '',
|
|
39
|
+
region TEXT NOT NULL DEFAULT '',
|
|
40
|
+
city TEXT NOT NULL DEFAULT '',
|
|
41
|
+
device TEXT NOT NULL DEFAULT '',
|
|
42
|
+
browser TEXT NOT NULL DEFAULT '',
|
|
43
|
+
os TEXT NOT NULL DEFAULT '',
|
|
44
|
+
flags TEXT NOT NULL DEFAULT '{}',
|
|
45
|
+
props TEXT NOT NULL DEFAULT '{}',
|
|
46
|
+
person_props TEXT NOT NULL DEFAULT '{}',
|
|
47
|
+
lib TEXT NOT NULL DEFAULT '',
|
|
48
|
+
received_ms INTEGER NOT NULL,
|
|
49
|
+
PRIMARY KEY (project, id)
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE INDEX IF NOT EXISTS events_by_time ON events (project, ts_ms);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS events_by_name ON events (project, event, ts_ms);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS events_by_person ON events (project, person_id, ts_ms);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS events_by_session ON events (project, session_id);
|
|
56
|
+
|
|
57
|
+
-- distinct_id (device) -> person_id (your user id), written by identify().
|
|
58
|
+
-- The first link wins, so a shared device never moves old events to a new user.
|
|
59
|
+
CREATE TABLE IF NOT EXISTS identities (
|
|
60
|
+
project TEXT NOT NULL,
|
|
61
|
+
distinct_id TEXT NOT NULL,
|
|
62
|
+
person_id TEXT NOT NULL,
|
|
63
|
+
created_at INTEGER NOT NULL,
|
|
64
|
+
PRIMARY KEY (project, distinct_id)
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
CREATE TABLE IF NOT EXISTS persons (
|
|
68
|
+
project TEXT NOT NULL,
|
|
69
|
+
person_id TEXT NOT NULL,
|
|
70
|
+
props TEXT NOT NULL DEFAULT '{}',
|
|
71
|
+
first_seen INTEGER NOT NULL,
|
|
72
|
+
last_seen INTEGER NOT NULL,
|
|
73
|
+
PRIMARY KEY (project, person_id)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE INDEX IF NOT EXISTS persons_by_last_seen ON persons (project, last_seen);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS flags (
|
|
79
|
+
project TEXT NOT NULL,
|
|
80
|
+
key TEXT NOT NULL,
|
|
81
|
+
-- JSON FlagDefinition (see packages/core/src/flags.ts)
|
|
82
|
+
definition TEXT NOT NULL,
|
|
83
|
+
created_at INTEGER NOT NULL,
|
|
84
|
+
updated_at INTEGER NOT NULL,
|
|
85
|
+
PRIMARY KEY (project, key)
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
CREATE TABLE IF NOT EXISTS experiments (
|
|
89
|
+
project TEXT NOT NULL,
|
|
90
|
+
key TEXT NOT NULL,
|
|
91
|
+
flag_key TEXT NOT NULL,
|
|
92
|
+
-- JSON: { goal, secondary?, hypothesis? }
|
|
93
|
+
definition TEXT NOT NULL,
|
|
94
|
+
-- draft | running | stopped | shipped
|
|
95
|
+
status TEXT NOT NULL DEFAULT 'draft',
|
|
96
|
+
started_at INTEGER,
|
|
97
|
+
ended_at INTEGER,
|
|
98
|
+
shipped_variant TEXT,
|
|
99
|
+
created_at INTEGER NOT NULL,
|
|
100
|
+
updated_at INTEGER NOT NULL,
|
|
101
|
+
PRIMARY KEY (project, key)
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE TABLE IF NOT EXISTS event_definitions (
|
|
105
|
+
project TEXT NOT NULL,
|
|
106
|
+
event TEXT NOT NULL,
|
|
107
|
+
description TEXT NOT NULL DEFAULT '',
|
|
108
|
+
owner TEXT NOT NULL DEFAULT '',
|
|
109
|
+
-- JSON object: property name -> description
|
|
110
|
+
properties TEXT NOT NULL DEFAULT '{}',
|
|
111
|
+
updated_at INTEGER NOT NULL,
|
|
112
|
+
PRIMARY KEY (project, event)
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
CREATE TABLE IF NOT EXISTS replays (
|
|
116
|
+
project TEXT NOT NULL,
|
|
117
|
+
session_id TEXT NOT NULL,
|
|
118
|
+
distinct_id TEXT NOT NULL,
|
|
119
|
+
user_id TEXT,
|
|
120
|
+
started_at INTEGER NOT NULL,
|
|
121
|
+
ended_at INTEGER NOT NULL,
|
|
122
|
+
chunks INTEGER NOT NULL DEFAULT 0,
|
|
123
|
+
bytes INTEGER NOT NULL DEFAULT 0,
|
|
124
|
+
clicks INTEGER NOT NULL DEFAULT 0,
|
|
125
|
+
errors INTEGER NOT NULL DEFAULT 0,
|
|
126
|
+
start_url TEXT NOT NULL DEFAULT '',
|
|
127
|
+
device TEXT NOT NULL DEFAULT '',
|
|
128
|
+
browser TEXT NOT NULL DEFAULT '',
|
|
129
|
+
country TEXT NOT NULL DEFAULT '',
|
|
130
|
+
PRIMARY KEY (project, session_id)
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
CREATE INDEX IF NOT EXISTS replays_by_time ON replays (project, started_at);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS replays_by_person ON replays (project, distinct_id);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Saved person cohorts: reusable filters for the People tab and insights.
|
|
2
|
+
CREATE TABLE IF NOT EXISTS cohorts (
|
|
3
|
+
project TEXT NOT NULL,
|
|
4
|
+
key TEXT NOT NULL,
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
-- JSON: { "filters": Filter[], "didEvent"?: string, "from"?: string }
|
|
7
|
+
definition TEXT NOT NULL,
|
|
8
|
+
created_at INTEGER NOT NULL,
|
|
9
|
+
updated_at INTEGER NOT NULL,
|
|
10
|
+
PRIMARY KEY (project, key)
|
|
11
|
+
);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- Saved insight analyses (trends / funnel / retention) shown on the Insights tab.
|
|
2
|
+
CREATE TABLE IF NOT EXISTS insights (
|
|
3
|
+
project TEXT NOT NULL,
|
|
4
|
+
key TEXT NOT NULL,
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
description TEXT NOT NULL DEFAULT '',
|
|
7
|
+
-- trends | funnel | retention
|
|
8
|
+
kind TEXT NOT NULL,
|
|
9
|
+
-- JSON query spec without kind/project (series, steps, cohortEvent, …)
|
|
10
|
+
spec TEXT NOT NULL,
|
|
11
|
+
created_at INTEGER NOT NULL,
|
|
12
|
+
updated_at INTEGER NOT NULL,
|
|
13
|
+
PRIMARY KEY (project, key)
|
|
14
|
+
);
|