From 2180683cf0c37437341395a15c8a5edc4924217f Mon Sep 17 00:00:00 2001 From: Arsen Bekirov Date: Fri, 29 May 2026 18:52:13 +0300 Subject: [PATCH 1/3] fix: guard against undefined recordId parts in googledns deleteRecord (#454) Replace destructuring assignment with validation to avoid TS18048 under noUncheckedIndexedAccess. --- packages/dns/googledns/src/index.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/dns/googledns/src/index.ts b/packages/dns/googledns/src/index.ts index dbb4c535..37902260 100644 --- a/packages/dns/googledns/src/index.ts +++ b/packages/dns/googledns/src/index.ts @@ -123,14 +123,19 @@ export default defineDns({ const token = await getAccessToken(); const project = config.projectId ?? _secret('GOOGLE_PROJECT_ID'); if (!project) throw new Error('GOOGLE_PROJECT_ID not set'); - const [type, name] = recordId.split('/'); + const parts = recordId.split('/'); + const type = parts[0]; + const name = parts.slice(1).join('/'); + if (!type || !name) throw new Error(`Invalid recordId "${recordId}" — expected "/"`); // Need to fetch the rrset to get current rrdatas for the deletion entry. const existing = (await this.listRecords(zoneId, config)).filter( r => r.type === type && (r.name === name || r.name === name.replace(/\.$/, '')), ); if (existing.length === 0) return; + const first = existing[0]; + if (!first) return; const fqdn = name.endsWith('.') ? name : `${name}.`; - const ttl = existing[0].ttl; + const ttl = first.ttl; const res = await fetch(`${API}/projects/${project}/managedZones/${zoneId}/changes`, { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, From ee8b3875a3f650c0dcbe378d80136add0c42a8ad Mon Sep 17 00:00:00 2001 From: Arsen Bekirov Date: Fri, 29 May 2026 18:52:13 +0300 Subject: [PATCH 2/3] fix: correct tsconfig.base.json extends paths for bot packages (#452) Use ../../../../tsconfig.base.json instead of ../../tsconfig.base.json which incorrectly pointed to packages/tsconfig.base.json. --- packages/bot/core/tsconfig.json | 8 +++++--- packages/bot/discord/tsconfig.json | 8 +++++--- packages/bot/signal/tsconfig.json | 8 +++++--- packages/bot/telegram/tsconfig.json | 8 +++++--- packages/bot/whatsapp/tsconfig.json | 8 +++++--- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/bot/core/tsconfig.json b/packages/bot/core/tsconfig.json index 61d15314..679d7254 100644 --- a/packages/bot/core/tsconfig.json +++ b/packages/bot/core/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*.ts"] -} \ No newline at end of file + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/bot/discord/tsconfig.json b/packages/bot/discord/tsconfig.json index 61d15314..679d7254 100644 --- a/packages/bot/discord/tsconfig.json +++ b/packages/bot/discord/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*.ts"] -} \ No newline at end of file + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/bot/signal/tsconfig.json b/packages/bot/signal/tsconfig.json index 61d15314..679d7254 100644 --- a/packages/bot/signal/tsconfig.json +++ b/packages/bot/signal/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*.ts"] -} \ No newline at end of file + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/bot/telegram/tsconfig.json b/packages/bot/telegram/tsconfig.json index 61d15314..679d7254 100644 --- a/packages/bot/telegram/tsconfig.json +++ b/packages/bot/telegram/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*.ts"] -} \ No newline at end of file + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/bot/whatsapp/tsconfig.json b/packages/bot/whatsapp/tsconfig.json index 61d15314..679d7254 100644 --- a/packages/bot/whatsapp/tsconfig.json +++ b/packages/bot/whatsapp/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, - "include": ["src/**/*.ts"] -} \ No newline at end of file + "include": [ + "src/**/*.ts" + ] +} From 7a2923b1385b1d6ce4a50e90c8cb90568974db54 Mon Sep 17 00:00:00 2001 From: Arsen Bekirov Date: Fri, 29 May 2026 18:52:13 +0300 Subject: [PATCH 3/3] fix: support .cmd/.bat shims on Windows in exec() helper (#446) Detect .cmd/.bat extensions on Windows and spawn via cmd.exe with shell:true. --- packages/core/src/exec.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/exec.ts b/packages/core/src/exec.ts index ed4e32a9..c08d79c6 100644 --- a/packages/core/src/exec.ts +++ b/packages/core/src/exec.ts @@ -28,10 +28,14 @@ export async function exec(cmd: string, args: string[], opts: ExecOptions): Prom } return new Promise((resolve, reject) => { - const child = spawn(cmd, args, { + // On Windows, .cmd/.bat shims must be spawned with shell:true or via cmd.exe + const isWin = process.platform === 'win32'; + const needsShell = isWin && (cmd.endsWith('.cmd') || cmd.endsWith('.bat')); + const child = spawn(needsShell ? 'cmd' : cmd, needsShell ? ['/d', '/s', '/c', cmd, ...args] : args, { cwd: opts.cwd, env: { ...process.env, ...extraEnv }, stdio: ['ignore', 'pipe', 'pipe'], + ...(needsShell ? { shell: true } : {}), }); let stdout = '';