@yeyo11/shipcast 0.0.0-stage → 0.3.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -2
  3. package/dist/cli/shipcast.js +25240 -0
  4. package/dist/fonts/Fraunces-Roman.ttf +0 -0
  5. package/dist/fonts/Fraunces-WonkItalic.ttf +0 -0
  6. package/dist/fonts/InstrumentSans-Regular.ttf +0 -0
  7. package/dist/fonts/InstrumentSans-SemiBold.ttf +0 -0
  8. package/dist/fonts/OFL-Fraunces.txt +93 -0
  9. package/dist/fonts/OFL-InstrumentSans.txt +93 -0
  10. package/dist/fonts/README.md +14 -0
  11. package/drizzle/0000_registry.sql +54 -0
  12. package/drizzle/0001_post_model.sql +144 -0
  13. package/drizzle/0002_api_tokens.sql +9 -0
  14. package/drizzle/0003_jobs.sql +20 -0
  15. package/drizzle/0004_account_snapshots.sql +15 -0
  16. package/drizzle/0006_comments.sql +29 -0
  17. package/drizzle/0007_comments_paging.sql +2 -0
  18. package/drizzle/0008_assistant_sessions.sql +25 -0
  19. package/drizzle/0009_attention_dismissals.sql +4 -0
  20. package/drizzle/0010_comments_search.sql +4 -0
  21. package/drizzle/0011_launches_list.sql +3 -0
  22. package/drizzle/0012_telemetry.sql +40 -0
  23. package/drizzle/0013_publish_attempts.sql +18 -0
  24. package/drizzle/0014_secrets.sql +8 -0
  25. package/drizzle/0015_draft_snapshots.sql +13 -0
  26. package/drizzle/0016_metrics_checked_at.sql +1 -0
  27. package/drizzle/0017_metric_days.sql +25 -0
  28. package/drizzle/0018_launch_model.sql +124 -0
  29. package/drizzle/0019_launch_imports.sql +20 -0
  30. package/drizzle/0020_launch_deletions.sql +15 -0
  31. package/drizzle/0021_dedupe_key_backfill.sql +22 -0
  32. package/drizzle/0022_drop_draft_snapshots.sql +4 -0
  33. package/drizzle/0023_push_subscriptions.sql +14 -0
  34. package/drizzle/meta/0000_snapshot.json +400 -0
  35. package/drizzle/meta/0001_snapshot.json +537 -0
  36. package/drizzle/meta/0002_snapshot.json +604 -0
  37. package/drizzle/meta/0003_snapshot.json +732 -0
  38. package/drizzle/meta/0004_snapshot.json +816 -0
  39. package/drizzle/meta/0006_snapshot.json +1036 -0
  40. package/drizzle/meta/0007_snapshot.json +1084 -0
  41. package/drizzle/meta/0008_snapshot.json +1298 -0
  42. package/drizzle/meta/0009_snapshot.json +1324 -0
  43. package/drizzle/meta/0010_snapshot.json +1372 -0
  44. package/drizzle/meta/0011_snapshot.json +1448 -0
  45. package/drizzle/meta/0012_snapshot.json +1717 -0
  46. package/drizzle/meta/0013_snapshot.json +1844 -0
  47. package/drizzle/meta/0014_snapshot.json +1896 -0
  48. package/drizzle/meta/0015_snapshot.json +1978 -0
  49. package/drizzle/meta/0016_snapshot.json +1984 -0
  50. package/drizzle/meta/0017_snapshot.json +2112 -0
  51. package/drizzle/meta/0018_snapshot.json +3051 -0
  52. package/drizzle/meta/0019_snapshot.json +3198 -0
  53. package/drizzle/meta/0020_snapshot.json +3315 -0
  54. package/drizzle/meta/0021_snapshot.json +3315 -0
  55. package/drizzle/meta/0022_snapshot.json +3233 -0
  56. package/drizzle/meta/0023_snapshot.json +3333 -0
  57. package/drizzle/meta/_journal.json +167 -0
  58. package/package.json +62 -4
