@spader/spall-tui 1.0.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.
- package/dist/App.js +3636 -0
- package/dist/App.js.map +39 -0
- package/dist/bash-nbhfht5r.scm +56 -0
- package/dist/c-4zy7d3fw.scm +81 -0
- package/dist/c_sharp-tb7n62t2.scm +212 -0
- package/dist/cpp-stxr9ffp.scm +77 -0
- package/dist/css-b1p1h6ys.scm +76 -0
- package/dist/dart-t89b32ej.scm +13 -0
- package/dist/elisp-ax9wx1b9.scm +72 -0
- package/dist/elixir-77300bss.scm +223 -0
- package/dist/elm-k2q5knqb.scm +76 -0
- package/dist/embedded_template-k7ypjkba.scm +12 -0
- package/dist/go-9wx8m64k.scm +123 -0
- package/dist/html-g95aq3vw.scm +13 -0
- package/dist/index.js +3635 -0
- package/dist/index.js.map +39 -0
- package/dist/java-wasz6t7a.scm +149 -0
- package/dist/javascript-cswtymww.scm +204 -0
- package/dist/json-pf4aw8w1.scm +16 -0
- package/dist/kotlin-m6cj2y7m.scm +380 -0
- package/dist/lib/git.js +117 -0
- package/dist/lib/git.js.map +10 -0
- package/dist/lua-7h6jk3pd.scm +204 -0
- package/dist/objc-6yjdwy1z.scm +216 -0
- package/dist/ocaml-jfj520qk.scm +148 -0
- package/dist/parsers/index.d.ts +8 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/php-bds7v5h1.scm +203 -0
- package/dist/python-k2cbtg72.scm +137 -0
- package/dist/ql-qs2vxbeq.scm +154 -0
- package/dist/ruby-3ybh5bp2.scm +154 -0
- package/dist/rust-edtnatpk.scm +161 -0
- package/dist/scala-91f2sb1z.scm +260 -0
- package/dist/src/App.d.ts +6 -0
- package/dist/src/App.d.ts.map +1 -0
- package/dist/src/Review.d.ts +6 -0
- package/dist/src/Review.d.ts.map +1 -0
- package/dist/src/components/CommandPalette.d.ts +2 -0
- package/dist/src/components/CommandPalette.d.ts.map +1 -0
- package/dist/src/components/DiffPanel.d.ts +16 -0
- package/dist/src/components/DiffPanel.d.ts.map +1 -0
- package/dist/src/components/EditorPanel.d.ts +9 -0
- package/dist/src/components/EditorPanel.d.ts.map +1 -0
- package/dist/src/components/ErrorFallback.d.ts +6 -0
- package/dist/src/components/ErrorFallback.d.ts.map +1 -0
- package/dist/src/components/HalfLineShadow.d.ts +18 -0
- package/dist/src/components/HalfLineShadow.d.ts.map +1 -0
- package/dist/src/components/index.d.ts +7 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/sidebar/CommentList.d.ts +10 -0
- package/dist/src/components/sidebar/CommentList.d.ts.map +1 -0
- package/dist/src/components/sidebar/FileList.d.ts +13 -0
- package/dist/src/components/sidebar/FileList.d.ts.map +1 -0
- package/dist/src/components/sidebar/PatchList.d.ts +14 -0
- package/dist/src/components/sidebar/PatchList.d.ts.map +1 -0
- package/dist/src/components/sidebar/ProjectStatus.d.ts +7 -0
- package/dist/src/components/sidebar/ProjectStatus.d.ts.map +1 -0
- package/dist/src/components/sidebar/Section.d.ts +12 -0
- package/dist/src/components/sidebar/Section.d.ts.map +1 -0
- package/dist/src/components/sidebar/ServerStatus.d.ts +2 -0
- package/dist/src/components/sidebar/ServerStatus.d.ts.map +1 -0
- package/dist/src/components/sidebar/index.d.ts +7 -0
- package/dist/src/components/sidebar/index.d.ts.map +1 -0
- package/dist/src/context/command.d.ts +10 -0
- package/dist/src/context/command.d.ts.map +1 -0
- package/dist/src/context/dialog.d.ts +11 -0
- package/dist/src/context/dialog.d.ts.map +1 -0
- package/dist/src/context/exit.d.ts +10 -0
- package/dist/src/context/exit.d.ts.map +1 -0
- package/dist/src/context/review.d.ts +47 -0
- package/dist/src/context/review.d.ts.map +1 -0
- package/dist/src/context/server.d.ts +10 -0
- package/dist/src/context/server.d.ts.map +1 -0
- package/dist/src/context/sidebar.d.ts +13 -0
- package/dist/src/context/sidebar.d.ts.map +1 -0
- package/dist/src/context/theme.d.ts +47 -0
- package/dist/src/context/theme.d.ts.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/lib/diff.d.ts +24 -0
- package/dist/src/lib/diff.d.ts.map +1 -0
- package/dist/src/lib/git.d.ts +15 -0
- package/dist/src/lib/git.d.ts.map +1 -0
- package/dist/src/lib/keybind.d.ts +23 -0
- package/dist/src/lib/keybind.d.ts.map +1 -0
- package/dist/src/lib/tree.d.ts +39 -0
- package/dist/src/lib/tree.d.ts.map +1 -0
- package/dist/src/store/comment.d.ts +20 -0
- package/dist/src/store/comment.d.ts.map +1 -0
- package/dist/src/store/db.d.ts +6 -0
- package/dist/src/store/db.d.ts.map +1 -0
- package/dist/src/store/index.d.ts +7 -0
- package/dist/src/store/index.d.ts.map +1 -0
- package/dist/src/store/patch.d.ts +22 -0
- package/dist/src/store/patch.d.ts.map +1 -0
- package/dist/src/store/repo.d.ts +8 -0
- package/dist/src/store/repo.d.ts.map +1 -0
- package/dist/src/store/review.d.ts +18 -0
- package/dist/src/store/review.d.ts.map +1 -0
- package/dist/store/index.js +303 -0
- package/dist/store/index.js.map +14 -0
- package/dist/swift-a4tt704b.scm +336 -0
- package/dist/toml-hcqfz0bg.scm +53 -0
- package/dist/tsx-c3k3mmc9.scm +239 -0
- package/dist/typescript-hz4pg6ze.scm +239 -0
- package/dist/vue-xbeea1aj.scm +9 -0
- package/dist/yaml-mbfb25g0.scm +79 -0
- package/dist/zig-ds3q8m26.scm +283 -0
- package/package.json +74 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type Info = {
|
|
2
|
+
id: number;
|
|
3
|
+
path: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function create(path: string): Info;
|
|
6
|
+
export declare function getByPath(path: string): Info | null;
|
|
7
|
+
export declare function getOrCreate(path: string): Info;
|
|
8
|
+
//# sourceMappingURL=repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../src/store/repo.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI9C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type Info = {
|
|
2
|
+
id: number;
|
|
3
|
+
repo: number;
|
|
4
|
+
commitSha: string;
|
|
5
|
+
name: string | null;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function create(input: {
|
|
9
|
+
repo: number;
|
|
10
|
+
commitSha: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
}): Info;
|
|
13
|
+
export declare function list(repo: number): Info[];
|
|
14
|
+
export declare function get(id: number): Info | null;
|
|
15
|
+
export declare function latest(repo: number): Info | null;
|
|
16
|
+
export declare function getByRepoAndCommit(repo: number, commitSha: string): Info | null;
|
|
17
|
+
export declare function getOrCreate(repo: number, commitSha: string): Info;
|
|
18
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/store/review.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAYF,wBAAgB,MAAM,CAAC,KAAK,EAAE;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CAYP;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAOzC;AAED,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQ3C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAUhD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,IAAI,GAAG,IAAI,CAQb;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIjE"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/store/db.ts
|
|
18
|
+
var exports_db = {};
|
|
19
|
+
__export(exports_db, {
|
|
20
|
+
path: () => path,
|
|
21
|
+
init: () => init,
|
|
22
|
+
get: () => get,
|
|
23
|
+
close: () => close
|
|
24
|
+
});
|
|
25
|
+
import { Database } from "bun:sqlite";
|
|
26
|
+
import { mkdirSync, existsSync } from "fs";
|
|
27
|
+
import { dirname, join } from "path";
|
|
28
|
+
import { Config } from "@spader/spall-core/config";
|
|
29
|
+
var DB_PATH = join(Config.get().dirs.data, "tui.db");
|
|
30
|
+
var CREATE_REPOS_TABLE = `
|
|
31
|
+
CREATE TABLE IF NOT EXISTS repos (
|
|
32
|
+
id INTEGER PRIMARY KEY,
|
|
33
|
+
path TEXT NOT NULL UNIQUE
|
|
34
|
+
)
|
|
35
|
+
`;
|
|
36
|
+
var CREATE_REVIEWS_TABLE = `
|
|
37
|
+
CREATE TABLE IF NOT EXISTS reviews (
|
|
38
|
+
id INTEGER PRIMARY KEY,
|
|
39
|
+
repo INTEGER NOT NULL,
|
|
40
|
+
commit_sha TEXT NOT NULL,
|
|
41
|
+
name TEXT,
|
|
42
|
+
created_at INTEGER NOT NULL,
|
|
43
|
+
FOREIGN KEY (repo) REFERENCES repos(id)
|
|
44
|
+
)
|
|
45
|
+
`;
|
|
46
|
+
var CREATE_PATCHES_TABLE = `
|
|
47
|
+
CREATE TABLE IF NOT EXISTS patches (
|
|
48
|
+
id INTEGER PRIMARY KEY,
|
|
49
|
+
review INTEGER NOT NULL,
|
|
50
|
+
seq INTEGER NOT NULL,
|
|
51
|
+
hash TEXT NOT NULL,
|
|
52
|
+
content TEXT NOT NULL,
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
FOREIGN KEY (review) REFERENCES reviews(id),
|
|
55
|
+
UNIQUE (review, seq)
|
|
56
|
+
)
|
|
57
|
+
`;
|
|
58
|
+
var CREATE_REVIEW_COMMENTS_TABLE = `
|
|
59
|
+
CREATE TABLE IF NOT EXISTS review_comments (
|
|
60
|
+
id INTEGER PRIMARY KEY,
|
|
61
|
+
review INTEGER NOT NULL,
|
|
62
|
+
note_id INTEGER NOT NULL,
|
|
63
|
+
file TEXT NOT NULL,
|
|
64
|
+
patch_id INTEGER NOT NULL,
|
|
65
|
+
start_row INTEGER NOT NULL,
|
|
66
|
+
end_row INTEGER NOT NULL,
|
|
67
|
+
created_at INTEGER NOT NULL,
|
|
68
|
+
FOREIGN KEY (review) REFERENCES reviews(id)
|
|
69
|
+
)
|
|
70
|
+
`;
|
|
71
|
+
var db = null;
|
|
72
|
+
function path() {
|
|
73
|
+
return DB_PATH;
|
|
74
|
+
}
|
|
75
|
+
function init() {
|
|
76
|
+
if (db)
|
|
77
|
+
return db;
|
|
78
|
+
const dir = dirname(DB_PATH);
|
|
79
|
+
if (!existsSync(dir)) {
|
|
80
|
+
mkdirSync(dir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
db = new Database(DB_PATH);
|
|
83
|
+
db.exec(CREATE_REPOS_TABLE);
|
|
84
|
+
db.exec(CREATE_REVIEWS_TABLE);
|
|
85
|
+
db.exec(CREATE_PATCHES_TABLE);
|
|
86
|
+
db.exec(CREATE_REVIEW_COMMENTS_TABLE);
|
|
87
|
+
return db;
|
|
88
|
+
}
|
|
89
|
+
function get() {
|
|
90
|
+
if (!db) {
|
|
91
|
+
throw new Error("Store not initialized. Call init() first.");
|
|
92
|
+
}
|
|
93
|
+
return db;
|
|
94
|
+
}
|
|
95
|
+
function close() {
|
|
96
|
+
if (db) {
|
|
97
|
+
db.close();
|
|
98
|
+
db = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/store/repo.ts
|
|
103
|
+
var exports_repo = {};
|
|
104
|
+
__export(exports_repo, {
|
|
105
|
+
getOrCreate: () => getOrCreate,
|
|
106
|
+
getByPath: () => getByPath,
|
|
107
|
+
create: () => create
|
|
108
|
+
});
|
|
109
|
+
function create(path2) {
|
|
110
|
+
const row = get().prepare(`INSERT INTO repos (path) VALUES (?) RETURNING id`).get(path2);
|
|
111
|
+
return { id: row.id, path: path2 };
|
|
112
|
+
}
|
|
113
|
+
function getByPath(path2) {
|
|
114
|
+
const row = get().prepare(`SELECT * FROM repos WHERE path = ?`).get(path2);
|
|
115
|
+
if (!row)
|
|
116
|
+
return null;
|
|
117
|
+
return { id: row.id, path: row.path };
|
|
118
|
+
}
|
|
119
|
+
function getOrCreate(path2) {
|
|
120
|
+
const existing = getByPath(path2);
|
|
121
|
+
if (existing)
|
|
122
|
+
return existing;
|
|
123
|
+
return create(path2);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// src/store/review.ts
|
|
127
|
+
var exports_review = {};
|
|
128
|
+
__export(exports_review, {
|
|
129
|
+
list: () => list,
|
|
130
|
+
latest: () => latest,
|
|
131
|
+
getOrCreate: () => getOrCreate2,
|
|
132
|
+
getByRepoAndCommit: () => getByRepoAndCommit,
|
|
133
|
+
get: () => get2,
|
|
134
|
+
create: () => create2
|
|
135
|
+
});
|
|
136
|
+
function rowToInfo(row) {
|
|
137
|
+
return {
|
|
138
|
+
id: row.id,
|
|
139
|
+
repo: row.repo,
|
|
140
|
+
commitSha: row.commit_sha,
|
|
141
|
+
name: row.name,
|
|
142
|
+
createdAt: row.created_at
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function create2(input) {
|
|
146
|
+
const createdAt = Date.now();
|
|
147
|
+
const row = get().prepare(`INSERT INTO reviews (repo, commit_sha, name, created_at)
|
|
148
|
+
VALUES (?, ?, ?, ?) RETURNING *`).get(input.repo, input.commitSha, input.name ?? null, createdAt);
|
|
149
|
+
return rowToInfo(row);
|
|
150
|
+
}
|
|
151
|
+
function list(repo) {
|
|
152
|
+
const rows = get().prepare(`SELECT * FROM reviews WHERE repo = ? ORDER BY created_at DESC`).all(repo);
|
|
153
|
+
return rows.map(rowToInfo);
|
|
154
|
+
}
|
|
155
|
+
function get2(id) {
|
|
156
|
+
const row = get().prepare(`SELECT * FROM reviews WHERE id = ?`).get(id);
|
|
157
|
+
if (!row)
|
|
158
|
+
return null;
|
|
159
|
+
return rowToInfo(row);
|
|
160
|
+
}
|
|
161
|
+
function latest(repo) {
|
|
162
|
+
const row = get().prepare(`SELECT * FROM reviews WHERE repo = ? ORDER BY created_at DESC LIMIT 1`).get(repo);
|
|
163
|
+
if (!row)
|
|
164
|
+
return null;
|
|
165
|
+
return rowToInfo(row);
|
|
166
|
+
}
|
|
167
|
+
function getByRepoAndCommit(repo, commitSha) {
|
|
168
|
+
const row = get().prepare(`SELECT * FROM reviews WHERE repo = ? AND commit_sha = ?`).get(repo, commitSha);
|
|
169
|
+
if (!row)
|
|
170
|
+
return null;
|
|
171
|
+
return rowToInfo(row);
|
|
172
|
+
}
|
|
173
|
+
function getOrCreate2(repo, commitSha) {
|
|
174
|
+
const existing = getByRepoAndCommit(repo, commitSha);
|
|
175
|
+
if (existing)
|
|
176
|
+
return existing;
|
|
177
|
+
return create2({ repo, commitSha });
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// src/store/patch.ts
|
|
181
|
+
var exports_patch = {};
|
|
182
|
+
__export(exports_patch, {
|
|
183
|
+
pruneUnreferenced: () => pruneUnreferenced,
|
|
184
|
+
nextSeq: () => nextSeq,
|
|
185
|
+
list: () => list2,
|
|
186
|
+
latest: () => latest2,
|
|
187
|
+
getOrCreate: () => getOrCreate3,
|
|
188
|
+
getByHash: () => getByHash,
|
|
189
|
+
get: () => get3,
|
|
190
|
+
create: () => create3
|
|
191
|
+
});
|
|
192
|
+
function rowToInfo2(row) {
|
|
193
|
+
return {
|
|
194
|
+
id: row.id,
|
|
195
|
+
review: row.review,
|
|
196
|
+
seq: row.seq,
|
|
197
|
+
hash: row.hash,
|
|
198
|
+
content: row.content,
|
|
199
|
+
createdAt: row.created_at
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function create3(input) {
|
|
203
|
+
const row = get().prepare(`INSERT INTO patches (review, seq, hash, content, created_at)
|
|
204
|
+
VALUES (?, ?, ?, ?, ?) RETURNING *`).get(input.review, input.seq, input.hash, input.content, Date.now());
|
|
205
|
+
return rowToInfo2(row);
|
|
206
|
+
}
|
|
207
|
+
function get3(id) {
|
|
208
|
+
const row = get().prepare(`SELECT * FROM patches WHERE id = ?`).get(id);
|
|
209
|
+
if (!row)
|
|
210
|
+
return null;
|
|
211
|
+
return rowToInfo2(row);
|
|
212
|
+
}
|
|
213
|
+
function getByHash(review, hash) {
|
|
214
|
+
const row = get().prepare(`SELECT * FROM patches WHERE review = ? AND hash = ?`).get(review, hash);
|
|
215
|
+
if (!row)
|
|
216
|
+
return null;
|
|
217
|
+
return rowToInfo2(row);
|
|
218
|
+
}
|
|
219
|
+
function latest2(review) {
|
|
220
|
+
const row = get().prepare(`SELECT * FROM patches WHERE review = ? ORDER BY seq DESC LIMIT 1`).get(review);
|
|
221
|
+
if (!row)
|
|
222
|
+
return null;
|
|
223
|
+
return rowToInfo2(row);
|
|
224
|
+
}
|
|
225
|
+
function list2(review) {
|
|
226
|
+
const rows = get().prepare(`SELECT * FROM patches WHERE review = ? ORDER BY seq ASC`).all(review);
|
|
227
|
+
return rows.map(rowToInfo2);
|
|
228
|
+
}
|
|
229
|
+
function pruneUnreferenced(review, keepPatchIds = []) {
|
|
230
|
+
const keep = keepPatchIds.filter((x) => Number.isFinite(x));
|
|
231
|
+
const keepSql = keep.length > 0 ? ` AND id NOT IN (${keep.map(() => "?").join(",")})` : "";
|
|
232
|
+
const stmt = get().prepare(`DELETE FROM patches
|
|
233
|
+
WHERE review = ?
|
|
234
|
+
AND id NOT IN (
|
|
235
|
+
SELECT DISTINCT patch_id FROM review_comments WHERE review = ?
|
|
236
|
+
)${keepSql}`);
|
|
237
|
+
const result = stmt.run(review, review, ...keep);
|
|
238
|
+
return Number(result.changes ?? 0);
|
|
239
|
+
}
|
|
240
|
+
function nextSeq(review) {
|
|
241
|
+
const last = latest2(review);
|
|
242
|
+
return last ? last.seq + 1 : 0;
|
|
243
|
+
}
|
|
244
|
+
function getOrCreate3(review, content) {
|
|
245
|
+
const hash = String(Bun.hash(content));
|
|
246
|
+
const existing = getByHash(review, hash);
|
|
247
|
+
if (existing)
|
|
248
|
+
return existing;
|
|
249
|
+
const seq = nextSeq(review);
|
|
250
|
+
return create3({ review, seq, hash, content });
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// src/store/comment.ts
|
|
254
|
+
var exports_comment = {};
|
|
255
|
+
__export(exports_comment, {
|
|
256
|
+
list: () => list3,
|
|
257
|
+
create: () => create4
|
|
258
|
+
});
|
|
259
|
+
function create4(input) {
|
|
260
|
+
const now = Date.now();
|
|
261
|
+
const row = get().prepare(`INSERT INTO review_comments (
|
|
262
|
+
review,
|
|
263
|
+
note_id,
|
|
264
|
+
file,
|
|
265
|
+
patch_id,
|
|
266
|
+
start_row,
|
|
267
|
+
end_row,
|
|
268
|
+
created_at
|
|
269
|
+
)
|
|
270
|
+
VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING id`).get(input.review, input.noteId, input.file, input.patchId, input.startRow, input.endRow, now);
|
|
271
|
+
return {
|
|
272
|
+
id: row.id,
|
|
273
|
+
review: input.review,
|
|
274
|
+
noteId: input.noteId,
|
|
275
|
+
file: input.file,
|
|
276
|
+
patchId: input.patchId,
|
|
277
|
+
startRow: input.startRow,
|
|
278
|
+
endRow: input.endRow,
|
|
279
|
+
createdAt: now
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function list3(review) {
|
|
283
|
+
const rows = get().prepare(`SELECT * FROM review_comments WHERE review = ? ORDER BY created_at ASC`).all(review);
|
|
284
|
+
return rows.map((row) => ({
|
|
285
|
+
id: row.id,
|
|
286
|
+
review: row.review,
|
|
287
|
+
noteId: row.note_id,
|
|
288
|
+
file: row.file,
|
|
289
|
+
patchId: row.patch_id,
|
|
290
|
+
startRow: row.start_row,
|
|
291
|
+
endRow: row.end_row,
|
|
292
|
+
createdAt: row.created_at
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
export {
|
|
296
|
+
exports_db as db,
|
|
297
|
+
exports_comment as ReviewComment,
|
|
298
|
+
exports_review as Review,
|
|
299
|
+
exports_repo as Repo,
|
|
300
|
+
exports_patch as Patch
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
//# debugId=DB9C928E72C392EE64756E2164756E21
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/store/db.ts", "../src/store/repo.ts", "../src/store/review.ts", "../src/store/patch.ts", "../src/store/comment.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { Database } from \"bun:sqlite\";\nimport { mkdirSync, existsSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { Config } from \"@spader/spall-core/config\";\n\nconst DB_PATH = join(Config.get().dirs.data, \"tui.db\");\n\nconst CREATE_REPOS_TABLE = `\n CREATE TABLE IF NOT EXISTS repos (\n id INTEGER PRIMARY KEY,\n path TEXT NOT NULL UNIQUE\n )\n`;\n\nconst CREATE_REVIEWS_TABLE = `\n CREATE TABLE IF NOT EXISTS reviews (\n id INTEGER PRIMARY KEY,\n repo INTEGER NOT NULL,\n commit_sha TEXT NOT NULL,\n name TEXT,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (repo) REFERENCES repos(id)\n )\n`;\n\nconst CREATE_PATCHES_TABLE = `\n CREATE TABLE IF NOT EXISTS patches (\n id INTEGER PRIMARY KEY,\n review INTEGER NOT NULL,\n seq INTEGER NOT NULL,\n hash TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (review) REFERENCES reviews(id),\n UNIQUE (review, seq)\n )\n`;\n\nconst CREATE_REVIEW_COMMENTS_TABLE = `\n CREATE TABLE IF NOT EXISTS review_comments (\n id INTEGER PRIMARY KEY,\n review INTEGER NOT NULL,\n note_id INTEGER NOT NULL,\n file TEXT NOT NULL,\n patch_id INTEGER NOT NULL,\n start_row INTEGER NOT NULL,\n end_row INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (review) REFERENCES reviews(id)\n )\n`;\n\nlet db: Database | null = null;\n\nexport function path(): string {\n return DB_PATH;\n}\n\nexport function init(): Database {\n if (db) return db;\n\n const dir = dirname(DB_PATH);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n db = new Database(DB_PATH);\n db.exec(CREATE_REPOS_TABLE);\n db.exec(CREATE_REVIEWS_TABLE);\n db.exec(CREATE_PATCHES_TABLE);\n db.exec(CREATE_REVIEW_COMMENTS_TABLE);\n\n return db;\n}\n\nexport function get(): Database {\n if (!db) {\n throw new Error(\"Store not initialized. Call init() first.\");\n }\n return db;\n}\n\nexport function close(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n",
|
|
6
|
+
"import * as db from \"./db\";\n\ntype Row = {\n id: number;\n path: string;\n};\n\nexport type Info = {\n id: number;\n path: string;\n};\n\nexport function create(path: string): Info {\n const row = db\n .get()\n .prepare(`INSERT INTO repos (path) VALUES (?) RETURNING id`)\n .get(path) as { id: number };\n return { id: row.id, path };\n}\n\nexport function getByPath(path: string): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM repos WHERE path = ?`)\n .get(path) as Row | null;\n if (!row) return null;\n return { id: row.id, path: row.path };\n}\n\nexport function getOrCreate(path: string): Info {\n const existing = getByPath(path);\n if (existing) return existing;\n return create(path);\n}\n",
|
|
7
|
+
"import * as db from \"./db\";\n\ntype Row = {\n id: number;\n repo: number;\n commit_sha: string;\n name: string | null;\n created_at: number;\n};\n\nexport type Info = {\n id: number;\n repo: number;\n commitSha: string;\n name: string | null;\n createdAt: number;\n};\n\nfunction rowToInfo(row: Row): Info {\n return {\n id: row.id,\n repo: row.repo,\n commitSha: row.commit_sha,\n name: row.name,\n createdAt: row.created_at,\n };\n}\n\nexport function create(input: {\n repo: number;\n commitSha: string;\n name?: string;\n}): Info {\n const createdAt = Date.now();\n\n const row = db\n .get()\n .prepare(\n `INSERT INTO reviews (repo, commit_sha, name, created_at) \n VALUES (?, ?, ?, ?) RETURNING *`,\n )\n .get(input.repo, input.commitSha, input.name ?? null, createdAt) as Row;\n\n return rowToInfo(row);\n}\n\nexport function list(repo: number): Info[] {\n const rows = db\n .get()\n .prepare(`SELECT * FROM reviews WHERE repo = ? ORDER BY created_at DESC`)\n .all(repo) as Row[];\n\n return rows.map(rowToInfo);\n}\n\nexport function get(id: number): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM reviews WHERE id = ?`)\n .get(id) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function latest(repo: number): Info | null {\n const row = db\n .get()\n .prepare(\n `SELECT * FROM reviews WHERE repo = ? ORDER BY created_at DESC LIMIT 1`,\n )\n .get(repo) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function getByRepoAndCommit(\n repo: number,\n commitSha: string,\n): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM reviews WHERE repo = ? AND commit_sha = ?`)\n .get(repo, commitSha) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function getOrCreate(repo: number, commitSha: string): Info {\n const existing = getByRepoAndCommit(repo, commitSha);\n if (existing) return existing;\n return create({ repo, commitSha });\n}\n",
|
|
8
|
+
"import * as db from \"./db\";\n\ntype Row = {\n id: number;\n review: number;\n seq: number;\n hash: string;\n content: string;\n created_at: number;\n};\n\nexport type Info = {\n id: number;\n review: number;\n seq: number;\n hash: string;\n content: string;\n createdAt: number;\n};\n\nfunction rowToInfo(row: Row): Info {\n return {\n id: row.id,\n review: row.review,\n seq: row.seq,\n hash: row.hash,\n content: row.content,\n createdAt: row.created_at,\n };\n}\n\nexport function create(input: {\n review: number;\n seq: number;\n hash: string;\n content: string;\n}): Info {\n const row = db\n .get()\n .prepare(\n `INSERT INTO patches (review, seq, hash, content, created_at)\n VALUES (?, ?, ?, ?, ?) RETURNING *`,\n )\n .get(input.review, input.seq, input.hash, input.content, Date.now()) as Row;\n\n return rowToInfo(row);\n}\n\nexport function get(id: number): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM patches WHERE id = ?`)\n .get(id) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function getByHash(review: number, hash: string): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM patches WHERE review = ? AND hash = ?`)\n .get(review, hash) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function latest(review: number): Info | null {\n const row = db\n .get()\n .prepare(`SELECT * FROM patches WHERE review = ? ORDER BY seq DESC LIMIT 1`)\n .get(review) as Row | null;\n\n if (!row) return null;\n return rowToInfo(row);\n}\n\nexport function list(review: number): Info[] {\n const rows = db\n .get()\n .prepare(`SELECT * FROM patches WHERE review = ? ORDER BY seq ASC`)\n .all(review) as Row[];\n\n return rows.map(rowToInfo);\n}\n\nexport function pruneUnreferenced(\n review: number,\n keepPatchIds: number[] = [],\n): number {\n const keep = keepPatchIds.filter((x) => Number.isFinite(x));\n const keepSql =\n keep.length > 0 ? ` AND id NOT IN (${keep.map(() => \"?\").join(\",\")})` : \"\";\n\n const stmt = db.get().prepare(\n `DELETE FROM patches\n WHERE review = ?\n AND id NOT IN (\n SELECT DISTINCT patch_id FROM review_comments WHERE review = ?\n )${keepSql}`,\n );\n\n const result = stmt.run(review, review, ...keep);\n return Number(result.changes ?? 0);\n}\n\nexport function nextSeq(review: number): number {\n const last = latest(review);\n return last ? last.seq + 1 : 0;\n}\n\nexport function getOrCreate(review: number, content: string): Info {\n const hash = String(Bun.hash(content));\n const existing = getByHash(review, hash);\n if (existing) return existing;\n const seq = nextSeq(review);\n return create({ review, seq, hash, content });\n}\n",
|
|
9
|
+
"import * as db from \"./db\";\n\ntype Row = {\n id: number;\n review: number;\n note_id: number;\n file: string;\n patch_id: number;\n start_row: number;\n end_row: number;\n created_at: number;\n};\n\nexport type Info = {\n id: number;\n review: number;\n noteId: number;\n file: string;\n patchId: number;\n startRow: number;\n endRow: number;\n createdAt: number;\n};\n\nexport function create(input: {\n review: number;\n noteId: number;\n file: string;\n patchId: number;\n startRow: number;\n endRow: number;\n}): Info {\n const now = Date.now();\n\n const row = db\n .get()\n .prepare(\n `INSERT INTO review_comments (\n review,\n note_id,\n file,\n patch_id,\n start_row,\n end_row,\n created_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING id`,\n )\n .get(\n input.review,\n input.noteId,\n input.file,\n input.patchId,\n input.startRow,\n input.endRow,\n now,\n ) as {\n id: number;\n };\n\n return {\n id: row.id,\n review: input.review,\n noteId: input.noteId,\n file: input.file,\n patchId: input.patchId,\n startRow: input.startRow,\n endRow: input.endRow,\n createdAt: now,\n };\n}\n\nexport function list(review: number): Info[] {\n const rows = db\n .get()\n .prepare(\n `SELECT * FROM review_comments WHERE review = ? ORDER BY created_at ASC`,\n )\n .all(review) as Row[];\n\n return rows.map((row) => ({\n id: row.id,\n review: row.review,\n noteId: row.note_id,\n file: row.file,\n patchId: row.patch_id,\n startRow: row.start_row,\n endRow: row.end_row,\n createdAt: row.created_at,\n }));\n}\n"
|
|
10
|
+
],
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "DB9C928E72C392EE64756E2164756E21",
|
|
13
|
+
"names": []
|
|
14
|
+
}
|