{"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["export function parseRawHeaders(h: string): Headers {\n  const s = h.trim();\n  if (!s) {\n    return new Headers();\n  }\n\n  const array: [string, string][] = s.split(\"\\r\\n\").map((value) => {\n    let s = value.split(\":\");\n    return [s[0].trim(), s[1].trim()];\n  });\n\n  return new Headers(array);\n}\n\nexport function parseGMResponse(req: Request, res: GM.Response<any>): Response {\n  // workaround TamperMonkey bug(?) where sometimes response is string despite responseType being \"blob\"\n  const headers = parseRawHeaders(res.responseHeaders);\n  const body =\n    typeof res.response === \"string\"\n      ? new Blob([res.response], { type: headers.get(\"Content-Type\") || \"text/plain\" })\n      : (res.response as Blob);\n  return new ResImpl(body, {\n    statusCode: res.status,\n    statusText: res.statusText,\n    headers,\n    finalUrl: res.finalUrl,\n    redirected: res.finalUrl === req.url,\n  });\n}\n\ninterface ResInit {\n  redirected: boolean;\n  headers: Headers;\n  statusCode: number;\n  statusText: string;\n  finalUrl: string;\n}\n\nclass ResImpl implements Response {\n  private _bodyUsed: boolean;\n  private readonly rawBody: Blob;\n  private readonly init: ResInit;\n\n  readonly body: ReadableStream<Uint8Array> | null;\n  readonly headers: Headers;\n  readonly redirected: boolean;\n  readonly status: number;\n  readonly statusText: string;\n  readonly type: ResponseType;\n  readonly url: string;\n\n  constructor(body: Blob, init: ResInit) {\n    this.rawBody = body;\n    this.init = init;\n\n    this.body = body.stream();\n    const { headers, statusCode, statusText, finalUrl, redirected } = init;\n    this.headers = headers;\n    this.status = statusCode;\n    this.statusText = statusText;\n    this.url = finalUrl;\n    this.type = \"basic\";\n    this.redirected = redirected;\n    this._bodyUsed = false;\n  }\n\n  get bodyUsed(): boolean {\n    return this._bodyUsed;\n  }\n\n  get ok(): boolean {\n    return this.status < 300;\n  }\n\n  arrayBuffer(): Promise<ArrayBuffer> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'arrayBuffer' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n    return this.rawBody.arrayBuffer();\n  }\n\n  blob(): Promise<Blob> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'blob' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n    // `slice` will use empty string as default value, so need to pass all arguments.\n    return Promise.resolve(this.rawBody.slice(0, this.rawBody.size, this.rawBody.type));\n  }\n\n  clone(): Response {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'clone' on 'Response': body stream already read\");\n    }\n    return new ResImpl(this.rawBody, this.init);\n  }\n\n  formData(): Promise<FormData> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'formData' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n    return this.rawBody.text().then(decode);\n  }\n\n  async json(): Promise<any> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'json' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n    return JSON.parse(await this.rawBody.text());\n  }\n\n  text(): Promise<string> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'text' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n    return this.rawBody.text();\n  }\n\n  async bytes(): Promise<Uint8Array> {\n    if (this.bodyUsed) {\n      throw new TypeError(\"Failed to execute 'bytes' on 'Response': body stream already read\");\n    }\n    this._bodyUsed = true;\n\n    return new Uint8Array(await this.rawBody.arrayBuffer());\n  }\n}\n\nfunction decode(body: string) {\n  const form = new FormData();\n\n  body\n    .trim()\n    .split(\"&\")\n    .forEach(function (bytes) {\n      if (bytes) {\n        const split = bytes.split(\"=\");\n        const name = split.shift()?.replace(/\\+/g, \" \");\n        const value = split.join(\"=\").replace(/\\+/g, \" \");\n        form.append(decodeURIComponent(name!), decodeURIComponent(value));\n      }\n    });\n\n  return form;\n}\n","import { parseGMResponse } from \"./utils\";\n\nexport default async function GM_fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n  const request = new Request(input, init);\n\n  let data: string | undefined;\n  if (init?.body) {\n    data = await request.text();\n  }\n\n  return await XHR(request, init, data);\n}\n\nfunction XHR(request: Request, init: RequestInit | undefined, data: string | undefined): Promise<Response> {\n  return new Promise((resolve, reject) => {\n    if (request.signal && request.signal.aborted) {\n      return reject(new DOMException(\"Aborted\", \"AbortError\"));\n    }\n\n    GM.xmlHttpRequest({\n      url: request.url,\n      method: gmXHRMethod(request.method.toUpperCase()),\n      headers: Object.fromEntries(new Headers(init?.headers).entries()),\n      data: data,\n      responseType: \"blob\",\n      onload(res) {\n        try {\n          resolve(parseGMResponse(request, res));\n        } catch (e) {\n          reject(e);\n        }\n      },\n      onabort() {\n        reject(new DOMException(\"Aborted\", \"AbortError\"));\n      },\n      ontimeout() {\n        reject(new TypeError(\"Network request failed, timeout\"));\n      },\n      onerror(err) {\n        reject(new TypeError(\"Failed to fetch: \" + err.finalUrl));\n      },\n    });\n  });\n}\n\nconst httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"TRACE\", \"OPTIONS\", \"CONNECT\"] as const;\n\n// a ts type helper to narrow type\nfunction includes<T extends U, U>(array: ReadonlyArray<T>, element: U): element is T {\n  return array.includes(element as T);\n}\n\nfunction gmXHRMethod(method: string): (typeof httpMethods)[number] {\n  if (includes(httpMethods, method)) {\n    return method;\n  }\n\n  throw new Error(`unsupported http method ${method}`);\n}\n"],"names":[],"mappings":"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"}