ework-web 0.10.37 → 0.10.38

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ework-web",
3
- "version": "0.10.37",
3
+ "version": "0.10.38",
4
4
  "type": "module",
5
5
  "description": "ework-web — standalone multi-project issue tracker. Local SQLite-backed, no external API dependency. Bun + TypeScript + SSR HTML.",
6
6
  "license": "MIT",
package/src/config.ts CHANGED
@@ -64,8 +64,8 @@ export const configSchema = z.object({
64
64
  collapseLines: z.coerce.number().int().positive().default(16),
65
65
  fileRoots: z
66
66
  .string()
67
- .transform((s) => s.split(",").map((x) => x.trim()).filter(Boolean))
68
- .default("/tmp"),
67
+ .default("/tmp")
68
+ .transform((s) => s.split(",").map((x) => x.trim()).filter(Boolean)),
69
69
  fileMaxLines: z.coerce.number().int().positive().default(2000),
70
70
  fileMaxBytes: z.coerce.number().int().positive().default(512 * 1024),
71
71
  translateUrl: z.string().default(""),
@@ -50,7 +50,8 @@ async function fetchDaemon(
50
50
  apiPath: string,
51
51
  params: Record<string, string>
52
52
  ): Promise<Response> {
53
- const url = new URL(`${endpoint}${apiPath}`);
53
+ const base = /^https?:\/\//.test(endpoint) ? endpoint : `http://${endpoint}`;
54
+ const url = new URL(`${base}${apiPath}`);
54
55
  for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);
55
56
  const resp = await fetch(url.toString(), { signal: AbortSignal.timeout(10_000) });
56
57
  return resp;
package/src/store.ts CHANGED
@@ -5,6 +5,22 @@
5
5
  import { getDB } from "./db";
6
6
  import { createHash } from "node:crypto";
7
7
 
8
+ let _visibilityChecked = false;
9
+ let _hasVisibilityColumn = true;
10
+
11
+ async function visibilitySupported(): Promise<boolean> {
12
+ if (_visibilityChecked) return _hasVisibilityColumn;
13
+ _visibilityChecked = true;
14
+ try {
15
+ await getDB().get("SELECT visibility FROM {{projects}} LIMIT 0");
16
+ _hasVisibilityColumn = true;
17
+ } catch {
18
+ _hasVisibilityColumn = false;
19
+ console.warn("[store] projects.visibility column missing — treating all projects as public");
20
+ }
21
+ return _hasVisibilityColumn;
22
+ }
23
+
8
24
  export type UserKind = "human" | "bot" | "system";
9
25
 
10
26
  export interface UserRow {
@@ -181,12 +197,15 @@ export async function listProjectsWithCounts(
181
197
  ): Promise<ProjectWithCounts[]> {
182
198
  const isAdmin = viewer?.is_admin === 1;
183
199
  const login = viewer?.login;
184
- const visibilityFilter = isAdmin
200
+ const hasVis = isAdmin ? true : await visibilitySupported();
201
+ const visibilityFilter = !hasVis
185
202
  ? ""
186
- : login
187
- ? ` AND (p.visibility != 'private' OR EXISTS (SELECT 1 FROM {{project_members}} pm WHERE pm.project_id = p.id AND pm.user_login = ?))`
188
- : ` AND p.visibility != 'private'`;
189
- const args = !isAdmin && login ? [login] : [];
203
+ : isAdmin
204
+ ? ""
205
+ : login
206
+ ? ` AND (p.visibility != 'private' OR EXISTS (SELECT 1 FROM {{project_members}} pm WHERE pm.project_id = p.id AND pm.user_login = ?))`
207
+ : ` AND p.visibility != 'private'`;
208
+ const args = hasVis && !isAdmin && login ? [login] : [];
190
209
  return await getDB().all<ProjectWithCounts>(
191
210
  `SELECT p.*,
192
211
  COALESCE(SUM(CASE WHEN i.state = 'open' THEN 1 ELSE 0 END), 0) AS open_count,
@@ -404,7 +423,7 @@ export async function listAllIssues(opts: ListIssuesOpts = {}): Promise<IssueWit
404
423
  sql += " AND EXISTS (SELECT 1 FROM {{issue_labels}} il JOIN {{labels}} l ON l.id = il.label_id WHERE il.issue_id = i.id AND l.name = ?)";
405
424
  args.push(label);
406
425
  }
407
- if (!opts.viewerIsAdmin) {
426
+ if (!opts.viewerIsAdmin && await visibilitySupported()) {
408
427
  sql += " AND (p.visibility != 'private'";
409
428
  if (opts.viewerLogin) {
410
429
  sql += " OR EXISTS (SELECT 1 FROM {{project_members}} pm WHERE pm.project_id = p.id AND pm.user_login = ?)";