(
code: string,
origin: string,
uuid?: string,
override: boolean = false,
dao?: ScriptDAO,
options?: {
byEditor?: boolean; // 是否通过编辑器导入
byWebRequest?: boolean; // 是否通过网页连结安装或更新
}
)
| 130 | |
| 131 | // 通过代码解析出脚本信息 (Script) |
| 132 | export async function prepareScriptByCode( |
| 133 | code: string, |
| 134 | origin: string, |
| 135 | uuid?: string, |
| 136 | override: boolean = false, |
| 137 | dao?: ScriptDAO, |
| 138 | options?: { |
| 139 | byEditor?: boolean; // 是否通过编辑器导入 |
| 140 | byWebRequest?: boolean; // 是否通过网页连结安装或更新 |
| 141 | } |
| 142 | ): Promise<{ script: Script; oldScript?: Script; oldScriptCode?: string }> { |
| 143 | dao = dao ?? new ScriptDAO(); |
| 144 | const script = parseScriptFromCode(code, origin, uuid); |
| 145 | let old: Script | undefined; |
| 146 | let oldCode: ScriptCode | undefined; |
| 147 | if (uuid) { |
| 148 | old = await dao.get(uuid); |
| 149 | } |
| 150 | if (!old && (!uuid || override)) { |
| 151 | old = await dao.findByNameAndNamespace(script.name, script.namespace); |
| 152 | } |
| 153 | if (!old && options?.byWebRequest) { |
| 154 | const test = await dao.searchExistingScript(script); |
| 155 | if (test.length === 1) { |
| 156 | const testCheckUrl = test[0]?.checkUpdateUrl; |
| 157 | if (testCheckUrl) { |
| 158 | // 尝试下载该脚本的url, 检查是否指向要求脚本 |
| 159 | try { |
| 160 | const code = await fetchScriptBody(testCheckUrl); |
| 161 | const metadata = code ? parseMetadata(code) : null; |
| 162 | if (metadata && metadata.name![0] === script.name && (metadata.namespace?.[0] || "") === script.namespace) { |
| 163 | old = test[0]; |
| 164 | } |
| 165 | } catch { |
| 166 | /* empty */ |
| 167 | } |
| 168 | } |
| 169 | } |
| 170 | } |
| 171 | const hasGrantConflict = (metadata: SCMetadata | undefined | null) => |
| 172 | metadata?.grant?.includes("none") && metadata?.grant?.some((s: string) => s.startsWith("GM")); |
| 173 | const hasDuplicatedMetaline = (metadata: SCMetadata | undefined | null) => { |
| 174 | if (metadata) { |
| 175 | for (const list of Object.values(metadata)) { |
| 176 | if (list && new Set(list).size !== list.length) return true; |
| 177 | } |
| 178 | } |
| 179 | }; |
| 180 | if (options?.byEditor && hasGrantConflict(script.metadata) && (!old || !hasGrantConflict(old.metadata))) { |
| 181 | throw new Error(i18n_t("error_grant_conflict")); |
| 182 | } |
| 183 | if (options?.byEditor && hasDuplicatedMetaline(script.metadata) && (!old || !hasDuplicatedMetaline(old.metadata))) { |
| 184 | throw new Error(i18n_t("error_metadata_line_duplicated")); |
| 185 | } |
| 186 | if (old) { |
| 187 | if ( |
| 188 | (old.type === SCRIPT_TYPE_NORMAL && script.type !== SCRIPT_TYPE_NORMAL) || |
| 189 | (script.type === SCRIPT_TYPE_NORMAL && old.type !== SCRIPT_TYPE_NORMAL) |
no test coverage detected