fix(cursor): 优化 ID 替换逻辑与 ESM 兼容性支持

修复了 Cursor 各平台脚本中 ID 占位符的替换方式,避免因双重引号导致的
JavaScript 语法错误。同时增强对 ESM 模块系统的兼容处理,确保在纯 ESM 环境下
也能正确获取 `require` 方法以完成模块 hook。此外,统一各平台脚本的处理逻辑,
提升代码一致性与可维护性。
This commit is contained in:
煎饼果子卷鲨鱼辣椒
2025-12-21 21:22:28 +08:00
parent f35d9ede3b
commit 91a72f9216
3 changed files with 142 additions and 53 deletions

View File

@@ -1623,40 +1623,69 @@ EOF
log_info "📝 [处理] 正在处理: ${file/$CURSOR_APP_PATH\//}"
# ========== 方法A: someValue占位符替换稳定锚点 ==========
# 重要说明:
# 当前 Cursor 的 main.js 中占位符通常是以字符串字面量形式出现,例如:
# this.machineId="someValue.machineId"
# 如果直接把 someValue.machineId 替换成 "\"<真实值>\"",会形成 ""<真实值>"" 导致 JS 语法错误。
# 因此这里优先替换完整的字符串字面量(包含外层引号),再兜底替换不带引号的占位符。
local replaced=false
if grep -q 'someValue\.machineId' "$file"; then
sed -i.tmp "s/someValue\.machineId/\"${machine_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.machineId\"/\"${machine_id}\"/g" \
-e "s/'someValue\.machineId'/\"${machine_id}\"/g" \
-e "s/someValue\.machineId/\"${machine_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.machineId"
replaced=true
fi
if grep -q 'someValue\.macMachineId' "$file"; then
sed -i.tmp "s/someValue\.macMachineId/\"${mac_machine_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.macMachineId\"/\"${mac_machine_id}\"/g" \
-e "s/'someValue\.macMachineId'/\"${mac_machine_id}\"/g" \
-e "s/someValue\.macMachineId/\"${mac_machine_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.macMachineId"
replaced=true
fi
if grep -q 'someValue\.devDeviceId' "$file"; then
sed -i.tmp "s/someValue\.devDeviceId/\"${device_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.devDeviceId\"/\"${device_id}\"/g" \
-e "s/'someValue\.devDeviceId'/\"${device_id}\"/g" \
-e "s/someValue\.devDeviceId/\"${device_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.devDeviceId"
replaced=true
fi
if grep -q 'someValue\.sqmId' "$file"; then
sed -i.tmp "s/someValue\.sqmId/\"${sqm_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.sqmId\"/\"${sqm_id}\"/g" \
-e "s/'someValue\.sqmId'/\"${sqm_id}\"/g" \
-e "s/someValue\.sqmId/\"${sqm_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.sqmId"
replaced=true
fi
if grep -q 'someValue\.sessionId' "$file"; then
sed -i.tmp "s/someValue\.sessionId/\"${session_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.sessionId\"/\"${session_id}\"/g" \
-e "s/'someValue\.sessionId'/\"${session_id}\"/g" \
-e "s/someValue\.sessionId/\"${session_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.sessionId"
replaced=true
fi
if grep -q 'someValue\.firstSessionDate' "$file"; then
sed -i.tmp "s/someValue\.firstSessionDate/\"${first_session_date}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.firstSessionDate\"/\"${first_session_date}\"/g" \
-e "s/'someValue\.firstSessionDate'/\"${first_session_date}\"/g" \
-e "s/someValue\.firstSessionDate/\"${first_session_date}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.firstSessionDate"
replaced=true
fi
@@ -1664,9 +1693,22 @@ EOF
# ========== 方法B: 增强版深度 Hook 注入 ==========
# 创建注入代码
local inject_code='// ========== Cursor Hook 注入开始 ==========
;(function(){/*__cursor_patched__*/
;(async function(){/*__cursor_patched__*/
"use strict";
if(globalThis.__cursor_patched__)return;
// 兼容 ESM确保可用的 require部分版本 main.js 可能是纯 ESM不保证存在 require
var __require__=typeof require==="function"?require:null;
if(!__require__){
try{
var __m__=await import("module");
__require__=__m__.createRequire(import.meta.url);
}catch(e){
// 无法获得 require 时直接退出,避免影响主进程启动
return;
}
}
globalThis.__cursor_patched__=true;
var __ids__={
@@ -1679,7 +1721,7 @@ var __ids__={
globalThis.__cursor_ids__=__ids__;
var Module=require("module");
var Module=__require__("module");
var _origReq=Module.prototype.require;
var _hooked=new Map();