From 849ab7e4c5140e519ad85f6a04776aa8f256f39e Mon Sep 17 00:00:00 2001 From: cupcakearmy Date: Sun, 6 Sep 2026 22:29:02 +0200 Subject: [PATCH] chore: upgrade to typescript 7 with tsconfig strictest --- packages/cli/src/actions/download.ts | 3 ++- packages/cli/src/actions/upload.ts | 4 ++-- packages/cli/src/cli.ts | 23 ++++++++++++++++------- packages/cli/src/utils/utils.ts | 4 ++-- packages/cli/tsconfig.json | 11 ++++++----- packages/shared/package.json | 9 +++++---- packages/shared/src/api.ts | 4 ++-- packages/shared/src/types.ts | 17 +++++++++++++++++ packages/shared/tsconfig.json | 5 ++--- 9 files changed, 54 insertions(+), 26 deletions(-) diff --git a/packages/cli/src/actions/download.ts b/packages/cli/src/actions/download.ts index eb4a528..6953786 100644 --- a/packages/cli/src/actions/download.ts +++ b/packages/cli/src/actions/download.ts @@ -3,11 +3,12 @@ import { access, constants, writeFile } from 'node:fs/promises' import { basename, resolve } from 'node:path' import { decode } from '@msgpack/msgpack' import pretty from 'pretty-bytes' -import { decrypt, deriveKey, setServer, getServer, info, get, decompress } from '@cryptgeon/shared' +import { decrypt, deriveKey, setServer, info, get, decompress } from '@cryptgeon/shared' export async function download(url: URL, all: boolean, suggestedPassword?: string) { setServer(url.origin) const id = url.pathname.split('/')[2] + if (!id) throw new Error('Invalid URL') const meta = await info(id) if (!meta) throw new Error('Note does not exist or is expired') diff --git a/packages/cli/src/actions/upload.ts b/packages/cli/src/actions/upload.ts index f60d081..7cbccc3 100644 --- a/packages/cli/src/actions/upload.ts +++ b/packages/cli/src/actions/upload.ts @@ -1,9 +1,9 @@ -import { readFile, stat } from 'node:fs/promises' +import { readFile } from 'node:fs/promises' import { basename } from 'node:path' import { encode } from '@msgpack/msgpack' import mime from 'mime' -import { encrypt, generateKey, deriveKey, randomBytes, setServer, getServer, create, utf8ToBytes, compress } from '@cryptgeon/shared' +import { encrypt, generateKey, deriveKey, randomBytes, getServer, create, compress } from '@cryptgeon/shared' export type UploadOptions = { views?: number; expiration?: number; password?: string } diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 835fd78..c3c08a3 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -21,7 +21,8 @@ const views = new Option('-v --views ', 'Amount of views before getting const minutes = new Option('-m --minutes ', 'Minutes before the note expires').argParser(parseNumber) // Node 18 guard -parseInt(process.version.slice(1).split(',')[0]) < 18 && exit('Node 18 or higher is required') +const major = Number(process.version.slice(1).split('.')[0]) +if (!Number.isFinite(major) || major < 18) exit('Node 18 or higher is required') // @ts-ignore const version: string = VERSION @@ -33,10 +34,10 @@ program .description('show information about the server') .addOption(server) .action(async (options) => { - setServer(options.server) + setServer(options.server!) const response = await status() const formatted = Object.fromEntries( - Object.entries({ ...response, max_size: prettyBytes(response.max_size as number) }) + Object.entries({ ...response, max_size: prettyBytes(response.max_size) }) .filter(([key]) => !key.startsWith('theme_')) ) console.table(formatted) @@ -51,11 +52,15 @@ send .addOption(minutes) .addOption(password) .action(async (files, options) => { - setServer(options.server) + setServer(options.server!) await checkConstrains(options) options.password ||= await getStdin() try { - const url = await upload(files, { views: options.views, expiration: options.minutes, password: options.password }) + const url = await upload(files, { + ...(options.views !== undefined ? { views: options.views } : {}), + ...(options.minutes !== undefined ? { expiration: options.minutes } : {}), + password: options.password, + }) console.log(`Note created:\n\n${url}`) } catch { exit('Could not create note') @@ -69,11 +74,15 @@ send .addOption(minutes) .addOption(password) .action(async (text, options) => { - setServer(options.server) + setServer(options.server!) await checkConstrains(options) options.password ||= await getStdin() try { - const url = await upload(text, { views: options.views, expiration: options.minutes, password: options.password }) + const url = await upload(text, { + ...(options.views !== undefined ? { views: options.views } : {}), + ...(options.minutes !== undefined ? { expiration: options.minutes } : {}), + password: options.password, + }) console.log(`Note created:\n\n${url}`) } catch { exit('Could not create note') diff --git a/packages/cli/src/utils/utils.ts b/packages/cli/src/utils/utils.ts index 9b919c7..b5c73b1 100644 --- a/packages/cli/src/utils/utils.ts +++ b/packages/cli/src/utils/utils.ts @@ -10,8 +10,8 @@ export async function checkConstrains(constrains: { views?: number; minutes?: nu if (!constrains.views && !constrains.minutes) constrains.views = 1 const response = await status() - if (constrains.views && constrains.views > (response.max_views as number)) + if (constrains.views && constrains.views > response.max_views) exit(`Only a maximum of ${response.max_views} views allowed. ${constrains.views} given.`) - if (constrains.minutes && constrains.minutes > (response.max_expiration as number)) + if (constrains.minutes && constrains.minutes > response.max_expiration) exit(`Only a maximum of ${response.max_expiration} minutes allowed. ${constrains.minutes} given.`) } \ No newline at end of file diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 5514c3b..f89d636 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -1,13 +1,14 @@ { + "extends": "@tsconfig/strictest/tsconfig.json", "compilerOptions": { - "target": "es2022", - "module": "es2022", + "target": "esnext", + "module": "esnext", "moduleResolution": "Bundler", "declaration": true, "emitDeclarationOnly": true, - "strict": true, "outDir": "./dist", "rootDir": "./src", "allowSyntheticDefaultImports": true - } -} + }, + "exclude": ["vite.config.ts"] +} \ No newline at end of file diff --git a/packages/shared/package.json b/packages/shared/package.json index 856537f..faf503c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -8,14 +8,15 @@ }, "dependencies": { "@msgpack/msgpack": "^3.1.3", - "@noble/ciphers": "^2.2.0", - "@noble/hashes": "^2.2.0", + "@noble/ciphers": "^2.4.0", + "@noble/hashes": "^2.4.0", "lz4js": "^0.2.0" }, "devDependencies": { + "@tsconfig/strictest": "catalog:", "@types/lz4js": "^0.2.2", - "typescript": "^5.9.3", - "vitest": "^4.1.7" + "typescript": "catalog:", + "vitest": "^4.1.11" }, "scripts": { "test": "vitest run", diff --git a/packages/shared/src/api.ts b/packages/shared/src/api.ts index 495404b..89397a1 100644 --- a/packages/shared/src/api.ts +++ b/packages/shared/src/api.ts @@ -1,6 +1,6 @@ import { encode, decode } from "@msgpack/msgpack"; -import type { ServerNote } from "./types.js"; +import type { ServerNote, Status } from "./types.js"; let server = ""; @@ -51,7 +51,7 @@ export async function get(id: string): Promise { return { meta, data: d instanceof Uint8Array ? d : new Uint8Array(d) } satisfies ServerNote; } -export async function status(): Promise> { +export async function status(): Promise { const res = await fetch(api("status")); if (!res.ok) throw new Error("status failed"); return res.json(); diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 99ed201..6ce718b 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -18,4 +18,21 @@ export type FileDTO = { mime: string; size: number; data: Uint8Array; +}; + +export type Status = { + version: string; + max_size: number; + max_views: number; + max_expiration: number; + allow_advanced: boolean; + allow_files: boolean; + imprint_url: string; + imprint_html: string; + theme_image: string; + theme_text: string; + theme_page_title: string; + theme_favicon: string; + theme_new_note_notice: boolean; + theme_home_link: boolean; }; \ No newline at end of file diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 97f0489..4d6cf77 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,10 +1,9 @@ { + "extends": "@tsconfig/strictest/tsconfig.json", "compilerOptions": { "target": "ESNext", "module": "ESNext", "moduleResolution": "bundler", - "strict": true, - "noEmit": true, - "skipLibCheck": true + "noEmit": true } } \ No newline at end of file