Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e819c5739e | ||
|
|
ac164789bd |
@@ -3,7 +3,7 @@ import type { Db, ExecResult } from "@wrnexus/db";
|
|||||||
import { users } from "./schema.ts";
|
import { users } from "./schema.ts";
|
||||||
|
|
||||||
export async function GetUserByEmail(db: Db, args: { email: string }): Promise<{ id: number; email: string; name: string; active: boolean; passwordHash: string; createdAt: Date } | null> {
|
export async function GetUserByEmail(db: Db, args: { email: string }): Promise<{ id: number; email: string; name: string; active: boolean; passwordHash: string; createdAt: Date } | null> {
|
||||||
return (await db.one("SELECT * FROM users WHERE email = $1", [args.email], users)) as { id: number; email: string; name: string; active: boolean; passwordHash: string; createdAt: Date } | null;
|
return (await db.one("SELECT * FROM users WHERE email = ?", [args.email], users)) as { id: number; email: string; name: string; active: boolean; passwordHash: string; createdAt: Date } | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function ListUsers(db: Db): Promise<{ id: number; name: string; active: boolean }[]> {
|
export async function ListUsers(db: Db): Promise<{ id: number; name: string; active: boolean }[]> {
|
||||||
@@ -11,13 +11,13 @@ export async function ListUsers(db: Db): Promise<{ id: number; name: string; act
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function CountActive(db: Db, args: { active: boolean }): Promise<{ n: number } | null> {
|
export async function CountActive(db: Db, args: { active: boolean }): Promise<{ n: number } | null> {
|
||||||
return (await db.one("SELECT COUNT(*) AS n FROM users WHERE active = $1", [args.active])) as { n: number } | null;
|
return (await db.one("SELECT COUNT(*) AS n FROM users WHERE active = ?", [args.active])) as { n: number } | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function CreateUser(db: Db, args: { email: string; name: string; active: boolean }): Promise<ExecResult> {
|
export async function CreateUser(db: Db, args: { email: string; name: string; active: boolean }): Promise<ExecResult> {
|
||||||
return db.exec("INSERT INTO users (email, name, active) VALUES ($1, $2, $3)", [args.email, args.name, args.active]);
|
return db.exec("INSERT INTO users (email, name, active) VALUES (?, ?, ?)", [args.email, args.name, args.active]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function DeactivateUser(db: Db, args: { id: number }): Promise<ExecResult> {
|
export async function DeactivateUser(db: Db, args: { id: number }): Promise<ExecResult> {
|
||||||
return db.exec("UPDATE users SET active = 0 WHERE id = $1", [args.id]);
|
return db.exec("UPDATE users SET active = 0 WHERE id = ?", [args.id]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import type { AssetServer } from "./runtime.ts";
|
|||||||
import { servePublicAsset } from "./public.ts";
|
import { servePublicAsset } from "./public.ts";
|
||||||
import { servePluginAsset, type ServedPluginAsset } from "./plugin-assets.ts";
|
import { servePluginAsset, type ServedPluginAsset } from "./plugin-assets.ts";
|
||||||
import { serveIslandArtifact, serveWrnBrowserArtifact } from "./pipeline.ts";
|
import { serveIslandArtifact, serveWrnBrowserArtifact } from "./pipeline.ts";
|
||||||
|
import { HMR_CLIENT_HREF, HMR_CLIENT_JS } from "./runtime.ts";
|
||||||
|
|
||||||
/** Style inputs the dev asset server needs to build `/__wrnexus/styles.css`. */
|
/** Style inputs the dev asset server needs to build `/__wrnexus/styles.css`. */
|
||||||
export interface DevStyles {
|
export interface DevStyles {
|
||||||
@@ -99,6 +100,7 @@ export function createDevAssetServer(
|
|||||||
if (pathname.startsWith("/__wrnexus/island/")) {
|
if (pathname.startsWith("/__wrnexus/island/")) {
|
||||||
return serveIslandArtifact(pathname) ?? new Response("Not Found", { status: 404 });
|
return serveIslandArtifact(pathname) ?? new Response("Not Found", { status: 404 });
|
||||||
}
|
}
|
||||||
|
if (pathname === HMR_CLIENT_HREF) return jsResponse(HMR_CLIENT_JS);
|
||||||
if (pathname === "/__wrnexus/islands.js") return jsResponse(getIslandRuntime(true));
|
if (pathname === "/__wrnexus/islands.js") return jsResponse(getIslandRuntime(true));
|
||||||
if (pathname === "/__wrnexus/reactive.js") return jsResponse(getReactiveRuntime(true));
|
if (pathname === "/__wrnexus/reactive.js") return jsResponse(getReactiveRuntime(true));
|
||||||
if (pathname === "/__wrnexus/controllers.js")
|
if (pathname === "/__wrnexus/controllers.js")
|
||||||
|
|||||||
@@ -878,8 +878,19 @@ function randomNonce(): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** The dev HMR client as a nonce-tagged inline script (strict-CSP friendly). */
|
/** The dev HMR client as a nonce-tagged inline script (strict-CSP friendly). */
|
||||||
function hmrClientTag(nonce: string): string {
|
/** Path the dev asset server publishes the HMR client on. */
|
||||||
return `<script nonce="${nonce}">${HMR_CLIENT_JS}</script>`;
|
export const HMR_CLIENT_HREF = "/__wrnexus/hmr-client.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The HMR client is served as an external module rather than inlined.
|
||||||
|
*
|
||||||
|
* A document's CSP nonce is fixed at load, so an inline script arriving from a
|
||||||
|
* later response — which is exactly what an HMR reload produces — can never
|
||||||
|
* carry a nonce this document accepts. An external file is covered by
|
||||||
|
* script-src 'self' and needs no nonce at all.
|
||||||
|
*/
|
||||||
|
function hmrClientTag(_nonce: string): string {
|
||||||
|
return `<script src="${HMR_CLIENT_HREF}"></script>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 403 for a rejected cross-site WebSocket handshake. */
|
/** 403 for a rejected cross-site WebSocket handshake. */
|
||||||
|
|||||||
Reference in New Issue
Block a user