MCPcopy Index your code
hub / github.com/scriptscat/scriptcat / prepareScriptByCode

Function prepareScriptByCode

src/pkg/utils/script.ts:132–218  ·  view source on GitHub ↗
(
  code: string,
  origin: string,
  uuid?: string,
  override: boolean = false,
  dao?: ScriptDAO,
  options?: {
    byEditor?: boolean; // 是否通过编辑器导入
    byWebRequest?: boolean; // 是否通过网页连结安装或更新
  }
)

Source from the content-addressed store, hash-verified

130
131// 通过代码解析出脚本信息 (Script)
132export 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)

Callers 11

onDropFunction · 0.90
fetchDataFunction · 0.90
emptyScriptFunction · 0.90
saveFunction · 0.90
getUpdatedNewScriptFunction · 0.90
initAsyncFunction · 0.90
installByUrlMethod · 0.90
installByCodeMethod · 0.90
_checkScriptUpdateMethod · 0.90
pullScriptMethod · 0.90

Calls 8

parseScriptFromCodeFunction · 0.85
parseMetadataFunction · 0.85
hasGrantConflictFunction · 0.85
hasDuplicatedMetalineFunction · 0.85
searchExistingScriptMethod · 0.80
fetchScriptBodyFunction · 0.70
getMethod · 0.65

Tested by

no test coverage detected