@@ -0,0 +1,25 @@
1
+ CREATE TABLE "metric_days" (
2
+ "launch_id" integer NOT NULL,
3
+ "post_id" integer,
4
+ "source" text NOT NULL,
5
+ "name" text NOT NULL,
6
+ "day" text NOT NULL,
7
+ "value" double precision NOT NULL,
8
+ "read_at" text NOT NULL,
9
+ CONSTRAINT "metric_days_unique" UNIQUE NULLS NOT DISTINCT("launch_id","post_id","source","name","day")
10
+ );
11
+ --> statement-breakpoint
12
+ ALTER TABLE "metric_days" ADD CONSTRAINT "metric_days_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
13
+ ALTER TABLE "metric_days" ADD CONSTRAINT "metric_days_post_id_posts_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
14
+ CREATE INDEX "metric_days_by_launch" ON "metric_days" USING btree ("launch_id","source","name","day");--> statement-breakpoint
15
+ -- The one stored reading that already says its day: a repo's traffic and stars kept as `views:<day>`
16
+ -- (and visitors, clones, cloners, stars), the newest reading of each day
17
+ INSERT INTO "metric_days" ("launch_id", "post_id", "source", "name", "day", "value", "read_at")
18
+ SELECT DISTINCT ON ("launch_id", "name", "day") "launch_id", NULL, 'github', "name", "day", "value", coalesce("checked_at", "taken_at")
19
+ FROM (
20
+ SELECT "launch_id", split_part("name", ':', 1) AS "name", split_part("name", ':', 2) AS "day", "value", "taken_at", "checked_at"
21
+ FROM "metrics"
22
+ WHERE "source" = 'github' AND "post_id" IS NULL AND "name" ~ '^(views|visitors|clones|cloners|stars):\d{4}-\d{2}-\d{2}$'
23
+ ) AS "dated"
24
+ ORDER BY "launch_id", "name", "day", "taken_at" DESC
25
+ ON CONFLICT DO NOTHING;
@@ -0,0 +1,124 @@
1
+ CREATE TABLE "approvals" (
2
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "approvals_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
3
+ "launch_id" integer NOT NULL,
4
+ "by" text NOT NULL,
5
+ "at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
6
+ "versions" jsonb NOT NULL,
7
+ "revoked_at" text,
8
+ "note" text
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE TABLE "draft_versions" (
12
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "draft_versions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
13
+ "draft_id" integer NOT NULL,
14
+ "n" integer NOT NULL,
15
+ "body" text NOT NULL,
16
+ "fields" jsonb DEFAULT '{}'::jsonb NOT NULL,
17
+ "origin" text NOT NULL,
18
+ "author" text,
19
+ "pack_id" integer,
20
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
21
+ CONSTRAINT "draft_versions_n_unique" UNIQUE("draft_id","n")
22
+ );
23
+ --> statement-breakpoint
24
+ CREATE TABLE "drafts" (
25
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "drafts_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
26
+ "launch_id" integer NOT NULL,
27
+ "channel" text NOT NULL,
28
+ "piece" text NOT NULL,
29
+ "current_version_id" integer,
30
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
31
+ "updated_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
32
+ CONSTRAINT "drafts_piece_unique" UNIQUE("launch_id","channel","piece")
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE TABLE "launch_channels" (
36
+ "launch_id" integer NOT NULL,
37
+ "channel" text NOT NULL,
38
+ "mode" text NOT NULL,
39
+ "account_id" integer,
40
+ "options" jsonb DEFAULT '{}'::jsonb NOT NULL,
41
+ "note" text,
42
+ "updated_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
43
+ CONSTRAINT "launch_channels_key" PRIMARY KEY("launch_id","channel")
44
+ );
45
+ --> statement-breakpoint
46
+ CREATE TABLE "launch_sources" (
47
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_sources_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
48
+ "launch_id" integer NOT NULL,
49
+ "position" integer NOT NULL,
50
+ "kind" text NOT NULL,
51
+ "role" text DEFAULT 'context' NOT NULL,
52
+ "repo" text,
53
+ "ref" text,
54
+ "sha" text,
55
+ "url" text,
56
+ "fetched_at" text,
57
+ "http_status" integer,
58
+ "content_type" text,
59
+ "text" text,
60
+ "media_id" integer,
61
+ "meta" jsonb DEFAULT '{}'::jsonb NOT NULL,
62
+ "content_hash" text,
63
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
64
+ CONSTRAINT "launch_sources_position_unique" UNIQUE("launch_id","position")
65
+ );
66
+ --> statement-breakpoint
67
+ CREATE TABLE "media" (
68
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "media_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
69
+ "launch_id" integer,
70
+ "sha256" text NOT NULL,
71
+ "kind" text NOT NULL,
72
+ "mime" text NOT NULL,
73
+ "bytes" bigint NOT NULL,
74
+ "width" integer,
75
+ "height" integer,
76
+ "duration_seconds" double precision,
77
+ "storage" text NOT NULL,
78
+ "path" text NOT NULL,
79
+ "role" text NOT NULL,
80
+ "public_path" text,
81
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
82
+ CONSTRAINT "media_launch_sha256_unique" UNIQUE NULLS NOT DISTINCT("launch_id","sha256")
83
+ );
84
+ --> statement-breakpoint
85
+ CREATE TABLE "packs" (
86
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "packs_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
87
+ "launch_id" integer NOT NULL,
88
+ "version" integer NOT NULL,
89
+ "pack" jsonb NOT NULL,
90
+ "ai_task" text,
91
+ "provider" text,
92
+ "chat_id" text,
93
+ "cost_usd" double precision,
94
+ "accepted" boolean DEFAULT false NOT NULL,
95
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
96
+ CONSTRAINT "packs_version_unique" UNIQUE("launch_id","version")
97
+ );
98
+ --> statement-breakpoint
99
+ ALTER TABLE "launches" ADD COLUMN "title" text;--> statement-breakpoint
100
+ ALTER TABLE "launches" ADD COLUMN "model" text DEFAULT 'legacy' NOT NULL;--> statement-breakpoint
101
+ ALTER TABLE "launches" ADD COLUMN "dedupe_key" text;--> statement-breakpoint
102
+ ALTER TABLE "launches" ADD COLUMN "channels_source" text;--> statement-breakpoint
103
+ ALTER TABLE "launches" ADD COLUMN "deleted_at" text;--> statement-breakpoint
104
+ ALTER TABLE "launches" ADD COLUMN "approved_at" text;--> statement-breakpoint
105
+ ALTER TABLE "posts" ADD COLUMN "draft_version_id" integer;--> statement-breakpoint
106
+ ALTER TABLE "publish_attempts" ADD COLUMN "draft_version_id" integer;--> statement-breakpoint
107
+ ALTER TABLE "publish_attempts" ADD COLUMN "approval_id" integer;--> statement-breakpoint
108
+ ALTER TABLE "approvals" ADD CONSTRAINT "approvals_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
109
+ ALTER TABLE "draft_versions" ADD CONSTRAINT "draft_versions_draft_id_drafts_id_fk" FOREIGN KEY ("draft_id") REFERENCES "public"."drafts"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
110
+ ALTER TABLE "draft_versions" ADD CONSTRAINT "draft_versions_pack_id_packs_id_fk" FOREIGN KEY ("pack_id") REFERENCES "public"."packs"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
111
+ ALTER TABLE "drafts" ADD CONSTRAINT "drafts_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
112
+ ALTER TABLE "drafts" ADD CONSTRAINT "drafts_current_version_id_draft_versions_id_fk" FOREIGN KEY ("current_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
113
+ ALTER TABLE "launch_channels" ADD CONSTRAINT "launch_channels_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
114
+ ALTER TABLE "launch_channels" ADD CONSTRAINT "launch_channels_account_id_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."accounts"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
115
+ ALTER TABLE "launch_sources" ADD CONSTRAINT "launch_sources_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
116
+ ALTER TABLE "launch_sources" ADD CONSTRAINT "launch_sources_media_id_media_id_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
117
+ ALTER TABLE "media" ADD CONSTRAINT "media_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
118
+ ALTER TABLE "packs" ADD CONSTRAINT "packs_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
119
+ CREATE INDEX "approvals_by_launch" ON "approvals" USING btree ("launch_id","at");--> statement-breakpoint
120
+ CREATE INDEX "media_by_sha256" ON "media" USING btree ("sha256");--> statement-breakpoint
121
+ ALTER TABLE "posts" ADD CONSTRAINT "posts_draft_version_id_draft_versions_id_fk" FOREIGN KEY ("draft_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
122
+ ALTER TABLE "publish_attempts" ADD CONSTRAINT "publish_attempts_draft_version_id_draft_versions_id_fk" FOREIGN KEY ("draft_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
123
+ ALTER TABLE "publish_attempts" ADD CONSTRAINT "publish_attempts_approval_id_approvals_id_fk" FOREIGN KEY ("approval_id") REFERENCES "public"."approvals"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
124
+ ALTER TABLE "launches" ADD CONSTRAINT "launches_dedupe_key_unique" UNIQUE("dedupe_key");
@@ -0,0 +1,20 @@
1
+ CREATE TABLE "launch_imports" (
2
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_imports_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
3
+ "batch" text NOT NULL,
4
+ "launch_id" integer NOT NULL,
5
+ "action" text NOT NULL,
6
+ "before" jsonb NOT NULL,
7
+ "summary" jsonb DEFAULT '{}'::jsonb NOT NULL,
8
+ "at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
9
+ "rolled_back_at" text
10
+ );
11
+ --> statement-breakpoint
12
+ ALTER TABLE "approvals" ADD COLUMN "import_batch" text;--> statement-breakpoint
13
+ ALTER TABLE "draft_versions" ADD COLUMN "import_batch" text;--> statement-breakpoint
14
+ ALTER TABLE "drafts" ADD COLUMN "import_batch" text;--> statement-breakpoint
15
+ ALTER TABLE "launch_channels" ADD COLUMN "import_batch" text;--> statement-breakpoint
16
+ ALTER TABLE "launch_sources" ADD COLUMN "import_batch" text;--> statement-breakpoint
17
+ ALTER TABLE "media" ADD COLUMN "import_batch" text;--> statement-breakpoint
18
+ ALTER TABLE "packs" ADD COLUMN "import_batch" text;--> statement-breakpoint
19
+ CREATE INDEX "launch_imports_by_batch" ON "launch_imports" USING btree ("batch");--> statement-breakpoint
20
+ CREATE INDEX "launch_imports_by_launch" ON "launch_imports" USING btree ("launch_id");
@@ -0,0 +1,15 @@
1
+ CREATE TABLE "launch_deletions" (
2
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_deletions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
3
+ "launch_id" integer NOT NULL,
4
+ "dedupe_key" text NOT NULL,
5
+ "repo" text NOT NULL,
6
+ "ref" text NOT NULL,
7
+ "mode" text NOT NULL,
8
+ "by" text NOT NULL,
9
+ "at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
10
+ "channels" jsonb DEFAULT '[]'::jsonb NOT NULL,
11
+ "article_links" integer
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE INDEX "launch_deletions_by_key" ON "launch_deletions" USING btree ("dedupe_key");--> statement-breakpoint
15
+ CREATE INDEX "launch_deletions_by_launch" ON "launch_deletions" USING btree ("launch_id");
@@ -0,0 +1,22 @@
1
+ -- Every launch claimed before each claim carried its dedupe key gets the one its repo and ref imply,
2
+ -- as dedupeKeyOf (src/launch-keys.ts) computes it: an article by its slug, a repo gone public by the
3
+ -- repo, a release by repo and tag. Only fills empty keys; a key another row holds already, or that
4
+ -- two old rows would share (a repo gone public by webhook and by poll), goes to the oldest row alone,
5
+ -- so the unique constraint never fails the migration.
6
+ UPDATE "launches" AS l SET "dedupe_key" = k."key"
7
+ FROM (
8
+ SELECT DISTINCT ON (c."key") c."id", c."key"
9
+ FROM (
10
+ SELECT "id",
11
+ CASE
12
+ WHEN "ref" LIKE 'article:%' THEN "ref"
13
+ WHEN "ref" LIKE 'public:%' THEN 'github-public:' || "repo"
14
+ ELSE 'github-release:' || "repo" || '@' || "ref"
15
+ END AS "key"
16
+ FROM "launches"
17
+ WHERE "dedupe_key" IS NULL
18
+ ) AS c
19
+ WHERE NOT EXISTS (SELECT 1 FROM "launches" AS t WHERE t."dedupe_key" = c."key")
20
+ ORDER BY c."key", c."id"
21
+ ) AS k
22
+ WHERE l."id" = k."id";
@@ -0,0 +1,4 @@
1
+ -- The one agreed exception to additive-only migrations (docs/decisions/launch-model.md, phase 8):
2
+ -- the drafts snapshot of the pull-request path, which nothing writes or reads since phase 8.
3
+ -- Dropped at the owner's decision on 2026-11-02, with no pg_dump step: he keeps his own backups.
4
+ DROP TABLE "draft_snapshots" CASCADE;
@@ -0,0 +1,14 @@
1
+ CREATE TABLE "push_subscriptions" (
2
+ "id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "push_subscriptions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
3
+ "login" text NOT NULL,
4
+ "endpoint" text NOT NULL,
5
+ "p256dh" text NOT NULL,
6
+ "auth" text NOT NULL,
7
+ "label" text NOT NULL,
8
+ "events" jsonb DEFAULT '{}'::jsonb NOT NULL,
9
+ "created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
10
+ "last_success_at" text,
11
+ "last_failure_at" text,
12
+ "last_failure" text,
13
+ CONSTRAINT "push_subscriptions_endpoint" UNIQUE("endpoint")
14
+ );
@@ -0,0 +1,400 @@
1
+ {
2
+ "id": "fc1ef674-ce73-4596-9190-bde841d806c9",
3
+ "prevId": "00000000-0000-0000-0000-000000000000",
4
+ "version": "7",
5
+ "dialect": "postgresql",
6
+ "tables": {
7
+ "public.accounts": {
8
+ "name": "accounts",
9
+ "schema": "",
10
+ "columns": {
11
+ "id": {
12
+ "name": "id",
13
+ "type": "integer",
14
+ "primaryKey": true,
15
+ "notNull": true,
16
+ "identity": {
17
+ "type": "byDefault",
18
+ "name": "accounts_id_seq",
19
+ "schema": "public",
20
+ "increment": "1",
21
+ "startWith": "1",
22
+ "minValue": "1",
23
+ "maxValue": "2147483647",
24
+ "cache": "1",
25
+ "cycle": false
26
+ }
27
+ },
28
+ "network": {
29
+ "name": "network",
30
+ "type": "text",
31
+ "primaryKey": false,
32
+ "notNull": true
33
+ },
34
+ "brand": {
35
+ "name": "brand",
36
+ "type": "text",
37
+ "primaryKey": false,
38
+ "notNull": true
39
+ },
40
+ "label": {
41
+ "name": "label",
42
+ "type": "text",
43
+ "primaryKey": false,
44
+ "notNull": true
45
+ },
46
+ "settings": {
47
+ "name": "settings",
48
+ "type": "text",
49
+ "primaryKey": false,
50
+ "notNull": true,
51
+ "default": "'{}'"
52
+ },
53
+ "is_primary": {
54
+ "name": "is_primary",
55
+ "type": "integer",
56
+ "primaryKey": false,
57
+ "notNull": true,
58
+ "default": 0
59
+ },
60
+ "status": {
61
+ "name": "status",
62
+ "type": "text",
63
+ "primaryKey": false,
64
+ "notNull": true,
65
+ "default": "'unchecked'"
66
+ },
67
+ "identity": {
68
+ "name": "identity",
69
+ "type": "text",
70
+ "primaryKey": false,
71
+ "notNull": false
72
+ },
73
+ "problem": {
74
+ "name": "problem",
75
+ "type": "text",
76
+ "primaryKey": false,
77
+ "notNull": false
78
+ },
79
+ "checked_at": {
80
+ "name": "checked_at",
81
+ "type": "text",
82
+ "primaryKey": false,
83
+ "notNull": false
84
+ },
85
+ "created_at": {
86
+ "name": "created_at",
87
+ "type": "text",
88
+ "primaryKey": false,
89
+ "notNull": true,
90
+ "default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
91
+ }
92
+ },
93
+ "indexes": {},
94
+ "foreignKeys": {},
95
+ "compositePrimaryKeys": {},
96
+ "uniqueConstraints": {
97
+ "accounts_network_brand_label_unique": {
98
+ "name": "accounts_network_brand_label_unique",
99
+ "nullsNotDistinct": false,
100
+ "columns": [
101
+ "network",
102
+ "brand",
103
+ "label"
104
+ ]
105
+ }
106
+ },
107
+ "policies": {},
108
+ "checkConstraints": {},
109
+ "isRLSEnabled": false
110
+ },
111
+ "public.cursors": {
112
+ "name": "cursors",
113
+ "schema": "",
114
+ "columns": {
115
+ "key": {
116
+ "name": "key",
117
+ "type": "text",
118
+ "primaryKey": true,
119
+ "notNull": true
120
+ },
121
+ "value": {
122
+ "name": "value",
123
+ "type": "text",
124
+ "primaryKey": false,
125
+ "notNull": true
126
+ }
127
+ },
128
+ "indexes": {},
129
+ "foreignKeys": {},
130
+ "compositePrimaryKeys": {},
131
+ "uniqueConstraints": {},
132
+ "policies": {},
133
+ "checkConstraints": {},
134
+ "isRLSEnabled": false
135
+ },
136
+ "public.launches": {
137
+ "name": "launches",
138
+ "schema": "",
139
+ "columns": {
140
+ "id": {
141
+ "name": "id",
142
+ "type": "integer",
143
+ "primaryKey": true,
144
+ "notNull": true,
145
+ "identity": {
146
+ "type": "byDefault",
147
+ "name": "launches_id_seq",
148
+ "schema": "public",
149
+ "increment": "1",
150
+ "startWith": "1",
151
+ "minValue": "1",
152
+ "maxValue": "2147483647",
153
+ "cache": "1",
154
+ "cycle": false
155
+ }
156
+ },
157
+ "repo": {
158
+ "name": "repo",
159
+ "type": "text",
160
+ "primaryKey": false,
161
+ "notNull": true
162
+ },
163
+ "ref": {
164
+ "name": "ref",
165
+ "type": "text",
166
+ "primaryKey": false,
167
+ "notNull": true
168
+ },
169
+ "trigger": {
170
+ "name": "trigger",
171
+ "type": "text",
172
+ "primaryKey": false,
173
+ "notNull": true
174
+ },
175
+ "kind": {
176
+ "name": "kind",
177
+ "type": "text",
178
+ "primaryKey": false,
179
+ "notNull": true
180
+ },
181
+ "brand": {
182
+ "name": "brand",
183
+ "type": "text",
184
+ "primaryKey": false,
185
+ "notNull": true
186
+ },
187
+ "status": {
188
+ "name": "status",
189
+ "type": "text",
190
+ "primaryKey": false,
191
+ "notNull": true
192
+ },
193
+ "detail": {
194
+ "name": "detail",
195
+ "type": "text",
196
+ "primaryKey": false,
197
+ "notNull": false
198
+ },
199
+ "created_at": {
200
+ "name": "created_at",
201
+ "type": "text",
202
+ "primaryKey": false,
203
+ "notNull": true,
204
+ "default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
205
+ },
206
+ "updated_at": {
207
+ "name": "updated_at",
208
+ "type": "text",
209
+ "primaryKey": false,
210
+ "notNull": true,
211
+ "default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
212
+ }
213
+ },
214
+ "indexes": {},
215
+ "foreignKeys": {},
216
+ "compositePrimaryKeys": {},
217
+ "uniqueConstraints": {
218
+ "launches_repo_ref_unique": {
219
+ "name": "launches_repo_ref_unique",
220
+ "nullsNotDistinct": false,
221
+ "columns": [
222
+ "repo",
223
+ "ref"
224
+ ]
225
+ }
226
+ },
227
+ "policies": {},
228
+ "checkConstraints": {},
229
+ "isRLSEnabled": false
230
+ },
231
+ "public.metrics": {
232
+ "name": "metrics",
233
+ "schema": "",
234
+ "columns": {
235
+ "launch_id": {
236
+ "name": "launch_id",
237
+ "type": "integer",
238
+ "primaryKey": false,
239
+ "notNull": true
240
+ },
241
+ "source": {
242
+ "name": "source",
243
+ "type": "text",
244
+ "primaryKey": false,
245
+ "notNull": true
246
+ },
247
+ "name": {
248
+ "name": "name",
249
+ "type": "text",
250
+ "primaryKey": false,
251
+ "notNull": true
252
+ },
253
+ "value": {
254
+ "name": "value",
255
+ "type": "double precision",
256
+ "primaryKey": false,
257
+ "notNull": true
258
+ },
259
+ "taken_at": {
260
+ "name": "taken_at",
261
+ "type": "text",
262
+ "primaryKey": false,
263
+ "notNull": true
264
+ }
265
+ },
266
+ "indexes": {
267
+ "metrics_by_launch": {
268
+ "name": "metrics_by_launch",
269
+ "columns": [
270
+ {
271
+ "expression": "launch_id",
272
+ "isExpression": false,
273
+ "asc": true,
274
+ "nulls": "last"
275
+ },
276
+ {
277
+ "expression": "source",
278
+ "isExpression": false,
279
+ "asc": true,
280
+ "nulls": "last"
281
+ },
282
+ {
283
+ "expression": "name",
284
+ "isExpression": false,
285
+ "asc": true,
286
+ "nulls": "last"
287
+ },
288
+ {
289
+ "expression": "taken_at",
290
+ "isExpression": false,
291
+ "asc": true,
292
+ "nulls": "last"
293
+ }
294
+ ],
295
+ "isUnique": false,
296
+ "concurrently": false,
297
+ "method": "btree",
298
+ "with": {}
299
+ }
300
+ },
301
+ "foreignKeys": {
302
+ "metrics_launch_id_launches_id_fk": {
303
+ "name": "metrics_launch_id_launches_id_fk",
304
+ "tableFrom": "metrics",
305
+ "tableTo": "launches",
306
+ "columnsFrom": [
307
+ "launch_id"
308
+ ],
309
+ "columnsTo": [
310
+ "id"
311
+ ],
312
+ "onDelete": "no action",
313
+ "onUpdate": "no action"
314
+ }
315
+ },
316
+ "compositePrimaryKeys": {},
317
+ "uniqueConstraints": {},
318
+ "policies": {},
319
+ "checkConstraints": {},
320
+ "isRLSEnabled": false
321
+ },
322
+ "public.posts": {
323
+ "name": "posts",
324
+ "schema": "",
325
+ "columns": {
326
+ "launch_id": {
327
+ "name": "launch_id",
328
+ "type": "integer",
329
+ "primaryKey": false,
330
+ "notNull": true
331
+ },
332
+ "channel": {
333
+ "name": "channel",
334
+ "type": "text",
335
+ "primaryKey": false,
336
+ "notNull": true
337
+ },
338
+ "url": {
339
+ "name": "url",
340
+ "type": "text",
341
+ "primaryKey": false,
342
+ "notNull": false
343
+ },
344
+ "external_id": {
345
+ "name": "external_id",
346
+ "type": "text",
347
+ "primaryKey": false,
348
+ "notNull": false
349
+ },
350
+ "published_at": {
351
+ "name": "published_at",
352
+ "type": "text",
353
+ "primaryKey": false,
354
+ "notNull": true,
355
+ "default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
356
+ }
357
+ },
358
+ "indexes": {},
359
+ "foreignKeys": {
360
+ "posts_launch_id_launches_id_fk": {
361
+ "name": "posts_launch_id_launches_id_fk",
362
+ "tableFrom": "posts",
363
+ "tableTo": "launches",
364
+ "columnsFrom": [
365
+ "launch_id"
366
+ ],
367
+ "columnsTo": [
368
+ "id"
369
+ ],
370
+ "onDelete": "no action",
371
+ "onUpdate": "no action"
372
+ }
373
+ },
374
+ "compositePrimaryKeys": {
375
+ "posts_launch_id_channel_pk": {
376
+ "name": "posts_launch_id_channel_pk",
377
+ "columns": [
378
+ "launch_id",
379
+ "channel"
380
+ ]
381
+ }
382
+ },
383
+ "uniqueConstraints": {},
384
+ "policies": {},
385
+ "checkConstraints": {},
386
+ "isRLSEnabled": false
387
+ }
388
+ },
389
+ "enums": {},
390
+ "schemas": {},
391
+ "sequences": {},
392
+ "roles": {},
393
+ "policies": {},
394
+ "views": {},
395
+ "_meta": {
396
+ "columns": {},
397
+ "schemas": {},
398
+ "tables": {}
399
+ }
400
+ }