diff --git a/packages/banhammer-bot/package.json b/packages/banhammer-bot/package.json new file mode 100644 index 0000000..cb99190 --- /dev/null +++ b/packages/banhammer-bot/package.json @@ -0,0 +1,20 @@ +{ + "name": "@allinbits/banhammer-bot", + "version": "0.1.0", + "private": true, + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc --noEmit && tsdown", + "dev": "tsx watch src/index.ts", + "lint": "eslint", + "start": "node dist/index.js" + }, + "dependencies": { + "@cosmjs/proto-signing": "^0.36.0", + "@cosmjs/stargate": "^0.36.0", + "node-telegram-bot-api": "^0.66.0" + } +} diff --git a/packages/banhammer-bot/src/BanhammerBot.ts b/packages/banhammer-bot/src/BanhammerBot.ts new file mode 100644 index 0000000..1a00839 --- /dev/null +++ b/packages/banhammer-bot/src/BanhammerBot.ts @@ -0,0 +1,133 @@ +import TelegramBot from "node-telegram-bot-api"; + +import { + BanhammerDB, +} from "./db.ts"; + +export type BanhammerBotOptions = { + token: string + owners: string[] + mnemonic: string + databasePath: string +}; + +type Command = { + command: string + description: string + regex: RegExp + function: (msg: TelegramBot.Message, match: RegExpExecArray | null) => void + usage: string + ownerOnly?: boolean +}; + +export class BanhammerBot { + private bot: TelegramBot; + private owners: Set; + private commands: Command[]; + private banhammerDB: BanhammerDB; + + constructor(options: BanhammerBotOptions) { + this.bot = new TelegramBot(options.token, { + polling: true, + }); + this.owners = new Set(options.owners); + this.banhammerDB = new BanhammerDB(options.databasePath); + + this.commands = [ + { + command: "ban", + description: "Ban a user (owners only)", + regex: /^\/ban(@.*)? (.*)/, + ownerOnly: true, + usage: "Usage: /ban as reply to a user's message (owners only)", + function: this.onBanUser, + }, + { + command: "add", + description: "Add Chat to federated ban list (owners only)", + regex: /^\/add(@.*)?/, + ownerOnly: true, + usage: "Usage: /add (owners only)", + function: this.onAddChat, + }, + ]; + } + + public async start(): Promise { + await this.registerCommands(); + + this.commands.forEach(cmd => this.bot.onText(cmd.regex, async (msg: TelegramBot.Message, match: RegExpExecArray | null) => { + console.log(`[INFO]: msg received ${msg.text} from ${msg.from?.username ?? msg.from?.id?.toString()}`); + + if (cmd.ownerOnly && !this.isOwner(msg.from?.username ?? "")) { + this.bot.sendMessage(msg.chat.id, "This command is only available to owners", { + protect_content: true, + }); + return; + } + + try { + if (!match) { + throw new Error("Message don't match regex"); + } + + await cmd.function(msg, match); + } + catch (error) { + console.error(`[ERROR] ${cmd.command}: ${msg.text}`, error); + this.bot.sendMessage(msg.chat.id, `${cmd.usage}\n\nError: ${(error as Error).message}`); + } + })); + } + + private isOwner = (username?: string | null): boolean => { + if (!username) return false; + return this.owners.has(username); + }; + + // Command registration + private async registerCommands(): Promise { + const commandsForTelegram: TelegramBot.BotCommand[] = this.commands.map(c => ({ + command: c.command, + description: c.description, + })); + + try { + await this.bot.setMyCommands(commandsForTelegram); + await this.bot.setMyCommands(commandsForTelegram, { + scope: { + type: "all_private_chats", + } as TelegramBot.BotCommandScope, + }); + await this.bot.setMyCommands(commandsForTelegram, { + scope: { + type: "all_group_chats", + } as TelegramBot.BotCommandScope, + }); + } + catch (err) { + console.error("Failed to set bot commands:", err); + } + } + + private onBanUser = (msg: TelegramBot.Message, match: RegExpExecArray | null) => { + const reason = match?.[1]; + const id = this.banhammerDB.ban(msg.reply_to_message?.from?.id.toString() ?? "", reason ?? "", msg.from?.id.toString() ?? ""); + if (id == null) { + throw new Error("Failed to create ban"); + } + }; + + private onAddChat = async (msg: TelegramBot.Message, _match: RegExpExecArray | null) => { + this.banhammerDB.addChat(msg.chat.id.toString()); + await this.bot.sendMessage(msg.chat.id, "Chat added to federated ban list", { + protect_content: true, + }); + const fedBans = this.banhammerDB.getBans(); + for (const ban of fedBans) { + await this.bot.banChatMember(msg.chat.id, parseInt(ban.user_id, 10), { + revoke_messages: true, + }); + } + }; +} diff --git a/packages/banhammer-bot/src/db.ts b/packages/banhammer-bot/src/db.ts new file mode 100644 index 0000000..32a948c --- /dev/null +++ b/packages/banhammer-bot/src/db.ts @@ -0,0 +1,108 @@ +import { + mkdirSync, +} from "node:fs"; +import path from "node:path"; +import { + DatabaseSync, +} from "node:sqlite"; + +export type Ban = { + id: number + user_id: string + reason: string + banned_at: number + unbanned_at: number | null + moderator_id: string +}; + +export class BanhammerDB { + private database: DatabaseSync; + + constructor(databasePath: string) { + mkdirSync(path.dirname(databasePath), { + recursive: true, + }); + + this.database = new DatabaseSync(databasePath); + const initDatabase = ` +CREATE TABLE IF NOT EXISTS bans ( + id INTEGER PRIMARY KEY, + user_id TEXT NOT NULL, + reason TEXT NOT NULL, + banned_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + unbanned_at TIMESTAMPTZ, + ban_moderator_id TEXT NOT NULL, + unban_moderator_id TEXT NOT NULL, +); +CREATE TABLE IF NOT EXISTS chats ( + id INTEGER PRIMARY KEY, + chat_id TEXT NOT NULL, +); +`; + + this.database.exec(initDatabase); + } + + public addChat(chat_id: string): void { + this.database.prepare("INSERT INTO chats (chat_id) VALUES (?)").run(chat_id); + } + + public ban(user_id: string, reason: string, moderator_id: string): number | null { + const bannedAt = Date.now(); + const row = this.database.prepare( + "INSERT INTO bans (user_id, reason, banned_at, unbanned_at, ban_moderator_id) VALUES (?, ?, ?, ?, ?) RETURNING id", + ).get(user_id, reason, bannedAt, null, moderator_id) as { + id?: unknown + } | undefined; + const idValue = row?.id; + return idValue == null ? null : Number(idValue); + } + + public unBan(id: number, moderator_id: string): void { + const unbannedAt = Date.now(); + this.database.prepare("UPDATE bans SET unbanned_at = ?, unban_moderator_id = ? WHERE id = ?").run(unbannedAt, moderator_id, id); + } + + public getBan(user_id: string): Ban | null { + const row = this.database.prepare("SELECT * FROM bans WHERE user_id = ? AND unbanned_at IS NULL").get(user_id) as + | { + id: number + user_id: string + reason: string + banned_at: number + unbanned_at: number | null + moderator_id: string + } + | undefined; + if (row == null) { + return null; + } + return { + id: row.id, + user_id: row.user_id, + reason: row.reason, + banned_at: row.banned_at, + unbanned_at: row.unbanned_at, + moderator_id: row.moderator_id, + }; + } + + public getBans(): Ban[] { + const rows = this.database.prepare("SELECT * FROM bans WHERE unbanned_at IS NULL").all() as { + id: number + user_id: string + reason: string + banned_at: number + unbanned_at: number | null + moderator_id: string + }[]; + return rows.map(row => ({ + id: row.id, + user_id: row.user_id, + reason: row.reason, + banned_at: row.banned_at, + unbanned_at: row.unbanned_at, + moderator_id: row.moderator_id, + })); + } +} diff --git a/packages/banhammer-bot/src/index.ts b/packages/banhammer-bot/src/index.ts new file mode 100644 index 0000000..369ac85 --- /dev/null +++ b/packages/banhammer-bot/src/index.ts @@ -0,0 +1,21 @@ +import { + BanhammerBot, +} from "./BanhammerBot.ts"; + +async function main() { + const token = process.env.TG_TOKEN ?? ""; + const owners = process.env.OWNERS?.split(",") ?? []; + const mnemonic = process.env.MNEMONIC ?? ""; + const databasePath = process.env.DATABASE_PATH ?? "data/banhammer.db"; + + const bot = new BanhammerBot({ + token: token, + owners: owners, + mnemonic: mnemonic, + databasePath: databasePath, + }); + + await bot.start(); +} + +main(); diff --git a/packages/banhammer-bot/tsconfig.json b/packages/banhammer-bot/tsconfig.json new file mode 100644 index 0000000..3462c84 --- /dev/null +++ b/packages/banhammer-bot/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": [ + "src/**/*" + ], + "compilerOptions": { + "target": "es2020", + "module": "es2020", + "rootDir": "./src/", + "moduleResolution": "bundler", + "types": ["node"], + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "./dist/", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "allowImportingTsExtensions": true + } +} diff --git a/packages/banhammer-bot/tsdown.config.ts b/packages/banhammer-bot/tsdown.config.ts new file mode 100644 index 0000000..1c930c4 --- /dev/null +++ b/packages/banhammer-bot/tsdown.config.ts @@ -0,0 +1,32 @@ +/* eslint-disable @stylistic/no-multi-spaces */ +import { + defineConfig, +} from "tsdown"; + +export default defineConfig([ + { + entry: ["./src/index.ts"], // Entry point + unbundle: true, // Keep modules separate (don't bundle) + attw: true, // Run @arethetypeswrong/core checks + platform: "node", // Target Node.js environment + nodeProtocol: "strip", // Remove "node:" protocol prefix + target: "es2020", // Target ES2020 JavaScript + outDir: "./dist", // Output directory + clean: true, // Clean output directory before build + sourcemap: true, // Generate source maps + dts: true, // Generate TypeScript declaration files + format: ["cjs"], // Generate CommonJS format + }, + { + entry: ["./src/index.ts"], + unbundle: true, + attw: true, + platform: "node", + target: "es2020", + outDir: "./dist", + clean: true, + sourcemap: true, + dts: true, + format: ["esm"], + }, +]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 392a247..28b4c6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,6 +52,18 @@ importers: specifier: ^8.44.0 version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + packages/banhammer-bot: + dependencies: + '@cosmjs/proto-signing': + specifier: ^0.36.0 + version: 0.36.0 + '@cosmjs/stargate': + specifier: ^0.36.0 + version: 0.36.0 + node-telegram-bot-api: + specifier: ^0.66.0 + version: 0.66.0(request@2.88.2) + packages/bounty-bot: dependencies: '@cosmjs/proto-signing': @@ -408,97 +420,97 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.94.0': - resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} '@quansync/fs@0.1.5': resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} - '@rolldown/binding-android-arm64@1.0.0-beta.43': - resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} + '@rolldown/binding-android-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.43': - resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.43': - resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.43': - resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': - resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': - resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': - resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': - resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': - resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': - resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': - resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': - resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': - resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': - resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.43': - resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rolldown/pluginutils@1.0.0-beta.52': + resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} '@stylistic/eslint-plugin@5.4.0': resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==} @@ -1511,8 +1523,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.43: - resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} + rolldown@1.0.0-beta.52: + resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2172,57 +2184,57 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oxc-project/types@0.94.0': {} + '@oxc-project/types@0.99.0': {} '@quansync/fs@0.1.5': dependencies: quansync: 0.2.11 - '@rolldown/binding-android-arm64@1.0.0-beta.43': + '@rolldown/binding-android-arm64@1.0.0-beta.52': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.43': + '@rolldown/binding-darwin-x64@1.0.0-beta.52': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': optional: true - '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rolldown/pluginutils@1.0.0-beta.52': {} '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.6.0))': dependencies: @@ -3372,7 +3384,7 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.52)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -3383,33 +3395,32 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.43 + rolldown: 1.0.0-beta.52 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.43: + rolldown@1.0.0-beta.52: dependencies: - '@oxc-project/types': 0.94.0 - '@rolldown/pluginutils': 1.0.0-beta.43 - ansis: 4.2.0 + '@oxc-project/types': 0.99.0 + '@rolldown/pluginutils': 1.0.0-beta.52 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.43 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 - '@rolldown/binding-darwin-x64': 1.0.0-beta.43 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 + '@rolldown/binding-android-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-x64': 1.0.0-beta.52 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 run-parallel@1.2.0: dependencies: @@ -3600,8 +3611,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.43 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.3) + rolldown: 1.0.0-beta.52 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.52)(typescript@5.9.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3c99c41..7a2de30 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,5 @@ packages: injectWorkspacePackages: true syncInjectedDepsAfterScripts: - build +onlyBuiltDependencies: + - esbuild